merge mozilla-central to mozilla-inbound. r=merge a=merge

This commit is contained in:
Sebastian Hengst 2017-10-13 11:53:54 +02:00
commit 30598ec65d
314 changed files with 7170 additions and 2676 deletions

View File

@ -47,7 +47,7 @@ ifndef MOZ_PROFILE_USE
# We need to explicitly put BUILD_BACKEND_FILES here otherwise the rule in
# rules.mk doesn't run early enough.
$(TIERS) binaries:: CLOBBER $(configure_dir)/configure config.status $(BUILD_BACKEND_FILES)
ifndef JS_STANDALONE
ifdef MOZ_WIDGET_TOOLKIT
ifdef COMPILE_ENVIRONMENT
$(TIERS) binaries:: $(topsrcdir)/js/src/configure js/src/config.status
endif
@ -122,7 +122,7 @@ install_manifest_depends = \
$(BUILD_BACKEND_FILES) \
$(NULL)
ifndef JS_STANDALONE
ifdef MOZ_WIDGET_TOOLKIT
ifdef COMPILE_ENVIRONMENT
install_manifest_depends += \
$(topsrcdir)/js/src/configure \
@ -213,7 +213,7 @@ endif
recurse_artifact:
$(topsrcdir)/mach --log-no-times artifact install
ifndef JS_STANDALONE
ifdef MOZ_WIDGET_TOOLKIT
ifdef ENABLE_TESTS
# Additional makefile targets to call automated test suites
include $(topsrcdir)/testing/testsuite-targets.mk

View File

@ -318,10 +318,9 @@ pref("browser.urlbar.suggest.history", true);
pref("browser.urlbar.suggest.bookmark", true);
pref("browser.urlbar.suggest.openpage", true);
pref("browser.urlbar.suggest.searches", true);
// Whether the user made a choice in the old search suggestions opt-in bar.
pref("browser.urlbar.userMadeSearchSuggestionsChoice", false);
// The suggestion opt-in notification will be shown on 4 different days.
pref("browser.urlbar.daysBeforeHidingSuggestionsPrompt", 4);
pref("browser.urlbar.lastSuggestionsPromptDate", 20160601);
// The suggestion opt-out hint will be hidden after being shown 4 times.
pref("browser.urlbar.timesBeforeHidingSuggestionsHint", 4);

View File

@ -465,9 +465,12 @@ var gSync = {
contextMenu.onVideo || contextMenu.onAudio ||
contextMenu.onLink || contextMenu.onTextInput);
["context-sendpagetodevice", "context-sep-sendpagetodevice"]
// Avoids double separator on images with links.
const hideSeparator = contextMenu.isContentSelected &&
contextMenu.onLink && contextMenu.onImage;
["context-sendpagetodevice", ...(hideSeparator ? [] : ["context-sep-sendpagetodevice"])]
.forEach(id => contextMenu.showItem(id, showSendPage));
["context-sendlinktodevice", "context-sep-sendlinktodevice"]
["context-sendlinktodevice", ...(hideSeparator ? [] : ["context-sep-sendlinktodevice"])]
.forEach(id => contextMenu.showItem(id, showSendLink));
if (!showSendLink && !showSendPage) {

View File

@ -86,10 +86,6 @@ support-files =
[browser_urlbarRevert.js]
[browser_urlbarSearchSingleWordNotification.js]
[browser_urlbarSearchSuggestions.js]
support-files =
searchSuggestionEngine.xml
searchSuggestionEngine.sjs
[browser_urlbarSearchSuggestions_opt-in.js]
support-files =
searchSuggestionEngine.xml
searchSuggestionEngine.sjs

View File

@ -1,232 +0,0 @@
const SUGGEST_ALL_PREF = "browser.search.suggest.enabled";
const SUGGEST_URLBAR_PREF = "browser.urlbar.suggest.searches";
const CHOICE_PREF = "browser.urlbar.userMadeSearchSuggestionsChoice";
const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
// Must run first.
add_task(async function prepare() {
let engine = await promiseNewSearchEngine(TEST_ENGINE_BASENAME);
let oldCurrentEngine = Services.search.currentEngine;
Services.search.currentEngine = engine;
let suggestionsEnabled = Services.prefs.getBoolPref(SUGGEST_URLBAR_PREF);
let defaults = Services.prefs.getDefaultBranch("browser.urlbar.");
let searchSuggestionsDefault = defaults.getBoolPref("suggest.searches");
defaults.setBoolPref("suggest.searches", false);
registerCleanupFunction(async function() {
defaults.setBoolPref("suggest.searches", searchSuggestionsDefault);
Services.search.currentEngine = oldCurrentEngine;
Services.prefs.clearUserPref(SUGGEST_ALL_PREF);
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, suggestionsEnabled);
// Disable the notification for future tests so it doesn't interfere with
// them. clearUserPref() won't work because by default the pref is false.
Services.prefs.setBoolPref(CHOICE_PREF, true);
// Make sure the popup is closed for the next test.
gURLBar.blur();
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
});
});
add_task(async function focus() {
// Focusing the urlbar used to open the popup in order to show the
// notification, but it doesn't anymore. Make sure it does not.
setupVisibleNotification();
gURLBar.blur();
gURLBar.focus();
Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed");
});
add_task(async function dismissWithoutResults() {
setupVisibleNotification();
gURLBar.blur();
gURLBar.focus();
let popupPromise = promisePopupShown(gURLBar.popup);
gURLBar.openPopup();
await popupPromise;
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
Assert.equal(gURLBar.popup._matchCount, 0, "popup should have no results");
let disableButton = document.getAnonymousElementByAttribute(
gURLBar.popup, "anonid", "search-suggestions-notification-disable"
);
let transitionPromise = promiseTransition();
disableButton.click();
await transitionPromise;
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
gURLBar.blur();
gURLBar.focus();
Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed");
await promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(false);
});
add_task(async function dismissWithResults() {
setupVisibleNotification();
gURLBar.blur();
gURLBar.focus();
await promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
Assert.ok(gURLBar.popup._matchCount > 0, "popup should have results");
let disableButton = document.getAnonymousElementByAttribute(
gURLBar.popup, "anonid", "search-suggestions-notification-disable"
);
let transitionPromise = promiseTransition();
disableButton.click();
await transitionPromise;
Assert.ok(gURLBar.popup.popupOpen, "popup should remain open");
gURLBar.blur();
gURLBar.focus();
Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed");
await promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(false);
});
add_task(async function disable() {
setupVisibleNotification();
gURLBar.blur();
gURLBar.focus();
await promiseAutocompleteResultPopup("foo");
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
assertVisible(true);
let disableButton = document.getAnonymousElementByAttribute(
gURLBar.popup, "anonid", "search-suggestions-notification-disable"
);
let transitionPromise = promiseTransition();
disableButton.click();
await transitionPromise;
gURLBar.blur();
await promiseAutocompleteResultPopup("foo");
Assert.ok(!suggestionsPresent());
});
add_task(async function enable() {
setupVisibleNotification();
gURLBar.blur();
gURLBar.focus();
await promiseAutocompleteResultPopup("foo");
assertVisible(true);
Assert.ok(!suggestionsPresent());
let enableButton = document.getAnonymousElementByAttribute(
gURLBar.popup, "anonid", "search-suggestions-notification-enable"
);
let searchPromise = BrowserTestUtils.waitForCondition(suggestionsPresent,
"waiting for suggestions");
enableButton.click();
await searchPromise;
// Clicking Yes should trigger a new search so that suggestions appear
// immediately.
Assert.ok(suggestionsPresent());
gURLBar.blur();
gURLBar.focus();
// Suggestions should still be present in a new search of course.
await promiseAutocompleteResultPopup("bar");
Assert.ok(suggestionsPresent());
});
add_task(async function privateWindow() {
// Since suggestions are disabled in private windows, the notification should
// not appear even when suggestions are otherwise enabled.
setupVisibleNotification();
let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
win.gURLBar.blur();
win.gURLBar.focus();
await promiseAutocompleteResultPopup("foo", win);
assertVisible(false, win);
win.gURLBar.blur();
await BrowserTestUtils.closeWindow(win);
});
add_task(async function multipleWindows() {
// Opening multiple windows, using their urlbars, and then dismissing the
// notification in one should dismiss the notification in all.
setupVisibleNotification();
gURLBar.focus();
await promiseAutocompleteResultPopup("win1");
assertVisible(true);
let win2 = await BrowserTestUtils.openNewBrowserWindow();
win2.gURLBar.focus();
await promiseAutocompleteResultPopup("win2", win2);
assertVisible(true, win2);
let win3 = await BrowserTestUtils.openNewBrowserWindow();
win3.gURLBar.focus();
await promiseAutocompleteResultPopup("win3", win3);
assertVisible(true, win3);
let enableButton = win3.document.getAnonymousElementByAttribute(
win3.gURLBar.popup, "anonid", "search-suggestions-notification-enable"
);
let transitionPromise = promiseTransition(win3);
enableButton.click();
await transitionPromise;
assertVisible(false, win3);
win2.gURLBar.focus();
await promiseAutocompleteResultPopup("win2done", win2);
assertVisible(false, win2);
gURLBar.focus();
await promiseAutocompleteResultPopup("win1done");
assertVisible(false);
await BrowserTestUtils.closeWindow(win2);
await BrowserTestUtils.closeWindow(win3);
});
add_task(async function enableOutsideNotification() {
// Setting the suggest.searches pref outside the notification (e.g., by
// ticking the checkbox in the preferences window) should hide it.
setupVisibleNotification();
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, true);
gURLBar.focus();
await promiseAutocompleteResultPopup("foo");
assertVisible(false);
});
function setupVisibleNotification() {
Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true);
// Toggle to reset the whichNotification cache.
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, true);
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, false);
Services.prefs.setBoolPref(CHOICE_PREF, false);
}
function suggestionsPresent() {
let controller = gURLBar.popup.input.controller;
let matchCount = controller.matchCount;
for (let i = 0; i < matchCount; i++) {
let url = controller.getValueAt(i);
let mozActionMatch = url.match(/^moz-action:([^,]+),(.*)$/);
if (mozActionMatch) {
let [, type, paramStr] = mozActionMatch;
let params = JSON.parse(paramStr);
if (type == "searchengine" && "searchSuggestion" in params) {
return true;
}
}
}
return false;
}
function assertVisible(visible, win = window) {
let style =
win.getComputedStyle(win.gURLBar.popup.searchSuggestionsNotification);
let check = visible ? "notEqual" : "equal";
Assert[check](style.display, "none");
}
function promiseTransition(win = window) {
return new Promise(resolve => {
win.gURLBar.popup.addEventListener("transitionend", function() {
// The urlbar needs to handle the transitionend first, but that happens
// naturally since promises are resolved at the end of the current tick.
resolve();
}, {capture: true, once: true});
});
}

View File

@ -1434,14 +1434,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
if (this.browserSearchSuggestEnabled && !this.inPrivateContext &&
// In any case, if the user made a choice we should not nag him.
!this._userMadeSearchSuggestionsChoice) {
let enabledByDefault = this._defaultPrefs.getBoolPref("suggest.searches");
if (!enabledByDefault &&
this._prefs.getIntPref("daysBeforeHidingSuggestionsPrompt")) {
return "opt-in";
}
if (enabledByDefault &&
// Has not been switched off.
this.urlbarSearchSuggestEnabled &&
if (this._defaultPrefs.getBoolPref("suggest.searches") &&
this.urlbarSearchSuggestEnabled && // Has not been switched off.
this._prefs.getIntPref("timesBeforeHidingSuggestionsHint")) {
return "opt-out";
}
@ -1457,21 +1451,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
throw new Error("Unexpected notification type");
}
let useDays = whichNotification == "opt-in";
let prefName = useDays ? "daysBeforeHidingSuggestionsPrompt"
: "timesBeforeHidingSuggestionsHint";
let remaining = this._prefs.getIntPref(prefName);
if (remaining <= 0)
return;
let now = new Date();
let date = now.getFullYear() * 10000 + (now.getMonth() + 1) * 100 + now.getDate();
let previousDate = this._prefs.getIntPref("lastSuggestionsPromptDate");
if (!useDays || previousDate != date) {
this._prefs.setIntPref(prefName, remaining - 1);
let remaining = this._prefs.getIntPref("timesBeforeHidingSuggestionsHint");
if (remaining > 0) {
this._prefs.setIntPref("timesBeforeHidingSuggestionsHint", remaining - 1);
}
this._prefs.setIntPref("lastSuggestionsPromptDate", date);
]]></body>
</method>
@ -1647,32 +1630,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
align="center"
role="alert"
selectedIndex="0">
<!-- OPT-IN -->
<xul:hbox flex="1" align="center" anonid="search-suggestions-opt-in">
<xul:description flex="1" id="search-suggestions-question">
&urlbar.searchSuggestionsNotification.question;
<!-- Several things here are to make the label accessibile via an
accesskey so that a11y doesn't suck: the accesskey, using an
onclick handler instead of an href attribute, the control
attribute, and having the control attribute refer to a valid ID
that is the label itself. -->
<xul:label id="search-suggestions-learn-more"
class="text-link"
role="link"
value="&urlbar.searchSuggestionsNotification.learnMore;"
accesskey="&urlbar.searchSuggestionsNotification.learnMore.accesskey;"
onclick="document.getBindingParent(this).openSearchSuggestionsNotificationLearnMoreURL();"
control="search-suggestions-learn-more"/>
</xul:description>
<xul:button anonid="search-suggestions-notification-disable"
label="&urlbar.searchSuggestionsNotification.disable;"
accesskey="&urlbar.searchSuggestionsNotification.disable.accesskey;"
onclick="document.getBindingParent(this).dismissSearchSuggestionsNotification(false);"/>
<xul:button anonid="search-suggestions-notification-enable"
label="&urlbar.searchSuggestionsNotification.enable;"
accesskey="&urlbar.searchSuggestionsNotification.enable.accesskey;"
onclick="document.getBindingParent(this).dismissSearchSuggestionsNotification(true);"/>
</xul:hbox>
<!-- OPT-OUT -->
<xul:hbox flex="1" align="center" anonid="search-suggestions-opt-out">
<xul:image class="ac-site-icon" type="searchengine"/>
@ -1781,38 +1738,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
]]></body>
</method>
<method name="openSearchSuggestionsNotificationLearnMoreURL">
<body><![CDATA[
let url = Services.urlFormatter.formatURL(
Services.prefs.getCharPref("app.support.baseURL") + "suggestions"
);
openUILinkIn(url, "tab");
]]></body>
</method>
<method name="dismissSearchSuggestionsNotification">
<parameter name="enableSuggestions"/>
<body><![CDATA[
// Make sure the urlbar is focused. It won't be, for example, if the
// user used an accesskey to make an opt-in choice. mIgnoreFocus
// prevents the text from being selected.
this.input.mIgnoreFocus = true;
this.input.focus();
this.input.mIgnoreFocus = false;
Services.prefs.setBoolPref(
"browser.urlbar.suggest.searches", enableSuggestions
);
Services.prefs.setBoolPref(
"browser.urlbar.userMadeSearchSuggestionsChoice", true
);
// Hide the notification.
this.searchSuggestionsNotificationWasDismissed(
Services.prefs.getBoolPref("browser.urlbar.suggest.searches")
);
]]></body>
</method>
<!-- Override this so that navigating between items results in an item
always being selected. -->
<method name="getNextIndex">
@ -2003,10 +1928,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
<parameter name="popupDirection"/>
<body>
<![CDATA[
let deckIndex = 0;
if (whichNotification == "opt-out") {
deckIndex = 1;
if (this.siteIconStart) {
this.searchSuggestionsNotification.style.paddingInlineStart =
this.siteIconStart + "px";
@ -2020,12 +1942,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
this.searchSuggestionsNotification.setAttribute("animate", "true");
}
}
this.searchSuggestionsNotification.setAttribute("selectedIndex", deckIndex);
let ariaDescElt = whichNotification == "opt-in" ?
"search-suggestions-question" : "search-suggestions-hint";
this.searchSuggestionsNotification.setAttribute("aria-describedby", ariaDescElt);
this.searchSuggestionsNotification.setAttribute("aria-describedby",
"search-suggestions-hint");
// With the notification shown, the listbox's height can sometimes be
// too small when it's flexed, as it normally is. Also, it can start
@ -2055,24 +1974,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
</body>
</method>
<method name="searchSuggestionsNotificationWasDismissed">
<parameter name="enableSuggestions"/>
<body>
<![CDATA[
if (!this.popupOpen) {
this._hideSearchSuggestionsNotification();
return;
}
this._hideSearchSuggestionsNotificationWithAnimation().then(() => {
if (enableSuggestions && this.input.textValue) {
// Start a new search so that suggestions appear immediately.
this.input.controller.startSearch(this.input.textValue);
}
});
]]>
</body>
</method>
<method name="_hideSearchSuggestionsNotification">
<body>
<![CDATA[
@ -2090,33 +1991,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
</body>
</method>
<method name="_hideSearchSuggestionsNotificationWithAnimation">
<body>
<![CDATA[
return new Promise(resolve => {
let notificationHeight = this.searchSuggestionsNotification
.getBoundingClientRect()
.height;
this.searchSuggestionsNotification.style.marginTop =
"-" + notificationHeight + "px";
let popupHeightPx =
(this.getBoundingClientRect().height - notificationHeight) + "px";
this.style.height = popupHeightPx;
let onTransitionEnd = () => {
this.removeEventListener("transitionend", onTransitionEnd, true);
this.searchSuggestionsNotification.style.marginTop = "0px";
this.style.removeProperty("height");
this._hideSearchSuggestionsNotification();
resolve();
};
this.addEventListener("transitionend", onTransitionEnd, true);
});
]]>
</body>
</method>
<method name="_selectedOneOffChanged">
<body><![CDATA[
// Update all searchengine result items to use the newly selected

View File

@ -8,7 +8,8 @@ const kCustomClass = "acustomclassnoonewilluse";
var tempElement = null;
function insertClassNameToMenuChildren(parentMenu) {
let el = parentMenu.querySelector("menuitem:first-of-type");
// Skip hidden menuitem elements, not copied via fillSubviewFromMenuItems.
let el = parentMenu.querySelector("menuitem:not([hidden])");
el.classList.add(kCustomClass);
tempElement = el;
}

View File

@ -2,8 +2,8 @@
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const {DevToolsShim} = Cu.import("chrome://devtools-shim/content/DevToolsShim.jsm", {});
const {gDevTools} = DevToolsShim;
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const {gDevTools} = require("devtools/client/framework/devtools");
/**
* Helper that returns the id of the last additional/extension tool for a provided

View File

@ -2,8 +2,8 @@
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
XPCOMUtils.defineLazyModuleGetter(this, "DevToolsShim",
"chrome://devtools-shim/content/DevToolsShim.jsm");
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const {gDevTools} = require("devtools/client/framework/devtools");
/**
* this test file ensures that:
@ -54,8 +54,6 @@ add_task(async function test_devtools_inspectedWindow_eval_bindings() {
await extension.startup();
const {gDevTools} = DevToolsShim;
const target = gDevTools.getTargetForTab(tab);
// Open the toolbox on the styleeditor, so that the inspector and the
// console panel have not been explicitly activated yet.

View File

@ -6,8 +6,8 @@
// on debug test slave, it takes about 50s to run the test.
requestLongerTimeout(4);
const {DevToolsShim} = Cu.import("chrome://devtools-shim/content/DevToolsShim.jsm", {});
const {gDevTools} = DevToolsShim;
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const {gDevTools} = require("devtools/client/framework/devtools");
// Small helper which provides the common steps to the following reload test cases.
async function runReloadTestCase({urlParams, background, devtoolsPage, testCase}) {

View File

@ -2,8 +2,8 @@
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const {DevToolsShim} = Cu.import("chrome://devtools-shim/content/DevToolsShim.jsm", {});
const {gDevTools} = DevToolsShim;
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const {gDevTools} = require("devtools/client/framework/devtools");
add_task(async function test_devtools_network_on_navigated() {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");

View File

@ -2,8 +2,8 @@
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const {DevToolsShim} = Cu.import("chrome://devtools-shim/content/DevToolsShim.jsm", {});
const {gDevTools} = DevToolsShim;
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const {gDevTools} = require("devtools/client/framework/devtools");
/**
* This test file ensures that:

View File

@ -5,8 +5,8 @@
XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
"resource://gre/modules/Preferences.jsm");
const {DevToolsShim} = Cu.import("chrome://devtools-shim/content/DevToolsShim.jsm", {});
const {gDevTools} = DevToolsShim;
const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
const {gDevTools} = require("devtools/client/framework/devtools");
const DEVTOOLS_THEME_PREF = "devtools.theme";

View File

@ -23,7 +23,6 @@ support-files =
[browser_contextSearchTabPosition.js]
skip-if = os == "mac" # bug 967013
[browser_ddg.js]
[browser_eBay.js]
[browser_google.js]
skip-if = artifact # bug 1315953
[browser_google_codes.js]

View File

@ -1,71 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/*
* Test eBay search plugin URLs
*/
"use strict";
const BROWSER_SEARCH_PREF = "browser.search.";
function test() {
let engine = Services.search.getEngineByName("eBay");
ok(engine, "eBay");
let base = "https://rover.ebay.com/rover/1/711-53200-19255-0/1?ff3=4&toolid=20004&campid=5338192028&customid=&mpre=https://www.ebay.com/sch/foo";
let url;
// Test search URLs (including purposes).
url = engine.getSubmission("foo").uri.spec;
is(url, base, "Check search URL for 'foo'");
// Check all other engine properties.
const EXPECTED_ENGINE = {
name: "eBay",
alias: null,
description: "eBay - Online auctions",
searchForm: "https://www.ebay.com/",
hidden: false,
wrappedJSObject: {
"_iconURL": "resource://search-plugins/images/ebay.ico",
_urls: [
{
type: "text/html",
method: "GET",
template: "https://rover.ebay.com/rover/1/711-53200-19255-0/1",
params: [
{
name: "ff3",
value: "4",
purpose: undefined,
},
{
name: "toolid",
value: "20004",
purpose: undefined,
},
{
name: "campid",
value: "5338192028",
purpose: undefined,
},
{
name: "customid",
value: "",
purpose: undefined,
},
{
name: "mpre",
value: "https://www.ebay.com/sch/{searchTerms}",
purpose: undefined,
},
],
mozparams: {},
},
],
},
};
isSubObjectOf(EXPECTED_ENGINE, engine, "eBay");
}

View File

@ -37,16 +37,6 @@ const SEARCH_ENGINE_DETAILS = [{
submission: "&t=ffsb",
},
name: "DuckDuckGo",
}, {
alias: "e",
baseURL: "https://rover.ebay.com/rover/1/711-53200-19255-0/1?ff3=4&toolid=20004&campid=5338192028&customid=&mpre=https://www.ebay.com/sch/foo",
codes: {
context: "",
keyword: "",
newTab: "",
submission: "",
},
name: "eBay",
}, {
// TODO: Google is tested in browser_google_behaviors.js - we can't test it here
// yet because of bug 1315953.

View File

@ -115,6 +115,12 @@ AutofillProfileAutoCompleteSearch.prototype = {
// - (address only) less than 3 inputs are covered by all saved fields in the storage.
if (!searchPermitted || !savedFieldNames.has(info.fieldName) || filledRecordGUID || (isAddressField &&
allFieldNames.filter(field => savedFieldNames.has(field)).length < FormAutofillUtils.AUTOFILL_FIELDS_THRESHOLD)) {
if (focusedInput.autocomplete == "off") {
// Create a dummy AddressResult as an empty search result.
let result = new AddressResult("", "", [], [], {});
listener.onSearchResult(this, result);
return;
}
let formHistory = Cc["@mozilla.org/autocomplete/search;1?name=form-history"]
.createInstance(Ci.nsIAutoCompleteSearch);
formHistory.startSearch(searchString, searchParam, previousResult, {

View File

@ -7,6 +7,8 @@
let formFillChromeScript;
let expectingPopup = null;
const {FormAutofillUtils} = SpecialPowers.Cu.import("resource://formautofill/FormAutofillUtils.jsm");
async function sleep(ms = 500, reason = "Intentionally wait for UI ready") {
SimpleTest.requestFlakyTimeout(reason);
await new Promise(resolve => setTimeout(resolve, ms));
@ -112,6 +114,14 @@ async function cleanUpStorage() {
await cleanUpCreditCards();
}
function patchRecordCCNumber(record) {
const ccNumber = record["cc-number"];
const normalizedCCNumber = "*".repeat(ccNumber.length - 4) + ccNumber.substr(-4);
const ccNumberFmt = FormAutofillUtils.fmtMaskedCreditCardLabel(normalizedCCNumber);
return Object.assign({}, record, {ccNumberFmt});
}
// Utils for registerPopupShownListener(in satchel_common.js) that handles dropdown popup
// Please call "initPopupListener()" in your test and "await expectPopup()"
// if you want to wait for dropdown menu displayed.
@ -122,6 +132,16 @@ function expectPopup() {
});
}
function notExpectPopup(ms = 500) {
info("not expecting a popup");
return new Promise((resolve, reject) => {
expectingPopup = reject.bind(this, "Unexpected Popup");
// TODO: We don't have an event to notify no popup showing, so wait for 500
// ms (in default) to predict any unexpected popup showing.
setTimeout(resolve, ms);
});
}
function popupShownListener() {
info("popup shown for test ");
if (expectingPopup) {
@ -144,8 +164,10 @@ function formAutoFillCommonSetup() {
}
});
SimpleTest.registerCleanupFunction(() => {
SimpleTest.registerCleanupFunction(async () => {
formFillChromeScript.sendAsyncMessage("cleanup");
await formFillChromeScript.promiseOneMessage("cleanup-finished");
formFillChromeScript.destroy();
expectingPopup = null;
});

View File

@ -89,19 +89,29 @@ var ParentUtils = {
async cleanUpAddresses() {
const guids = (await this._getRecords(ADDRESSES_COLLECTION_NAME)).map(record => record.guid);
if (guids.length == 0) {
sendAsyncMessage("FormAutofillTest:AddressesCleanedUp");
return;
}
await this.operateAddress("remove", {guids}, "FormAutofillTest:AddressesCleanedUp");
},
async cleanUpCreditCards() {
const guids = (await this._getRecords(CREDITCARDS_COLLECTION_NAME)).map(record => record.guid);
if (guids.length == 0) {
sendAsyncMessage("FormAutofillTest:CreditCardsCleanedUp");
return;
}
await this.operateCreditCard("remove", {guids}, "FormAutofillTest:CreditCardsCleanedUp");
},
async cleanup() {
Services.obs.removeObserver(this, "formautofill-storage-changed");
await this.cleanUpAddresses();
await this.cleanUpCreditCards();
Services.obs.removeObserver(this, "formautofill-storage-changed");
},
_areRecordsMatching(recordA, recordB, collectionName) {
@ -196,5 +206,7 @@ addMessageListener("FormAutofillTest:CleanUpCreditCards", (msg) => {
});
addMessageListener("cleanup", () => {
ParentUtils.cleanup();
ParentUtils.cleanup().then(() => {
sendAsyncMessage("cleanup-finished", {});
});
});

View File

@ -11,6 +11,8 @@ support-files =
[test_basic_autocomplete_form.html]
[test_basic_creditcard_autocomplete_form.html]
scheme=https
[test_creditcard_autocomplete_off.html]
scheme=https
[test_formautofill_preview_highlight.html]
[test_multiple_forms.html]
[test_on_address_submission.html]

View File

@ -19,8 +19,6 @@ Form autofill test: simple form address autofill
"use strict";
const {FormAutofillUtils} = SpecialPowers.Cu.import("resource://formautofill/FormAutofillUtils.jsm");
let MOCK_STORAGE = [{
organization: "Sesame Street",
"street-address": "123 Sesame Street.\n2-line\n3-line",

View File

@ -19,8 +19,6 @@ Form autofill test: simple form credit card autofill
"use strict";
const {FormAutofillUtils} = SpecialPowers.Cu.import("resource://formautofill/FormAutofillUtils.jsm");
const MOCK_STORAGE = [{
"cc-name": "John Doe",
"cc-number": "1234567812345678",
@ -38,14 +36,6 @@ const reducedMockRecord = {
"cc-number": "1234123456785678",
};
function patchRecordCCNumber(record) {
const ccNumber = record["cc-number"];
const normalizedCCNumber = "*".repeat(ccNumber.length - 4) + ccNumber.substr(-4);
const ccNumberFmt = FormAutofillUtils.fmtMaskedCreditCardLabel(normalizedCCNumber);
return Object.assign({}, record, {ccNumberFmt});
}
function checkElementFilled(element, expectedvalue) {
const focusedElem = document.activeElement;
const promises = [];

View File

@ -0,0 +1,98 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test basic autofill</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
<script type="text/javascript" src="formautofill_common.js"></script>
<script type="text/javascript" src="satchel_common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
Form autofill test: simple form credit card autofill
<script>
/* import-globals-from ../../../../../testing/mochitest/tests/SimpleTest/SpawnTask.js */
/* import-globals-from ../../../../../toolkit/components/satchel/test/satchel_common.js */
/* import-globals-from formautofill_common.js */
"use strict";
const MOCK_STORAGE = [{
"cc-name": "John Doe",
"cc-number": "1234567812345678",
"cc-exp-month": 4,
"cc-exp-year": 2017,
}, {
"cc-name": "Timothy Berners-Lee",
"cc-number": "1111222233334444",
"cc-exp-month": 12,
"cc-exp-year": 2022,
}];
async function setupCreditCardStorage() {
await addCreditCard(MOCK_STORAGE[0]);
await addCreditCard(MOCK_STORAGE[1]);
}
async function setupFormHistory() {
await updateFormHistory([
{op: "add", fieldname: "cc-name", value: "John Smith"},
{op: "add", fieldname: "cc-number", value: "1234000056780000"},
]);
}
initPopupListener();
// Show Form History popup for non-autocomplete="off" field only
add_task(async function history_only_menu_checking() {
await setupFormHistory();
await setInput("#cc-number", "");
doKey("down");
await expectPopup();
checkMenuEntries(["1234000056780000"], false);
await setInput("#cc-name", "");
doKey("down");
await notExpectPopup();
});
// Show Form Autofill popup for the credit card fields.
add_task(async function check_menu_when_both_with_autocomplete_off() {
await setupCreditCardStorage();
await setInput("#cc-number", "");
doKey("down");
await expectPopup();
checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
primaryAffix: cc.ccNumberFmt.affix,
primary: cc.ccNumberFmt.label,
secondary: cc["cc-name"],
})));
await setInput("#cc-name", "");
doKey("down");
await expectPopup();
checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
primary: cc["cc-name"],
secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
})));
});
</script>
<p id="display"></p>
<div id="content">
<form id="form1">
<p>This is a Credit Card form with autocomplete="off" cc-name field.</p>
<p><label>Name: <input id="cc-name" autocomplete="off"></label></p>
<p><label>Card Number: <input id="cc-number" autocomplete="cc-number"></label></p>
</form>
</div>
<pre id="test"></pre>
</body>
</html>

View File

@ -377,6 +377,8 @@
@RESPATH@/browser/components/devtools-startup.js
@RESPATH@/browser/components/aboutdebugging-registration.js
@RESPATH@/browser/components/aboutdebugging.manifest
@RESPATH@/browser/components/aboutdevtools-registration.js
@RESPATH@/browser/components/aboutdevtools.manifest
@RESPATH@/browser/components/Experiments.manifest
@RESPATH@/browser/components/ExperimentsService.js
@RESPATH@/browser/components/browser-newtab.xpt

View File

@ -431,14 +431,6 @@ These should match what Safari and other Apple applications use on OS X Lion. --
<!ENTITY urlbar.extension.label "Extension:">
<!ENTITY urlbar.switchToTab.label "Switch to tab:">
<!ENTITY urlbar.searchSuggestionsNotification.question "Would you like to improve your search experience with suggestions?">
<!ENTITY urlbar.searchSuggestionsNotification.learnMore "Learn more…">
<!ENTITY urlbar.searchSuggestionsNotification.learnMore.accesskey "l">
<!ENTITY urlbar.searchSuggestionsNotification.disable "No">
<!ENTITY urlbar.searchSuggestionsNotification.disable.accesskey "n">
<!ENTITY urlbar.searchSuggestionsNotification.enable "Yes">
<!ENTITY urlbar.searchSuggestionsNotification.enable.accesskey "y">
<!-- LOCALIZATION NOTE (urlbar.searchSuggestionsNotification.hintPrefix): Shown just before the suggestions opt-out hint. -->
<!ENTITY urlbar.searchSuggestionsNotification.hintPrefix "Tip:">
<!-- LOCALIZATION NOTE (urlbar.searchSuggestionsNotification.hint): &#x1F50E; is the magnifier icon emoji, please don't change it. -->

View File

@ -98,7 +98,6 @@
locale/browser/searchplugins/list.json (.deps/generated_@AB_CD@/list.json)
#endif
locale/browser/searchplugins/images/amazon.ico (searchplugins/images/amazon.ico)
locale/browser/searchplugins/images/ebay.ico (searchplugins/images/ebay.ico)
locale/browser/searchplugins/images/wikipedia.ico (searchplugins/images/wikipedia.ico)
locale/browser/searchplugins/images/yahoo.ico (searchplugins/images/yahoo.ico)
locale/browser/searchplugins/images/yandex-en.ico (searchplugins/images/yandex-en.ico)

View File

@ -9,9 +9,7 @@
"google": "google-nocodes"
},
"CA": {
"google": "google-nocodes",
"ebay": "ebay-ca",
"ebay-fr": "ebay-ca"
"google": "google-nocodes"
},
"KZ": {
"google": "google-nocodes"
@ -33,40 +31,13 @@
},
"HK": {
"google": "google-nocodes"
},
"AT": {
"ebay-de": "ebay-at"
},
"AU": {
"ebay": "ebay-au",
"ebay-uk": "ebay-au"
},
"BE": {
"ebay": "ebay-be",
"ebay-nl": "ebay-be",
"ebay-fr": "ebay-be"
},
"CH": {
"ebay": "ebay-ch",
"ebay-de": "ebay-ch",
"ebay-fr": "ebay-ch"
},
"IE": {
"ebay": "ebay-ie",
"ebay-uk": "ebay-ie"
},
"NL": {
"ebay": "ebay-nl"
},
"GB": {
"ebay": "ebay-gb"
}
},
"locales": {
"en-US": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo", "amazondotcom", "bing", "ddg", "ebay", "twitter", "wikipedia"
"google", "yahoo", "amazondotcom", "bing", "ddg", "twitter", "wikipedia"
]
},
"experimental-hidden": {
@ -92,7 +63,7 @@
"an": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-es", "bing", "ebay-es", "wikipedia-an", "ddg", "twitter"
"google", "yahoo-es", "bing", "wikipedia-an", "ddg", "twitter"
]
}
},
@ -113,7 +84,7 @@
"ast": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-es", "bing", "diccionariu-alla", "ddg", "ebay-es", "wikipedia-ast"
"google", "yahoo-es", "bing", "diccionariu-alla", "ddg", "wikipedia-ast"
]
}
},
@ -155,7 +126,7 @@
"br": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-france", "amazon-france", "ddg", "ebay-fr", "freelang", "klask", "wikipedia-br"
"google", "yahoo-france", "amazon-france", "ddg", "freelang", "klask", "wikipedia-br"
]
}
},
@ -169,7 +140,7 @@
"ca": {
"default": {
"visibleDefaultEngines": [
"google", "bing", "diec2", "ddg", "ebay-es", "twitter", "wikipedia-ca"
"google", "bing", "diec2", "ddg", "twitter", "wikipedia-ca"
]
}
},
@ -190,7 +161,7 @@
"cy": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-en-GB", "amazon-en-GB", "ddg", "ebay-uk", "palasprint", "termau", "wikipedia-cy"
"google", "yahoo-en-GB", "amazon-en-GB", "ddg", "palasprint", "termau", "wikipedia-cy"
]
}
},
@ -204,14 +175,14 @@
"de": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-de", "amazondotcom-de", "bing", "ddg", "ebay-de", "leo_ende_de", "wikipedia-de"
"google", "yahoo-de", "amazondotcom-de", "bing", "ddg", "leo_ende_de", "wikipedia-de"
]
}
},
"dsb": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-de", "bing", "amazondotcom-de", "ddg", "ebay-de", "leo_ende_de", "wikipedia-dsb"
"google", "yahoo-de", "bing", "amazondotcom-de", "ddg", "leo_ende_de", "wikipedia-dsb"
]
}
},
@ -225,7 +196,7 @@
"en-GB": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-en-GB", "bing", "amazon-en-GB", "chambers-en-GB", "ddg", "ebay-uk", "twitter", "wikipedia"
"google", "yahoo-en-GB", "bing", "amazon-en-GB", "chambers-en-GB", "ddg", "twitter", "wikipedia"
]
},
"experimental-hidden": {
@ -265,7 +236,7 @@
"es-ES": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-es", "bing", "drae", "ddg", "ebay-es", "twitter", "wikipedia-es"
"google", "yahoo-es", "bing", "drae", "ddg", "twitter", "wikipedia-es"
]
}
},
@ -286,7 +257,7 @@
"eu": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo", "bing", "amazon-en-GB", "ddg", "ebay-es", "elebila", "wikipedia-eu"
"google", "yahoo", "bing", "amazon-en-GB", "ddg", "elebila", "wikipedia-eu"
]
}
},
@ -314,35 +285,35 @@
"fr": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-france", "bing", "amazon-france", "ddg", "ebay-fr", "cnrtl-tlfi-fr", "wikipedia-fr"
"google", "yahoo-france", "bing", "amazon-france", "ddg", "cnrtl-tlfi-fr", "wikipedia-fr"
]
}
},
"fy-NL": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-fy-NL", "bing", "bolcom-fy-NL", "ddg", "ebay-nl", "marktplaats-fy-NL", "wikipedia-fy-NL"
"google", "yahoo-fy-NL", "bing", "bolcom-fy-NL", "ddg", "marktplaats-fy-NL", "wikipedia-fy-NL"
]
}
},
"ga-IE": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-en-GB", "amazon-en-GB", "ddg", "ebay-ie", "tearma", "twitter", "wikipedia-ga-IE"
"google", "yahoo-en-GB", "amazon-en-GB", "ddg", "tearma", "twitter", "wikipedia-ga-IE"
]
}
},
"gd": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-en-GB", "amazon-en-GB", "bbc-alba", "ddg", "ebay-uk", "faclair-beag", "wikipedia-gd"
"google", "yahoo-en-GB", "faclair-beag", "amazon-en-GB", "bbc-alba", "ddg", "wikipedia-gd"
]
}
},
"gl": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-es", "amazon-en-GB", "ddg", "ebay-es", "wikipedia-gl"
"google", "yahoo-es", "amazon-en-GB", "ddg", "wikipedia-gl"
]
}
},
@ -384,7 +355,7 @@
"hsb": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-de", "bing", "amazondotcom-de", "ddg", "ebay-de", "leo_ende_de", "wikipedia-hsb"
"google", "yahoo-de", "bing", "amazondotcom-de", "ddg", "leo_ende_de", "wikipedia-hsb"
]
}
},
@ -426,7 +397,7 @@
"it": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-it", "bing", "amazon-it", "ddg", "ebay-it", "hoepli", "wikipedia-it"
"google", "yahoo-it", "bing", "amazon-it", "ddg", "hoepli", "wikipedia-it"
]
}
},
@ -489,7 +460,7 @@
"lij": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-it", "bing", "amazon-it", "ddg", "ebay-it", "paroledigenova-lij", "wikipedia-lij"
"google", "yahoo-it", "bing", "amazon-it", "ddg", "paroledigenova-lij", "wikipedia-lij"
]
}
},
@ -580,7 +551,7 @@
"nl": {
"default": {
"visibleDefaultEngines": [
"google", "bing", "bolcom-nl", "ddg", "ebay-nl", "marktplaats-nl", "wikipedia-nl"
"google", "bing", "bolcom-nl", "ddg", "marktplaats-nl", "wikipedia-nl"
]
}
},
@ -629,7 +600,7 @@
"rm": {
"default": {
"visibleDefaultEngines": [
"google", "yahoo-ch", "bing", "ddg", "ebay-ch", "leo_ende_de-rm", "pledarigrond", "wikipedia-rm"
"google", "yahoo-ch", "bing", "ddg", "leo_ende_de-rm", "pledarigrond", "wikipedia-rm"
]
}
},

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/5221-53469-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.at/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.at/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/705-53470-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.com.au/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.com.au/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/1553-53471-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.befr.ebay.be/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.at/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/706-53473-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.ca/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.ca/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/5222-53480-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.ch/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.ch/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/707-53477-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.de/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.de/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/1185-53479-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.es/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.es/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/709-53476-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.fr/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.fr/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/5282-53468-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.ie/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.ie/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/724-53478-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.it/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.it/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/1346-53482-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.nl/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.nl/</SearchForm>
</SearchPlugin>

View File

@ -1,19 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/710-53481-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.co.uk/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.co.uk/</SearchForm>
</SearchPlugin>

View File

@ -1,17 +0,0 @@
<!-- 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/. -->
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>eBay</ShortName>
<Description>eBay - Online auctions</Description>
<Image width="16" height="16">resource://search-plugins/images/ebay.ico</Image>
<Url type="text/html" method="GET" template="https://rover.ebay.com/rover/1/711-53200-19255-0/1" resultdomain="ebay.com">
<Param name="ff3" value="4"/>
<Param name="toolid" value="20004"/>
<Param name="campid" value="5338192028"/>
<Param name="customid" value=""/>
<Param name="mpre" value="https://www.ebay.com/sch/{searchTerms}" />
</Url>
<SearchForm>https://www.ebay.com/</SearchForm>
</SearchPlugin>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -520,6 +520,10 @@ tabbrowser {
left: 0;
}
#tabbrowser-tabs[positionpinnedtabs] > .tabbrowser-tab[pinned] > .tab-stack {
border-inline-end: 1px solid transparent;
}
.tabbrowser-tab:-moz-any([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected="true"]),
.tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected="true"]) {
background-image: url(chrome://browser/skin/tabbrowser/indicator-tab-attention.svg);

View File

@ -11,58 +11,6 @@
max-height: 5em;
}
/* Opt-in notification */
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] > hbox[anonid="search-suggestions-opt-in"] {
padding: 6px 0;
padding-inline-start: 44px;
background-color: hsla(210, 4%, 10%, 0.07);
background-image: url("chrome://browser/skin/info.svg");
background-clip: padding-box;
background-position: 20px center;
background-repeat: no-repeat;
background-size: 16px 16px;
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] > hbox[anonid="search-suggestions-opt-in"]:-moz-locale-dir(rtl) {
background-position: right 20px center;
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] > hbox[anonid="search-suggestions-opt-in"] > description {
margin: 0;
padding: 0;
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] > hbox[anonid="search-suggestions-opt-in"] > description > label.text-link {
margin-inline-start: 0;
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] button {
-moz-appearance: none;
min-width: 80px;
border-radius: 3px;
margin: 0;
margin-inline-start: 10px;
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] button[anonid="search-suggestions-notification-disable"] {
color: hsl(210, 0%, 38%);
background-color: hsl(210, 0%, 88%);
border: 1px solid hsl(210, 0%, 82%);
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] button[anonid="search-suggestions-notification-disable"]:hover {
background-color: hsl(210, 0%, 84%);
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] button[anonid="search-suggestions-notification-enable"] {
color: white;
background-color: hsl(93, 82%, 44%);
border: 1px solid hsl(93, 82%, 44%);
}
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] button[anonid="search-suggestions-notification-enable"]:hover {
background-color: hsl(93, 82%, 40%);
}
/* Opt-out hint */
#PopupAutoCompleteRichResult > deck[anonid="search-suggestions-notification"] > hbox[anonid="search-suggestions-opt-out"] {

View File

@ -47,7 +47,7 @@ buildscript {
url repository
}
}
// For dexcount-gradle-plugin and other in tree plugins.
// For in tree plugins.
maven {
url "file://${gradle.mozconfig.topsrcdir}/mobile/android/gradle/m2repo"
}

View File

@ -17,6 +17,7 @@
"patches": [
"llvm-debug-frame.patch",
"r277806.patch",
"r285657.patch"
"r285657.patch",
"r313872-for-3.9.patch"
]
}

View File

@ -0,0 +1,17 @@
--- a/llvm/tools/dsymutil/DwarfLinker.cpp
+++ b/llvm/tools/dsymutil/DwarfLinker.cpp
@@ -1489,8 +1489,12 @@
uint64_t RefOffset = *RefValue.getAsReference(&Unit);
if ((RefCU = getUnitForOffset(Units, RefOffset)))
- if (const auto *RefDie = RefCU->getOrigUnit().getDIEForOffset(RefOffset))
- return RefDie;
+ if (const auto *RefDie = RefCU->getOrigUnit().getDIEForOffset(RefOffset)) {
+ // In a file with broken references, an attribute might point to a NULL
+ // DIE.
+ if(!RefDie->isNULL())
+ return RefDie;
+ }
Linker.reportWarning("could not find referenced DIE", &Unit, &DIE);
return nullptr;

View File

@ -67,7 +67,7 @@ def GeckoBinary(linkage='dependent', msvcrt='dynamic', mozglue=None):
else:
error('`mozglue` must be "program" or "library"')
if not CONFIG['JS_STANDALONE']:
if CONFIG['MOZ_WIDGET_TOOLKIT']:
USE_LIBS += [
'fallible',
]

View File

@ -739,7 +739,7 @@ nsChromeRegistryChrome::ManifestLocale(ManifestProcessingContext& cx, int lineno
if (mainPackage.Equals(package)) {
// We should refresh the LocaleService, since the available
// locales changed.
LocaleService::GetInstance()->OnAvailableLocalesChanged();
LocaleService::GetInstance()->AvailableLocalesChanged();
}
}

View File

@ -135,6 +135,9 @@ class MockedOpen(object):
will thus open the virtual file instance for the file 'foo' to f.
If the content of a file is given as None, then that file will be
represented as not existing (even if it does, actually, exist).
MockedOpen also masks writes, so that creating or replacing files
doesn't touch the file system, while subsequently opening the file
will return the recorded content.
@ -154,7 +157,10 @@ class MockedOpen(object):
if 'w' in mode:
file = MockedFile(self, absname)
elif absname in self.files:
file = MockedFile(self, absname, self.files[absname])
content = self.files[absname]
if content is None:
raise IOError(2, 'No such file or directory')
file = MockedFile(self, absname, content)
elif 'a' in mode:
file = MockedFile(self, absname, self.open(name, 'r').read())
else:
@ -183,17 +189,16 @@ class MockedOpen(object):
def _wrapped_exists(self, p):
return (self._wrapped_isfile(p) or
self._wrapped_isdir(p) or
self._orig_path_exists(p))
self._wrapped_isdir(p))
def _wrapped_isfile(self, p):
p = normcase(p)
if p in self.files:
return True
return self.files[p] is not None
abspath = normcase(os.path.abspath(p))
if abspath in self.files:
return True
return self.files[abspath] is not None
return self._orig_path_isfile(p)
@ -207,7 +212,7 @@ class MockedOpen(object):
if any(f.startswith(abspath) for f in self.files):
return True
return self._orig_path_exists(p)
return self._orig_path_isdir(p)
def main(*args, **kwargs):

View File

@ -919,12 +919,7 @@ ifdef MOZ_USING_SCCACHE
sccache_wrap := RUSTC_WRAPPER='$(CCACHE)'
endif
# XXX hack to work around dsymutil failing on cross-OSX builds (bug 1380381)
ifeq ($(HOST_OS_ARCH)-$(OS_ARCH),Linux-Darwin)
default_rustflags += -C debuginfo=1
else
default_rustflags += -C debuginfo=2
endif
# We use the + prefix to pass down the jobserver fds to cargo, but we
# don't use the prefix when make -n is used, so that cargo doesn't run

View File

@ -11,6 +11,8 @@ const { loader } = Components.utils.import(
"resource://devtools/shared/Loader.jsm", {});
const { BrowserLoader } = Components.utils.import(
"resource://devtools/client/shared/browser-loader.js", {});
const { Services } = Components.utils.import(
"resource://gre/modules/Services.jsm", {});
loader.lazyRequireGetter(this, "DebuggerClient",
"devtools/shared/client/debugger-client", true);
@ -31,6 +33,12 @@ const AboutDebuggingApp = createFactory(require("./components/aboutdebugging"));
var AboutDebugging = {
init() {
if (!Services.prefs.getBoolPref("devtools.enabled", true)) {
// If DevTools are disabled, navigate to about:devtools.
window.location = "about:devtools?reason=AboutDebugging";
return;
}
if (!DebuggerServer.initialized) {
DebuggerServer.init();
}
@ -53,8 +61,10 @@ var AboutDebugging = {
destroy() {
unmountComponentAtNode(document.querySelector("#body"));
this.client.close();
this.client = null;
if (this.client) {
this.client.close();
this.client = null;
}
},
};

View File

@ -43,24 +43,6 @@ this.DevToolsShim = {
_gDevTools: null,
listeners: [],
/**
* Lazy getter for the `gDevTools` instance. Should only be called when users interacts
* with DevTools as it will force loading them.
*
* @return {DevTools} a devtools instance (from client/framework/devtools)
*/
get gDevTools() {
if (!this.isInstalled()) {
throw new Error(`Trying to interact with DevTools, but they are not installed`);
}
if (!this.isInitialized()) {
this._initDevTools();
}
return this._gDevTools;
},
/**
* Check if DevTools are currently installed (but not necessarily initialized).
*
@ -147,6 +129,7 @@ this.DevToolsShim = {
if (!this.isInitialized()) {
return;
}
this._gDevTools.saveDevToolsSession(state);
},
@ -155,11 +138,12 @@ this.DevToolsShim = {
* opened scratchpad windows and browser console.
*/
restoreDevToolsSession: function (session) {
if (!this.isInstalled()) {
let devtoolsReady = this._maybeInitializeDevTools();
if (!devtoolsReady) {
return;
}
this.gDevTools.restoreDevToolsSession(session);
this._gDevTools.restoreDevToolsSession(session);
},
/**
@ -176,28 +160,12 @@ this.DevToolsShim = {
* markup view or that resolves immediately if DevTools are not installed.
*/
inspectNode: function (tab, selectors) {
if (!this.isInstalled()) {
let devtoolsReady = this._maybeInitializeDevTools("ContextMenu");
if (!devtoolsReady) {
return Promise.resolve();
}
// Initialize DevTools explicitly to pass the "ContextMenu" reason to telemetry.
if (!this.isInitialized()) {
this._initDevTools("ContextMenu");
}
return this.gDevTools.inspectNode(tab, selectors);
},
/**
* Initialize DevTools via the devtools-startup command line handler component.
* Overridden in tests.
*
* @param {String} reason
* optional, if provided should be a valid entry point for DEVTOOLS_ENTRY_POINT
* in toolkit/components/telemetry/Histograms.json
*/
_initDevTools: function (reason) {
DevtoolsStartup.initDevTools(reason);
return this._gDevTools.inspectNode(tab, selectors);
},
_onDevToolsRegistered: function () {
@ -208,6 +176,30 @@ this.DevToolsShim = {
this.listeners = [];
},
/**
* Should be called if a shim method attempts to initialize devtools.
* - if DevTools are already initialized, returns true.
* - if DevTools are not initialized, call initDevTools from devtools-startup:
* - if devtools.enabled is true, DevTools will synchronously initialize and the
* method will return true.
* - if devtools.enabled is false, DevTools installation flow will start and the
* method will return false
*
* @param {String} reason
* optional, if provided should be a valid entry point for DEVTOOLS_ENTRY_POINT
* in toolkit/components/telemetry/Histograms.json
*/
_maybeInitializeDevTools: function (reason) {
// Attempt to initialize DevTools, which should be synchronous.
if (!this.isInitialized()) {
DevtoolsStartup.initDevTools(reason);
}
// The initialization process can lead to show the user installation screen, in this
// case this.isInitialized() will still be false after calling initDevTools().
return this.isInitialized();
}
};
/**
@ -226,6 +218,11 @@ let webExtensionsMethods = [
for (let method of webExtensionsMethods) {
this.DevToolsShim[method] = function () {
return this.gDevTools[method].apply(this.gDevTools, arguments);
let devtoolsReady = this._maybeInitializeDevTools();
if (!devtoolsReady) {
throw new Error("Could not call a DevToolsShim webextension method ('" + method +
"'): DevTools are not initialized.");
}
return this._gDevTools[method].apply(this._gDevTools, arguments);
};
}

View File

@ -0,0 +1,43 @@
/* 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";
// Register the about:devtools URL, that is opened whenever a user attempts to open
// DevTools for the first time.
const Ci = Components.interfaces;
const Cu = Components.utils;
const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
const { nsIAboutModule } = Ci;
function AboutDevtools() {}
AboutDevtools.prototype = {
uri: Services.io.newURI("chrome://devtools-shim/content/aboutdevtools/aboutdevtools.xhtml"),
classDescription: "about:devtools",
classID: Components.ID("3a16d383-92bd-4c24-ac10-0e2bd66883ab"),
contractID: "@mozilla.org/network/protocol/about;1?what=devtools",
QueryInterface: XPCOMUtils.generateQI([nsIAboutModule]),
newChannel: function (uri, loadInfo) {
let chan = Services.io.newChannelFromURIWithLoadInfo(
this.uri,
loadInfo
);
chan.owner = Services.scriptSecurityManager.getSystemPrincipal();
return chan;
},
getURIFlags: function (uri) {
return nsIAboutModule.ALLOW_SCRIPT;
}
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([
AboutDevtools
]);

View File

@ -0,0 +1,97 @@
.box {
width: 980px;
display: flex;
align-items: center;
height: 400px;
}
.wrapper {
display: flex;
flex-direction: column;
position: absolute;
align-items: center;
width: 100%;
}
.left-pane {
width: 360px;
background-image: url(images/otter.png);
background-size: 100%;
background-position: 50%;
background-repeat: no-repeat;
height: 100%;
flex-shrink: 0;
}
.message {
line-height: 1.6em;
}
.right-pane {
height: 250px;
}
.features {
max-width: 980px;
border-top: 1px solid #d7d7db;
}
.features-list {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 40px 20px;
margin: 40px;
padding: 0;
}
.feature {
list-style: none;
text-align: center;
}
.feature-desc {
margin: 1em 20px
}
a {
color: #0A84FF;
}
h1 {
font-size: 36px;
margin-top: 16px;
font-weight: 300;
line-height: 44px;
}
.installpage-button {
display: block;
margin-top: 2em;
padding: 10px 20px;
border: none;
border-radius: 3px;
font-size: 15px;
font-weight: 600;
line-height: 21px;
background-color: #0060df;
color: #fff;
box-shadow: 0 1px 0 rgba(0,0,0,0.23);
cursor: pointer;
}
.installpage-button:enabled:hover {
background-color: #003eaa
}
/* Remove light gray outline when clicking on the button */
.installpage-button::-moz-focus-inner {
border: 0;
}
[hidden="true"] {
display: none;
}

View File

@ -0,0 +1,82 @@
/* 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";
const { utils: Cu } = Components;
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
const DEVTOOLS_ENABLED_PREF = "devtools.enabled";
const MESSAGES = {
AboutDebugging: "about-debugging-message",
ContextMenu: "inspect-element-message",
HamburgerMenu: "menu-message",
KeyShortcut: "key-shortcut-message",
SystemMenu: "menu-message",
};
// URL constructor doesn't support about: scheme,
// we have to use http in order to have working searchParams.
let url = new URL(window.location.href.replace("about:", "http://"));
let reason = url.searchParams.get("reason");
function getToolboxShortcut() {
const bundleUrl = "chrome://devtools-shim/locale/key-shortcuts.properties";
const bundle = Services.strings.createBundle(bundleUrl);
const modifier = Services.appinfo.OS == "Darwin" ? "Cmd+Opt+" : "Ctrl+Shift+";
return modifier + bundle.GetStringFromName("toggleToolbox.commandkey");
}
function onInstallButtonClick() {
Services.prefs.setBoolPref("devtools.enabled", true);
}
function updatePage() {
const installPage = document.getElementById("install-page");
const welcomePage = document.getElementById("welcome-page");
const isEnabled = Services.prefs.getBoolPref("devtools.enabled");
if (isEnabled) {
installPage.setAttribute("hidden", "true");
welcomePage.removeAttribute("hidden");
} else {
welcomePage.setAttribute("hidden", "true");
installPage.removeAttribute("hidden");
}
}
window.addEventListener("load", function () {
const inspectorShortcut = getToolboxShortcut();
const welcomeMessage = document.getElementById("welcome-message");
welcomeMessage.textContent = welcomeMessage.textContent.replace(
"##INSPECTOR_SHORTCUT##", inspectorShortcut);
Services.prefs.addObserver(DEVTOOLS_ENABLED_PREF, updatePage);
// Set the appropriate title message.
if (reason == "ContextMenu") {
document.getElementById("inspect-title").removeAttribute("hidden");
} else {
document.getElementById("common-title").removeAttribute("hidden");
}
// Display the message specific to the reason
let id = MESSAGES[reason];
if (id) {
let message = document.getElementById(id);
message.removeAttribute("hidden");
}
let installButton = document.getElementById("install");
installButton.addEventListener("click", onInstallButtonClick);
// Update the current page based on the current value of DEVTOOLS_ENABLED_PREF.
updatePage();
}, { once: true });
window.addEventListener("unload", function () {
let installButton = document.getElementById("install");
installButton.removeEventListener("click", onInstallButtonClick);
Services.prefs.removeObserver(DEVTOOLS_ENABLED_PREF, updatePage);
}, {once: true});

View File

@ -0,0 +1,2 @@
component {3a16d383-92bd-4c24-ac10-0e2bd66883ab} aboutdevtools-registration.js
contract @mozilla.org/network/protocol/about;1?what=devtools {3a16d383-92bd-4c24-ac10-0e2bd66883ab}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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/. -->
<!DOCTYPE html [
<!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> %htmlDTD;
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> %globalDTD;
<!ENTITY % aboutdevtoolsDTD SYSTEM "chrome://devtools-shim/locale/aboutdevtools.dtd"> %aboutdevtoolsDTD;
]>
<html xmlns="http://www.w3.org/1999/xhtml" dir="&locale.dir;">
<head>
<title>&aboutDevtools.headTitle;</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>a
<link rel="stylesheet" href="chrome://global/skin/in-content/common.css" type="text/css"/>
<link rel="stylesheet" href="chrome://devtools-shim/content/aboutdevtools/aboutdevtools.css" type="text/css"/>
<script type="application/javascript" src="chrome://devtools-shim/content/aboutdevtools/aboutdevtools.js"></script>
</head>
<body>
<div id="install-page" class="wrapper" hidden="true">
<div class="box">
<div class="left-pane" />
<div class="right-pane">
<h1 id="common-title" hidden="true">&aboutDevtools.enable.title;</h1>
<h1 id="inspect-title" hidden="true">&aboutDevtools.enable.inspectElementTitle;</h1>
<!-- Include all the possible message, hidden by default
as we can't lazily load localized strings from dtd -->
<p class="message" id="about-debugging-message" hidden="true">&aboutDevtools.enable.aboutDebuggingMessage;</p>
<p class="message" id="menu-message" hidden="true">&aboutDevtools.enable.menuMessage;</p>
<p class="message" id="key-shortcut-message" hidden="true">&aboutDevtools.enable.keyShortcutMessage;</p>
<p class="message" id="inspect-element-message" hidden="true">&aboutDevtools.enable.inspectElementMessage;</p>
<p class="message">&aboutDevtools.enable.commonMessage;</p>
<a href="https://developer.mozilla.org/docs/Tools" target="_blank">&aboutDevtools.enable.learnMoreLink;</a>
<button class="installpage-button" id="install">&aboutDevtools.enable.installButton;</button>
</div>
</div>
</div>
<!-- This page, hidden by default is displayed once the add-on is installed -->
<div id="welcome-page" class="wrapper" hidden="true">
<div class="box">
<div class="left-pane" />
<div class="right-pane">
<h1>&aboutDevtools.welcome.title;</h1>
<p class="message" id="welcome-message">&aboutDevtools.welcome.message;</p>
</div>
</div>
<div class="features">
<ul class="features-list">
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-inspector.svg" alt=""/>
<h3 class="feature-name">Inspector</h3>
<p class="feature-desc">Inspect and refine code to build pixel-perfect layouts.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-console.svg" alt=""/>
<h3 class="feature-name">Console</h3>
<p class="feature-desc">Track CSS, JavaScript, security and network issues.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-debugger.svg" alt=""/>
<h3 class="feature-name">Debugger</h3>
<p class="feature-desc">Powerful JavaScript debugger with support for your framework.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-network.svg" alt=""/>
<h3 class="feature-name">Network</h3>
<p class="feature-desc">Monitor network requests that can slow or block your site.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-storage.svg" alt=""/>
<h3 class="feature-name">Storage panel</h3>
<p class="feature-desc">Add, modify and remove cache, cookies, databases and session data.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-responsive-mode.svg" alt=""/>
<h3 class="feature-name">Responsive Design Mode</h3>
<p class="feature-desc">Test sites on emulated devices in your browser.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-visual-editing.svg" alt=""/>
<h3 class="feature-name">Visual Editing</h3>
<p class="feature-desc">Fine-tune animations, alignment and padding.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-performance.svg" alt=""/>
<h3 class="feature-name">Performance</h3>
<p class="feature-desc">Unblock bottlenecks, streamline processes, optimize assets.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-memory.svg" alt=""/>
<h3 class="feature-name">Memory</h3>
<p class="feature-desc">Find memory leaks and make your application zippy.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-web-audio.svg" alt=""/>
<h3 class="feature-name">Web Audio</h3>
<p class="feature-desc">The only developer tool for inspecting the Web Audio API.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-scratchpad.svg" alt=""/>
<h3 class="feature-name">Scratchpad</h3>
<p class="feature-desc">Edit, write, run and execute JavaScript in real time.</p>
</li>
<li class="feature">
<img class="feature-icon" src="chrome://devtools-shim/content/aboutdevtools/images/feature-style-editor.svg" alt=""/>
<h3 class="feature-name">Style Editor</h3>
<p class="feature-desc">Edit and manage all your CSS stylesheets in your browser.</p>
</li>
</ul>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Console</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-502.000000, -2865.000000)">
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
<g id="Page-1" transform="translate(555.000000, 2887.000000)">
<path d="M116.75859,15.6454747 L116.75859,74.4046313 C116.75859,78.9611253 112.762065,82.6539446 107.832465,82.6539446 L8.926515,82.6539446 C3.996915,82.6539446 0.00039,78.9611253 0.00039,74.4046313 L0.00039,15.6454747" id="Stroke-1" stroke="#0080FF" stroke-width="5"></path>
<path d="M114.359603,0.99990241 L2.3993775,0.99990241 C1.0743525,0.99990241 -9.75000003e-05,2.07534819 -9.75000003e-05,3.4016012 L-9.75000003e-05,14.9621554 L116.758103,14.9621554 L116.758103,3.4016012 C116.758103,2.07534819 115.684628,0.99990241 114.359603,0.99990241" id="Fill-3" fill="#0080FF"></path>
<path d="M114.359603,-9.75903613e-05 L78.8554687,-9.75903613e-05 L2.3993775,-9.75903613e-05 C1.0743525,-9.75903613e-05 -9.75000003e-05,1.07534819 -9.75000003e-05,2.4016012 L-9.75000003e-05,13.9621554 L116.758103,13.9621554 L116.758103,2.4016012 C116.758103,1.07534819 115.684628,-9.75903613e-05 114.359603,-9.75903613e-05 Z" id="Stroke-5" stroke="#0080FF" stroke-width="5"></path>
<path d="M9.117225,7.88080361 C9.117225,9.64230964 7.689825,11.0710325 5.92995,11.0710325 C4.170075,11.0710325 2.742675,9.64230964 2.742675,7.88080361 C2.742675,6.11832169 4.170075,4.6895988 5.92995,4.6895988 C7.689825,4.6895988 9.117225,6.11832169 9.117225,7.88080361" id="Fill-7" fill="#FFFFFF"></path>
<path d="M19.7446275,7.88080361 C19.7446275,9.64230964 18.3182025,11.0710325 16.5573525,11.0710325 C14.7974775,11.0710325 13.3700775,9.64230964 13.3700775,7.88080361 C13.3700775,6.11832169 14.7974775,4.6895988 16.5573525,4.6895988 C18.3182025,4.6895988 19.7446275,6.11832169 19.7446275,7.88080361" id="Fill-9" fill="#FFFFFF"></path>
<path d="M30.13023,7.88080361 C30.13023,9.64230964 28.70283,11.0710325 26.942955,11.0710325 C25.18308,11.0710325 23.75568,9.64230964 23.75568,7.88080361 C23.75568,6.11832169 25.18308,4.6895988 26.942955,4.6895988 C28.70283,4.6895988 30.13023,6.11832169 30.13023,7.88080361" id="Fill-11" fill="#FFFFFF"></path>
<polyline id="Stroke-13" stroke="#00C7D8" stroke-width="3" stroke-linecap="round" points="13.863242 53.3297773 19.986242 59.4574761 13.863242 65.5871267"></polyline>
<path d="M25.574659,67 L38.160934,67" id="Stroke-15" stroke="#00C7D8" stroke-width="3" stroke-linecap="round"></path>
</g>
<rect id="Rectangle-5" fill="#1C2142" x="615" y="2913" width="46" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" fill="#1C2142" x="567" y="2913" width="40" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" fill="#1C2142" x="623" y="2925" width="26" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" fill="#1C2142" x="567" y="2925" width="50" height="3" rx="1.5"></rect>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Debugger</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-843.000000, -2865.000000)">
<g id="Group-11" transform="translate(892.000000, 2893.000000)">
<g id="Page-1" transform="translate(4.032520, 0.000000)" stroke="#0080FF" stroke-width="4" stroke-linecap="round">
<path d="M101.173069,18.4397779 L101.173069,14.4680499 C101.173069,11.4317399 103.618565,8.9694856 106.635539,8.9694856 L117.258565,8.9694856" id="Stroke-1"></path>
<polyline id="Stroke-3" points="111.688269 2.54689767 118.069417 8.97002819 111.688269 15.3931587"></polyline>
<path d="M89.3390484,28 L97.1187005,28" id="Stroke-5"></path>
<path d="M104.283097,28 L112.063828,28" id="Stroke-7"></path>
<path d="M44.237984,28 L53.1153058,28" id="Stroke-16"></path>
<path d="M61.2894936,28 L70.1668153,28" id="Stroke-18"></path>
<path d="M47.537031,0.000325551471 L52.0409266,0.000325551471 C55.4827353,0.000325551471 58.2743527,2.80874957 58.2743527,6.27261722 L58.2743527,18.4710308" id="Stroke-20"></path>
<polyline id="Stroke-22" points="65.5557405 12.0750296 58.2742449 19.4031932 50.991671 12.0750296"></polyline>
<path d="M47.537031,0.000325551471 L52.0409266,0.000325551471 C55.4827353,0.000325551471 58.2743527,2.80874957 58.2743527,6.27261722 L58.2743527,18.4710308" id="Stroke-24"></path>
<polyline id="Stroke-26" points="65.5557405 12.0750296 58.2742449 19.4031932 50.991671 12.0750296"></polyline>
<path d="M3.81743446,28 L7.27973011,28" id="Stroke-28"></path>
<path d="M0.057215327,16.1793655 L2.74855446,12.0274991 C4.8058762,8.85445741 9.03050228,7.96027604 12.1833371,10.0307834 L23.2861892,17.3220512" id="Stroke-30"></path>
<polyline id="Stroke-32" points="21.8156571 6.78590337 24.1339179 17.8785271 13.1119353 20.2105608"></polyline>
<path d="M0.057215327,16.1793655 L2.74855446,12.0274991 C4.8058762,8.85445741 9.03050228,7.96027604 12.1833371,10.0307834 L23.2861892,17.3220512" id="Stroke-34"></path>
<polyline id="Stroke-36" points="21.8156571 6.78590337 24.1339179 17.8785271 13.1119353 20.2105608"></polyline>
</g>
<rect id="Rectangle-10" fill="#00C7D8" x="0" y="46.6764706" width="124" height="5" rx="2.5"></rect>
<rect id="Rectangle-10" fill="#0080FF" x="1" y="62.9117647" width="35.2299995" height="5" rx="2.5"></rect>
<rect id="Rectangle-10" fill="#1C2142" x="45.2764228" y="62.9117647" width="45.3658537" height="5" rx="2.5"></rect>
</g>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Inspector</title>
<desc>Created with Sketch.</desc>
<defs>
<polygon id="path-1" points="82.3351726 27.0750512 82.3351726 54.149836 0.391390693 54.149836 0.391390693 0.000266310669 82.3351726 0.000266310669 82.3351726 27.0750512"></polygon>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-145.000000, -2868.000000)">
<g id="Group-18" transform="translate(176.000000, 2877.000000)">
<g id="Group-6">
<g id="Page-1">
<g id="Group-14">
<path d="M104.972689,69.5181903 L40.5788803,69.5181903 C35.675454,69.5181903 31.6986882,65.5085545 31.6986882,60.5606493 L31.6986882,36.4173153 C31.6986882,31.4694101 35.675454,27.4597744 40.5788803,27.4597744 L104.972689,27.4597744 C109.877327,27.4597744 113.854092,31.4694101 113.854092,36.4173153 L113.854092,60.5606493 C113.854092,65.5085545 109.877327,69.5181903 104.972689,69.5181903" id="Fill-1" fill="#0080FF"></path>
<path d="M19.6363636,0.611219006 L19.6363636,97.7367656" id="Stroke-3" stroke="#0080FF" stroke-width="4" stroke-linecap="round"></path>
<path d="M125.181818,0.611219006 L125.181818,97.7367656" id="Stroke-5" stroke="#0080FF" stroke-width="4" stroke-linecap="round"></path>
<path d="M145.397489,13.5581395 L0.605902617,13.5581395" id="Stroke-7" stroke="#0080FF" stroke-width="4" stroke-linecap="round"></path>
<path d="M145.397489,82.5813953 L0.605902617,82.5813953" id="Stroke-9" stroke="#0080FF" stroke-width="4" stroke-linecap="round"></path>
</g>
<g id="Group-13" transform="translate(77.331874, 50.959169)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-12"></g>
<path d="M15.6361907,54.1501023 C7.21643156,54.1501023 0.391390693,47.2917149 0.391390693,38.8319126 L0.391390693,0.000266310669 L67.0894891,0.000266310669 C75.5092482,0.000266310669 82.3351726,6.85865373 82.3351726,15.318456 L82.3351726,38.8319126 C82.3351726,47.2917149 75.5092482,54.1501023 67.0894891,54.1501023 L15.6361907,54.1501023 Z" id="Fill-11" fill="#1C2142" mask="url(#mask-2)"></path>
</g>
</g>
<g id="Group-25" transform="translate(85.139034, 64.361849)" fill="#00C7D8">
<rect id="Rectangle-5" x="49.840151" y="0" width="15.6361258" height="2.94439966" rx="1.47219983"></rect>
<rect id="Rectangle-5" x="0" y="24.5366638" width="15.6361258" height="2.94439966" rx="1.47219983"></rect>
<rect id="Rectangle-5" x="20.5224151" y="24.5366638" width="15.6361258" height="2.94439966" rx="1.47219983"></rect>
<rect id="Rectangle-5" x="0" y="0" width="43.9766038" height="2.94439966" rx="1.47219983"></rect>
<rect id="Rectangle-5" x="0" y="12.7590652" width="65.4762768" height="2.94439966" rx="1.47219983"></rect>
</g>
</g>
</g>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Memory</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-846.000000, -3508.000000)">
<path d="M918,3609.05462 C918,3611.74049 920.178731,3613.9179 922.866215,3613.9179 L994.621505,3613.9179 C997.308989,3613.9179 999.48772,3611.74049 999.48772,3609.05462 L999.48772,3574.73675 C995.606387,3572.77699 992.938301,3569.64701 992.938301,3565.00403 C992.938301,3560.36017 995.606387,3557.23107 999.48772,3555.27131 L999.48772,3530.86328 C999.48772,3528.17742 997.308989,3526 994.621505,3526 L922.866215,3526 C920.178731,3526 918,3528.17742 918,3530.86328" id="Stroke-1" stroke="#0080FF" stroke-width="5" stroke-linecap="round"></path>
<path d="M918,3532 L918,3554.51876 C921.882215,3556.47764 924.549419,3559.60762 924.549419,3564.25149 C924.549419,3568.89358 921.882215,3572.02356 918,3573.98421 L918,3610.19047" id="Stroke-3" stroke="#0080FF" stroke-width="5" stroke-linecap="round"></path>
<path d="M965,3594 L965,3599.21751" id="Stroke-5" stroke="#00C7D8" stroke-width="3" stroke-linecap="round"></path>
<path d="M976,3594 L976,3599.21751" id="Stroke-7" stroke="#00C7D8" stroke-width="3" stroke-linecap="round"></path>
<path d="M954,3594 L954,3599.21751" id="Stroke-9" stroke="#00C7D8" stroke-width="3" stroke-linecap="round"></path>
<path d="M943,3594 L943,3599.21751" id="Stroke-11" stroke="#00C7D8" stroke-width="3" stroke-linecap="round"></path>
<path d="M972.908182,3546 L946.753278,3546 C944.688851,3546 943,3547.68615 943,3549.74628 L943,3573.58554 C943,3575.64566 944.688851,3577.33181 946.753278,3577.33181 L972.908182,3577.33181 C974.972609,3577.33181 976.662285,3575.64566 976.662285,3573.58554 L976.662285,3549.74628 C976.662285,3547.68615 974.972609,3546 972.908182,3546 Z" id="Stroke-31" stroke="#0022A9" stroke-width="4" stroke-linecap="round"></path>
<g id="Group-19" transform="translate(938.000000, 3541.000000)" stroke="#0022A9" stroke-width="4" stroke-linecap="round">
<path d="M39.3191489,13 L43.9659236,13" id="Stroke-19"></path>
<path d="M39.3191489,21 L43.9659236,21" id="Stroke-21"></path>
<path d="M39.3191489,30 L43.9659236,30" id="Stroke-23"></path>
<path d="M0,13 L4.64677463,13" id="Stroke-25"></path>
<path d="M0,21 L4.64677463,21" id="Stroke-27"></path>
<path d="M0,30 L4.64677463,30" id="Stroke-29"></path>
<path d="M13,5.07816341 L13,0.445188366" id="Stroke-33"></path>
<path d="M21.5,5.07816341 L21.5,0.445188366" id="Stroke-35"></path>
<path d="M30,5.07816341 L30,0.445188366" id="Stroke-37"></path>
<path d="M13,42.2908441 L13,37.6578691" id="Stroke-39"></path>
<path d="M21.5,42.2908441 L21.5,37.6578691" id="Stroke-41"></path>
<path d="M30,42.2908441 L30,37.6578691" id="Stroke-43"></path>
</g>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Network</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-149.000000, -3171.000000)">
<path d="M198.474304,3207.33333 L320.101069,3207.33333" id="Stroke-7" stroke="#031537" stroke-width="5" stroke-linecap="round" transform="translate(259.500000, 3206.500000) scale(1, -1) translate(-259.500000, -3206.500000) "></path>
<g id="Group-20" transform="translate(207.000000, 3202.000000)" stroke="#031537" stroke-width="5" stroke-linecap="round">
<path d="M107,0 L107,8.69585809" id="Stroke-5" transform="translate(109.500000, 4.347929) scale(1, -1) translate(-109.500000, -4.347929) "></path>
<path d="M71,0 L71,8.69585809" id="Stroke-7" transform="translate(73.500000, 4.347929) scale(1, -1) translate(-73.500000, -4.347929) "></path>
<path d="M34,0 L34,8.69585809" id="Stroke-9" transform="translate(36.500000, 4.347929) scale(1, -1) translate(-36.500000, -4.347929) "></path>
<path d="M0,0 L0,8.69585809" id="Stroke-11" transform="translate(2.500000, 4.347929) scale(1, -1) translate(-2.500000, -4.347929) "></path>
</g>
<rect id="Rectangle-9" fill="#0080FF" x="199" y="3227" width="56.0699997" height="5" rx="2.5"></rect>
<rect id="Rectangle-9" fill="#00C7D8" x="283" y="3259" width="33.0764463" height="5" rx="2.5"></rect>
<rect id="Rectangle-9" fill="#0080FF" x="264" y="3227" width="33.0764463" height="5" rx="2.5"></rect>
<path d="M239,3245.5 C239,3244.11929 240.110137,3243 241.509621,3243 L324.292032,3243 C325.678057,3243 326.801653,3244.10966 326.801653,3245.5 L326.801653,3245.5 C326.801653,3246.88071 325.691516,3248 324.292032,3248 L241.509621,3248 C240.123596,3248 239,3246.89034 239,3245.5 L239,3245.5 Z" id="Rectangle-9" fill="#1C2142"></path>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Performance</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-490.000000, -3508.000000)">
<g id="Page-1-Copy" transform="translate(540.000000, 3527.000000)">
<path d="M107.539403,14.3339002 L107.539403,72.0477183 C107.539403,76.1024983 104.090172,79.3891087 99.8359389,79.3891087 L8.15514924,79.3891087 C3.9000141,79.3891087 0.450782609,76.1024983 0.450782609,72.0477183 L0.450782609,14.3339002" id="Stroke-9" stroke="#0080FF" stroke-width="5"></path>
<path d="M105.436112,0.450972419 L2.55479577,0.450972419 C1.39241739,0.450972419 0.451143596,1.39335674 0.451143596,2.55508913 L0.451143596,12.8770859 L107.539764,12.8770859 L107.539764,2.55508913 C107.539764,1.39335674 106.597588,0.450972419 105.436112,0.450972419" id="Fill-11" fill="#0080FF"></path>
<path d="M105.436112,0.450972419 L2.55479577,0.450972419 C1.39241739,0.450972419 0.451143596,1.39335674 0.451143596,2.55508913 L0.451143596,12.8770859 L107.539764,12.8770859 L107.539764,2.55508913 C107.539764,1.39335674 106.597588,0.450972419 105.436112,0.450972419 Z" id="Stroke-13" stroke="#0080FF" stroke-width="5"></path>
<path d="M8.3194886,7.44402371 C8.3194886,9.01195623 7.08762021,10.283814 5.5687671,10.283814 C4.04991398,10.283814 2.81804559,9.01195623 2.81804559,7.44402371 C2.81804559,5.87609118 4.04991398,4.60423342 5.5687671,4.60423342 C7.08762021,4.60423342 8.3194886,5.87609118 8.3194886,7.44402371" id="Fill-15" fill="#FFFFFF"></path>
<path d="M17.4913579,7.44402371 C17.4913579,9.01195623 16.260392,10.283814 14.7406364,10.283814 C13.2217833,10.283814 11.9899149,9.01195623 11.9899149,7.44402371 C11.9899149,5.87609118 13.2217833,4.60423342 14.7406364,4.60423342 C16.260392,4.60423342 17.4913579,5.87609118 17.4913579,7.44402371" id="Fill-17" fill="#FFFFFF"></path>
<path d="M26.454306,7.44402371 C26.454306,9.01195623 25.2224376,10.283814 23.7035845,10.283814 C22.1847314,10.283814 20.952863,9.01195623 20.952863,7.44402371 C20.952863,5.87609118 22.1847314,4.60423342 23.7035845,4.60423342 C25.2224376,4.60423342 26.454306,5.87609118 26.454306,7.44402371" id="Fill-19" fill="#FFFFFF"></path>
</g>
<g id="Group-15" transform="translate(603.000000, 3564.000000)">
<path d="M16.7889599,48.6338083 L60.0183852,48.6338083 L66.7547698,48.6338083 C68.5906179,44.4244314 69.6087997,39.7787973 69.6087997,34.8959824 C69.6087997,15.8507488 54.117612,0.410664266 35.0085629,0.410664266 L34.8400362,0.410664266 C15.7309871,0.410664266 0.239799373,15.8507488 0.239799373,34.8959824 C0.239799373,39.7787973 1.25798119,44.4244314 3.09382933,48.6338083 L16.7889599,48.6338083 Z" id="Fill-13" fill="#FFFFFF"></path>
<path d="M16.7889599,48.6338083 L60.0183852,48.6338083 L66.7547698,48.6338083 C68.5906179,44.4244314 69.6087997,39.7787973 69.6087997,34.8959824 C69.6087997,15.8507488 54.117612,0.410664266 35.0085629,0.410664266 L34.8400362,0.410664266 C15.7309871,0.410664266 0.239799373,15.8507488 0.239799373,34.8959824 C0.239799373,39.7787973 1.25798119,44.4244314 3.09382933,48.6338083 L16.7889599,48.6338083 Z" id="Stroke-15" stroke="#00C7D8" stroke-width="5" stroke-linecap="round"></path>
<path d="M34.5454545,11.0442206 L34.5454545,17.5328666" id="Stroke-17" stroke="#0080FF" stroke-width="3" stroke-linecap="round"></path>
<path d="M17.041906,19.3658468 L21.3104674,23.6203269" id="Stroke-19" stroke="#0080FF" stroke-width="3" stroke-linecap="round"></path>
<path d="M12.0840237,36.2962963 L18.1197743,36.2962963" id="Stroke-21" stroke="#0080FF" stroke-width="3" stroke-linecap="round"></path>
<path d="M43.1928722,32.7635321 C43.1928722,37.3158492 39.4907475,41.0049834 34.9241435,41.0049834 C30.3575395,41.0049834 26.6554148,37.3158492 26.6554148,32.7635321 C26.6554148,28.2112151 30.3575395,24.5220808 34.9241435,24.5220808 C39.4907475,24.5220808 43.1928722,28.2112151 43.1928722,32.7635321" id="Fill-23" fill="#0022A9"></path>
<g id="Group-28" transform="translate(34.890282, 14.806064)">
<path d="M0.0340954371,17.9574677 L17.4001421,0.647931427" id="Fill-25" fill="#005482"></path>
<path d="M0.0340954371,17.9574677 L17.4001421,0.647931427" id="Stroke-27" stroke="#137EFF" stroke-width="3" stroke-linecap="round"></path>
</g>
</g>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Responsive design mode</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-843.000000, -3171.000000)">
<g id="Group-23" transform="translate(902.000000, 3212.000000)" fill="#00C7D8">
<rect id="Rectangle-5" x="0" y="12" width="63" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" x="0" y="25" width="58" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" x="0" y="0" width="41" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" x="0" y="37" width="41" height="3" rx="1.5"></rect>
</g>
<g id="Page-1" transform="translate(890.000000, 3186.000000)">
<path d="M110.526609,14.6922477 L110.526609,73.8489112 C110.526609,78.0050607 106.981565,81.3738364 102.609159,81.3738364 L8.38168116,81.3738364 C4.00834783,81.3738364 0.463304348,78.0050607 0.463304348,73.8489112 L0.463304348,14.6922477" id="Stroke-9" stroke="#0080FF" stroke-width="5"></path>
<path d="M108.364893,0.462246729 L2.62576232,0.462246729 C1.43109565,0.462246729 0.463675362,1.42819065 0.463675362,2.61896636 L0.463675362,13.1990131 L110.52698,13.1990131 L110.52698,2.61896636 C110.52698,1.42819065 109.558632,0.462246729 108.364893,0.462246729" id="Fill-11" fill="#0080FF"></path>
<path d="M108.364893,0.462246729 L2.62576232,0.462246729 C1.43109565,0.462246729 0.463675362,1.42819065 0.463675362,2.61896636 L0.463675362,13.1990131 L110.52698,13.1990131 L110.52698,2.61896636 C110.52698,1.42819065 109.558632,0.462246729 108.364893,0.462246729 Z" id="Stroke-13" stroke="#0080FF" stroke-width="5"></path>
<path d="M8.55058551,7.6301243 C8.55058551,9.23725514 7.28449855,10.5409093 5.72345507,10.5409093 C4.16241159,10.5409093 2.89632464,9.23725514 2.89632464,7.6301243 C2.89632464,6.02299346 4.16241159,4.71933925 5.72345507,4.71933925 C7.28449855,4.71933925 8.55058551,6.02299346 8.55058551,7.6301243" id="Fill-15" fill="#FFFFFF"></path>
<path d="M17.977229,7.6301243 C17.977229,9.23725514 16.7120696,10.5409093 15.1500986,10.5409093 C13.5890551,10.5409093 12.3229681,9.23725514 12.3229681,7.6301243 C12.3229681,6.02299346 13.5890551,4.71933925 15.1500986,4.71933925 C16.7120696,4.71933925 17.977229,6.02299346 17.977229,7.6301243" id="Fill-17" fill="#FFFFFF"></path>
<path d="M27.1891478,7.6301243 C27.1891478,9.23725514 25.9230609,10.5409093 24.3620174,10.5409093 C22.8009739,10.5409093 21.534887,9.23725514 21.534887,7.6301243 C21.534887,6.02299346 22.8009739,4.71933925 24.3620174,4.71933925 C25.9230609,4.71933925 27.1891478,6.02299346 27.1891478,7.6301243" id="Fill-19" fill="#FFFFFF"></path>
</g>
<g id="Page-1" transform="translate(974.000000, 3196.000000)">
<rect id="Rectangle-6" fill="#FFFFFF" x="1.85507246" y="1.85046729" width="51.0144928" height="82.5319977"></rect>
<g id="Group-23" transform="translate(9.797101, 13.271028)" fill="#1C2142">
<rect id="Rectangle-5" x="0" y="10" width="35.2000008" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" x="0" y="19" width="30.2999992" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" x="0" y="0" width="26.0200005" height="3" rx="1.5"></rect>
<rect id="Rectangle-5" x="0" y="29" width="22.0200005" height="3" rx="1.5"></rect>
</g>
<path d="M44.1492738,82.932179 L9.66292295,82.932179 C4.56906009,82.932179 0.401792083,78.7766344 0.401792083,73.6971017 L0.401792083,9.63525863 C0.401792083,4.55572592 4.56906009,0.400181344 9.66292295,0.400181344 L44.1492738,0.400181344 C49.2431367,0.400181344 53.4112076,4.55572592 53.4112076,9.63525863 L53.4112076,73.6971017 C53.4112076,78.7766344 49.2431367,82.932179 44.1492738,82.932179 Z" id="Stroke-1" stroke="#0E59E1" stroke-width="5" stroke-linecap="round"></path>
<path d="M53.4109667,58 L0.401551201,58" id="Stroke-3" stroke="#0E59E1" stroke-width="4" stroke-linecap="round"></path>
<path d="M26.4057603,73.678527 C24.2272275,73.678527 22.4607604,71.9170293 22.4607604,69.7439667 C22.4607604,67.5715627 24.2272275,65.810065 26.4057603,65.810065 C28.5842931,65.810065 30.3507602,67.5715627 30.3507602,69.7439667 C30.3507602,71.9170293 28.5842931,73.678527 26.4057603,73.678527 Z" id="Fill-5" fill="#0080FF"></path>
</g>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="222" height="122" viewBox="0 0 222 122"><defs><filter id="a" filterUnits="userSpaceOnUse" x="53.5" y="11.8" width="114" height="106.4"><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/></filter></defs><mask maskUnits="userSpaceOnUse" x="53.5" y="11.8" width="114" height="106.4" id="b"><path fill="#FFF" d="M167.5 11.8v106.3h-114V11.8z" filter="url(#a)"/></mask><path mask="url(#b)" fill="#306EFD" d="M67.4 14.7c-6 0-11 4.9-11 11v78.6c0 6 4.9 11 11 11h86.2c6 0 11-4.9 11-11V25.6c0-6-4.9-11-11-11H67.4zm86.2 103.4H67.4c-7.7 0-13.9-6.2-13.9-13.9V25.6c0-7.7 6.2-13.9 13.9-13.9h86.2c7.7 0 13.9 6.2 13.9 13.9v78.6c0 7.7-6.2 13.9-13.9 13.9z"/><path fill="#0022A9" d="M132 23.4h2.9V3.5H132m16.2 19.9h2.9V3.5h-2.9m-31.8 19.9h2.9V3.5h-2.9m-15.7 19.9h2.9V3.5h-2.9M85.1 23.4H88V3.5h-2.9M69.4 23.4h3V3.5h-3"/><path fill="#4DE5FF" d="M77.8 41.3h66.6v-2.9H77.8m0 20.2h66.6v-2.9H77.8m0 20.2h66.6V73H77.8m48 20.2h18.6v-2.9h-18.6m-48 2.9h48v-2.9h-48"/></svg>

After

Width:  |  Height:  |  Size: 1004 B

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Storage</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-494.000000, -3171.000000)">
<g id="Group-16" transform="translate(562.000000, 3192.000000)" stroke-width="5" stroke-linecap="round">
<path d="M79.0179219,81.9119141 L9.41614704,81.9119141 C4.47517472,81.9119141 0.43303223,78.6943644 0.43303223,74.7621705 L0.43303223,61.8828944 C0.43303223,57.9507005 4.47517472,54.7331509 9.41614704,54.7331509 L79.0179219,54.7331509 C83.9578575,54.7331509 88,57.9507005 88,61.8828944 L88,74.7621705 C88,78.6943644 83.9578575,81.9119141 79.0179219,81.9119141 Z" id="Stroke-1" stroke="#0022A9"></path>
<path d="M79.0179219,54.7335635 L9.41614704,54.7335635 C4.47517472,54.7335635 0.43303223,51.5160138 0.43303223,47.5838199 L0.43303223,34.7045439 C0.43303223,30.7723499 4.47517472,27.5548003 9.41614704,27.5548003 L79.0179219,27.5548003 C83.9578575,27.5548003 88,30.7723499 88,34.7045439 L88,47.5838199 C88,51.5160138 83.9578575,54.7335635 79.0179219,54.7335635 Z" id="Stroke-3" stroke="#137EFF"></path>
<path d="M79.0179219,27.5551304 L9.41614704,27.5551304 C4.47517472,27.5551304 0.43303223,24.3375807 0.43303223,20.4053868 L0.43303223,7.52611075 C0.43303223,3.59391684 4.47517472,0.376367187 9.41614704,0.376367187 L79.0179219,0.376367187 C83.9578575,0.376367187 88,3.59391684 88,7.52611075 L88,20.4053868 C88,24.3375807 83.9578575,27.5551304 79.0179219,27.5551304 Z" id="Stroke-5" stroke="#00C7D8"></path>
</g>
<path d="M576.8016,3209.62875 C574.701741,3209.62875 573,3207.92195 573,3205.8148 C573,3203.70765 574.701741,3202 576.8016,3202 C578.900612,3202 580.602353,3203.70765 580.602353,3205.8148 C580.602353,3207.92195 578.900612,3209.62875 576.8016,3209.62875 Z" id="Fill-7" fill="#1C2142"></path>
<path d="M580.602353,3232.8148 C580.602353,3234.92195 578.900612,3236.62875 576.8016,3236.62875 C574.701741,3236.62875 573,3234.92195 573,3232.8148 C573,3230.70765 574.701741,3229 576.8016,3229 C578.900612,3229 580.602353,3230.70765 580.602353,3232.8148" id="Fill-9" fill="#1C2142"></path>
<path d="M576.8016,3263.62875 C574.701741,3263.62875 573,3261.9211 573,3259.8148 C573,3257.70765 574.701741,3256 576.8016,3256 C578.900612,3256 580.602353,3257.70765 580.602353,3259.8148 C580.602353,3261.9211 578.900612,3263.62875 576.8016,3263.62875 Z" id="Fill-11" fill="#1C2142"></path>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="222" height="122" viewBox="0 0 222 122"><path fill="#306EFD" d="M53.5 27.5v89.6h90.3V50h-3.1v64H56.6V30.7h69.7v-3.2"/><path fill="#4DE5FF" d="M120.6 94.1H76.7V50.5H103v3.2H79.9v37.2h37.6V73.3h3.1"/><path fill="#0022A9" d="M96.6 80.8c-1.2 0-2.3-.4-3-1.1-1.1-1.2-1.4-3.1-.6-5.6l3.6-17 35.9-36.2 2.2 2.2-35.2 35.5-3.4 16.2c-.5 1.8-.3 2.5-.2 2.6.1.2.9.3 2.5-.1l16.7-3L150 39l2.2 2.2-35.6 36-17.5 3.2c-.9.2-1.7.4-2.5.4"/><path fill="#306EFD" d="M168.5 14.2c0-2.2-.8-4.3-2.4-5.8l-1-1c-3.2-3.2-8.4-3.2-11.5 0l-16.3 16L126.1 12l-2.2 2.2L159 49.7l2.2-2.2L150 36.2 166.1 20c1.5-1.6 2.4-3.6 2.4-5.8zm-4.6 3.5L147.8 34l-8.3-8.4 16.3-16c2-2 5.2-2 7.1 0l1 1c1 1 1.5 2.2 1.5 3.6-.1 1.3-.6 2.6-1.5 3.5z"/></svg>

After

Width:  |  Height:  |  Size: 743 B

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="222px" height="122px" viewBox="0 0 222 122" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.2 (43514) - http://www.bohemiancoding.com/sketch -->
<title>Visual Editing</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="2017.06.07.Firefox.DevEdition-[white]" transform="translate(-148.000000, -3508.000000)">
<g id="Page-1" transform="translate(223.000000, 3529.000000)" stroke-linecap="round">
<path d="M0.89919464,57.0148819 L77.7462535,23.4916261" id="Stroke-1" stroke="#00C7D8" stroke-width="3"></path>
<path d="M45.0950384,7 L29.3065911,7" id="Stroke-7" stroke="#0022A9" stroke-width="4"></path>
<path d="M27.8236668,7.37685859 C27.8236668,3.30266194 24.5180803,0 20.4416475,0 C16.3638431,0 13.0582566,3.30266194 13.0582566,7.37685859 C13.0582566,11.4510552 16.3638431,14.7537172 20.4416475,14.7537172 C24.5180803,14.7537172 27.8236668,11.4510552 27.8236668,7.37685859 Z" id="Stroke-9" stroke="#0022A9" stroke-width="4"></path>
<g id="Group-22" transform="translate(50.605882, 72.383721) scale(-1, 1) translate(-50.605882, -72.383721) translate(34.105882, 64.883721)" stroke="#0022A9" stroke-width="4">
<path d="M32.271509,6 L16.4830617,6" id="Stroke-7"></path>
<path d="M15.0001374,7.37685859 C15.0001374,3.30266194 11.6945509,-8.52651283e-14 7.61811806,-8.52651283e-14 C3.54031364,-8.52651283e-14 0.234727144,3.30266194 0.234727144,7.37685859 C0.234727144,11.4510552 3.54031364,14.7537172 7.61811806,14.7537172 C11.6945509,14.7537172 15.0001374,11.4510552 15.0001374,7.37685859 Z" id="Stroke-9"></path>
</g>
</g>
<path d="M228.208485,3610.05653 C246.820825,3610.05653 261.908498,3594.86648 261.908498,3576.12979 L261.908498,3572.0866 L261.908498,3563.26842 C261.908498,3544.53086 271.883376,3529.97961 290.495715,3529.97961" id="Stroke-10" stroke="#0080FF" stroke-width="5" stroke-linecap="round" transform="translate(259.352100, 3570.018067) rotate(13.000000) translate(-259.352100, -3570.018067) "></path>
<ellipse id="Oval" fill="#0080FF" cx="220.155067" cy="3602.14962" rx="6.15506733" ry="6.14962174"></ellipse>
<ellipse id="Oval" fill="#0080FF" cx="299.155067" cy="3536.14962" rx="6.15506733" ry="6.14962174"></ellipse>
<g id="Group-6" transform="translate(145.000000, 2865.000000)"></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="222" height="122" viewBox="0 0 222 122"><path fill="#306EFD" d="M130.7 103.3H36.5c-5.2 0-9.5-4.3-9.5-9.5V4.4h145.5v44.9h-2.8V7.2h-140v86.6c0 3.7 3 6.7 6.7 6.7h94.2v2.8z"/><path fill="#306EFD" d="M28.4 30h142.7v-2.8H28.4M43 17.2c0 2-1.6 3.5-3.5 3.5-2 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5c1.9-.1 3.5 1.5 3.5 3.5M54.8 17.2c0 2-1.6 3.5-3.5 3.5-2 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5c1.9-.1 3.5 1.5 3.5 3.5M66.7 17.2c0 2-1.6 3.5-3.5 3.5-2 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5c1.9-.1 3.5 1.5 3.5 3.5M39.4 49.4h47v-2.7h-47M39.4 78.5h47v-2.7h-47M93.8 49.4h18.5v-2.7H93.8M39.4 64h61.9v-2.8H39.4"/><path fill="#0022A9" d="M158.6 49.8c-18 0-32.7 14.6-32.7 32.6s14.7 32.6 32.7 32.6 32.7-14.6 32.7-32.6-14.7-32.6-32.7-32.6m0 68c-19.6 0-35.5-15.9-35.5-35.4s16-35.4 35.5-35.4 35.5 15.9 35.5 35.4-15.9 35.4-35.5 35.4"/><path fill="#4DE5FF" d="M183 93.8c-3.4 0-4.6-5.2-5.9-11.2-.6-2.7-2-9-3.2-9-1.2 0-2.6 6.3-3.2 9-1.4 6-2.5 11.1-5.9 11.1-3.4 0-4.6-5.2-5.9-11.1-.6-2.7-2-9-3.2-9-1.2 0-2.6 6.3-3.2 9-1.4 6-2.5 11.1-5.9 11.1s-4.6-5.2-5.9-11.2c-.6-2.7-2-9-3.2-9v-2.8c3.4 0 4.6 5.2 5.9 11.1.6 2.7 2 9 3.2 9 1.2 0 2.6-6.3 3.2-9 1.4-6 2.5-11.1 5.9-11.1 3.4 0 4.6 5.2 5.9 11.1.6 2.7 2 9 3.2 9 1.2 0 2.6-6.3 3.2-9 1.4-6 2.5-11.2 5.9-11.2s4.6 5.2 5.9 11.1c.6 2.7 2 9 3.2 9v3.1z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

View File

@ -0,0 +1,12 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# 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/.
EXTRA_COMPONENTS += [
'aboutdevtools-registration.js',
'aboutdevtools.manifest',
]
BROWSER_CHROME_MANIFESTS += ['test/browser.ini']

View File

@ -0,0 +1,6 @@
"use strict";
module.exports = {
// Extend from the shared list of defined globals for mochitests.
"extends": "../../../.eslintrc.mochitests.js"
};

View File

@ -0,0 +1,7 @@
[DEFAULT]
tags = devtools
subsuite = devtools
support-files =
head.js
[browser_aboutdevtools_enables_devtools.js]

View File

@ -0,0 +1,36 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/* eslint-env browser */
add_task(async function () {
pushPref("devtools.enabled", false);
let {tab, doc, win} = await openAboutDevTools();
let installPage = doc.getElementById("install-page");
let welcomePage = doc.getElementById("welcome-page");
info("Check that about:devtools is in the correct state with devtools.enabled=false");
ok(!installPage.hasAttribute("hidden"), "install screen is visible");
ok(welcomePage.hasAttribute("hidden"), "welcome screen is hidden");
info("Click on the install button to enable DevTools.");
let installButton = doc.getElementById("install");
EventUtils.synthesizeMouseAtCenter(installButton, {}, win);
info("Wait until the UI updates");
await waitUntil(() => installPage.hasAttribute("hidden") === true);
ok(!welcomePage.hasAttribute("hidden"), "welcome screen is visible");
ok(Services.prefs.getBoolPref("devtools.enabled"),
"The preference devtools.enabled has been flipped to true.");
// Flip the devtools.enabled preference back to false, otherwise the pushPref cleanup
// times out.
Services.prefs.setBoolPref("devtools.enabled", false);
await removeTab(tab);
});

View File

@ -0,0 +1,92 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint no-unused-vars: [2, {"vars": "local"}] */
"use strict";
const { utils: Cu } = Components;
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
// All test are asynchronous
waitForExplicitFinish();
/**
* Waits until a predicate returns true.
*
* @param function predicate
* Invoked once in a while until it returns true.
* @param number interval [optional]
* How often the predicate is invoked, in milliseconds.
*/
const waitUntil = function (predicate, interval = 100) {
if (predicate()) {
return Promise.resolve(true);
}
return new Promise(resolve => {
setTimeout(function () {
waitUntil(predicate, interval).then(() => resolve(true));
}, interval);
});
};
/**
* Open the provided url in a new tab.
*/
const addTab = async function (url) {
info("Adding a new tab with URL: " + url);
let { gBrowser } = window;
let tab = BrowserTestUtils.addTab(gBrowser, url);
gBrowser.selectedTab = tab;
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
info("Tab added and finished loading");
return tab;
};
/**
* Remove the given tab.
* @param {Object} tab The tab to be removed.
* @return Promise<undefined> resolved when the tab is successfully removed.
*/
const removeTab = async function (tab) {
info("Removing tab.");
let { gBrowser } = tab.ownerGlobal;
await new Promise(resolve => {
gBrowser.tabContainer.addEventListener("TabClose", resolve, {once: true});
gBrowser.removeTab(tab);
});
info("Tab removed and finished closing");
};
/**
* Open a new tab on about:devtools
*/
const openAboutDevTools = async function () {
info("Open about:devtools programmatically in a new tab");
let tab = await addTab("about:devtools");
let browser = tab.linkedBrowser;
let doc = browser.contentDocument;
let win = browser.contentWindow;
return {tab, doc, win};
};
/**
* Copied from devtools shared-head.js.
* Set a temporary value for a preference, that will be cleaned up after the test.
*/
const pushPref = function (preferenceName, value) {
return new Promise(resolve => {
let options = {"set": [[preferenceName, value]]};
SpecialPowers.pushPrefEnv(options, resolve);
});
};

View File

@ -31,6 +31,8 @@ const kDebuggerPrefs = [
// startup.
const TOOLBAR_VISIBLE_PREF = "devtools.toolbar.visible";
const DEVTOOLS_ENABLED_PREF = "devtools.enabled";
const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
XPCOMUtils.defineLazyModuleGetter(this, "Services",
"resource://gre/modules/Services.jsm");
@ -41,9 +43,14 @@ XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
XPCOMUtils.defineLazyModuleGetter(this, "CustomizableWidgets",
"resource:///modules/CustomizableWidgets.jsm");
XPCOMUtils.defineLazyGetter(this, "Bundle", function () {
const kUrl = "chrome://devtools-shim/locale/key-shortcuts.properties";
return Services.strings.createBundle(kUrl);
XPCOMUtils.defineLazyGetter(this, "StartupBundle", function () {
const url = "chrome://devtools-shim/locale/startup.properties";
return Services.strings.createBundle(url);
});
XPCOMUtils.defineLazyGetter(this, "KeyShortcutsBundle", function () {
const url = "chrome://devtools-shim/locale/key-shortcuts.properties";
return Services.strings.createBundle(url);
});
XPCOMUtils.defineLazyGetter(this, "KeyShortcuts", function () {
@ -62,49 +69,49 @@ XPCOMUtils.defineLazyGetter(this, "KeyShortcuts", function () {
// or the default one.
{
id: "toggleToolbox",
shortcut: Bundle.GetStringFromName("toggleToolbox.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("toggleToolbox.commandkey"),
modifiers
},
// All locales are using F12
{
id: "toggleToolboxF12",
shortcut: Bundle.GetStringFromName("toggleToolboxF12.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("toggleToolboxF12.commandkey"),
modifiers: "" // F12 is the only one without modifiers
},
// Toggle the visibility of the Developer Toolbar (=gcli)
{
id: "toggleToolbar",
shortcut: Bundle.GetStringFromName("toggleToolbar.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("toggleToolbar.commandkey"),
modifiers: "shift"
},
// Open WebIDE window
{
id: "webide",
shortcut: Bundle.GetStringFromName("webide.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("webide.commandkey"),
modifiers: "shift"
},
// Open the Browser Toolbox
{
id: "browserToolbox",
shortcut: Bundle.GetStringFromName("browserToolbox.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("browserToolbox.commandkey"),
modifiers: "accel,alt,shift"
},
// Open the Browser Console
{
id: "browserConsole",
shortcut: Bundle.GetStringFromName("browserConsole.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("browserConsole.commandkey"),
modifiers: "accel,shift"
},
// Toggle the Responsive Design Mode
{
id: "responsiveDesignMode",
shortcut: Bundle.GetStringFromName("responsiveDesignMode.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("responsiveDesignMode.commandkey"),
modifiers
},
// Open ScratchPad window
{
id: "scratchpad",
shortcut: Bundle.GetStringFromName("scratchpad.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("scratchpad.commandkey"),
modifiers: "shift"
},
@ -114,55 +121,57 @@ XPCOMUtils.defineLazyGetter(this, "KeyShortcuts", function () {
// Key for opening the Inspector
{
toolId: "inspector",
shortcut: Bundle.GetStringFromName("inspector.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("inspector.commandkey"),
modifiers
},
// Key for opening the Web Console
{
toolId: "webconsole",
shortcut: Bundle.GetStringFromName("webconsole.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("webconsole.commandkey"),
modifiers
},
// Key for opening the Debugger
{
toolId: "jsdebugger",
shortcut: Bundle.GetStringFromName("debugger.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("debugger.commandkey"),
modifiers
},
// Key for opening the Network Monitor
{
toolId: "netmonitor",
shortcut: Bundle.GetStringFromName("netmonitor.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("netmonitor.commandkey"),
modifiers
},
// Key for opening the Style Editor
{
toolId: "styleeditor",
shortcut: Bundle.GetStringFromName("styleeditor.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("styleeditor.commandkey"),
modifiers: "shift"
},
// Key for opening the Performance Panel
{
toolId: "performance",
shortcut: Bundle.GetStringFromName("performance.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("performance.commandkey"),
modifiers: "shift"
},
// Key for opening the Storage Panel
{
toolId: "storage",
shortcut: Bundle.GetStringFromName("storage.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("storage.commandkey"),
modifiers: "shift"
},
// Key for opening the DOM Panel
{
toolId: "dom",
shortcut: Bundle.GetStringFromName("dom.commandkey"),
shortcut: KeyShortcutsBundle.GetStringFromName("dom.commandkey"),
modifiers
},
];
});
function DevToolsStartup() {}
function DevToolsStartup() {
this.onEnabledPrefChanged = this.onEnabledPrefChanged.bind(this);
}
DevToolsStartup.prototype = {
/**
@ -188,6 +197,9 @@ DevToolsStartup.prototype = {
let debuggerFlag = cmdLine.handleFlag("jsdebugger", false);
let devtoolsFlag = cmdLine.handleFlag("devtools", false);
let hasDevToolsFlag = consoleFlag || devtoolsFlag || debuggerFlag;
this.setupEnabledPref(hasDevToolsFlag);
if (consoleFlag) {
this.handleConsoleFlag(cmdLine);
}
@ -226,6 +238,8 @@ DevToolsStartup.prototype = {
JsonView.initialize();
};
Services.obs.addObserver(onWindowReady, "browser-delayed-startup-finished");
Services.prefs.addObserver(DEVTOOLS_ENABLED_PREF, this.onEnabledPrefChanged);
},
/**
@ -251,6 +265,9 @@ DevToolsStartup.prototype = {
if (!this.initialized) {
this.hookWebDeveloperMenu(window);
}
this.createDevToolsEnableMenuItem(window);
this.updateDevToolsMenuItems(window);
},
/**
@ -285,8 +302,11 @@ DevToolsStartup.prototype = {
CustomizableUI.AREA_NAVBAR :
CustomizableUI.AREA_PANEL,
onViewShowing: (event) => {
// Ensure creating the menuitems in the system menu before trying to copy them.
this.initDevTools("HamburgerMenu");
if (Services.prefs.getBoolPref(DEVTOOLS_ENABLED_PREF)) {
// If DevTools are enabled, initialize DevTools to create all menuitems in the
// system menu before trying to copy them.
this.initDevTools("HamburgerMenu");
}
// Populate the subview with whatever menuitems are in the developer
// menu. We skip menu elements, because the menu panel has no way
@ -336,9 +356,79 @@ DevToolsStartup.prototype = {
*/
hookWebDeveloperMenu(window) {
let menu = window.document.getElementById("webDeveloperMenu");
menu.addEventListener("popupshowing", () => {
let onPopupShowing = () => {
if (!Services.prefs.getBoolPref(DEVTOOLS_ENABLED_PREF)) {
return;
}
menu.removeEventListener("popupshowing", onPopupShowing);
this.initDevTools("SystemMenu");
}, { once: true });
};
menu.addEventListener("popupshowing", onPopupShowing);
},
/**
* Create a new menu item to enable DevTools and insert it DevTools's submenu in the
* System Menu.
*/
createDevToolsEnableMenuItem(window) {
let {document} = window;
// Create the menu item.
let item = document.createElement("menuitem");
item.id = "enableDeveloperTools";
item.setAttribute("label", StartupBundle.GetStringFromName("enableDevTools.label"));
item.setAttribute("accesskey",
StartupBundle.GetStringFromName("enableDevTools.accesskey"));
// The menu item should open the install page for DevTools.
item.addEventListener("command", () => {
this.openInstallPage("SystemMenu");
});
// Insert the menu item in the DevTools submenu.
let systemMenuItem = document.getElementById("menuWebDeveloperPopup");
systemMenuItem.appendChild(item);
},
/**
* Update the visibility the menu item to enable DevTools.
*/
updateDevToolsMenuItems(window) {
let item = window.document.getElementById("enableDeveloperTools");
item.hidden = Services.prefs.getBoolPref(DEVTOOLS_ENABLED_PREF);
},
/**
* Loop on all windows and update the hidden attribute of the "enable DevTools" menu
* item.
*/
onEnabledPrefChanged() {
let enumerator = Services.wm.getEnumerator("navigator:browser");
while (enumerator.hasMoreElements()) {
let window = enumerator.getNext();
if (window.gBrowserInit && window.gBrowserInit.delayedStartupFinished) {
this.updateDevToolsMenuItems(window);
}
}
},
/**
* Depending on some runtime parameters (command line arguments as well as existing
* preferences), the DEVTOOLS_ENABLED_PREF might be forced to true.
*
* @param {Boolean} hasDevToolsFlag
* true if any DevTools command line argument was passed when starting Firefox.
*/
setupEnabledPref(hasDevToolsFlag) {
if (Services.prefs.getBoolPref(DEVTOOLS_ENABLED_PREF)) {
// Nothing to do if DevTools are already enabled.
return;
}
let hasToolbarPref = Services.prefs.getBoolPref(TOOLBAR_VISIBLE_PREF, false);
if (hasDevToolsFlag || hasToolbarPref) {
Services.prefs.setBoolPref(DEVTOOLS_ENABLED_PREF, true);
}
},
hookKeyShortcuts(window) {
@ -360,8 +450,11 @@ DevToolsStartup.prototype = {
onKey(window, key) {
let require = this.initDevTools("KeyShortcut");
let { gDevToolsBrowser } = require("devtools/client/framework/devtools-browser");
gDevToolsBrowser.onKeyShortcut(window, key);
if (require) {
// require might be null if initDevTools was called while DevTools are disabled.
let { gDevToolsBrowser } = require("devtools/client/framework/devtools-browser");
gDevToolsBrowser.onKeyShortcut(window, key);
}
},
// Create a <xul:key> DOM Element
@ -387,6 +480,12 @@ DevToolsStartup.prototype = {
},
initDevTools: function (reason) {
// If an entry point is fired and tools are not enabled open the installation page
if (!Services.prefs.getBoolPref(DEVTOOLS_ENABLED_PREF)) {
this.openInstallPage(reason);
return null;
}
if (reason && !this.recorded) {
// Only save the first call for each firefox run as next call
// won't necessarely start the tool. For example key shortcuts may
@ -399,9 +498,7 @@ DevToolsStartup.prototype = {
}
this.recorded = true;
}
if (!this.initialized) {
Services.prefs.setBoolPref("devtools.enabled", true);
}
this.initialized = true;
let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
// Ensure loading main devtools module that hooks up into browser UI
@ -410,12 +507,19 @@ DevToolsStartup.prototype = {
return require;
},
openInstallPage: function (reason) {
let { gBrowser } = Services.wm.getMostRecentWindow("navigator:browser");
let url = "about:devtools";
if (reason) {
url += "?reason=" + encodeURIComponent(reason);
}
gBrowser.selectedTab = gBrowser.addTab(url);
},
handleConsoleFlag: function (cmdLine) {
let window = Services.wm.getMostRecentWindow("devtools:webconsole");
if (!window) {
this.initDevTools("CommandLine");
let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
let require = this.initDevTools("CommandLine");
let { HUDService } = require("devtools/client/webconsole/hudservice");
let { console } = Cu.import("resource://gre/modules/Console.jsm", {});
HUDService.toggleBrowserConsole().catch(console.error);

View File

@ -4,4 +4,23 @@
devtools-shim.jar:
% content devtools-shim %content/
content/aboutdevtools/aboutdevtools.xhtml (aboutdevtools/aboutdevtools.xhtml)
content/aboutdevtools/aboutdevtools.css (aboutdevtools/aboutdevtools.css)
content/aboutdevtools/aboutdevtools.js (aboutdevtools/aboutdevtools.js)
content/aboutdevtools/images/otter.png (aboutdevtools/images/otter.png)
content/aboutdevtools/images/feature-inspector.svg (aboutdevtools/images/feature-inspector.svg)
content/aboutdevtools/images/feature-console.svg (aboutdevtools/images/feature-console.svg)
content/aboutdevtools/images/feature-debugger.svg (aboutdevtools/images/feature-debugger.svg)
content/aboutdevtools/images/feature-network.svg (aboutdevtools/images/feature-network.svg)
content/aboutdevtools/images/feature-memory.svg (aboutdevtools/images/feature-memory.svg)
content/aboutdevtools/images/feature-visual-editing.svg (aboutdevtools/images/feature-visual-editing.svg)
content/aboutdevtools/images/feature-responsive-mode.svg (aboutdevtools/images/feature-responsive-mode.svg)
content/aboutdevtools/images/feature-storage.svg (aboutdevtools/images/feature-storage.svg)
content/aboutdevtools/images/feature-performance.svg (aboutdevtools/images/feature-performance.svg)
content/aboutdevtools/images/feature-style-editor.svg (aboutdevtools/images/feature-style-editor.svg)
content/aboutdevtools/images/feature-web-audio.svg (aboutdevtools/images/feature-web-audio.svg)
content/aboutdevtools/images/feature-scratchpad.svg (aboutdevtools/images/feature-scratchpad.svg)
content/DevToolsShim.jsm (DevToolsShim.jsm)

View File

@ -0,0 +1,20 @@
<!ENTITY aboutDevtools.headTitle "About Developer Tools">
<!ENTITY aboutDevtools.enable.title "Enable Firefox Developer Tools">
<!ENTITY aboutDevtools.enable.inspectElementTitle "Enable Firefox Developer Tools to use Inspect Element">
<!ENTITY aboutDevtools.enable.aboutDebuggingMessage
"Develop and debug WebExtensions, web workers, service workers and more with the Firefox DevTools.">
<!ENTITY aboutDevtools.enable.inspectElementMessage
"Examine and edit HTML and CSS with the DevTools Inspector.">
<!ENTITY aboutDevtools.enable.keyShortcutMessage
"You activated a Developer Tool shortcut. If that was a mistake, you can close this tab.">
<!ENTITY aboutDevtools.enable.menuMessage
"Examine, edit and debug HTML, CSS, and JavaScript with tools like Inspector and Debugger.">
<!ENTITY aboutDevtools.enable.commonMessage
"As of Firefox 58, Developer Tools are disabled by default to give you more control over your browser.">
<!ENTITY aboutDevtools.enable.learnMoreLink "Learn more about DevTools">
<!ENTITY aboutDevtools.enable.installButton "Enable Developer Tools">
<!ENTITY aboutDevtools.welcome.title "Welcome to Firefox Developer Tools!">
<!ENTITY aboutDevtools.welcome.message "Youve successfully enabled DevTools! To get started explore the Web Developer menu or open the tools with ##INSPECTOR_SHORTCUT##.">

View File

@ -0,0 +1,8 @@
# 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/.
# LOCALIZATION NOTE (enableDevTools.label):
# Label for the menu item displayed in Tools > Developer Tools when DevTools are disabled.
enableDevTools.label=Enable Developer Tools…
enableDevTools.accesskey=E

View File

@ -20,6 +20,7 @@ if CONFIG['MOZ_DEVTOOLS'] != 'server':
]
DIRS += [
'aboutdevtools',
'locales',
]

View File

@ -37,15 +37,6 @@ function createMockDevTools() {
return mock;
}
let isInstalledMethodBackup = DevToolsShim.isInstalled;
function mockDevToolsInstalled(isInstalled) {
DevToolsShim.isInstalled = () => isInstalled;
}
function restoreDevToolsInstalled() {
DevToolsShim.isInstalled = isInstalledMethodBackup;
}
/**
* Check if a given method was called an expected number of times, and finally check the
* arguments provided to the last call, if appropriate.
@ -67,8 +58,6 @@ function checkCalls(mock, method, length, lastArgs) {
}
function test_register_unregister() {
mockDevToolsInstalled(true);
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
DevToolsShim.register(createMockDevTools());
@ -76,8 +65,6 @@ function test_register_unregister() {
DevToolsShim.unregister();
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
restoreDevToolsInstalled();
}
function test_on_is_forwarded_to_devtools() {
@ -93,13 +80,9 @@ function test_on_is_forwarded_to_devtools() {
DevToolsShim.on("other_event", cb2);
checkCalls(mock, "on", 2, ["other_event", cb2]);
restoreDevToolsInstalled();
}
function test_off_called_before_registering_devtools() {
mockDevToolsInstalled(true);
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
function cb1() {}
@ -110,13 +93,9 @@ function test_off_called_before_registering_devtools() {
DevToolsShim.register(mock);
checkCalls(mock, "on", 0);
restoreDevToolsInstalled();
}
function test_off_called_before_with_bad_callback() {
mockDevToolsInstalled(true);
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
function cb1() {}
@ -131,13 +110,9 @@ function test_off_called_before_with_bad_callback() {
checkCalls(mock, "on", 1, ["test_event", cb1]);
// Calls to off should not be held and forwarded.
checkCalls(mock, "off", 0);
restoreDevToolsInstalled();
}
function test_events() {
mockDevToolsInstalled(true);
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
let mock = createMockDevTools();
@ -151,41 +126,31 @@ function test_events() {
// Check emit is called once with the devtools-unregistered event.
DevToolsShim.unregister();
checkCalls(mock, "emit", 2, ["devtools-unregistered"]);
restoreDevToolsInstalled();
}
function test_scratchpad_apis() {
mockDevToolsInstalled(false);
let backupMaybeInitializeDevTools = DevToolsShim._maybeInitializeDevTools;
DevToolsShim._maybeInitializeDevTools = () => {
return false;
};
ok(!DevToolsShim.isInstalled(), "DevTools are not installed");
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
// Ensure that saveDevToolsSession doesn't initialize the tools
// Ensure that save & restore DevToolsSession don't initialize the tools and don't crash
DevToolsShim.saveDevToolsSession({});
ok(!DevToolsShim.isInstalled(), "DevTools are not installed");
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
// Check that restoreDevToolsSession doesn't crash.
DevToolsShim.restoreDevToolsSession({
scratchpads: [{}],
browserConsole: true,
});
// Check that saveDevToolsSession doesn't crash.
DevToolsShim.saveDevToolsSession({});
mockDevToolsInstalled(true);
ok(DevToolsShim.isInstalled(), "DevTools are installed");
ok(!DevToolsShim.isInitialized(), "DevTools are not initialized");
let mock = createMockDevTools();
DevToolsShim._initDevTools = () => {
DevToolsShim._maybeInitializeDevTools = () => {
// Next call to restoreDevToolsSession is expected to initialize DevTools, which we
// simulate here by registering our mock.
DevToolsShim.register(mock);
return true;
};
let scratchpadSessions = [{}];
@ -197,7 +162,7 @@ function test_scratchpad_apis() {
DevToolsShim.saveDevToolsSession({});
checkCalls(mock, "saveDevToolsSession", 1, []);
restoreDevToolsInstalled();
DevToolsShim._maybeInitializeDevTools = backupMaybeInitializeDevTools;
}
function run_test() {

View File

@ -35,7 +35,9 @@ ChooseValidatorCompileOptions(const ShBuiltInResources& resources,
ShCompileOptions options = SH_VARIABLES |
SH_ENFORCE_PACKING_RESTRICTIONS |
SH_OBJECT_CODE |
SH_INIT_GL_POSITION;
SH_INIT_GL_POSITION |
SH_INITIALIZE_UNINITIALIZED_LOCALS |
SH_INIT_OUTPUT_VARIABLES;
#ifndef XP_MACOSX
// We want to do this everywhere, but to do this on Mac, we need

View File

@ -13,7 +13,7 @@
#include "libANGLE/Error.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include <map>

View File

@ -15,7 +15,7 @@
#include "libANGLE/angletypes.h"
#include "libANGLE/Error.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
namespace rx
{

View File

@ -569,5 +569,122 @@ class Renderer11 : public RendererD3D
TextureHelper11 mCachedResolveTexture;
};
namespace d3d11
{
template <ResourceType ResourceT>
class LazyResource : angle::NonCopyable
{
public:
constexpr LazyResource() : mResource() {}
virtual ~LazyResource() {}
virtual gl::Error resolve(Renderer11 *renderer) = 0;
void reset() { mResource.reset(); }
GetD3D11Type<ResourceT> *get() const
{
ASSERT(mResource.valid());
return mResource.get();
}
const Resource11<GetD3D11Type<ResourceT>> &getObj() const { return mResource; }
protected:
LazyResource(LazyResource &&other) : mResource(std::move(other.mResource)) {}
gl::Error resolveImpl(Renderer11 *renderer,
const GetDescType<ResourceT> &desc,
GetInitDataType<ResourceT> *initData,
const char *name)
{
if (!mResource.valid())
{
ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
mResource.setDebugName(name);
}
return gl::NoError();
}
Resource11<GetD3D11Type<ResourceT>> mResource;
};
template <typename D3D11ShaderType>
class LazyShader final : public LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>
{
public:
// All parameters must be constexpr. Not supported in VS2013.
constexpr LazyShader(const BYTE *byteCode, size_t byteCodeSize, const char *name)
: mByteCode(byteCode, byteCodeSize), mName(name)
{
}
constexpr LazyShader(LazyShader &&shader)
: LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>(std::move(shader)),
mByteCode(std::move(shader.mByteCode)),
mName(shader.mName)
{
}
gl::Error resolve(Renderer11 *renderer) override
{
return this->resolveImpl(renderer, mByteCode, nullptr, mName);
}
private:
ShaderData mByteCode;
const char *mName;
};
class LazyInputLayout final : public LazyResource<ResourceType::InputLayout>
{
public:
constexpr LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
size_t inputDescLen,
const BYTE *byteCode,
size_t byteCodeLen,
const char *debugName)
: mInputDesc(inputDesc, inputDescLen),
mByteCode(byteCode, byteCodeLen),
mDebugName(debugName)
{
}
gl::Error resolve(Renderer11 *renderer) override
{
return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName);
}
private:
InputElementArray mInputDesc;
ShaderData mByteCode;
const char *mDebugName;
};
class LazyBlendState final : public LazyResource<ResourceType::BlendState>
{
public:
LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName)
: mDesc(desc), mDebugName(debugName)
{
}
gl::Error resolve(Renderer11 *renderer)
{
return resolveImpl(renderer, mDesc, nullptr, mDebugName);
}
private:
D3D11_BLEND_DESC mDesc;
const char *mDebugName;
};
} // namespace d3d11
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_H_

View File

@ -2026,21 +2026,6 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
#endif
}
gl::Error LazyInputLayout::resolve(Renderer11 *renderer)
{
return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName);
}
LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName)
: mDesc(desc), mDebugName(debugName)
{
}
gl::Error LazyBlendState::resolve(Renderer11 *renderer)
{
return resolveImpl(renderer, mDesc, nullptr, mDebugName);
}
angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps,
const DXGI_ADAPTER_DESC &adapterDesc)
{

View File

@ -178,101 +178,6 @@ inline bool isDeviceLostError(HRESULT errorCode)
}
}
template <ResourceType ResourceT>
class LazyResource : angle::NonCopyable
{
public:
constexpr LazyResource() : mResource() {}
virtual ~LazyResource() {}
virtual gl::Error resolve(Renderer11 *renderer) = 0;
void reset() { mResource.reset(); }
GetD3D11Type<ResourceT> *get() const
{
ASSERT(mResource.valid());
return mResource.get();
}
const Resource11<GetD3D11Type<ResourceT>> &getObj() const { return mResource; }
protected:
LazyResource(LazyResource &&other) : mResource(std::move(other.mResource)) {}
gl::Error resolveImpl(Renderer11 *renderer,
const GetDescType<ResourceT> &desc,
GetInitDataType<ResourceT> *initData,
const char *name)
{
if (!mResource.valid())
{
ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
mResource.setDebugName(name);
}
return gl::NoError();
}
Resource11<GetD3D11Type<ResourceT>> mResource;
};
template <typename D3D11ShaderType>
class LazyShader final : public LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>
{
public:
// All parameters must be constexpr. Not supported in VS2013.
constexpr LazyShader(const BYTE *byteCode, size_t byteCodeSize, const char *name)
: mByteCode(byteCode, byteCodeSize), mName(name)
{
}
constexpr LazyShader(LazyShader &&shader)
: LazyResource<GetResourceTypeFromD3D11<D3D11ShaderType>()>(std::move(shader)),
mByteCode(std::move(shader.mByteCode)),
mName(shader.mName)
{
}
gl::Error resolve(Renderer11 *renderer) override
{
return this->resolveImpl(renderer, mByteCode, nullptr, mName);
}
private:
ShaderData mByteCode;
const char *mName;
};
class LazyInputLayout final : public LazyResource<ResourceType::InputLayout>
{
public:
constexpr LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
size_t inputDescLen,
const BYTE *byteCode,
size_t byteCodeLen,
const char *debugName)
: mInputDesc(inputDesc, inputDescLen),
mByteCode(byteCode, byteCodeLen),
mDebugName(debugName)
{
}
gl::Error resolve(Renderer11 *renderer) override;
private:
InputElementArray mInputDesc;
ShaderData mByteCode;
const char *mDebugName;
};
class LazyBlendState final : public LazyResource<ResourceType::BlendState>
{
public:
LazyBlendState(const D3D11_BLEND_DESC &desc, const char *debugName);
gl::Error resolve(Renderer11 *renderer);
private:
D3D11_BLEND_DESC mDesc;
const char *mDebugName;
};
// Copy data to small D3D11 buffers, such as for small constant buffers, which use one struct to
// represent an entire buffer.

View File

@ -1,82 +1,178 @@
Step 1: Install Rust if you don't have it already
If you are doing gecko builds already, you should already have Rust as it is a build requirement.
If not, you can install it using |mach bootstrap| (recommended) or from https://www.rust-lang.org/
Note: If installing manually, use the stable 64-bit release - on Windows make sure to use the MSVC ABI installer.
Ensure that rustc and cargo are in your $PATH (adding $HOME/.cargo/bin/ should be sufficient)
Step 2: Set up mozconfig
Add the following line to your mozconfig:
ac_add_options --enable-webrender
The first time you do a build with this changes, you should also run |mach clobber|
Step 3:
Build using |mach build|
To build and run WebRender in Gecko:
1. Install Rust if you don't have it already
If you are doing gecko builds already, you should already have Rust as it is a build requirement.
If not, you can install it using |mach bootstrap| (recommended) or from https://www.rust-lang.org/
Note: If installing manually, use the stable 64-bit release - on Windows make sure to use the MSVC ABI installer.
Ensure that rustc and cargo are in your $PATH (adding $HOME/.cargo/bin/ should be sufficient)
2. Build using |mach build|.
You don't need anything special in your mozconfig for local builds; webrender will be built by default.
If you are building a non-nightly version (e.g. beta) you may need to add |ac_add_options --enable-webrender=build| to your mozconfig.
3. Run with |MOZ_WEBRENDER=1| in your environment. e.g. |MOZ_WEBRENDER=1 ./mach run|.
Alternatively, you can set the gfx.webrender.enabled pref to true (browser restart required).
Note that on Linux, acceleration is disabled by default and it needs to be enabled for WebRender to work.
On Linux you can enable acceleration by putting |MOZ_ACCELERATED=1| in your environment, or setting layers.acceleration.force-enabled to true in about:config.
4. Verify WebRender is enabled. You can do this by going to about:support and checking the "Compositing" line in the Graphics section. It should say "WebRender".
There should also be a WebRender section under "Decision Log" in about:support, which will provide some more detail on what caused it to be enabled/disabled.
When making changes:
- Make the changes you want.
- Run |mach build| or |mach build binaries| as desired.
For a debug webrender build:
Use a debug mozconfig (ac_add_options --enable-debug)
You can also use an opt build but make webrender less optimized by putting opt-level=0 in the [profile.release] section of your toolkit/library/rust/Cargo.toml file
See also https://groups.google.com/forum/#!topic/mozilla.dev.servo/MbeMcqqO1fs
--------------------------------------------------------------------------------
What if you have to pull in an update to webrender itself?
What if you have to pull in an update to webrender itself? You have two options,
listed below. Both options will give you a set of patches and the ability to do
try pushes to verify the update. After that, continue with the steps below to
actually land the update into the tree.
1) Update your graphics branch checkout to the latest code on the
graphics branch
2) Check out and update the webrender repo to the version you want
3) Copy over the webrender and webrender_api folders into gfx/. The best way
to do this is to simply delete the gfx/webrender and gfx/webrender_api
folders and use |cp -R| to copy them in again from the webrender repo. Update
the "latest commit" information at the bottom of this file with the version.
4) If you need to modify webrender_bindings/Cargo.toml to include or remove
features, do so now.
4) Commit your changes to the graphics branch locally
5) Run |mach vendor rust| to update the rust dependencies in third_party/rust
6) Commit the vendored changes locally
7) Build and test. You may need to make changes in bindings.rs or on
the C++ side depending on what changed in webrender. This can
potentially be quite tricky if you don't fully understand the API
changes on the webrender side. In this step, try to not use your new
features yet, just get the build working with the minimal changes.
8) Commit the changes locally from step 7, and push everything to the
graphics branch.
9) Now you have an update webrender with the new features you wanted,
so you can write gecko code against them.
Option A:
Use a script to do the update for you. This will usually work, if you satisfy
all the assumptions the script is making. The script can be found at
https://github.com/staktrace/moz-scripts/blob/master/try-latest-webrender.sh
and contains documentation on how to use it. Read the documentation carefully
before trying to use it. The only extra change you need to make with this
option is to manually update the revision at the bottom of gfx/doc/README.webrender
so that it points to the new WR version you are landing. The script doesn't
do that yet.
Yes, this is somewhat painful. It used to be worse. :)
Option B:
Do the update manually. This is a little more cumbersome but may be required
if the script doesn't work or the repos are in a state that violates hidden
assumptions in the script (e.g. if the webrender_bindings/Cargo.toml file is
no longer in the format expected by the script). The steps to do this are,
roughly:
- Update your mozilla-central checkout to the latest code on mozilla-central.
- Check out and update the webrender repo to the version you want
- Copy over the webrender and webrender_api folders into gfx/. The best way
to do this is to simply delete the gfx/webrender and gfx/webrender_api
folders and use |cp -R| to copy them in again from the webrender repo. Update
the "latest commit" information at the bottom of this file with the version.
- If you need to modify webrender_bindings/Cargo.toml file, do so now. Changes
at this step usually consist of:
(a) Updating version numbers. Go through the version numbers of ALL the
dependencies in the Cargo.toml file (webrender, euclid, etc.) and make
sure the version numbers listed match what's in the new
gfx/webrender/Cargo.toml and gfx/webrender_api/Cargo.toml files.
(b) Turning on or off any new features that were added in upstream WR. This
used to happen a lot but is pretty rare now.
- Go to toolkit/library/rust and run |cargo update -p webrender -p webrender_api|.
If it complains about version numbers of other crates not lining up, add those
as well, e.g. |cargo update -p webrender -p webrender_api -p gleam -p euclid|.
You may need to do this a few times until you get all the crates to make it
happy.
- Run the same cargo update command from the previous step in the
toolkit/library/gtest/rust folder.
- Commit your changes locally. You'll need to do this before the next step or
it will complain.
- At the top of the tree, run |mach vendor rust| to update the rust
dependencies in third_party/rust.
- Commit your changes locally.
- Build and test. You may need to make changes in bindings.rs or on the C++
side depending on what changed in webrender. This can potentially be quite
tricky if you don't fully understand the API changes on the webrender side.
Get help if you need it. For simplicity in bisecting, try to not use your
new features yet, just get the build working with the minimal changes.
- Commit any changes from the previous step, and do a try push to make sure
everything is good. Generally we do two try pushes, one for builds and
linux tests. This should be totally green. The other forces WR enabled on
Windows and runs reftests, which currently fails. However if it fails with
more than just regular reftest failures (e.g. it crashes or has an assertion
failure) then that's potentially going to be a problem for Windows users
running WebRender and will need investigation.
- You now have an updated webrender, so you can land it or write gecko
code against the new features.
Note that when webrender is built as part of gecko, it may end up using slightly
different versions of its dependencies than when it is built standalone from the
webrender repo. The reason is that the Cargo.lock files in m-c and in the WR
repo may reference different versions of the dependencies. Both builds will be
compatible in terms of semantic versioning, but may produce different results -
for example the standalone webrender might use euclid 0.10.4 while the
one in gecko uses euclid 0.10.3. Although both choices are "valid" per
the semantic versioning rules in webrender's Cargo.toml, the 0.2.3 may provide
a bugfix that is needed for correct behaviour in webrender. If this is the case,
the technically "correct" fix is to change the upstream webrender Cargo.toml
file to require the correct version. Alternnatively, you can update the
Cargo.lock files in m-c to pull in the new version. The way to do this is as
follows:
- Go to toolkit/library/rust and run |cargo update -p <package> --precise <version>|.
Repeat this for as many libraries as you need to update. Run the same commands
in toolkit/library/gtest/rust and js/src (ignore any errors about unmatched
packages). Commit all the changes locally.
- Run |mach vendor rust|, which will update the corresponding libraries in
third_party/rust to the versions you specified.
The reason we don't do this by default is to work around bug 1336528. Specifically,
there is another crate in m-c called mozjs_sys which is built separately but uses
the same folder to store its rust dependencies. If one of the libraries that is
required by both mozjs_sys and webrender is updated without updating the other
project's Cargo.lock file, that results in build bustage.
This means that any time you do this sort of manual update of packages, you need
to make sure that mozjs_sys also has its Cargo.lock file updated if needed, hence
the need to run the cargo update command in js/src as well. Hopefully this will
be resolved soon.
Once you have followed either Option A or Option B and have a good update, you
might want to land it in the tree. To do this:
- Find the current wr-future-update bug, by going to https://bugzil.la/wr-future-update
- Clone this bug (there is a little dropdown in the bottom right corner of the
page which gives you an option to "Create a new bug ... as a clone of this bug").
- This will take you to a bug entry page with some stuff prepopulated. Do NOT
submit it yet, but make the following changes:
(a) Modify the "Description" to remove the SECOND instance of the text "+++ This
bug was initially created as a clone of ... +++". Keep the first instance
as it points to the bug you just cloned, and keep the rest of the text unless
you feel it needs changing.
(b) Add wr-future-update into the "Alias" field
(c) Clear the bugs in the "Depends on" field
(d) For each bug in the "Blocks" field, except for 1311790 and 1386670, go
to the bug and check the "See Also" link for the corresponding WR issue/PR,
if any. If there is a WR issue that is not yet resolved in the update you
are landing, leave the bug in the "Blocks" field of your clone. In a later
step you will remove the dependency from the update you are landing. At
end of this step the "Blocks" field should contain 1311790, 1386670, and
any bugs tracking upstream WR issues that are not fixed in the update.
(e) You still cannot submit the clone as a new bug, because you can't have two
bugs in the system with the same alias. So hold on a sec.
- Go back to the tab with the current wr-future-update bug, and click on the edit
button. Make the following changes:
(a) Assign the bug to yourself.
(b) Clear the "Alias" field.
(c) Remove bugs from the "Blocks" field that you kept in step (d), other than
1311790 and 1386670. In other words, update the "Blocks" field so that it
contains 1311790, 1386670, and any bugs that are actually fixed by the
update.
(d) Submit your changes to this bug.
- Now you can submit your changes to the clone bug which will create a new
wr-future-update bug.
- Update your patch queue so that the patches are properly formatted with
bug number, reviewer, etc. and push to MozReview. This is kind of important,
because you want these patches to land on autoland rather than inbound. If it
lands on inbound there's a high chance of it conflicting with the servo-vcs-sync
bot that is regularly pushing to autoland, and then you'll only find out about
it when the sheriff tries to do a merge and backs you out. If you push to
autoland you're likely to find out about the problem at push time, when the
patches won't rebase.
Latest Commit: 6440dff485271cdfd24a22c920cea31e01e2b164
Troubleshooting tips:
1. Note that when webrender is built as part of gecko, it may end up using slightly
different versions of its dependencies than when it is built standalone from the
webrender repo. The reason is that the Cargo.lock files in m-c and in the WR
repo may reference different versions of the dependencies. Both builds will be
compatible in terms of semantic versioning, but may produce different results -
for example the standalone webrender might use euclid 0.10.4 while the
one in gecko uses euclid 0.10.3. Although both choices are "valid" per
the semantic versioning rules in webrender's Cargo.toml, the 0.2.3 may provide
a bugfix that is needed for correct behaviour in webrender. If this is the case,
the technically "correct" fix is to change the upstream webrender Cargo.toml
file to require the correct version. Alternnatively, you can update the
Cargo.lock files in m-c to pull in the new version. The way to do this is as
follows:
- Go to toolkit/library/rust and run |cargo update -p <package> --precise <version>|.
Repeat this for as many libraries as you need to update. Run the same commands
in toolkit/library/gtest/rust and js/src (ignore any errors about unmatched
packages). Commit all the changes locally.
- Run |mach vendor rust|, which will update the corresponding libraries in
third_party/rust to the versions you specified.
The reason we don't do this by default is to work around bug 1336528. Specifically,
there is another crate in m-c called mozjs_sys which is built separately but uses
the same folder to store its rust dependencies. If one of the libraries that is
required by both mozjs_sys and webrender is updated without updating the other
project's Cargo.lock file, that results in build bustage.
This means that any time you do this sort of manual update of packages, you need
to make sure that mozjs_sys also has its Cargo.lock file updated if needed, hence
the need to run the cargo update command in js/src as well. Hopefully this will
be resolved soon.
2. Sometimes autoland tip has changed enough from mozilla-central (because of the
servo vcs-sync-bot, which will sync servo into m-c and often re-vendor third-
party rust dependencies) that trying to land an update based on mozilla-central
will not work well. As in, you'll get conflicts in Cargo.lock files or in the
third_party/rust directory. This is best handled by running your update steps
on top of autoland tip rather than central. (The script-based update in option A
has an env var you can set to do this). In theory you can get the same
result by resolving the conflict manually but Cargo.lock files are usually not
trivial to merge by hand. If it's just the third_party/rust dir that has conflicts
you can delete it and run |mach vendor rust| again to repopulate it.
-------------------------------------------------------------------------------
The version of WebRender currently in the tree is:
6440dff485271cdfd24a22c920cea31e01e2b164

View File

@ -19,6 +19,8 @@
#include "unicode/uloc.h"
#define INTL_SYSTEM_LOCALES_CHANGED "intl:system-locales-changed"
#define MATCH_OS_LOCALE_PREF "intl.locale.matchOS"
#define SELECTED_LOCALE_PREF "general.useragent.locale"
@ -175,8 +177,13 @@ LocaleService::GetInstance()
// from prefs.
DebugOnly<nsresult> rv = Preferences::AddWeakObservers(sInstance, kObservedPrefs);
MOZ_ASSERT(NS_SUCCEEDED(rv), "Adding observers failed.");
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
obs->AddObserver(sInstance, INTL_SYSTEM_LOCALES_CHANGED, true);
}
}
ClearOnShutdown(&sInstance);
ClearOnShutdown(&sInstance, ShutdownPhase::Shutdown);
}
return sInstance;
}
@ -185,6 +192,11 @@ LocaleService::~LocaleService()
{
if (mIsServer) {
Preferences::RemoveObservers(this, kObservedPrefs);
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
obs->RemoveObserver(this, INTL_SYSTEM_LOCALES_CHANGED);
}
}
}
@ -270,16 +282,16 @@ LocaleService::GetAvailableLocales(nsTArray<nsCString>& aRetVal)
void
LocaleService::OnAvailableLocalesChanged()
LocaleService::AvailableLocalesChanged()
{
MOZ_ASSERT(mIsServer, "This should only be called in the server mode.");
mAvailableLocales.Clear();
// In the future we may want to trigger here intl:available-locales-changed
OnLocalesChanged();
LocalesChanged();
}
void
LocaleService::OnRequestedLocalesChanged()
LocaleService::RequestedLocalesChanged()
{
MOZ_ASSERT(mIsServer, "This should only be called in the server mode.");
@ -292,12 +304,12 @@ LocaleService::OnRequestedLocalesChanged()
if (obs) {
obs->NotifyObservers(nullptr, "intl:requested-locales-changed", nullptr);
}
OnLocalesChanged();
LocalesChanged();
}
}
void
LocaleService::OnLocalesChanged()
LocaleService::LocalesChanged()
{
MOZ_ASSERT(mIsServer, "This should only be called in the server mode.");
@ -519,19 +531,24 @@ LocaleService::Observe(nsISupports *aSubject, const char *aTopic,
{
MOZ_ASSERT(mIsServer, "This should only be called in the server mode.");
NS_ConvertUTF16toUTF8 pref(aData);
if (!strcmp(aTopic, INTL_SYSTEM_LOCALES_CHANGED)) {
RequestedLocalesChanged();
} else {
NS_ConvertUTF16toUTF8 pref(aData);
// This is a temporary solution until we get bug 1337078 landed.
if (pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
OSPreferences::GetInstance()->Refresh();
}
// At the moment the only thing we're observing are settings indicating
// user requested locales.
if (pref.EqualsLiteral(MATCH_OS_LOCALE_PREF) ||
pref.EqualsLiteral(SELECTED_LOCALE_PREF) ||
pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
OnRequestedLocalesChanged();
// This is a temporary solution until we get bug 1337078 landed.
if (pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
OSPreferences::GetInstance()->Refresh();
}
// At the moment the only thing we're observing are settings indicating
// user requested locales.
if (pref.EqualsLiteral(MATCH_OS_LOCALE_PREF) ||
pref.EqualsLiteral(SELECTED_LOCALE_PREF) ||
pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
RequestedLocalesChanged();
}
}
return NS_OK;
}

View File

@ -213,9 +213,9 @@ public:
*
* This code should be called only in the server mode..
*/
void OnAvailableLocalesChanged();
void OnRequestedLocalesChanged();
void OnLocalesChanged();
void AvailableLocalesChanged();
void RequestedLocalesChanged();
void LocalesChanged();
/**
* Negotiates the best locales out of an ordered list of requested locales and

View File

@ -11,3 +11,9 @@ for header in ('GCAnnotations.h', 'GCAPI.h', 'HeapAPI.h', 'RootingAPI.h', 'Slice
with Files('public/TrackedOptimizationInfo.h'):
BUG_COMPONENT = component_jit
with Files("src/**"):
SCHEDULES.inclusive += ['jittest', 'jsreftest']
with Files("public/**"):
SCHEDULES.inclusive += ['jittest', 'jsreftest']

View File

@ -0,0 +1,8 @@
if (helperThreadCount() === 0)
quit();
evalInCooperativeThread(`
(new Promise(function(resolve, reject) { resolve(); })).then(() => {});
drainJobQueue();
`);

View File

@ -1140,11 +1140,11 @@ class MOZ_STACK_CLASS ReportExceptionClosure : public ScriptEnvironmentPreparer:
} // anonymous namespace
JS_FRIEND_API(bool)
js::UseInternalJobQueues(JSContext* cx)
js::UseInternalJobQueues(JSContext* cx, bool cooperative)
{
// Internal job queue handling must be set up very early. Self-hosting
// initialization is as good a marker for that as any.
MOZ_RELEASE_ASSERT(!cx->runtime()->hasInitializedSelfHosting(),
MOZ_RELEASE_ASSERT(cooperative || !cx->runtime()->hasInitializedSelfHosting(),
"js::UseInternalJobQueues must be called early during runtime startup.");
MOZ_ASSERT(!cx->jobQueue);
auto* queue = js_new<PersistentRooted<JobQueue>>(cx, JobQueue(SystemAllocPolicy()));
@ -1152,7 +1152,10 @@ js::UseInternalJobQueues(JSContext* cx)
return false;
cx->jobQueue = queue;
cx->runtime()->offThreadPromiseState.ref().initInternalDispatchQueue();
if (!cooperative)
cx->runtime()->offThreadPromiseState.ref().initInternalDispatchQueue();
MOZ_ASSERT(cx->runtime()->offThreadPromiseState.ref().initialized());
JS::SetEnqueuePromiseJobCallback(cx, InternalEnqueuePromiseJobCallback);

View File

@ -435,7 +435,7 @@ ForgetSourceHook(JSContext* cx);
* right time(s), such as after evaluation of a script has run to completion.
*/
extern JS_FRIEND_API(bool)
UseInternalJobQueues(JSContext* cx);
UseInternalJobQueues(JSContext* cx, bool cooperative = false);
/**
* Instruct the runtime to stop draining the internal job queue.

View File

@ -3579,6 +3579,8 @@ WorkerMain(void* arg)
} else {
JS_AddInterruptCallback(cx, ShellInterruptCallback);
js::UseInternalJobQueues(cx, /* cooperative = */true);
// The Gecko Profiler requires that all cooperating contexts have
// profiling stacks installed.
MOZ_ALWAYS_TRUE(EnsureGeckoProfilingStackInstalled(cx, sc));

View File

@ -729,7 +729,7 @@ JSRuntime::enqueuePromiseJob(JSContext* cx, HandleFunction job, HandleObject pro
HandleObject incumbentGlobal)
{
MOZ_ASSERT(cx->enqueuePromiseJobCallback,
"Must set a callback using JS_SetEnqeueuPromiseJobCallback before using Promises");
"Must set a callback using JS::SetEnqueuePromiseJobCallback before using Promises");
MOZ_ASSERT_IF(incumbentGlobal, !IsWrapper(incumbentGlobal) && !IsWindowProxy(incumbentGlobal));
void* data = cx->enqueuePromiseJobCallbackData;

View File

@ -28,6 +28,7 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase):
# Element IDs.
_input_id = 'input'
_input_padding_id = 'input-padding'
_input_size_id = 'input-size'
_textarea_id = 'textarea'
_textarea2_id = 'textarea2'
_textarea_one_line_id = 'textarea-one-line'
@ -570,36 +571,29 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase):
def test_long_press_to_select_when_partial_visible_word_is_selected(self):
self.open_test_html(self._selection_html)
el = self.marionette.find_element(By.ID, self._input_id)
el = self.marionette.find_element(By.ID, self._input_size_id)
sel = SelectionManager(el)
# To successfully select the second word while the first word is being
# selected, use sufficient spaces between 'a' and 'b' to avoid the
# second caret covers on the second word.
original_content = 'aaaaaaaa bbbbbbbb'
el.clear()
el.send_keys(original_content)
original_content = sel.content
words = original_content.split()
# We cannot use self.long_press_on_word() directly since it has will
# change the cursor position which affects this test. We have to store
# the position of word 0 and word 1 before long-pressing to select the
# word.
# We cannot use self.long_press_on_word() for the second long press
# on the first word because it has side effect that changes the
# cursor position. We need to save the location of the first word to
# be used later.
word0_x, word0_y = self.word_location(el, 0)
word1_x, word1_y = self.word_location(el, 1)
self.long_press_on_location(el, word0_x, word0_y)
self.assertEqual(words[0], sel.selected_content)
self.long_press_on_location(el, word1_x, word1_y)
# Long press on the second word.
self.long_press_on_word(el, 1)
self.assertEqual(words[1], sel.selected_content)
# Long press on the first word.
self.long_press_on_location(el, word0_x, word0_y)
self.assertEqual(words[0], sel.selected_content)
# If the second carets is visible, it can be dragged to the position of
# the first caret. After that, selection will contain only the first
# character.
# If the second caret is visible, it can be dragged to the position
# of the first caret. After that, selection will contain only the
# first character.
(caret1_x, caret1_y), (caret2_x, caret2_y) = sel.carets_location()
self.actions.flick(el, caret2_x, caret2_y, caret1_x, caret1_y).perform()
self.assertEqual(words[0][0], sel.selected_content)

View File

@ -1182,7 +1182,7 @@ test-pref(dom.use_xbl_scopes_for_remote_xul,true) != 449149-1b.html about:blank
== 449149-2.html 449149-2-ref.html
== 449171-1.html 449171-ref.html
== 449362-1.html 449362-1-ref.html
fuzzy-if(webrender,3,349) == 449519-1.html 449519-1-ref.html
fuzzy-if(webrender,3,360) == 449519-1.html 449519-1-ref.html
== 450670-1.html 450670-1-ref.html
== 451168-1.html 451168-1-ref.html
== 451876-1.html 451876-1-ref.html

View File

@ -964,18 +964,27 @@ nsresult NrIceCtx::StartGathering(bool default_route_only, bool proxy_only) {
SetCtxFlags(default_route_only, proxy_only);
TimeStamp start = TimeStamp::Now();
// This might start gathering for the first time, or again after
// renegotiation, or might do nothing at all if gathering has already
// finished.
int r = nr_ice_gather(ctx_, &NrIceCtx::gather_cb, this);
if (!r) {
SetGatheringState(ICE_CTX_GATHER_COMPLETE);
Telemetry::AccumulateTimeDelta(
Telemetry::WEBRTC_ICE_NR_ICE_GATHER_TIME_IMMEDIATE_SUCCESS, start);
} else if (r != R_WOULDBLOCK) {
MOZ_MTLOG(ML_ERROR, "Couldn't gather ICE candidates for '"
<< name_ << "', error=" << r);
SetConnectionState(ICE_CTX_FAILED);
Telemetry::AccumulateTimeDelta(
Telemetry::WEBRTC_ICE_NR_ICE_GATHER_TIME_IMMEDIATE_FAILURE, start);
return NS_ERROR_FAILURE;
} else {
Telemetry::AccumulateTimeDelta(
Telemetry::WEBRTC_ICE_NR_ICE_GATHER_TIME, start);
}
return NS_OK;

View File

@ -61,12 +61,11 @@ static mozilla::StaticAutoPtr<LogSinkImpl> sSink;
void
GetWebRtcLogPrefs(uint32_t *aTraceMask, nsACString& aLogFile,
nsACString& aAECLogDir, bool *aMultiLog)
bool *aMultiLog)
{
*aMultiLog = mozilla::Preferences::GetBool("media.webrtc.debug.multi_log");
*aTraceMask = mozilla::Preferences::GetUint("media.webrtc.debug.trace_mask");
mozilla::Preferences::GetCString("media.webrtc.debug.log_file", aLogFile);
mozilla::Preferences::GetCString("media.webrtc.debug.aec_log_dir", aAECLogDir);
webrtc::Trace::set_aec_debug_size(mozilla::Preferences::GetUint("media.webrtc.debug.aec_dump_max_size"));
}
@ -123,7 +122,7 @@ CheckOverrides(uint32_t *aTraceMask, nsACString *aLogFile, bool *aMultiLog)
}
void ConfigWebRtcLog(mozilla::LogLevel level, uint32_t trace_mask,
nsCString &aLogFile, nsCString &aAECLogDir, bool multi_log)
nsCString &aLogFile, bool multi_log)
{
if (gWebRtcTraceLoggingOn) {
return;
@ -217,16 +216,15 @@ void StartWebRtcLog(uint32_t log_level)
uint32_t trace_mask = 0;
bool multi_log = false;
nsAutoCString log_file;
nsAutoCString aec_log_dir;
GetWebRtcLogPrefs(&trace_mask, log_file, aec_log_dir, &multi_log);
GetWebRtcLogPrefs(&trace_mask, log_file, &multi_log);
mozilla::LogLevel level = CheckOverrides(&trace_mask, &log_file, &multi_log);
if (trace_mask == 0) {
trace_mask = log_level;
}
ConfigWebRtcLog(level, trace_mask, log_file, aec_log_dir, multi_log);
ConfigWebRtcLog(level, trace_mask, log_file, multi_log);
}
@ -239,11 +237,10 @@ void EnableWebRtcLog()
uint32_t trace_mask = 0;
bool multi_log = false;
nsAutoCString log_file;
nsAutoCString aec_log_dir;
GetWebRtcLogPrefs(&trace_mask, log_file, aec_log_dir, &multi_log);
GetWebRtcLogPrefs(&trace_mask, log_file, &multi_log);
mozilla::LogLevel level = CheckOverrides(&trace_mask, &log_file, &multi_log);
ConfigWebRtcLog(level, trace_mask, log_file, aec_log_dir, multi_log);
ConfigWebRtcLog(level, trace_mask, log_file, multi_log);
}
// Called when we destroy the singletons from PeerConnectionCtx or if the
@ -260,31 +257,21 @@ void StopWebRtcLog()
}
}
void ConfigAecLog(nsCString &aAECLogDir) {
void ConfigAecLog() {
if (webrtc::Trace::aec_debug()) {
return;
}
nsCString aAECLogDir;
#if defined(ANDROID)
// For AEC, do not use a default value: force the user to specify a directory.
if (aAECLogDir.IsEmpty()) {
aAECLogDir.Assign(default_tmp_dir);
}
aAECLogDir.Assign(default_tmp_dir);
#else
if (aAECLogDir.IsEmpty()) {
nsCOMPtr<nsIFile> tempDir;
nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempDir));
if (NS_SUCCEEDED(rv)) {
if (aAECLogDir.IsEmpty()) {
tempDir->GetNativePath(aAECLogDir);
}
}
nsCOMPtr<nsIFile> tempDir;
nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempDir));
if (NS_SUCCEEDED(rv)) {
tempDir->GetNativePath(aAECLogDir);
}
#endif
webrtc::Trace::set_aec_debug_filename(aAECLogDir.get());
if (XRE_IsParentProcess()) {
// Capture the final choice for the aec_log_dir setting.
mozilla::Preferences::SetCString("media.webrtc.debug.aec_log_dir", aAECLogDir);
}
}
void StartAecLog()
@ -295,11 +282,10 @@ void StartAecLog()
uint32_t trace_mask = 0;
bool multi_log = false;
nsAutoCString log_file;
nsAutoCString aec_log_dir;
GetWebRtcLogPrefs(&trace_mask, log_file, aec_log_dir, &multi_log);
GetWebRtcLogPrefs(&trace_mask, log_file, &multi_log);
CheckOverrides(&trace_mask, &log_file, &multi_log);
ConfigAecLog(aec_log_dir);
ConfigAecLog();
webrtc::Trace::set_aec_debug(true);
}

Some files were not shown because too many files have changed in this diff Show More