fune/devtools/startup/aboutdevtools/subscribe.js
Julian Descottes 0846848648 Bug 1444926 - Move devtools/shim to devtools/startup;r=ochameau
MozReview-Commit-ID: K9WuJuTdYHS

--HG--
rename : devtools/shim/DevToolsShim.jsm => devtools/startup/DevToolsShim.jsm
rename : devtools/shim/aboutdebugging-registration.js => devtools/startup/aboutdebugging-registration.js
rename : devtools/shim/aboutdebugging.manifest => devtools/startup/aboutdebugging.manifest
rename : devtools/shim/aboutdevtools/aboutdevtools-registration.js => devtools/startup/aboutdevtools/aboutdevtools-registration.js
rename : devtools/shim/aboutdevtools/aboutdevtools.css => devtools/startup/aboutdevtools/aboutdevtools.css
rename : devtools/shim/aboutdevtools/aboutdevtools.js => devtools/startup/aboutdevtools/aboutdevtools.js
rename : devtools/shim/aboutdevtools/aboutdevtools.manifest => devtools/startup/aboutdevtools/aboutdevtools.manifest
rename : devtools/shim/aboutdevtools/aboutdevtools.xhtml => devtools/startup/aboutdevtools/aboutdevtools.xhtml
rename : devtools/shim/aboutdevtools/images/dev-edition-logo.svg => devtools/startup/aboutdevtools/images/dev-edition-logo.svg
rename : devtools/shim/aboutdevtools/images/external-link.svg => devtools/startup/aboutdevtools/images/external-link.svg
rename : devtools/shim/aboutdevtools/images/feature-console.svg => devtools/startup/aboutdevtools/images/feature-console.svg
rename : devtools/shim/aboutdevtools/images/feature-debugger.svg => devtools/startup/aboutdevtools/images/feature-debugger.svg
rename : devtools/shim/aboutdevtools/images/feature-inspector.svg => devtools/startup/aboutdevtools/images/feature-inspector.svg
rename : devtools/shim/aboutdevtools/images/feature-memory.svg => devtools/startup/aboutdevtools/images/feature-memory.svg
rename : devtools/shim/aboutdevtools/images/feature-network.svg => devtools/startup/aboutdevtools/images/feature-network.svg
rename : devtools/shim/aboutdevtools/images/feature-performance.svg => devtools/startup/aboutdevtools/images/feature-performance.svg
rename : devtools/shim/aboutdevtools/images/feature-responsive.svg => devtools/startup/aboutdevtools/images/feature-responsive.svg
rename : devtools/shim/aboutdevtools/images/feature-storage.svg => devtools/startup/aboutdevtools/images/feature-storage.svg
rename : devtools/shim/aboutdevtools/images/feature-visualediting.svg => devtools/startup/aboutdevtools/images/feature-visualediting.svg
rename : devtools/shim/aboutdevtools/images/otter.svg => devtools/startup/aboutdevtools/images/otter.svg
rename : devtools/shim/aboutdevtools/moz.build => devtools/startup/aboutdevtools/moz.build
rename : devtools/shim/aboutdevtools/subscribe.css => devtools/startup/aboutdevtools/subscribe.css
rename : devtools/shim/aboutdevtools/subscribe.js => devtools/startup/aboutdevtools/subscribe.js
rename : devtools/shim/aboutdevtools/test/.eslintrc.js => devtools/startup/aboutdevtools/test/.eslintrc.js
rename : devtools/shim/aboutdevtools/test/browser.ini => devtools/startup/aboutdevtools/test/browser.ini
rename : devtools/shim/aboutdevtools/test/browser_aboutdevtools_closes_page.js => devtools/startup/aboutdevtools/test/browser_aboutdevtools_closes_page.js
rename : devtools/shim/aboutdevtools/test/browser_aboutdevtools_enables_devtools.js => devtools/startup/aboutdevtools/test/browser_aboutdevtools_enables_devtools.js
rename : devtools/shim/aboutdevtools/test/browser_aboutdevtools_focus_owner_tab.js => devtools/startup/aboutdevtools/test/browser_aboutdevtools_focus_owner_tab.js
rename : devtools/shim/aboutdevtools/test/browser_aboutdevtools_reuse_existing.js => devtools/startup/aboutdevtools/test/browser_aboutdevtools_reuse_existing.js
rename : devtools/shim/aboutdevtools/test/head.js => devtools/startup/aboutdevtools/test/head.js
rename : devtools/shim/aboutdevtoolstoolbox-registration.js => devtools/startup/aboutdevtoolstoolbox-registration.js
rename : devtools/shim/aboutdevtoolstoolbox.manifest => devtools/startup/aboutdevtoolstoolbox.manifest
rename : devtools/shim/devtools-startup-prefs.js => devtools/startup/devtools-startup-prefs.js
rename : devtools/shim/devtools-startup.js => devtools/startup/devtools-startup.js
rename : devtools/shim/devtools-startup.manifest => devtools/startup/devtools-startup.manifest
rename : devtools/shim/jar.mn => devtools/startup/jar.mn
rename : devtools/shim/locales/en-US/aboutdevtools.dtd => devtools/startup/locales/en-US/aboutdevtools.dtd
rename : devtools/shim/locales/en-US/aboutdevtools.properties => devtools/startup/locales/en-US/aboutdevtools.properties
rename : devtools/shim/locales/en-US/key-shortcuts.properties => devtools/startup/locales/en-US/key-shortcuts.properties
rename : devtools/shim/locales/en-US/startup.properties => devtools/startup/locales/en-US/startup.properties
rename : devtools/shim/locales/jar.mn => devtools/startup/locales/jar.mn
rename : devtools/shim/locales/moz.build => devtools/startup/locales/moz.build
rename : devtools/shim/moz.build => devtools/startup/moz.build
rename : devtools/shim/tests/browser/.eslintrc.js => devtools/startup/tests/browser/.eslintrc.js
rename : devtools/shim/tests/browser/browser.ini => devtools/startup/tests/browser/browser.ini
rename : devtools/shim/tests/browser/browser_shim_disable_devtools.js => devtools/startup/tests/browser/browser_shim_disable_devtools.js
rename : devtools/shim/tests/unit/.eslintrc.js => devtools/startup/tests/unit/.eslintrc.js
rename : devtools/shim/tests/unit/test_devtools_shim.js => devtools/startup/tests/unit/test_devtools_shim.js
rename : devtools/shim/tests/unit/xpcshell.ini => devtools/startup/tests/unit/xpcshell.ini
extra : rebase_source : 7867a5b103d01dc936091a71deeaf526e7f0e47a
2018-03-12 14:41:48 +01:00

146 lines
4.9 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* This file handles the newsletter subscription form on about:devtools.
* It is largely inspired from https://mozilla.github.io/basket-example/
*/
window.addEventListener("load", function() {
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm", {});
// Timeout for the subscribe XHR.
const REQUEST_TIMEOUT = 5000;
const ABOUTDEVTOOLS_STRINGS = "chrome://devtools-startup/locale/aboutdevtools.properties";
const aboutDevtoolsBundle = Services.strings.createBundle(ABOUTDEVTOOLS_STRINGS);
let emailInput = document.getElementById("email");
let newsletterErrors = document.getElementById("newsletter-errors");
let newsletterForm = document.getElementById("newsletter-form");
let newsletterPrivacySection = document.getElementById("newsletter-privacy");
let newsletterThanks = document.getElementById("newsletter-thanks");
/**
* Update the error panel to display the provided errors. If the argument is null or
* empty, a default error message will be displayed.
*
* @param {Array} errors
* Array of strings, each item being an error message to display.
*/
function updateErrorPanel(errors) {
clearErrorPanel();
if (!errors || errors.length == 0) {
errors = [aboutDevtoolsBundle.GetStringFromName("newsletter.error.unknown")];
}
// Create errors markup.
let fragment = document.createDocumentFragment();
for (let error of errors) {
let item = document.createElement("p");
item.classList.add("error");
item.appendChild(document.createTextNode(error));
fragment.appendChild(item);
}
newsletterErrors.appendChild(fragment);
newsletterErrors.classList.add("show");
}
/**
* Hide the error panel and remove all errors.
*/
function clearErrorPanel() {
newsletterErrors.classList.remove("show");
newsletterErrors.innerHTML = "";
}
// Show the additional form fields on focus of the email input.
function onEmailInputFocus() {
// Create a hidden measuring container, append it to the parent of the privacy section
let container = document.createElement("div");
container.style.cssText = "visibility: hidden; overflow: hidden; position: absolute";
newsletterPrivacySection.parentNode.appendChild(container);
// Clone the privacy section, append the clone to the measuring container.
let clone = newsletterPrivacySection.cloneNode(true);
container.appendChild(clone);
// Measure the target height of the privacy section.
clone.style.height = "auto";
let height = clone.offsetHeight;
// Cleanup the measuring container.
container.remove();
// Set the animate class and set the height to the measured height.
newsletterPrivacySection.classList.add("animate");
newsletterPrivacySection.style.cssText = `height: ${height}px; margin-bottom: 0;`;
}
// XHR subscribe; handle errors; display thanks message on success.
function onFormSubmit(evt) {
evt.preventDefault();
evt.stopPropagation();
// New submission, clear old errors
clearErrorPanel();
let xhr = new XMLHttpRequest();
xhr.onload = function(r) {
if (r.target.status >= 200 && r.target.status < 300) {
let {response} = r.target;
if (response.success === true) {
// Hide form and show success message.
newsletterForm.style.display = "none";
newsletterThanks.classList.add("show");
} else {
// We trust the error messages from the service to be meaningful for the user.
updateErrorPanel(response.errors);
}
} else {
let {status, statusText} = r.target;
let statusInfo = `${status} - ${statusText}`;
let error = aboutDevtoolsBundle
.formatStringFromName("newsletter.error.common", [statusInfo], 1);
updateErrorPanel([error]);
}
};
xhr.onerror = () => {
updateErrorPanel();
};
xhr.ontimeout = () => {
let error = aboutDevtoolsBundle.GetStringFromName("newsletter.error.timeout");
updateErrorPanel([error]);
};
let url = newsletterForm.getAttribute("action");
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.timeout = REQUEST_TIMEOUT;
xhr.responseType = "json";
// Create form data.
let formData = new FormData(newsletterForm);
formData.append("source_url", document.location.href);
let params = new URLSearchParams(formData);
// Send the request.
xhr.send(params.toString());
}
// Attach event listeners.
newsletterForm.addEventListener("submit", onFormSubmit);
emailInput.addEventListener("focus", onEmailInputFocus);
}, { once: true });