merge mozilla-central to mozilla-inbound. r=merge a=merge
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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});
|
||||
});
|
||||
}
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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}) {
|
||||
|
@ -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/");
|
||||
|
@ -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:
|
||||
|
@ -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";
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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");
|
||||
}
|
@ -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.
|
||||
|
@ -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, {
|
||||
|
@ -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;
|
||||
});
|
||||
|
@ -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", {});
|
||||
});
|
||||
});
|
||||
|
@ -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]
|
||||
|
@ -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",
|
||||
|
@ -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 = [];
|
||||
|
@ -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>
|
@ -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
|
||||
|
@ -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): 🔎 is the magnifier icon emoji, please don't change it. -->
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
Before Width: | Height: | Size: 1.1 KiB |
@ -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);
|
||||
|
@ -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"] {
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -17,6 +17,7 @@
|
||||
"patches": [
|
||||
"llvm-debug-frame.patch",
|
||||
"r277806.patch",
|
||||
"r285657.patch"
|
||||
"r285657.patch",
|
||||
"r313872-for-3.9.patch"
|
||||
]
|
||||
}
|
||||
|
17
build/build-clang/r313872-for-3.9.patch
Normal 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;
|
@ -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',
|
||||
]
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
43
devtools/shim/aboutdevtools/aboutdevtools-registration.js
Normal 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
|
||||
]);
|
97
devtools/shim/aboutdevtools/aboutdevtools.css
Normal 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;
|
||||
}
|
82
devtools/shim/aboutdevtools/aboutdevtools.js
Normal 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});
|
2
devtools/shim/aboutdevtools/aboutdevtools.manifest
Normal 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}
|
129
devtools/shim/aboutdevtools/aboutdevtools.xhtml
Normal 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>
|
26
devtools/shim/aboutdevtools/images/feature-console.svg
Executable 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 |
34
devtools/shim/aboutdevtools/images/feature-debugger.svg
Executable 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 |
41
devtools/shim/aboutdevtools/images/feature-inspector.svg
Executable 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 |
33
devtools/shim/aboutdevtools/images/feature-memory.svg
Executable 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 |
23
devtools/shim/aboutdevtools/images/feature-network.svg
Executable 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 |
32
devtools/shim/aboutdevtools/images/feature-performance.svg
Executable 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 |
38
devtools/shim/aboutdevtools/images/feature-responsive-mode.svg
Executable 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 |
@ -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 |
20
devtools/shim/aboutdevtools/images/feature-storage.svg
Executable 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 |
@ -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 |
24
devtools/shim/aboutdevtools/images/feature-visual-editing.svg
Executable 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 |
1
devtools/shim/aboutdevtools/images/feature-web-audio.svg
Normal 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 |
BIN
devtools/shim/aboutdevtools/images/otter.png
Normal file
After Width: | Height: | Size: 266 KiB |
12
devtools/shim/aboutdevtools/moz.build
Normal 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']
|
6
devtools/shim/aboutdevtools/test/.eslintrc.js
Normal file
@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
// Extend from the shared list of defined globals for mochitests.
|
||||
"extends": "../../../.eslintrc.mochitests.js"
|
||||
};
|
7
devtools/shim/aboutdevtools/test/browser.ini
Normal file
@ -0,0 +1,7 @@
|
||||
[DEFAULT]
|
||||
tags = devtools
|
||||
subsuite = devtools
|
||||
support-files =
|
||||
head.js
|
||||
|
||||
[browser_aboutdevtools_enables_devtools.js]
|
@ -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);
|
||||
});
|
92
devtools/shim/aboutdevtools/test/head.js
Normal 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);
|
||||
});
|
||||
};
|
@ -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);
|
||||
|
@ -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)
|
||||
|
20
devtools/shim/locales/en-US/aboutdevtools.dtd
Normal 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 "You’ve successfully enabled DevTools! To get started explore the Web Developer menu or open the tools with ##INSPECTOR_SHORTCUT##.">
|
8
devtools/shim/locales/en-US/startup.properties
Normal 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
|
@ -20,6 +20,7 @@ if CONFIG['MOZ_DEVTOOLS'] != 'server':
|
||||
]
|
||||
|
||||
DIRS += [
|
||||
'aboutdevtools',
|
||||
'locales',
|
||||
]
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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_
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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']
|
||||
|
8
js/src/jit-test/tests/promise/cooperative-thread.js
Normal file
@ -0,0 +1,8 @@
|
||||
if (helperThreadCount() === 0)
|
||||
quit();
|
||||
|
||||
evalInCooperativeThread(`
|
||||
(new Promise(function(resolve, reject) { resolve(); })).then(() => {});
|
||||
|
||||
drainJobQueue();
|
||||
`);
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|