Merge mozilla-central to mozilla-inbound

This commit is contained in:
Carsten "Tomcat" Book 2016-06-10 15:44:04 +02:00
Родитель 6697f3e22c 4ee1ed2b8f
Коммит 2266139ee3
277 изменённых файлов: 3566 добавлений и 1564 удалений

Просмотреть файл

@ -107,6 +107,7 @@ devtools/client/webconsole/**
!devtools/client/webconsole/jsterm.js !devtools/client/webconsole/jsterm.js
!devtools/client/webconsole/console-commands.js !devtools/client/webconsole/console-commands.js
devtools/client/webide/** devtools/client/webide/**
!devtools/client/webide/components/webideCli.js
devtools/server/** devtools/server/**
!devtools/server/actors/webbrowser.js !devtools/server/actors/webbrowser.js
!devtools/server/actors/styles.js !devtools/server/actors/styles.js
@ -117,6 +118,7 @@ devtools/shared/*.js
!devtools/shared/event-emitter.js !devtools/shared/event-emitter.js
!devtools/shared/task.js !devtools/shared/task.js
devtools/shared/*.jsm devtools/shared/*.jsm
!devtools/shared/Loader.jsm
devtools/shared/apps/** devtools/shared/apps/**
devtools/shared/client/** devtools/shared/client/**
devtools/shared/discovery/** devtools/shared/discovery/**

Просмотреть файл

@ -614,6 +614,8 @@ pref("accessibility.typeaheadfind", false);
pref("accessibility.typeaheadfind.timeout", 5000); pref("accessibility.typeaheadfind.timeout", 5000);
pref("accessibility.typeaheadfind.linksonly", false); pref("accessibility.typeaheadfind.linksonly", false);
pref("accessibility.typeaheadfind.flashBar", 1); pref("accessibility.typeaheadfind.flashBar", 1);
pref("findbar.highlightAll", true);
pref("findbar.modalHighlight", true);
// Tracks when accessibility is loaded into the previous session. // Tracks when accessibility is loaded into the previous session.
pref("accessibility.loadedInLastSession", false); pref("accessibility.loadedInLastSession", false);
@ -1418,6 +1420,8 @@ pref("browser.esedbreader.loglevel", "Error");
pref("browser.laterrun.enabled", false); pref("browser.laterrun.enabled", false);
pref("browser.migration.automigrate", false);
// Enable browser frames for use on desktop. Only exposed to chrome callers. // Enable browser frames for use on desktop. Only exposed to chrome callers.
pref("dom.mozBrowserFramesEnabled", true); pref("dom.mozBrowserFramesEnabled", true);

Просмотреть файл

@ -75,8 +75,8 @@ a {
-moz-box-flex: 1; -moz-box-flex: 1;
padding-top: 6px; padding-top: 6px;
padding-bottom: 6px; padding-bottom: 6px;
padding-left: 34px; padding-inline-start: 34px;
padding-right: 8px; padding-inline-end: 8px;
background: hsla(0,0%,100%,.9) padding-box; background: hsla(0,0%,100%,.9) padding-box;
border: 1px solid; border: 1px solid;
border-radius: 2px 0 0 2px; border-radius: 2px 0 0 2px;
@ -124,6 +124,7 @@ a {
#searchSubmit:dir(rtl) { #searchSubmit:dir(rtl) {
border-radius: 2px 0 0 2px; border-radius: 2px 0 0 2px;
background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl"), linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1));
} }
#searchText:focus + #searchSubmit, #searchText:focus + #searchSubmit,
@ -143,6 +144,12 @@ a {
0 1px 0 hsla(210,54%,20%,.03); 0 1px 0 hsla(210,54%,20%,.03);
} }
#searchText:focus + #searchSubmit:dir(rtl),
#searchText[keepfocus] + #searchSubmit:dir(rtl),
#searchText[autofocus] + #searchSubmit:dir(rtl) {
background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl-inverted"), linear-gradient(#4cb1ff, #1793e5);
}
#searchText + #searchSubmit:hover { #searchText + #searchSubmit:hover {
background: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-inverted") center center no-repeat, linear-gradient(#66bdff, #0d9eff); background: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-inverted") center center no-repeat, linear-gradient(#66bdff, #0d9eff);
box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset, box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
@ -151,6 +158,10 @@ a {
0 0 4px hsla(206,100%,20%,.2); 0 0 4px hsla(206,100%,20%,.2);
} }
#searchText + #searchSubmit:dir(rtl):hover {
background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl-inverted"), linear-gradient(#66bdff, #0d9eff);
}
#searchText + #searchSubmit:hover:active { #searchText + #searchSubmit:hover:active {
box-shadow: 0 1px 1px hsla(211,79%,6%,.1) inset, box-shadow: 0 1px 1px hsla(211,79%,6%,.1) inset,
0 0 1px hsla(211,79%,6%,.2) inset; 0 0 1px hsla(211,79%,6%,.2) inset;

Просмотреть файл

@ -14,6 +14,11 @@
cursor: default; cursor: default;
} }
.contentSearchSuggestionTable:-moz-dir(rtl) {
left: auto;
right: 0;
}
.contentSearchSuggestionsList { .contentSearchSuggestionsList {
border-bottom: 1px solid hsl(0, 0%, 92%); border-bottom: 1px solid hsl(0, 0%, 92%);
width: 100%; width: 100%;
@ -38,7 +43,7 @@
.contentSearchHeaderRow > td > img, .contentSearchHeaderRow > td > img,
.contentSearchSuggestionRow > td > .historyIcon { .contentSearchSuggestionRow > td > .historyIcon {
margin-right: 8px; margin-inline-end: 8px;
margin-bottom: -3px; margin-bottom: -3px;
} }
@ -110,6 +115,10 @@
background-position: right center; background-position: right center;
} }
.contentSearchOneOffItem:-moz-dir(rtl) {
background-position: left center;
}
.contentSearchOneOffItem > img { .contentSearchOneOffItem > img {
width: 16px; width: 16px;
height: 16px; height: 16px;

Просмотреть файл

@ -366,8 +366,8 @@ input[type=button] {
-moz-box-flex: 1; -moz-box-flex: 1;
padding-top: 6px; padding-top: 6px;
padding-bottom: 6px; padding-bottom: 6px;
padding-left: 34px; padding-inline-start: 34px;
padding-right: 8px; padding-inline-end: 8px;
background: hsla(0,0%,100%,.9) padding-box; background: hsla(0,0%,100%,.9) padding-box;
border: 1px solid; border: 1px solid;
border-spacing: 0; border-spacing: 0;
@ -416,6 +416,7 @@ input[type=button] {
#newtab-search-submit:dir(rtl) { #newtab-search-submit:dir(rtl) {
border-radius: 2px 0 0 2px; border-radius: 2px 0 0 2px;
background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl"), linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1));
} }
#newtab-search-text:focus + #newtab-search-submit, #newtab-search-text:focus + #newtab-search-submit,
@ -448,6 +449,13 @@ input[type=button] {
transition-duration: 0ms; transition-duration: 0ms;
} }
#newtab-search-text:focus + #newtab-search-submit:dir(rtl),
#newtab-search-text[keepfocus] + #newtab-search-submit:dir(rtl),
#newtab-search-text[autofocus] + #newtab-search-submit:dir(rtl),
#newtab-search-text + #newtab-search-submit:dir(rtl):hover {
background-image: url("chrome://browser/skin/search-arrow-go.svg#search-arrow-go-rtl-inverted"), linear-gradient(#4cb1ff, #1793e5);
}
/* CUSTOMIZE */ /* CUSTOMIZE */
#newtab-customize-overlay { #newtab-customize-overlay {
opacity: 0; opacity: 0;

Просмотреть файл

@ -1005,7 +1005,7 @@ function promisePopupHidden(popup) {
function promiseNotificationShown(notification) { function promiseNotificationShown(notification) {
let win = notification.browser.ownerDocument.defaultView; let win = notification.browser.ownerDocument.defaultView;
if (win.PopupNotifications.panel.state == "open") { if (win.PopupNotifications.panel.state == "open") {
return Promise.resolved(); return Promise.resolve();
} }
let panelPromise = promisePopupShown(win.PopupNotifications.panel); let panelPromise = promisePopupShown(win.PopupNotifications.panel);
notification.reshow(); notification.reshow();

Просмотреть файл

@ -117,7 +117,7 @@ var tests = [
}, },
// Moving a tab to a new window should preserve swappable notifications. // Moving a tab to a new window should preserve swappable notifications.
{ id: "Test#6", { id: "Test#6",
run: function() { run: function* () {
gBrowser.selectedTab = gBrowser.addTab("about:blank"); gBrowser.selectedTab = gBrowser.addTab("about:blank");
let notifyObj = new BasicNotification(this.id); let notifyObj = new BasicNotification(this.id);
let originalCallback = notifyObj.options.eventCallback; let originalCallback = notifyObj.options.eventCallback;
@ -126,17 +126,26 @@ var tests = [
return eventName == "swapping"; return eventName == "swapping";
}; };
showNotification(notifyObj); let notification = showNotification(notifyObj);
let win = gBrowser.replaceTabWithWindow(gBrowser.selectedTab); let win = gBrowser.replaceTabWithWindow(gBrowser.selectedTab);
whenDelayedStartupFinished(win, function() { yield whenDelayedStartupFinished(win);
let [tab] = win.gBrowser.tabs; let [tab] = win.gBrowser.tabs;
let anchor = win.document.getElementById("default-notification-icon"); let anchor = win.document.getElementById("default-notification-icon");
win.PopupNotifications._reshowNotifications(anchor);
yield new Promise(resolve => {
notification.options.eventCallback = function (eventName) {
if (eventName == "shown") {
resolve();
}
};
info("Showing the notification again");
notification.reshow();
});
checkPopup(win.PopupNotifications.panel, notifyObj); checkPopup(win.PopupNotifications.panel, notifyObj);
ok(notifyObj.swappingCallbackTriggered, "the swapping callback was triggered"); ok(notifyObj.swappingCallbackTriggered, "the swapping callback was triggered");
win.close(); win.close();
goNext(); goNext();
});
} }
}, },
// the hideNotNow option // the hideNotNow option

Просмотреть файл

@ -8,12 +8,18 @@ XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
"resource://gre/modules/PlacesUtils.jsm"); "resource://gre/modules/PlacesUtils.jsm");
function whenDelayedStartupFinished(aWindow, aCallback) { function whenDelayedStartupFinished(aWindow, aCallback) {
return new Promise(resolve => {
info("Waiting for delayed startup to finish");
Services.obs.addObserver(function observer(aSubject, aTopic) { Services.obs.addObserver(function observer(aSubject, aTopic) {
if (aWindow == aSubject) { if (aWindow == aSubject) {
Services.obs.removeObserver(observer, aTopic); Services.obs.removeObserver(observer, aTopic);
if (aCallback) {
executeSoon(aCallback); executeSoon(aCallback);
} }
resolve();
}
}, "browser-delayed-startup-finished", false); }, "browser-delayed-startup-finished", false);
});
} }
/** /**

Просмотреть файл

@ -9,3 +9,4 @@ JAR_MANIFESTS += ['jar.mn']
DIRS += ['schemas'] DIRS += ['schemas']
BROWSER_CHROME_MANIFESTS += ['test/browser/browser.ini'] BROWSER_CHROME_MANIFESTS += ['test/browser/browser.ini']
XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini']

Просмотреть файл

@ -393,7 +393,7 @@ add_task(function* testSecureManifestURLsDenied() {
info(`TEST ${api} icon url: ${url}`); info(`TEST ${api} icon url: ${url}`);
let matchURLForbidden = url => ({ let matchURLForbidden = url => ({
message: new RegExp(`String "${url}" must be a relative URL`), message: new RegExp(`match the format "strictRelativeUrl"`),
}); });
let messages = [matchURLForbidden(url)]; let messages = [matchURLForbidden(url)];

Просмотреть файл

@ -45,7 +45,7 @@ add_task(function* test_delete() {
browser.test.sendMessage("ready"); browser.test.sendMessage("ready");
} }
const REFERENCE_DATE = new Date(1999, 9, 9, 9, 9); const BASE_URL = "http://mozilla.com/test_history/";
let extension = ExtensionTestUtils.loadExtension({ let extension = ExtensionTestUtils.loadExtension({
manifest: { manifest: {
@ -60,65 +60,75 @@ add_task(function* test_delete() {
let historyClearedCount; let historyClearedCount;
let visits = []; let visits = [];
let visitDate = new Date(1999, 9, 9, 9, 9).getTime();
function pushVisit(visits) {
visitDate += 1000;
visits.push({date: new Date(visitDate)});
}
// Add 5 visits for one uri and 3 visits for 3 others // Add 5 visits for one uri and 3 visits for 3 others
for (let i = 0; i < 8; ++i) { for (let i = 0; i < 4; ++i) {
let baseUri = "http://mozilla.com/test_history/";
let uri = (i > 4) ? `${baseUri}${i}/` : baseUri;
let dbDate = PlacesUtils.toPRTime(Number(REFERENCE_DATE) + 3600 * 1000 * i);
let visit = { let visit = {
uri, url: `${BASE_URL}${i}`,
title: "visit " + i, title: "visit " + i,
visitDate: dbDate, visits: [],
}; };
if (i === 0) {
for (let j = 0; j < 5; ++j) {
pushVisit(visit.visits);
}
} else {
pushVisit(visit.visits);
}
visits.push(visit); visits.push(visit);
} }
yield PlacesTestUtils.addVisits(visits); yield PlacesUtils.history.insertMany(visits);
is(yield PlacesTestUtils.visitsInDB(visits[0].uri), 5, "5 visits for uri found in history database"); is(yield PlacesTestUtils.visitsInDB(visits[0].url), 5, "5 visits for uri found in history database");
let testUrl = visits[6].uri.spec; let testUrl = visits[2].url;
ok(yield PlacesTestUtils.isPageInDB(testUrl), "expected url found in history database"); ok(yield PlacesTestUtils.isPageInDB(testUrl), "expected url found in history database");
extension.sendMessage("delete-url", testUrl); extension.sendMessage("delete-url", testUrl);
yield extension.awaitMessage("url-deleted"); yield extension.awaitMessage("url-deleted");
is(yield PlacesTestUtils.isPageInDB(testUrl), false, "expected url not found in history database"); is(yield PlacesTestUtils.isPageInDB(testUrl), false, "expected url not found in history database");
// delete 3 of the 5 visits for url 1
let filter = { let filter = {
startTime: PlacesUtils.toDate(visits[1].visitDate), startTime: visits[0].visits[0].date,
endTime: PlacesUtils.toDate(visits[3].visitDate), endTime: visits[0].visits[2].date,
}; };
extension.sendMessage("delete-range", filter); extension.sendMessage("delete-range", filter);
let removedUrls = yield extension.awaitMessage("range-deleted"); let removedUrls = yield extension.awaitMessage("range-deleted");
ok(!removedUrls.includes(visits[0].uri.spec), `${visits[0].uri.spec} received by onVisitRemoved`); ok(!removedUrls.includes(visits[0].url), `${visits[0].url} not received by onVisitRemoved`);
ok(yield PlacesTestUtils.isPageInDB(visits[0].url), "expected uri found in history database");
is(yield PlacesTestUtils.visitsInDB(visits[0].url), 2, "2 visits for uri found in history database");
ok(yield PlacesTestUtils.isPageInDB(visits[1].url), "expected uri found in history database");
is(yield PlacesTestUtils.visitsInDB(visits[1].url), 1, "1 visit for uri found in history database");
ok(yield PlacesTestUtils.isPageInDB(visits[0].uri), "expected uri found in history database"); // delete the rest of the visits for url 1, and the visit for url 2
is(yield PlacesTestUtils.visitsInDB(visits[0].uri), 2, "2 visits for uri found in history database"); filter.startTime = visits[0].visits[0].date;
ok(yield PlacesTestUtils.isPageInDB(visits[5].uri), "expected uri found in history database"); filter.endTime = visits[1].visits[0].date;
is(yield PlacesTestUtils.visitsInDB(visits[5].uri), 1, "1 visit for uri found in history database");
filter.startTime = PlacesUtils.toDate(visits[0].visitDate);
filter.endTime = PlacesUtils.toDate(visits[5].visitDate);
extension.sendMessage("delete-range", filter); extension.sendMessage("delete-range", filter);
yield extension.awaitMessage("range-deleted"); yield extension.awaitMessage("range-deleted");
is(yield PlacesTestUtils.isPageInDB(visits[0].uri), false, "expected uri not found in history database"); is(yield PlacesTestUtils.isPageInDB(visits[0].url), false, "expected uri not found in history database");
is(yield PlacesTestUtils.visitsInDB(visits[0].uri), 0, "0 visits for uri found in history database"); is(yield PlacesTestUtils.visitsInDB(visits[0].url), 0, "0 visits for uri found in history database");
is(yield PlacesTestUtils.isPageInDB(visits[5].uri), false, "expected uri not found in history database"); is(yield PlacesTestUtils.isPageInDB(visits[1].url), false, "expected uri not found in history database");
is(yield PlacesTestUtils.visitsInDB(visits[5].uri), 0, "0 visits for uri found in history database"); is(yield PlacesTestUtils.visitsInDB(visits[1].url), 0, "0 visits for uri found in history database");
ok(yield PlacesTestUtils.isPageInDB(visits[7].uri), "expected uri found in history database"); ok(yield PlacesTestUtils.isPageInDB(visits[3].url), "expected uri found in history database");
extension.sendMessage("delete-all"); extension.sendMessage("delete-all");
[historyClearedCount, removedUrls] = yield extension.awaitMessage("history-cleared"); [historyClearedCount, removedUrls] = yield extension.awaitMessage("history-cleared");
is(PlacesUtils.history.hasHistoryEntries, false, "history is empty"); is(PlacesUtils.history.hasHistoryEntries, false, "history is empty");
is(historyClearedCount, 2, "onVisitRemoved called for each clearing of history"); is(historyClearedCount, 2, "onVisitRemoved called for each clearing of history");
is(removedUrls.length, 3, "onVisitRemoved called the expected number of times"); is(removedUrls.length, 3, "onVisitRemoved called the expected number of times");
for (let index of [0, 5, 6]) { for (let i = 1; i < 3; ++i) {
let url = visits[index].uri.spec; let url = visits[i].url;
ok(removedUrls.includes(url), `${url} received by onVisitRemoved`); ok(removedUrls.includes(url), `${url} received by onVisitRemoved`);
} }
yield extension.unload(); yield extension.unload();

Просмотреть файл

@ -0,0 +1,3 @@
{
"extends": "../../../../../testing/xpcshell/xpcshell.eslintrc",
}

Просмотреть файл

@ -0,0 +1,55 @@
"use strict";
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Extension",
"resource://gre/modules/Extension.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionData",
"resource://gre/modules/Extension.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
"resource://gre/modules/NetUtil.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Schemas",
"resource://gre/modules/Schemas.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Services",
"resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/ExtensionManagement.jsm");
/* exported normalizeManifest */
let BASE_MANIFEST = {
"applications": {"gecko": {"id": "test@web.ext"}},
"manifest_version": 2,
"name": "name",
"version": "0",
};
ExtensionManagement.registerSchema("chrome://browser/content/schemas/commands.json");
function* normalizeManifest(manifest, baseManifest = BASE_MANIFEST) {
const {Management} = Cu.import("resource://gre/modules/Extension.jsm", {});
yield Management.lazyInit();
let errors = [];
let context = {
url: null,
logError: error => {
errors.push(error);
},
preprocessors: {},
};
manifest = Object.assign({}, baseManifest, manifest);
let normalized = Schemas.normalize(manifest, "manifest.WebExtensionManifest", context);
normalized.errors = errors;
return normalized;
}

Просмотреть файл

@ -0,0 +1,24 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* test_manifest_commands() {
let normalized = yield normalizeManifest({
"commands": {
"toggle-feature": {
"suggested_key": {"default": "Shifty+Y"},
"description": "Send a 'toggle-feature' event to the extension",
},
},
});
let expectedError = (
String.raw`commands.toggle-feature.suggested_key.default: Value must either: ` +
String.raw`match the pattern /^\s*(Alt|Ctrl|Command|MacCtrl)\s*\+\s*(Shift\s*\+\s*)?([A-Z0-9]|Comma|Period|Home|End|PageUp|PageDown|Space|Insert|Delete|Up|Down|Left|Right)\s*$/, or ` +
String.raw`match the pattern /^(MediaNextTrack|MediaPlayPause|MediaPrevTrack|MediaStop)$/`
);
ok(normalized.error.includes(expectedError),
`The manifest error ${JSON.stringify(normalized.error)} must contain ${JSON.stringify(expectedError)}`);
});

Просмотреть файл

@ -0,0 +1,6 @@
[DEFAULT]
head = head.js
tail =
firefox-appdir = browser
[test_ext_manifest_commands.js]

Просмотреть файл

@ -491,7 +491,9 @@ GenericProtocolHandler.prototype = {
}, },
get protocolFlags() { get protocolFlags() {
return this._http.protocolFlags; let {URI_DANGEROUS_TO_LOAD, ALLOWS_PROXY_HTTP, ALLOWS_PROXY} =
Ci.nsIProtocolHandler;
return URI_DANGEROUS_TO_LOAD | ALLOWS_PROXY | ALLOWS_PROXY_HTTP;
}, },
get defaultPort() { get defaultPort() {

Просмотреть файл

@ -0,0 +1,113 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
this.EXPORTED_SYMBOLS = ["AutoMigrate"];
const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
Cu.import("resource:///modules/MigrationUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
const AutoMigrate = {
get resourceTypesToUse() {
let {BOOKMARKS, HISTORY, FORMDATA, PASSWORDS} = Ci.nsIBrowserProfileMigrator;
return BOOKMARKS | HISTORY | FORMDATA | PASSWORDS;
},
/**
* Automatically pick a migrator and resources to migrate,
* then migrate those and start up.
*
* @throws if automatically deciding on migrators/data
* failed for some reason.
*/
migrate(profileStartup, migratorKey, profileToMigrate) {
let histogram = Services.telemetry.getKeyedHistogramById("FX_STARTUP_MIGRATION_AUTOMATED_IMPORT_SUCCEEDED");
histogram.add("initialized");
let migrator = this.pickMigrator(migratorKey);
histogram.add("got-browser");
profileToMigrate = this.pickProfile(migrator, profileToMigrate);
histogram.add("got-profile");
let resourceTypes = migrator.getMigrateData(profileToMigrate, profileStartup);
if (!(resourceTypes & this.resourceTypesToUse)) {
throw new Error("No usable resources were found for the selected browser!");
}
histogram.add("got-data");
let sawErrors = false;
let migrationObserver = function(subject, topic, data) {
if (topic == "Migration:ItemError") {
sawErrors = true;
} else if (topic == "Migration:Ended") {
histogram.add(sawErrors ? "finished-with-errors" : "finished");
Services.obs.removeObserver(migrationObserver, "Migration:Ended");
Services.obs.removeObserver(migrationObserver, "Migration:ItemError");
}
};
Services.obs.addObserver(migrationObserver, "Migration:Ended", false);
Services.obs.addObserver(migrationObserver, "Migration:ItemError", false);
migrator.migrate(this.resourceTypesToUse, profileStartup, profileToMigrate);
histogram.add("migrate-called-without-exceptions");
},
/**
* Pick and return a migrator to use for automatically migrating.
*
* @param {String} migratorKey optional, a migrator key to prefer/pick.
* @returns the migrator to use for migrating.
*/
pickMigrator(migratorKey) {
if (!migratorKey) {
let defaultKey = MigrationUtils.getMigratorKeyForDefaultBrowser();
if (!defaultKey) {
throw new Error("Could not determine default browser key to migrate from");
}
migratorKey = defaultKey;
}
if (migratorKey == "firefox") {
throw new Error("Can't automatically migrate from Firefox.");
}
let migrator = MigrationUtils.getMigrator(migratorKey);
if (!migrator) {
throw new Error("Migrator specified or a default was found, but the migrator object is not available.");
}
return migrator;
},
/**
* Pick a source profile (from the original browser) to use.
*
* @param {Migrator} migrator the migrator object to use
* @param {String} suggestedId the id of the profile to migrate, if pre-specified, or null
* @returns the id of the profile to migrate, or null if migrating
* from the default profile.
*/
pickProfile(migrator, suggestedId) {
let profiles = migrator.sourceProfiles;
if (profiles && !profiles.length) {
throw new Error("No profile data found to migrate.");
}
if (suggestedId) {
if (!profiles) {
throw new Error("Profile specified but only a default profile found.");
}
let suggestedProfile = profiles.find(profile => profile.id == suggestedId);
if (!suggestedProfile) {
throw new Error("Profile specified was not found.");
}
return suggestedProfile.id;
}
if (profiles && profiles.length > 1) {
throw new Error("Don't know how to pick a profile when more than 1 profile is present.");
}
return profiles ? profiles[0].id : null;
},
};

Просмотреть файл

@ -21,6 +21,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "BookmarkHTMLUtils",
"resource://gre/modules/BookmarkHTMLUtils.jsm"); "resource://gre/modules/BookmarkHTMLUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils", XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils",
"resource://gre/modules/PromiseUtils.jsm"); "resource://gre/modules/PromiseUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AutoMigrate",
"resource:///modules/AutoMigrate.jsm");
var gMigrators = null; var gMigrators = null;
var gProfileStartup = null; var gProfileStartup = null;
@ -95,7 +97,7 @@ this.MigratorPrototype = {
* profiles. * profiles.
* *
* Each migration resource should provide: * Each migration resource should provide:
* - a |type| getter, retunring any of the migration types (see * - a |type| getter, returning any of the migration types (see
* nsIBrowserProfileMigrator). * nsIBrowserProfileMigrator).
* *
* - a |migrate| method, taking a single argument, aCallback(bool success), * - a |migrate| method, taking a single argument, aCallback(bool success),
@ -696,8 +698,22 @@ this.MigrationUtils = Object.freeze({
} }
} }
let isRefresh = migrator && skipSourcePage &&
migratorKey == AppConstants.MOZ_APP_NAME;
if (!isRefresh &&
Services.prefs.getBoolPref("browser.migration.automigrate")) {
try {
AutoMigrate.migrate(aProfileStartup, aMigratorKey, aProfileToMigrate);
return;
} catch (ex) {
// If automigration failed, continue and show the dialog.
Cu.reportError(ex);
}
}
let migrationEntryPoint = this.MIGRATION_ENTRYPOINT_FIRSTRUN; let migrationEntryPoint = this.MIGRATION_ENTRYPOINT_FIRSTRUN;
if (migrator && skipSourcePage && migratorKey == AppConstants.MOZ_APP_NAME) { if (isRefresh) {
migrationEntryPoint = this.MIGRATION_ENTRYPOINT_FXREFRESH; migrationEntryPoint = this.MIGRATION_ENTRYPOINT_FXREFRESH;
} }
@ -721,6 +737,8 @@ this.MigrationUtils = Object.freeze({
gMigrationBundle = null; gMigrationBundle = null;
}, },
gAvailableMigratorKeys,
MIGRATION_ENTRYPOINT_UNKNOWN: 0, MIGRATION_ENTRYPOINT_UNKNOWN: 0,
MIGRATION_ENTRYPOINT_FIRSTRUN: 1, MIGRATION_ENTRYPOINT_FIRSTRUN: 1,
MIGRATION_ENTRYPOINT_FXREFRESH: 2, MIGRATION_ENTRYPOINT_FXREFRESH: 2,

Просмотреть файл

@ -27,6 +27,7 @@ EXTRA_PP_COMPONENTS += [
] ]
EXTRA_JS_MODULES += [ EXTRA_JS_MODULES += [
'AutoMigrate.jsm',
'MigrationUtils.jsm', 'MigrationUtils.jsm',
] ]

Просмотреть файл

@ -0,0 +1,119 @@
Cu.import("resource:///modules/MigrationUtils.jsm");
let AutoMigrateBackstage = Cu.import("resource:///modules/AutoMigrate.jsm");
let gShimmedMigratorKeyPicker = null;
let gShimmedMigrator = null;
// This is really a proxy on MigrationUtils, but if we specify that directly,
// we get in trouble because the object itself is frozen, and Proxies can't
// return a different value to an object when directly proxying a frozen
// object.
AutoMigrateBackstage.MigrationUtils = new Proxy({}, {
get(target, name) {
if (name == "getMigratorKeyForDefaultBrowser" && gShimmedMigratorKeyPicker) {
return gShimmedMigratorKeyPicker;
}
if (name == "getMigrator" && gShimmedMigrator) {
return function() { return gShimmedMigrator };
}
return MigrationUtils[name];
},
});
do_register_cleanup(function() {
AutoMigrateBackstage.MigrationUtils = MigrationUtils;
});
/**
* Test automatically picking a browser to migrate from
*/
add_task(function* checkMigratorPicking() {
Assert.throws(() => AutoMigrate.pickMigrator("firefox"),
/Can't automatically migrate from Firefox/,
"Should throw when explicitly picking Firefox.");
Assert.throws(() => AutoMigrate.pickMigrator("gobbledygook"),
/migrator object is not available/,
"Should throw when passing unknown migrator key");
gShimmedMigratorKeyPicker = function() {
return "firefox";
};
Assert.throws(() => AutoMigrate.pickMigrator(),
/Can't automatically migrate from Firefox/,
"Should throw when implicitly picking Firefox.");
gShimmedMigratorKeyPicker = function() {
return "gobbledygook";
};
Assert.throws(() => AutoMigrate.pickMigrator(),
/migrator object is not available/,
"Should throw when an unknown migrator is the default");
gShimmedMigratorKeyPicker = function() {
return "";
};
Assert.throws(() => AutoMigrate.pickMigrator(),
/Could not determine default browser key/,
"Should throw when an unknown migrator is the default");
});
/**
* Test automatically picking a profile to migrate from
*/
add_task(function* checkProfilePicking() {
let fakeMigrator = {sourceProfiles: [{id: "a"}, {id: "b"}]};
Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator),
/Don't know how to pick a profile when more/,
"Should throw when there are multiple profiles.");
Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator, "c"),
/Profile specified was not found/,
"Should throw when the profile supplied doesn't exist.");
let profileToMigrate = AutoMigrate.pickProfile(fakeMigrator, "b");
Assert.equal(profileToMigrate, "b", "Should return profile supplied");
fakeMigrator.sourceProfiles = null;
Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator, "c"),
/Profile specified but only a default profile found./,
"Should throw when the profile supplied doesn't exist.");
profileToMigrate = AutoMigrate.pickProfile(fakeMigrator);
Assert.equal(profileToMigrate, null, "Should return default profile when that's the only one.");
fakeMigrator.sourceProfiles = [];
Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator),
/No profile data found/,
"Should throw when no profile data is present.");
fakeMigrator.sourceProfiles = [{id: "a"}];
profileToMigrate = AutoMigrate.pickProfile(fakeMigrator);
Assert.equal(profileToMigrate, "a", "Should return the only profile if only one is present.");
});
/**
* Test the complete automatic process including browser and profile selection,
* and actual migration (which implies startup)
*/
add_task(function* checkIntegration() {
gShimmedMigrator = {
get sourceProfiles() {
do_print("Read sourceProfiles");
return null;
},
getMigrateData(profileToMigrate) {
this._getMigrateDataArgs = profileToMigrate;
return Ci.nsIBrowserProfileMigrator.BOOKMARKS;
},
migrate(types, startup, profileToMigrate) {
this._migrateArgs = [types, startup, profileToMigrate];
},
};
gShimmedMigratorKeyPicker = function() {
return "gobbledygook";
};
AutoMigrate.migrate("startup");
Assert.strictEqual(gShimmedMigrator._getMigrateDataArgs, null,
"getMigrateData called with 'null' as a profile");
let {BOOKMARKS, HISTORY, FORMDATA, PASSWORDS} = Ci.nsIBrowserProfileMigrator;
let expectedTypes = BOOKMARKS | HISTORY | FORMDATA | PASSWORDS;
Assert.deepEqual(gShimmedMigrator._migrateArgs, [expectedTypes, "startup", null],
"getMigrateData called with 'null' as a profile");
});

Просмотреть файл

@ -7,6 +7,7 @@ support-files =
Library/** Library/**
AppData/** AppData/**
[test_automigration.js]
[test_Chrome_cookies.js] [test_Chrome_cookies.js]
skip-if = os != "mac" # Relies on ULibDir skip-if = os != "mac" # Relies on ULibDir
[test_Chrome_passwords.js] [test_Chrome_passwords.js]

Просмотреть файл

@ -312,6 +312,9 @@ BrowserGlue.prototype = {
case "fxaccounts:onverified": case "fxaccounts:onverified":
this._showSyncStartedDoorhanger(); this._showSyncStartedDoorhanger();
break; break;
case "fxaccounts:device_disconnected":
this._onDeviceDisconnected();
break;
case "weave:engine:clients:display-uri": case "weave:engine:clients:display-uri":
this._onDisplaySyncURI(subject); this._onDisplaySyncURI(subject);
break; break;
@ -530,6 +533,7 @@ BrowserGlue.prototype = {
} }
os.addObserver(this, "weave:service:ready", false); os.addObserver(this, "weave:service:ready", false);
os.addObserver(this, "fxaccounts:onverified", false); os.addObserver(this, "fxaccounts:onverified", false);
os.addObserver(this, "fxaccounts:device_disconnected", false);
os.addObserver(this, "weave:engine:clients:display-uri", false); os.addObserver(this, "weave:engine:clients:display-uri", false);
os.addObserver(this, "session-save", false); os.addObserver(this, "session-save", false);
os.addObserver(this, "places-init-complete", false); os.addObserver(this, "places-init-complete", false);
@ -596,6 +600,7 @@ BrowserGlue.prototype = {
} }
os.removeObserver(this, "weave:service:ready"); os.removeObserver(this, "weave:service:ready");
os.removeObserver(this, "fxaccounts:onverified"); os.removeObserver(this, "fxaccounts:onverified");
os.removeObserver(this, "fxaccounts:device_disconnected");
os.removeObserver(this, "weave:engine:clients:display-uri"); os.removeObserver(this, "weave:engine:clients:display-uri");
os.removeObserver(this, "session-save"); os.removeObserver(this, "session-save");
if (this._bookmarksBackupIdleTime) { if (this._bookmarksBackupIdleTime) {
@ -2505,6 +2510,19 @@ BrowserGlue.prototype = {
} }
}, },
_onDeviceDisconnected() {
let bundle = Services.strings.createBundle("chrome://browser/locale/accounts.properties");
let title = bundle.GetStringFromName("deviceDisconnectedNotification.title");
let body = bundle.GetStringFromName("deviceDisconnectedNotification.body");
let clickCallback = (subject, topic, data) => {
if (topic != "alertclickcallback")
return;
this._openPreferences("sync");
}
AlertsService.showAlertNotification(null, title, body, true, null, clickCallback);
},
_handleFlashHang: function() { _handleFlashHang: function() {
++this._flashHangCount; ++this._flashHangCount;
if (this._flashHangCount < 2) { if (this._flashHangCount < 2) {

Просмотреть файл

@ -169,6 +169,12 @@ var gSearchPane = {
gSearchPane.remove(aEngine); gSearchPane.remove(aEngine);
break; break;
case "engine-current": case "engine-current":
// If the user is going through the drop down using up/down keys, the
// dropdown may still be open (eg. on Windows) when engine-current is
// fired, so rebuilding the list unconditionally would get in the way.
let selectedEngine =
document.getElementById("defaultEngine").selectedItem.engine;
if (selectedEngine.name != aEngine.name)
gSearchPane.buildDefaultEngineDropDown(); gSearchPane.buildDefaultEngineDropDown();
break; break;
case "engine-default": case "engine-default":

Просмотреть файл

@ -28,3 +28,8 @@ verificationNotSentBody = We are unable to send a verification mail at this time
# These strings are used in a notification shown after Sync is connected. # These strings are used in a notification shown after Sync is connected.
syncStartNotification.title = Sync enabled syncStartNotification.title = Sync enabled
syncStartNotification.body = Firefox will begin syncing momentarily. syncStartNotification.body = Firefox will begin syncing momentarily.
# LOCALIZATION NOTE (deviceDisconnectedNotification.title, deviceDisconnectedNotification.body)
# These strings are used in a notification shown after Sync was disconnected remotely.
deviceDisconnectedNotification.title = Sync disconnected
deviceDisconnectedNotification.body = This computer has been successfully disconnected from Firefox Sync.

Двоичные данные
browser/themes/linux/Geolocation-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 606 B

Двоичные данные
browser/themes/linux/Geolocation-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.9 KiB

Просмотреть файл

@ -16,8 +16,6 @@ browser.jar:
* skin/classic/browser/browser-lightweightTheme.css * skin/classic/browser/browser-lightweightTheme.css
skin/classic/browser/click-to-play-warning-stripes.png skin/classic/browser/click-to-play-warning-stripes.png
skin/classic/browser/content-contextmenu.svg skin/classic/browser/content-contextmenu.svg
skin/classic/browser/Geolocation-16.png
skin/classic/browser/Geolocation-64.png
skin/classic/browser/Info.png skin/classic/browser/Info.png
skin/classic/browser/menuPanel.png skin/classic/browser/menuPanel.png
skin/classic/browser/menuPanel@2x.png skin/classic/browser/menuPanel@2x.png
@ -34,8 +32,6 @@ browser.jar:
* skin/classic/browser/pageInfo.css * skin/classic/browser/pageInfo.css
skin/classic/browser/pageInfo.png skin/classic/browser/pageInfo.png
skin/classic/browser/page-livemarks.png skin/classic/browser/page-livemarks.png
skin/classic/browser/pointerLock-16.png
skin/classic/browser/pointerLock-64.png
skin/classic/browser/Privacy-16.png skin/classic/browser/Privacy-16.png
skin/classic/browser/privatebrowsing-mask.png skin/classic/browser/privatebrowsing-mask.png
skin/classic/browser/reload-stop-go.png skin/classic/browser/reload-stop-go.png

Двоичные данные
browser/themes/linux/pointerLock-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 249 B

Двоичные данные
browser/themes/linux/pointerLock-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Просмотреть файл

@ -49,7 +49,7 @@
-moz-image-region: rect(28px, 42px, 42px, 28px); -moz-image-region: rect(28px, 42px, 42px, 28px);
} }
.search-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon { .search-go-button:-moz-locale-dir(rtl) {
transform: scaleX(-1); transform: scaleX(-1);
} }
@ -138,6 +138,10 @@ menuitem[cmd="cmd_clearhistory"][disabled] {
background-position: right center; background-position: right center;
} }
.searchbar-engine-one-off-item:-moz-locale-dir(rtl) {
background-position: left center;
}
.searchbar-engine-one-off-item:not(.last-row) { .searchbar-engine-one-off-item:not(.last-row) {
box-sizing: content-box; box-sizing: content-box;
border-bottom: 1px solid rgba(0, 0, 0, 0.2); border-bottom: 1px solid rgba(0, 0, 0, 0.2);

Двоичные данные
browser/themes/osx/Geolocation-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 312 B

Двоичные данные
browser/themes/osx/Geolocation-16@2x.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 666 B

Двоичные данные
browser/themes/osx/Geolocation-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.3 KiB

Двоичные данные
browser/themes/osx/Geolocation-64@2x.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 26 KiB

Просмотреть файл

@ -16,10 +16,6 @@ browser.jar:
* skin/classic/browser/browser-lightweightTheme.css * skin/classic/browser/browser-lightweightTheme.css
skin/classic/browser/click-to-play-warning-stripes.png skin/classic/browser/click-to-play-warning-stripes.png
skin/classic/browser/content-contextmenu.svg skin/classic/browser/content-contextmenu.svg
skin/classic/browser/Geolocation-16.png
skin/classic/browser/Geolocation-16@2x.png
skin/classic/browser/Geolocation-64.png
skin/classic/browser/Geolocation-64@2x.png
skin/classic/browser/Info.png skin/classic/browser/Info.png
skin/classic/browser/keyhole-circle.png skin/classic/browser/keyhole-circle.png
skin/classic/browser/keyhole-circle@2x.png skin/classic/browser/keyhole-circle@2x.png
@ -45,10 +41,6 @@ browser.jar:
skin/classic/browser/page-livemarks.png skin/classic/browser/page-livemarks.png
skin/classic/browser/page-livemarks@2x.png skin/classic/browser/page-livemarks@2x.png
skin/classic/browser/pageInfo.css skin/classic/browser/pageInfo.css
skin/classic/browser/pointerLock-16.png
skin/classic/browser/pointerLock-16@2x.png
skin/classic/browser/pointerLock-64.png
skin/classic/browser/pointerLock-64@2x.png
skin/classic/browser/privatebrowsing-mask.png skin/classic/browser/privatebrowsing-mask.png
skin/classic/browser/privatebrowsing-mask@2x.png skin/classic/browser/privatebrowsing-mask@2x.png
skin/classic/browser/privatebrowsing-mask-short.png skin/classic/browser/privatebrowsing-mask-short.png

Двоичные данные
browser/themes/osx/pointerLock-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 249 B

Двоичные данные
browser/themes/osx/pointerLock-16@2x.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 411 B

Двоичные данные
browser/themes/osx/pointerLock-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичные данные
browser/themes/osx/pointerLock-64@2x.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.1 KiB

Просмотреть файл

@ -52,7 +52,7 @@
-moz-image-region: rect(14px, 42px, 28px, 28px); -moz-image-region: rect(14px, 42px, 28px, 28px);
} }
.search-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon { .search-go-button:-moz-locale-dir(rtl) {
transform: scaleX(-1); transform: scaleX(-1);
} }
@ -164,6 +164,10 @@
background-position: right center; background-position: right center;
} }
.searchbar-engine-one-off-item:-moz-locale-dir(rtl) {
background-position: left center;
}
.searchbar-engine-one-off-item:not(.last-row) { .searchbar-engine-one-off-item:not(.last-row) {
box-sizing: content-box; box-sizing: content-box;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;

Просмотреть файл

@ -0,0 +1,9 @@
<?xml version="1.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/. -->
<svg xmlns="http://www.w3.org/2000/svg">
<filter id="fill">
<feComposite in="FillPaint" in2="SourceGraphic" operator="in"/>
</filter>
</svg>

После

Ширина:  |  Высота:  |  Размер: 383 B

Просмотреть файл

@ -0,0 +1,26 @@
<?xml version="1.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/. -->
<svg xmlns="http://www.w3.org/2000/svg"
width="32" height="32" viewBox="0 0 32 32">
<style>
path:not(:target) {
display: none;
}
</style>
<path id="camera" d="m 2,23 a 3,3 0 0 0 3,3 l 14,0 a 3,3 0 0 0 3,-3 l 0,-4 6,5.5 c 0.5,0.5 1,0.7 2,0.5 l 0,-18 c -1,-0.2 -1.5,0 -2,0.5 l -6,5.5 0,-4 a 3,3 0 0 0 -3,-3 l -14,0 a 3,3 0 0 0 -3,3 z" />
<path id="geo-linux" d="m 2,15.9 a 14,14 0 1 1 0,0.2 z m 4,2.1 a 10,10 0 0 0 8,8 l 0,-4 4,0 0,4 a 10,10 0 0 0 8,-8 l -4,0 0,-4 4,0 a 10,10 0 0 0 -8,-8 l 0,4 -4,0 0,-4 a 10,10 0 0 0 -8,8 l 4,0 0,4 z" />
<path id="geo-linux-detailed" d="m 2,15.9 a 14,14 0 1 1 0,0.2 z m 3,2.1 a 11,11 0 0 0 9,9 l 1,-5 2,0 1,5 a 11,11 0 0 0 9,-9 l -5,-1 0,-2 5,-1 a 11,11 0 0 0 -9,-9 l -1,5 -2,0 -1,-5 a 11,11 0 0 0 -9,9 l 5,1 0,2 z" />
<path id="geo-osx" d="m 0,16 16,0 0,16 12,-28 z" />
<path id="geo-windows" d="m 2,14 0,4 2,0 a 12,12 0 0 0 10,10 l 0,2 4,0 0,-2 a 12,12 0 0 0 10,-10 l 2,0 0,-4 -2,0 a 12,12 0 0 0 -10,-10 l 0,-2 -4,0 0,2 a 12,12 0 0 0 -10,10 z m 4,1.9 a 10,10 0 1 1 0,0.2 z m 4,0 a 6,6 0 1 1 0,0.2 z" />
<path id="geo-windows-detailed" d="m 2,14.5 0,3 2,0.5 a 12,12 0 0 0 10,10 l 0.5,2 3,0 0.5,-2 a 12,12 0 0 0 10,-10 l 2,-0.5 0,-3 -2,-0.5 a 12,12 0 0 0 -10,-10 l -0.5,-2 -3,0 -0.5,2 a 12,12 0 0 0 -10,10 z m 4,1.4 a 10,10 0 1 1 0,0.2 z m 3,0 a 7,7 0 1 1 0,0.2 z" />
<path id="indexedDB" d="m 2,24 a 4,4 0 0 0 4,4 l 2,0 0,-4 -2,0 0,-16 20,0 0,16 -2,0 0,4 2,0 a 4,4 0 0 0 4,-4 l 0,-16 a 4,4 0 0 0 -4,-4 l -20,0 a 4,4 0 0 0 -4,4 z m 8,-2 6,7 6,-7 -4,0 0,-8 -4,0 0,8 z" />
<path id="login" d="m 2,26 0,4 6,0 0,-2 2,0 0,-2 1,0 0,-1 2,0 0,-3 2,0 2.5,-2.5 1.5,1.5 3,-3 a 8,8 0 1 0 -8,-8 l -3,3 2,2 z m 20,-18.1 a 2,2 0 1 1 0,0.2 z" />
<path id="login-detailed" d="m 1,27 0,3.5 a 0.5,0.5 0 0 0 0.5,0.5 l 5,0 a 0.5,0.5 0 0 0 0.5,-0.5 l 0,-1.5 1.5,0 a 0.5,0.5 0 0 0 0.5,-0.5 l 0,-1.5 1,0 a 0.5,0.5 0 0 0 0.5,-0.5 l 0,-1 1,0 a 0.5,0.5 0 0 0 0.5,-0.5 l 0,-2 2,0 2.5,-2.5 q 0.5,-0.5 1,0 l 1,1 c 0.5,0.5 1,0.5 1.5,-0.5 l 1,-2 a 9,9 0 1 0 -8,-8 l -2,1 c -1,0.5 -1,1 -0.5,1.5 l 1.5,1.5 q 0.5,0.5 0,1 z m 21,-19.1 a 2,2 0 1 1 0,0.2 z" />
<path id="microphone" d="m 8,14 0,4 a 8,8 0 0 0 6,7.7 l 0,2.3 -2,0 a 2,2 0 0 0 -2,2 l 12,0 a 2,2 0 0 0 -2,-2 l -2,0 0,-2.3 a 8,8 0 0 0 6,-7.7 l 0,-4 -2,0 0,4 a 6,6 0 0 1 -12,0 l 0,-4 z m 4,4 a 4,4 0 0 0 8,0 l 0,-12 a 4,4 0 0 0 -8,0 z" />
<path id="microphone-detailed" d="m 8,18 a 8,8 0 0 0 6,7.7 l 0,2.3 -1,0 a 3,2 0 0 0 -3,2 l 12,0 a 3,2 0 0 0 -3,-2 l -1,0 0,-2.3 a 8,8 0 0 0 6,-7.7 l 0,-4 a 1,1 0 0 0 -2,0 l 0,4 a 6,6 0 0 1 -12,0 l 0,-4 a 1,1 0 0 0 -2,0 z m 4,0 a 4,4 0 0 0 8,0 l 0,-12 a 4,4 0 0 0 -8,0 z" />
<path id="pointer" d="m 8,24 6,-5 5,10 4,-2 -5,-10 7,-1 -17,-14 z" />
<path id="screen" d="m 2,18 a 2,2 0 0 0 2,2 l 2,0 0,-6 a 4,4 0 0 1 4,-4 l 14,0 0,-6 a 2,2 0 0 0 -2,-2 l -18,0 a 2,2 0 0 0 -2,2 z m 6,10 a 2,2 0 0 0 2,2 l 18,0 a 2,2 0 0 0 2,-2 l 0,-14 a 2,2 0 0 0 -2,-2 l -18,0 a 2,2 0 0 0 -2,2 z" />
<path id="web-notifications" d="m 2,20 a 4,4 0 0 0 4,4 l 13,0 7,7 0,-7 a 4,4 0 0 0 4,-4 l 0,-12 a 4,4 0 0 0 -4,-4 l -20,0 a 4,4 0 0 0 -4,4 z m 5,-2 a 1,1 0 1 1 0,-2 l 10,0 a 1,1 0 1 1 0,2 z m 0,-4 a 1,1 0 1 1 0,-2 l 14,0 a 1,1 0 1 1 0,2 z m 0,-4 a 1,1 0 1 1 0,-2 l 18,0 a 1,1 0 1 1 0,2 z" />
</svg>

После

Ширина:  |  Высота:  |  Размер: 3.4 KiB

Просмотреть файл

@ -54,8 +54,10 @@
skin/classic/browser/download-blocked.svg (../shared/download-blocked.svg) skin/classic/browser/download-blocked.svg (../shared/download-blocked.svg)
skin/classic/browser/downloads/contentAreaDownloadsView.css (../shared/downloads/contentAreaDownloadsView.css) skin/classic/browser/downloads/contentAreaDownloadsView.css (../shared/downloads/contentAreaDownloadsView.css)
skin/classic/browser/drm-icon.svg (../shared/drm-icon.svg) skin/classic/browser/drm-icon.svg (../shared/drm-icon.svg)
skin/classic/browser/filters.svg (../shared/filters.svg)
skin/classic/browser/fullscreen/insecure.svg (../shared/fullscreen/insecure.svg) skin/classic/browser/fullscreen/insecure.svg (../shared/fullscreen/insecure.svg)
skin/classic/browser/fullscreen/secure.svg (../shared/fullscreen/secure.svg) skin/classic/browser/fullscreen/secure.svg (../shared/fullscreen/secure.svg)
skin/classic/browser/glyphs.svg (../shared/glyphs.svg)
skin/classic/browser/heartbeat-icon.svg (../shared/heartbeat-icon.svg) skin/classic/browser/heartbeat-icon.svg (../shared/heartbeat-icon.svg)
skin/classic/browser/heartbeat-star-lit.svg (../shared/heartbeat-star-lit.svg) skin/classic/browser/heartbeat-star-lit.svg (../shared/heartbeat-star-lit.svg)
skin/classic/browser/heartbeat-star-off.svg (../shared/heartbeat-star-off.svg) skin/classic/browser/heartbeat-star-off.svg (../shared/heartbeat-star-off.svg)
@ -133,26 +135,6 @@
skin/classic/browser/notification-pluginAlert@2x.png (../shared/plugins/notification-pluginAlert@2x.png) skin/classic/browser/notification-pluginAlert@2x.png (../shared/plugins/notification-pluginAlert@2x.png)
skin/classic/browser/notification-pluginBlocked.png (../shared/plugins/notification-pluginBlocked.png) skin/classic/browser/notification-pluginBlocked.png (../shared/plugins/notification-pluginBlocked.png)
skin/classic/browser/notification-pluginBlocked@2x.png (../shared/plugins/notification-pluginBlocked@2x.png) skin/classic/browser/notification-pluginBlocked@2x.png (../shared/plugins/notification-pluginBlocked@2x.png)
skin/classic/browser/web-notifications-icon.svg (../shared/web-notifications-icon.svg)
skin/classic/browser/web-notifications-tray.svg (../shared/web-notifications-tray.svg)
skin/classic/browser/webRTC-shareDevice-16.png (../shared/webrtc/webRTC-shareDevice-16.png)
skin/classic/browser/webRTC-shareDevice-16@2x.png (../shared/webrtc/webRTC-shareDevice-16@2x.png)
skin/classic/browser/webRTC-shareDevice-64.png (../shared/webrtc/webRTC-shareDevice-64.png)
skin/classic/browser/webRTC-shareDevice-64@2x.png (../shared/webrtc/webRTC-shareDevice-64@2x.png)
skin/classic/browser/webRTC-sharingDevice-16.png (../shared/webrtc/webRTC-sharingDevice-16.png)
skin/classic/browser/webRTC-sharingDevice-16@2x.png (../shared/webrtc/webRTC-sharingDevice-16@2x.png)
skin/classic/browser/webRTC-shareMicrophone-16.png (../shared/webrtc/webRTC-shareMicrophone-16.png)
skin/classic/browser/webRTC-shareMicrophone-16@2x.png (../shared/webrtc/webRTC-shareMicrophone-16@2x.png)
skin/classic/browser/webRTC-shareMicrophone-64.png (../shared/webrtc/webRTC-shareMicrophone-64.png)
skin/classic/browser/webRTC-shareMicrophone-64@2x.png (../shared/webrtc/webRTC-shareMicrophone-64@2x.png)
skin/classic/browser/webRTC-sharingMicrophone-16.png (../shared/webrtc/webRTC-sharingMicrophone-16.png)
skin/classic/browser/webRTC-sharingMicrophone-16@2x.png (../shared/webrtc/webRTC-sharingMicrophone-16@2x.png)
skin/classic/browser/webRTC-shareScreen-16.png (../shared/webrtc/webRTC-shareScreen-16.png)
skin/classic/browser/webRTC-shareScreen-16@2x.png (../shared/webrtc/webRTC-shareScreen-16@2x.png)
skin/classic/browser/webRTC-shareScreen-64.png (../shared/webrtc/webRTC-shareScreen-64.png)
skin/classic/browser/webRTC-shareScreen-64@2x.png (../shared/webrtc/webRTC-shareScreen-64@2x.png)
skin/classic/browser/webRTC-sharingScreen-16.png (../shared/webrtc/webRTC-sharingScreen-16.png)
skin/classic/browser/webRTC-sharingScreen-16@2x.png (../shared/webrtc/webRTC-sharingScreen-16@2x.png)
skin/classic/browser/webRTC-camera-white-16.png (../shared/webrtc/camera-white-16.png) skin/classic/browser/webRTC-camera-white-16.png (../shared/webrtc/camera-white-16.png)
skin/classic/browser/webRTC-microphone-white-16.png (../shared/webrtc/microphone-white-16.png) skin/classic/browser/webRTC-microphone-white-16.png (../shared/webrtc/microphone-white-16.png)
skin/classic/browser/webRTC-screen-white-16.png (../shared/webrtc/screen-white-16.png) skin/classic/browser/webRTC-screen-white-16.png (../shared/webrtc/screen-white-16.png)

Просмотреть файл

@ -4,14 +4,215 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
%endif %endif
#notification-popup-box {
position: relative;
background-color: #fff;
background-clip: padding-box;
padding-left: 3px;
border-width: 0 8px 0 0;
border-style: solid;
border-image: url("chrome://browser/skin/urlbar-arrow.png") 0 8 0 0 fill;
margin-inline-end: -8px;
}
@media (min-resolution: 1.1dppx) {
#notification-popup-box {
border-image: url("chrome://browser/skin/urlbar-arrow@2x.png") 0 16 0 0 fill;
}
}
@conditionalForwardWithUrlbar@ > #forward-button[disabled] + #urlbar > #notification-popup-box {
padding-left: calc(var(--backbutton-urlbar-overlap) + 3px);
}
/* This changes the direction of the main notification box on the url bar. */
#notification-popup-box:-moz-locale-dir(rtl),
/* This adds a second flip for the notification anchors, as they don't switch direction
for RTL mode. */
.notification-anchor-icon:-moz-locale-dir(rtl) {
transform: scaleX(-1);
}
/* For the anchor icons in the chat window, we don't have the notification popup box,
so we need to cancel the RTL transform. */
.notification-anchor-icon.chat-toolbarbutton:-moz-locale-dir(rtl) {
transform: none;
}
/* This class can be used alone or in combination with the class defining the
type of icon displayed. This rule must be defined before the others in order
for its list-style-image to be overridden. */
.notification-anchor-icon {
width: 16px;
height: 16px;
margin: 0 2px;
%ifdef MOZ_WIDGET_GTK
list-style-image: url(moz-icon://stock/gtk-dialog-info?size=16);
%else
list-style-image: url(chrome://global/skin/icons/information-16.png);
%endif
}
@media (min-resolution: 1.1dppx) {
.notification-anchor-icon {
%ifdef MOZ_WIDGET_GTK
list-style-image: url(moz-icon://stock/gtk-dialog-info?size=dialog);
%else
list-style-image: url(chrome://global/skin/icons/information-32.png);
%endif
}
}
.popup-notification-icon { .popup-notification-icon {
width: 64px; width: 64px;
height: 64px; height: 64px;
margin-inline-end: 10px; margin-inline-end: 10px;
} }
/* INDIVIDUAL NOTIFICATIONS */
/* For the moment we apply the color filter only on the icons listed here.
The first two selectors are used by socialchat.xml (bug 1275558). */
.webRTC-sharingDevices-notification-icon,
.webRTC-sharingMicrophone-notification-icon,
.camera-icon,
.geo-icon,
.indexedDB-icon,
.login-icon,
.microphone-icon,
.pointer-icon,
.screen-icon,
.web-notifications-icon,
.popup-notification-icon[popupid="geolocation"],
.popup-notification-icon[popupid="indexedDB-permissions-prompt"],
.popup-notification-icon[popupid="password"],
.popup-notification-icon[popupid="pointerLock"],
.popup-notification-icon[popupid="webRTC-shareDevices"],
.popup-notification-icon[popupid="webRTC-shareMicrophone"],
.popup-notification-icon[popupid="webRTC-shareScreen"],
.popup-notification-icon[popupid="webRTC-sharingDevices"],
.popup-notification-icon[popupid="webRTC-sharingMicrophone"],
.popup-notification-icon[popupid="webRTC-sharingScreen"],
.popup-notification-icon[popupid="web-notifications"] {
filter: url(chrome://browser/skin/filters.svg#fill);
fill: #999;
}
/* The first two selectors are used by socialchat.xml (bug 1275558). The
notifications in the chat window are only shown when they are in use. */
.webRTC-sharingDevices-notification-icon,
.webRTC-sharingMicrophone-notification-icon,
.in-use {
fill: #fea01b;
}
.geo-icon {
%ifdef XP_MACOSX
list-style-image: url(chrome://browser/skin/glyphs.svg#geo-osx);
%elif defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
list-style-image: url(chrome://browser/skin/glyphs.svg#geo-linux);
%else
list-style-image: url(chrome://browser/skin/glyphs.svg#geo-windows);
%endif
}
.popup-notification-icon[popupid="geolocation"] { .popup-notification-icon[popupid="geolocation"] {
list-style-image: url(chrome://browser/skin/Geolocation-64.png); %ifdef XP_MACOSX
list-style-image: url(chrome://browser/skin/glyphs.svg#geo-osx);
%elif defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
list-style-image: url(chrome://browser/skin/glyphs.svg#geo-linux-detailed);
%else
list-style-image: url(chrome://browser/skin/glyphs.svg#geo-windows-detailed);
%endif
}
.popup-notification-icon[popupid="indexedDB-permissions-prompt"],
.indexedDB-icon {
list-style-image: url(chrome://browser/skin/glyphs.svg#indexedDB);
}
.login-icon {
list-style-image: url(chrome://browser/skin/glyphs.svg#login);
}
.popup-notification-icon[popupid="password"] {
list-style-image: url(chrome://browser/skin/glyphs.svg#login-detailed);
}
#login-fill-notification-icon {
/* Temporary solution until the capture and fill doorhangers are unified. */
transform: scaleX(-1);
}
/* The first selector is used by socialchat.xml (bug 1275558). */
.webRTC-sharingDevices-notification-icon,
.camera-icon,
.popup-notification-icon[popupid="webRTC-shareDevices"],
.popup-notification-icon[popupid="webRTC-sharingDevices"] {
list-style-image: url(chrome://browser/skin/glyphs.svg#camera);
}
/* The first selector is used by socialchat.xml (bug 1275558). */
.webRTC-sharingMicrophone-notification-icon,
.microphone-icon {
list-style-image: url(chrome://browser/skin/glyphs.svg#microphone);
}
.popup-notification-icon[popupid="webRTC-shareMicrophone"],
.popup-notification-icon[popupid="webRTC-sharingMicrophone"] {
list-style-image: url(chrome://browser/skin/glyphs.svg#microphone-detailed);
}
.popup-notification-icon[popupid="webRTC-shareScreen"],
.popup-notification-icon[popupid="webRTC-sharingScreen"],
.screen-icon {
list-style-image: url(chrome://browser/skin/glyphs.svg#screen);
}
.popup-notification-icon[popupid="web-notifications"],
.web-notifications-icon {
list-style-image: url(chrome://browser/skin/glyphs.svg#web-notifications);
}
.popup-notification-icon[popupid="pointerLock"],
.pointer-icon {
list-style-image: url(chrome://browser/skin/glyphs.svg#pointer);
}
/* EME */
.popup-notification-icon[popupid="drmContentPlaying"],
.drm-icon {
list-style-image: url("chrome://browser/skin/drm-icon.svg#chains");
}
.drm-icon:hover:active {
list-style-image: url("chrome://browser/skin/drm-icon.svg#chains-pressed");
}
#eme-notification-icon[firstplay=true] {
animation: emeTeachingMoment 0.2s linear 0s 5 normal;
}
@keyframes emeTeachingMoment {
0% {transform: translateX(0); }
25% {transform: translateX(3px) }
75% {transform: translateX(-3px) }
100% { transform: translateX(0); }
}
/* INSTALL ADDONS */
.install-icon {
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#default);
}
.install-icon:hover {
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#hover);
}
.install-icon:hover:active {
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#active);
} }
.popup-notification-icon[popupid="xpinstall-disabled"], .popup-notification-icon[popupid="xpinstall-disabled"],
@ -48,125 +249,14 @@
list-style-image: url(chrome://mozapps/skin/plugins/pluginBlocked-64.png); list-style-image: url(chrome://mozapps/skin/plugins/pluginBlocked-64.png);
} }
.popup-notification-icon[popupid="web-notifications"] { /* OFFLINE APPS */
list-style-image: url(chrome://browser/skin/web-notifications-icon.svg);
}
.popup-notification-icon[popupid="indexedDB-permissions-prompt"],
.popup-notification-icon[popupid*="offline-app-requested"], .popup-notification-icon[popupid*="offline-app-requested"],
.popup-notification-icon[popupid="offline-app-usage"] { .popup-notification-icon[popupid="offline-app-usage"] {
list-style-image: url(chrome://global/skin/icons/question-64.png); list-style-image: url(chrome://global/skin/icons/question-64.png);
} }
.popup-notification-icon[popupid="password"] { /* PLUGINS */
list-style-image: url(chrome://mozapps/skin/passwordmgr/key-64.png);
}
.popup-notification-icon[popupid="webRTC-sharingDevices"],
.popup-notification-icon[popupid="webRTC-shareDevices"] {
list-style-image: url(chrome://browser/skin/webRTC-shareDevice-64.png);
}
.popup-notification-icon[popupid="webRTC-sharingMicrophone"],
.popup-notification-icon[popupid="webRTC-shareMicrophone"] {
list-style-image: url(chrome://browser/skin/webRTC-shareMicrophone-64.png);
}
.popup-notification-icon[popupid="webRTC-sharingScreen"],
.popup-notification-icon[popupid="webRTC-shareScreen"] {
list-style-image: url(chrome://browser/skin/webRTC-shareScreen-64.png);
}
.popup-notification-icon[popupid="pointerLock"] {
list-style-image: url(chrome://browser/skin/pointerLock-64.png);
}
.popup-notification-icon[popupid="servicesInstall"] {
list-style-image: url(chrome://browser/skin/social/services-64.png);
}
/* Notification icon box */
#notification-popup-box {
position: relative;
background-color: #fff;
background-clip: padding-box;
padding-left: 3px;
border-width: 0 8px 0 0;
border-style: solid;
border-image: url("chrome://browser/skin/urlbar-arrow.png") 0 8 0 0 fill;
margin-inline-end: -8px;
}
@conditionalForwardWithUrlbar@ > #forward-button[disabled] + #urlbar > #notification-popup-box {
padding-left: calc(var(--backbutton-urlbar-overlap) + 3px);
}
/* This changes the direction of the main notification box on the url bar. */
#notification-popup-box:-moz-locale-dir(rtl),
/* This adds a second flip for the notification anchors, as they don't switch direction
for RTL mode. */
.notification-anchor-icon:-moz-locale-dir(rtl) {
transform: scaleX(-1);
}
/* For the anchor icons in the chat window, we don't have the notification popup box,
so we need to cancel the RTL transform. */
.notification-anchor-icon.chat-toolbarbutton:-moz-locale-dir(rtl) {
transform: none;
}
/* This class can be used alone or in combination with the class defining the
type of icon displayed. This rule must be defined before the others in order
for its list-style-image to be overridden. */
.notification-anchor-icon {
%ifdef MOZ_WIDGET_GTK
list-style-image: url(moz-icon://stock/gtk-dialog-info?size=16);
%else
list-style-image: url(chrome://global/skin/icons/information-16.png);
%endif
width: 16px;
height: 16px;
margin: 0 2px;
}
@media (min-resolution: 1.1dppx) {
.notification-anchor-icon {
%ifdef MOZ_WIDGET_GTK
list-style-image: url(moz-icon://stock/gtk-dialog-info?size=dialog);
%else
list-style-image: url(chrome://global/skin/icons/information-32.png);
%endif
}
}
.geo-icon {
list-style-image: url(chrome://browser/skin/Geolocation-16.png);
}
.install-icon {
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#default);
}
.install-icon:hover {
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#hover);
}
.install-icon:hover:active {
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#active);
}
.indexedDB-icon {
list-style-image: url(chrome://global/skin/icons/question-16.png);
}
.login-icon {
list-style-image: url(chrome://mozapps/skin/passwordmgr/key-16.png);
}
#login-fill-notification-icon {
/* Temporary solution until the capture and fill doorhangers are unified. */
transform: scaleX(-1);
}
.plugin-icon { .plugin-icon {
list-style-image: url(chrome://browser/skin/notification-pluginNormal.png); list-style-image: url(chrome://browser/skin/notification-pluginNormal.png);
@ -192,165 +282,8 @@
-moz-image-region: rect(0, 48px, 16px, 32px); -moz-image-region: rect(0, 48px, 16px, 32px);
} }
#notification-popup-box[hidden] {
/* Override display:none to make the pluginBlockedNotification animation work
when showing the notification repeatedly. */
display: -moz-box;
visibility: collapse;
}
#plugins-notification-icon.plugin-blocked[showing] {
animation: pluginBlockedNotification 500ms ease 0s 5 alternate both;
}
@keyframes pluginBlockedNotification {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.camera-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareDevice-16.png);
}
/* The first selector is used by socialchat.xml (bug 1275558). */
.webRTC-sharingDevices-notification-icon,
.camera-icon.in-use {
list-style-image: url(chrome://browser/skin/webRTC-sharingDevice-16.png);
}
.microphone-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareMicrophone-16.png);
}
/* The first selector is used by socialchat.xml (bug 1275558). */
.webRTC-sharingMicrophone-notification-icon,
.microphone-icon.in-use {
list-style-image: url(chrome://browser/skin/webRTC-sharingMicrophone-16.png);
}
.screen-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareScreen-16.png);
}
.screen-icon.in-use {
list-style-image: url(chrome://browser/skin/webRTC-sharingScreen-16.png);
}
.web-notifications-icon {
list-style-image: url(chrome://browser/skin/web-notifications-tray.svg);
-moz-image-region: rect(0, 16px, 16px, 0);
}
.web-notifications-icon:hover {
-moz-image-region: rect(0, 32px, 16px, 16px);
}
.web-notifications-icon:hover:active {
-moz-image-region: rect(0, 48px, 16px, 32px);
}
.pointer-icon {
list-style-image: url(chrome://browser/skin/pointerLock-16.png);
}
.service-icon {
list-style-image: url(chrome://browser/skin/social/services-16.png);
}
.translation-icon {
list-style-image: url(chrome://browser/skin/translation-16.png);
-moz-image-region: rect(0px, 16px, 16px, 0px);
}
.translation-icon.in-use {
-moz-image-region: rect(0px, 32px, 16px, 16px);
}
/* EME notifications */
.popup-notification-icon[popupid="drmContentPlaying"],
.drm-icon {
list-style-image: url("chrome://browser/skin/drm-icon.svg#chains");
}
.drm-icon:hover:active {
list-style-image: url("chrome://browser/skin/drm-icon.svg#chains-pressed");
}
#eme-notification-icon[firstplay=true] {
animation: emeTeachingMoment 0.2s linear 0s 5 normal;
}
@keyframes emeTeachingMoment {
0% {transform: translateX(0); }
25% {transform: translateX(3px) }
75% {transform: translateX(-3px) }
100% { transform: translateX(0); }
}
/* HiDPI notification icons */
@media (min-resolution: 1.1dppx) {
#notification-popup-box {
border-image: url("chrome://browser/skin/urlbar-arrow@2x.png") 0 16 0 0 fill;
}
.camera-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareDevice-16@2x.png);
}
.camera-icon.in-use {
list-style-image: url(chrome://browser/skin/webRTC-sharingDevice-16@2x.png);
}
.microphone-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareMicrophone-16@2x.png);
}
.microphone-icon.in-use {
list-style-image: url(chrome://browser/skin/webRTC-sharingMicrophone-16@2x.png);
}
.screen-icon {
list-style-image: url(chrome://browser/skin/webRTC-shareScreen-16@2x.png);
}
.screen-icon.in-use {
list-style-image: url(chrome://browser/skin/webRTC-sharingScreen-16@2x.png);
}
.popup-notification-icon[popupid="webRTC-sharingDevices"],
.popup-notification-icon[popupid="webRTC-shareDevices"] {
list-style-image: url(chrome://browser/skin/webRTC-shareDevice-64@2x.png);
}
.popup-notification-icon[popupid="webRTC-sharingMicrophone"],
.popup-notification-icon[popupid="webRTC-shareMicrophone"] {
list-style-image: url(chrome://browser/skin/webRTC-shareMicrophone-64@2x.png);
}
.popup-notification-icon[popupid="webRTC-sharingScreen"],
.popup-notification-icon[popupid="webRTC-shareScreen"] {
list-style-image: url(chrome://browser/skin/webRTC-shareScreen-64@2x.png);
}
%ifdef XP_MACOSX %ifdef XP_MACOSX
/* OSX only until we have icons for Windows and Linux */ @media (min-resolution: 1.1dppx) {
.geo-icon {
list-style-image: url(chrome://browser/skin/Geolocation-16@2x.png);
}
.indexedDB-icon {
list-style-image: url(chrome://global/skin/icons/question-32.png);
}
.login-icon {
list-style-image: url(chrome://mozapps/skin/passwordmgr/key-16@2x.png);
}
.plugin-icon { .plugin-icon {
list-style-image: url(chrome://browser/skin/notification-pluginNormal@2x.png); list-style-image: url(chrome://browser/skin/notification-pluginNormal@2x.png);
} }
@ -374,11 +307,64 @@
.plugin-icon:active { .plugin-icon:active {
-moz-image-region: rect(0, 96px, 32px, 64px); -moz-image-region: rect(0, 96px, 32px, 64px);
} }
}
%endif
.pointer-icon { #notification-popup-box[hidden] {
list-style-image: url(chrome://browser/skin/pointerLock-16@2x.png); /* Override display:none to make the pluginBlockedNotification animation work
when showing the notification repeatedly. */
display: -moz-box;
visibility: collapse;
} }
#plugins-notification-icon.plugin-blocked[showing] {
animation: pluginBlockedNotification 500ms ease 0s 5 alternate both;
}
@keyframes pluginBlockedNotification {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* SOCIAL API */
.popup-notification-icon[popupid="servicesInstall"] {
list-style-image: url(chrome://browser/skin/social/services-64.png);
}
.service-icon {
list-style-image: url(chrome://browser/skin/social/services-16.png);
}
%ifdef XP_MACOSX
@media (min-resolution: 1.1dppx) {
.popup-notification-icon[popupid="servicesInstall"] {
list-style-image: url(chrome://browser/skin/social/services-64@2x.png);
}
.service-icon {
list-style-image: url(chrome://browser/skin/social/services-16@2x.png);
}
}
%endif
/* TRANSLATION */
.translation-icon {
list-style-image: url(chrome://browser/skin/translation-16.png);
-moz-image-region: rect(0px, 16px, 16px, 0px);
}
.translation-icon.in-use {
-moz-image-region: rect(0px, 32px, 16px, 16px);
}
%ifdef XP_MACOSX
@media (min-resolution: 1.1dppx) {
.translation-icon { .translation-icon {
list-style-image: url(chrome://browser/skin/translation-16@2x.png); list-style-image: url(chrome://browser/skin/translation-16@2x.png);
-moz-image-region: rect(0px, 32px, 32px, 0px); -moz-image-region: rect(0px, 32px, 32px, 0px);
@ -387,21 +373,5 @@
.translation-icon.in-use { .translation-icon.in-use {
-moz-image-region: rect(0px, 64px, 32px, 32px); -moz-image-region: rect(0px, 64px, 32px, 32px);
} }
.popup-notification-icon[popupid="geolocation"] {
list-style-image: url(chrome://browser/skin/Geolocation-64@2x.png);
}
.popup-notification-icon[popupid="pointerLock"] {
list-style-image: url(chrome://browser/skin/pointerLock-64@2x.png);
}
.popup-notification-icon[popupid="servicesInstall"] {
list-style-image: url(chrome://browser/skin/social/services-64@2x.png);
}
.service-icon {
list-style-image: url(chrome://browser/skin/social/services-16@2x.png);
} }
%endif %endif
}

Просмотреть файл

@ -18,5 +18,7 @@
<path id="search-arrow-go-glyph" d="M1,7v2.2C1,9.8,1.4,10,2,10h7.5l-3,3.1c-0.4,0.3-0.4,1,0,1.4l0.8,0.8 c0.4,0.4,1,0.4,1.4,0l6.6-6.6c0.4-0.4,0.4-1,0-1.4L8.7,0.7c-0.4-0.4-1-0.4-1.4,0L6.5,1.6C6.1,2,6.1,2.6,6.5,3l3,3H2C1.4,6,1,6.4,1,7z"/> <path id="search-arrow-go-glyph" d="M1,7v2.2C1,9.8,1.4,10,2,10h7.5l-3,3.1c-0.4,0.3-0.4,1,0,1.4l0.8,0.8 c0.4,0.4,1,0.4,1.4,0l6.6-6.6c0.4-0.4,0.4-1,0-1.4L8.7,0.7c-0.4-0.4-1-0.4-1.4,0L6.5,1.6C6.1,2,6.1,2.6,6.5,3l3,3H2C1.4,6,1,6.4,1,7z"/>
</defs> </defs>
<use id="search-arrow-go" xlink:href="#search-arrow-go-glyph"/> <use id="search-arrow-go" xlink:href="#search-arrow-go-glyph"/>
<use id="search-arrow-go-rtl" transform="rotate(180 8 8)" xlink:href="#search-arrow-go-glyph"/>
<use id="search-arrow-go-inverted" xlink:href="#search-arrow-go-glyph"/> <use id="search-arrow-go-inverted" xlink:href="#search-arrow-go-glyph"/>
<use id="search-arrow-go-rtl-inverted" transform="rotate(180 8 8)" xlink:href="#search-arrow-go-glyph"/>
</svg> </svg>

До

Ширина:  |  Высота:  |  Размер: 926 B

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Просмотреть файл

@ -1,6 +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/. -->
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<path fill="#a6a6a6" d="M53.6,8H10.4A6.4,6.4,0,0,0,4,14.4V41.6A6.4,6.4,0,0,0,10.4,48H12V62L26.7,48H53.6A6.4,6.4,0,0,0,60,41.6V14.4A6.4,6.4,0,0,0,53.6,8ZM34,36H14a2,2,0,0,1,0-4H34A2,2,0,0,1,34,36Zm8-8H14a2,2,0,0,1,0-4H42A2,2,0,0,1,42,28Zm8-8H14a2,2,0,0,1,0-4H50A2,2,0,0,1,50,20Z"/>
</svg>

До

Ширина:  |  Высота:  |  Размер: 586 B

Просмотреть файл

@ -1,23 +0,0 @@
<?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/. -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="16" viewBox="0 0 48 16">
<defs>
<style>
.style-icon-notification {
fill: #666;
}
.style-icon-notification.hover {
fill: #808080;
}
.style-icon-notification.active {
fill: #4d4d4d;
}
</style>
<path id="shape-notifications-push" d="M13.4,2H2.6A1.6,1.6,0,0,0,1,3.6v6.8A1.6,1.6,0,0,0,2.6,12H3v3.5L6.7,12h6.7A1.6,1.6,0,0,0,15,10.4V3.6A1.6,1.6,0,0,0,13.4,2ZM8.5,9h-5a0.5,0.5,0,0,1,0-1h5A0.5,0.5,0,0,1,8.5,9Zm2-2h-7a0.5,0.5,0,0,1,0-1h7A0.5,0.5,0,0,1,10.5,7Zm2-2h-9a0.5,0.5,0,0,1,0-1h9A0.5,0.5,0,0,1,12.5,5Z"/>
</defs>
<use xlink:href="#shape-notifications-push" class="style-icon-notification"/>
<use xlink:href="#shape-notifications-push" transform="translate(16)" class="style-icon-notification hover"/>
<use xlink:href="#shape-notifications-push" transform="translate(32)" class="style-icon-notification active"/>
</svg>

До

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 224 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 367 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.3 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 5.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 5.6 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.8 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.8 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.7 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичные данные
browser/themes/windows/Geolocation-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 704 B

Двоичные данные
browser/themes/windows/Geolocation-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.2 KiB

Просмотреть файл

@ -18,8 +18,6 @@ browser.jar:
skin/classic/browser/caption-buttons.svg skin/classic/browser/caption-buttons.svg
skin/classic/browser/click-to-play-warning-stripes.png skin/classic/browser/click-to-play-warning-stripes.png
skin/classic/browser/content-contextmenu.svg skin/classic/browser/content-contextmenu.svg
skin/classic/browser/Geolocation-16.png
skin/classic/browser/Geolocation-64.png
skin/classic/browser/Info.png skin/classic/browser/Info.png
skin/classic/browser/Info-XP.png skin/classic/browser/Info-XP.png
skin/classic/browser/keyhole-forward-mask.svg skin/classic/browser/keyhole-forward-mask.svg
@ -49,8 +47,6 @@ browser.jar:
skin/classic/browser/pageInfo.css skin/classic/browser/pageInfo.css
skin/classic/browser/pageInfo.png skin/classic/browser/pageInfo.png
skin/classic/browser/pageInfo-XP.png skin/classic/browser/pageInfo-XP.png
skin/classic/browser/pointerLock-16.png
skin/classic/browser/pointerLock-64.png
skin/classic/browser/privatebrowsing-mask-tabstrip.png skin/classic/browser/privatebrowsing-mask-tabstrip.png
skin/classic/browser/privatebrowsing-mask-tabstrip-XPVista7.png skin/classic/browser/privatebrowsing-mask-tabstrip-XPVista7.png
skin/classic/browser/privatebrowsing-mask-titlebar.png skin/classic/browser/privatebrowsing-mask-titlebar.png

Двоичные данные
browser/themes/windows/pointerLock-16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 249 B

Двоичные данные
browser/themes/windows/pointerLock-64.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.0 KiB

Просмотреть файл

@ -44,8 +44,7 @@
width: 14px; width: 14px;
} }
.search-go-button:-moz-locale-dir(rtl), .search-go-button:-moz-locale-dir(rtl) {
.search-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
transform: scaleX(-1); transform: scaleX(-1);
} }
@ -174,6 +173,10 @@
background-position: right center; background-position: right center;
} }
.searchbar-engine-one-off-item:-moz-locale-dir(rtl) {
background-position: left center;
}
.searchbar-engine-one-off-item:not(.last-row) { .searchbar-engine-one-off-item:not(.last-row) {
box-sizing: content-box; box-sizing: content-box;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;

Просмотреть файл

@ -54,8 +54,8 @@ function testScriptSrc(aCallback) {
/** <img src=""> tests **/ /** <img src=""> tests **/
var img_global = "chrome://global/skin/icons/Error.png"; var img_global = "chrome://global/skin/icons/Error.png";
var img_mozapps = "chrome://mozapps/skin/passwordmgr/key-16.png"; var img_mozapps = "chrome://mozapps/skin/plugins/contentPluginClose.png";
var res_mozapps = "resource://gre/chrome/toolkit/skin/classic/mozapps/passwordmgr/key-16.png"; var res_mozapps = "resource://gre/chrome/toolkit/skin/classic/mozapps/plugins/contentPluginClose.png";
var imgTests = [[img_global, "success"], var imgTests = [[img_global, "success"],
[img_mozapps, "fail"], [img_mozapps, "fail"],

Просмотреть файл

@ -29,8 +29,9 @@
"mozilla/mark-test-function-used": 1, "mozilla/mark-test-function-used": 1,
"mozilla/no-aArgs": 1, "mozilla/no-aArgs": 1,
"mozilla/no-cpows-in-tests": 2, "mozilla/no-cpows-in-tests": 2,
"mozilla/no-single-arg-cu-import": 2,
// See bug 1224289. // See bug 1224289.
"mozilla/reject-importGlobalProperties": 1, "mozilla/reject-importGlobalProperties": 2,
"mozilla/var-only-at-top-level": 1, "mozilla/var-only-at-top-level": 1,
// Rules from the React plugin // Rules from the React plugin

Просмотреть файл

@ -14,7 +14,7 @@
var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
var { loader, require } = Cu.import("resource://devtools/shared/Loader.jsm"); var { loader, require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
var { Task } = require("devtools/shared/task"); var { Task } = require("devtools/shared/task");
loader.lazyRequireGetter(this, "promise"); loader.lazyRequireGetter(this, "promise");

Просмотреть файл

@ -6,8 +6,6 @@
"use strict"; "use strict";
const {Cu} = require("chrome");
var {loader} = Cu.import("resource://devtools/shared/Loader.jsm");
loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter"); loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
const { LocalizationHelper } = require("devtools/client/shared/l10n"); const { LocalizationHelper } = require("devtools/client/shared/l10n");

Просмотреть файл

@ -5,10 +5,9 @@
var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {}); const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
const promise = require("promise"); const promise = require("promise");
const Services = require("Services"); const Services = require("Services");
const EventEmitter = require("devtools/shared/event-emitter"); const EventEmitter = require("devtools/shared/event-emitter");

Просмотреть файл

@ -31,7 +31,7 @@ var { helpers, assert } = (function () {
var cli = require("gcli/cli"); var cli = require("gcli/cli");
var KeyEvent = require("gcli/util/util").KeyEvent; var KeyEvent = require("gcli/util/util").KeyEvent;
const { GcliFront } = require("devtools/server/actors/gcli"); const { GcliFront } = require("devtools/shared/fronts/gcli");
/** /**
* See notes in helpers.checkOptions() * See notes in helpers.checkOptions()
@ -467,7 +467,7 @@ var { helpers, assert } = (function () {
// Send a message to add the commands to the content process // Send a message to add the commands to the content process
const front = yield GcliFront.create(options.target); const front = yield GcliFront.create(options.target);
yield front._testOnly_addItemsByModule(MOCK_COMMANDS_URI); yield front._testOnlyAddItemsByModule(MOCK_COMMANDS_URI);
// This will cause the local set of commands to be updated with the // This will cause the local set of commands to be updated with the
// command proxies, wait for that to complete. // command proxies, wait for that to complete.
@ -483,7 +483,7 @@ var { helpers, assert } = (function () {
// Finally undo the mock commands and converters // Finally undo the mock commands and converters
system.removeItems(converters); system.removeItems(converters);
const removePromise = system.commands.onCommandsChange.once(); const removePromise = system.commands.onCommandsChange.once();
yield front._testOnly_removeItemsByModule(MOCK_COMMANDS_URI); yield front._testOnlyRemoveItemsByModule(MOCK_COMMANDS_URI);
yield removedDeferred.promise; yield removedDeferred.promise;
// And close everything down // And close everything down

Просмотреть файл

@ -1,11 +1,15 @@
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict"; "use strict";
/* import-globals-from ../../debugger-controller.js */
const actions = require("../actions/event-listeners"); const actions = require("../actions/event-listeners");
const { bindActionCreators } = require("devtools/client/shared/vendor/redux"); const { bindActionCreators } = require("devtools/client/shared/vendor/redux");
const { Heritage, WidgetMethods } = require("devtools/client/shared/widgets/view-helpers"); const { Heritage, WidgetMethods } = require("devtools/client/shared/widgets/view-helpers");
const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
/** /**
* Functions handling the event listeners UI. * Functions handling the event listeners UI.

Просмотреть файл

@ -1,9 +1,11 @@
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* import-globals-from ../../debugger-controller.js */
"use strict"; "use strict";
/* import-globals-from ../../debugger-controller.js */
const utils = require("../utils"); const utils = require("../utils");
const { const {
getSelectedSource, getSelectedSource,
@ -24,6 +26,7 @@ const {
setNamedTimeout setNamedTimeout
} = require("devtools/client/shared/widgets/view-helpers"); } = require("devtools/client/shared/widgets/view-helpers");
const { Task } = require("devtools/shared/task"); const { Task } = require("devtools/shared/task");
const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
const NEW_SOURCE_DISPLAY_DELAY = 200; // ms const NEW_SOURCE_DISPLAY_DELAY = 200; // ms
const FUNCTION_SEARCH_POPUP_POSITION = "topcenter bottomleft"; const FUNCTION_SEARCH_POPUP_POSITION = "topcenter bottomleft";

Просмотреть файл

@ -96,20 +96,19 @@ const FRAME_TYPE = {
PUBLIC_CLIENT_EVAL: 3 PUBLIC_CLIENT_EVAL: 3
}; };
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); const { BrowserLoader } = Cu.import("resource://devtools/client/shared/browser-loader.js", {});
Cu.import("resource://devtools/shared/event-emitter.js");
Cu.import("resource://devtools/client/shared/widgets/SimpleListWidget.jsm");
Cu.import("resource://devtools/client/shared/widgets/BreadcrumbsWidget.jsm");
Cu.import("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
Cu.import("resource://devtools/client/shared/widgets/VariablesView.jsm");
Cu.import("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
Cu.import("resource://devtools/client/shared/browser-loader.js");
const { require } = BrowserLoader({ const { require } = BrowserLoader({
baseURI: "resource://devtools/client/debugger/", baseURI: "resource://devtools/client/debugger/",
window, window,
}); });
const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineConstant(this, "require", require); XPCOMUtils.defineConstant(this, "require", require);
const { SimpleListWidget } = require("resource://devtools/client/shared/widgets/SimpleListWidget.jsm");
const { BreadcrumbsWidget } = require("resource://devtools/client/shared/widgets/BreadcrumbsWidget.jsm");
const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
const { VariablesView } = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
const { VariablesViewController, StackFrameUtils } = require("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
const EventEmitter = require("devtools/shared/event-emitter");
const { gDevTools } = require("devtools/client/framework/devtools"); const { gDevTools } = require("devtools/client/framework/devtools");
const { ViewHelpers, Heritage, WidgetMethods, setNamedTimeout, const { ViewHelpers, Heritage, WidgetMethods, setNamedTimeout,
clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers"); clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");

Просмотреть файл

@ -1,5 +1,3 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

Просмотреть файл

@ -28,10 +28,8 @@
<script type="text/javascript" src="debugger-view.js"/> <script type="text/javascript" src="debugger-view.js"/>
<script type="text/javascript" src="utils.js"/> <script type="text/javascript" src="utils.js"/>
<script type="text/javascript" src="views/workers-view.js"/> <script type="text/javascript" src="views/workers-view.js"/>
<script type="text/javascript" src="views/sources-view.js"/>
<script type="text/javascript" src="views/variable-bubble-view.js"/> <script type="text/javascript" src="views/variable-bubble-view.js"/>
<script type="text/javascript" src="views/watch-expressions-view.js"/> <script type="text/javascript" src="views/watch-expressions-view.js"/>
<script type="text/javascript" src="views/event-listeners-view.js"/>
<script type="text/javascript" src="views/global-search-view.js"/> <script type="text/javascript" src="views/global-search-view.js"/>
<script type="text/javascript" src="views/toolbar-view.js"/> <script type="text/javascript" src="views/toolbar-view.js"/>
<script type="text/javascript" src="views/options-view.js"/> <script type="text/javascript" src="views/options-view.js"/>

Просмотреть файл

@ -1,7 +1,9 @@
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */ http://creativecommons.org/publicdomain/zero/1.0/ */
var { interfaces: Ci, classes: Cc, utils: Cu } = Components; "use strict";
var { interfaces: Ci, utils: Cu } = Components;
function notify() { function notify() {
// Log objects so makeDebuggeeValue can get the global to use // Log objects so makeDebuggeeValue can get the global to use
@ -9,13 +11,13 @@ function notify() {
} }
function startup(aParams, aReason) { function startup(aParams, aReason) {
Cu.import("resource://gre/modules/Services.jsm"); const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
let res = Services.io.getProtocolHandler("resource") let res = Services.io.getProtocolHandler("resource")
.QueryInterface(Ci.nsIResProtocolHandler); .QueryInterface(Ci.nsIResProtocolHandler);
res.setSubstitution("browser_dbg_addon4", aParams.resourceURI); res.setSubstitution("browser_dbg_addon4", aParams.resourceURI);
// Load a JS module // Load a JS module
Cu.import("resource://browser_dbg_addon4/test.jsm"); Cu.import("resource://browser_dbg_addon4/test.jsm"); // eslint-disable-line mozilla/no-single-arg-cu-import
// Log objects so makeDebuggeeValue can get the global to use // Log objects so makeDebuggeeValue can get the global to use
console.log({ msg: "Hello from the test add-on" }); console.log({ msg: "Hello from the test add-on" });

Просмотреть файл

@ -2,10 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* FIXME: remove this globals comment and replace with import-globals-from when
bug 1242893 is fixed */
/* globals BrowserToolboxProcess */
/** /**
* This XPCOM component is loaded very early. * This XPCOM component is loaded very early.
* It handles command line arguments like -jsconsole, but also ensures starting * It handles command line arguments like -jsconsole, but also ensures starting
@ -22,7 +18,7 @@ const kDebuggerPrefs = [
"devtools.debugger.remote-enabled", "devtools.debugger.remote-enabled",
"devtools.chrome.enabled" "devtools.chrome.enabled"
]; ];
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});
XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm");
function DevToolsStartup() {} function DevToolsStartup() {}
@ -126,7 +122,7 @@ DevToolsStartup.prototype = {
if (!this._isRemoteDebuggingEnabled()) { if (!this._isRemoteDebuggingEnabled()) {
return; return;
} }
Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm"); const { BrowserToolboxProcess } = Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", {});
BrowserToolboxProcess.init(); BrowserToolboxProcess.init();
if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) { if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) {

Просмотреть файл

@ -2,11 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const {Cc, Ci, Cu} = require("chrome"); "use strict";
const {Cc, Ci} = require("chrome");
const {rgbToHsl, rgbToColorName} = const {rgbToHsl, rgbToColorName} =
require("devtools/client/shared/css-color").colorUtils; require("devtools/client/shared/css-color").colorUtils;
const Telemetry = require("devtools/client/shared/telemetry"); const Telemetry = require("devtools/client/shared/telemetry");
const {EventEmitter} = Cu.import("resource://devtools/shared/event-emitter.js"); const EventEmitter = require("devtools/shared/event-emitter");
const promise = require("promise"); const promise = require("promise");
const Services = require("Services"); const Services = require("Services");
@ -182,7 +184,8 @@ Eyedropper.prototype = {
* Get color of center cell in the grid. * Get color of center cell in the grid.
*/ */
get centerColor() { get centerColor() {
let x = y = (this.centerCell * this.cellSize) + (this.cellSize / 2); let x, y;
x = y = (this.centerCell * this.cellSize) + (this.cellSize / 2);
let rgb = this._ctx.getImageData(x, y, 1, 1).data; let rgb = this._ctx.getImageData(x, y, 1, 1).data;
return rgb; return rgb;
}, },
@ -727,7 +730,8 @@ Eyedropper.prototype = {
* Draw a box on the canvas to highlight the center cell. * Draw a box on the canvas to highlight the center cell.
*/ */
_drawCrosshair: function () { _drawCrosshair: function () {
let x = y = this.centerCell * this.cellSize; let x, y;
x = y = this.centerCell * this.cellSize;
this._ctx.lineWidth = 1; this._ctx.lineWidth = 1;
this._ctx.lineJoin = "miter"; this._ctx.lineJoin = "miter";

Просмотреть файл

@ -11,8 +11,8 @@ const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
const DBG_XUL = "chrome://devtools/content/framework/toolbox-process-window.xul"; const DBG_XUL = "chrome://devtools/content/framework/toolbox-process-window.xul";
const CHROME_DEBUGGER_PROFILE_NAME = "chrome_debugger_profile"; const CHROME_DEBUGGER_PROFILE_NAME = "chrome_debugger_profile";
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const { require, DevToolsLoader } = Cu.import("resource://devtools/shared/Loader.jsm", {}); const { require, DevToolsLoader } = Cu.import("resource://devtools/shared/Loader.jsm", {});
const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyGetter(this, "Telemetry", function () { XPCOMUtils.defineLazyGetter(this, "Telemetry", function () {
return require("devtools/client/shared/telemetry"); return require("devtools/client/shared/telemetry");

Просмотреть файл

@ -7,13 +7,12 @@
"use strict"; "use strict";
var Cu = Components.utils; var Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); var {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
var {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
var Services = require("Services"); var Services = require("Services");
var {gDevTools} = require("devtools/client/framework/devtools"); var {gDevTools} = require("devtools/client/framework/devtools");
var {TargetFactory} = require("devtools/client/framework/target"); var {TargetFactory} = require("devtools/client/framework/target");
var {Toolbox} = require("devtools/client/framework/toolbox"); var {Toolbox} = require("devtools/client/framework/toolbox");
var promise = require("promise");
var {DebuggerClient} = require("devtools/shared/client/main"); var {DebuggerClient} = require("devtools/shared/client/main");
var {Task} = require("devtools/shared/task"); var {Task} = require("devtools/shared/task");

Просмотреть файл

@ -1,13 +1,10 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const {Cu} = require("chrome"); "use strict";
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
var Services = require("Services"); var Services = require("Services");
var {Task} = require("devtools/shared/task"); var {Task} = require("devtools/shared/task");
var EventEmitter = require("devtools/shared/event-emitter"); var EventEmitter = require("devtools/shared/event-emitter");

Просмотреть файл

@ -1,17 +1,15 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict"; "use strict";
const { Ci, Cu } = require("chrome"); const { Ci } = require("chrome");
const promise = require("promise"); const promise = require("promise");
const EventEmitter = require("devtools/shared/event-emitter"); const EventEmitter = require("devtools/shared/event-emitter");
const Services = require("Services"); const Services = require("Services");
const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
loader.lazyRequireGetter(this, "DebuggerServer", "devtools/server/main", true); loader.lazyRequireGetter(this, "DebuggerServer", "devtools/server/main", true);
loader.lazyRequireGetter(this, "DebuggerClient", loader.lazyRequireGetter(this, "DebuggerClient",
"devtools/shared/client/main", true); "devtools/shared/client/main", true);

Просмотреть файл

@ -9,7 +9,8 @@
/** /**
* Check that the detached devtools window title is not updated when switching * Check that the detached devtools window title is not updated when switching
* the selected frame. * the selected frame. Also check that frames command button has 'open'
* attribute set when the list of frames is opened.
*/ */
var {Toolbox} = require("devtools/client/framework/toolbox"); var {Toolbox} = require("devtools/client/framework/toolbox");
@ -35,10 +36,14 @@ add_task(function* () {
yield waitForTick(); yield waitForTick();
// Open frame menu and wait till it's available on the screen. // Open frame menu and wait till it's available on the screen.
// Also check 'open' attribute on the command button.
let btn = toolbox.doc.getElementById("command-button-frames"); let btn = toolbox.doc.getElementById("command-button-frames");
ok(!btn.getAttribute("open"), "The open attribute must not be present");
let menu = toolbox.showFramesMenu({target: btn}); let menu = toolbox.showFramesMenu({target: btn});
yield once(menu, "open"); yield once(menu, "open");
is(btn.getAttribute("open"), "true", "The open attribute must be set");
// Verify that the frame list menu is populated // Verify that the frame list menu is populated
let frames = menu.items; let frames = menu.items;
is(frames.length, 2, "We have both frames in the list"); is(frames.length, 2, "We have both frames in the list");

Просмотреть файл

@ -6,11 +6,10 @@
"use strict"; "use strict";
const {Cu} = require("chrome");
const EventEmitter = require("devtools/shared/event-emitter"); const EventEmitter = require("devtools/shared/event-emitter");
const promise = require("promise"); const promise = require("promise");
const Services = require("Services"); const Services = require("Services");
Cu.import("resource://devtools/client/shared/DOMHelpers.jsm"); const {DOMHelpers} = require("resource://devtools/client/shared/DOMHelpers.jsm");
loader.lazyRequireGetter(this, "system", "devtools/shared/system"); loader.lazyRequireGetter(this, "system", "devtools/shared/system");

Просмотреть файл

@ -1,5 +1,3 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public /* 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 * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@ -26,9 +24,7 @@ var viewSource = require("devtools/client/shared/view-source");
var { attachThread, detachThread } = require("./attach-thread"); var { attachThread, detachThread } = require("./attach-thread");
var Menu = require("devtools/client/framework/menu"); var Menu = require("devtools/client/framework/menu");
var MenuItem = require("devtools/client/framework/menu-item"); var MenuItem = require("devtools/client/framework/menu-item");
var { DOMHelpers } = require("resource://devtools/client/shared/DOMHelpers.jsm");
Cu.import("resource://devtools/client/scratchpad/scratchpad-manager.jsm");
Cu.import("resource://devtools/client/shared/DOMHelpers.jsm");
const { BrowserLoader } = const { BrowserLoader } =
Cu.import("resource://devtools/client/shared/browser-loader.js", {}); Cu.import("resource://devtools/client/shared/browser-loader.js", {});
@ -1619,6 +1615,7 @@ Toolbox.prototype = {
*/ */
showFramesMenu: function (event) { showFramesMenu: function (event) {
let menu = new Menu(); let menu = new Menu();
let target = event.target;
// Generate list of menu items from the list of frames. // Generate list of menu items from the list of frames.
this.frameMap.forEach(frame => { this.frameMap.forEach(frame => {
@ -1636,14 +1633,22 @@ Toolbox.prototype = {
})); }));
}); });
menu.once("open").then(() => {
target.setAttribute("open", "true");
});
menu.once("close").then(() => {
target.removeAttribute("open");
});
// Show a drop down menu with frames. // Show a drop down menu with frames.
// XXX Missing menu API for specifying target (anchor) // XXX Missing menu API for specifying target (anchor)
// and relative position to it. See also: // and relative position to it. See also:
// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/openPopup // https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/openPopup
// https://bugzilla.mozilla.org/show_bug.cgi?id=1274551 // https://bugzilla.mozilla.org/show_bug.cgi?id=1274551
let rect = event.target.getBoundingClientRect(); let rect = target.getBoundingClientRect();
let screenX = event.target.ownerDocument.defaultView.mozInnerScreenX; let screenX = target.ownerDocument.defaultView.mozInnerScreenX;
let screenY = event.target.ownerDocument.defaultView.mozInnerScreenY; let screenY = target.ownerDocument.defaultView.mozInnerScreenY;
menu.popup(rect.left + screenX, rect.bottom + screenY, this); menu.popup(rect.left + screenX, rect.bottom + screenY, this);
return menu; return menu;

Просмотреть файл

@ -8,7 +8,7 @@
"use strict"; "use strict";
const {Cc, Ci, Cu} = require("chrome"); const {Cc, Ci} = require("chrome");
const ToolDefinitions = require("devtools/client/definitions").Tools; const ToolDefinitions = require("devtools/client/definitions").Tools;
const {CssLogic} = require("devtools/shared/inspector/css-logic"); const {CssLogic} = require("devtools/shared/inspector/css-logic");
@ -19,6 +19,7 @@ const {OutputParser} = require("devtools/client/shared/output-parser");
const {PrefObserver, PREF_ORIG_SOURCES} = require("devtools/client/styleeditor/utils"); const {PrefObserver, PREF_ORIG_SOURCES} = require("devtools/client/styleeditor/utils");
const {createChild} = require("devtools/client/inspector/shared/utils"); const {createChild} = require("devtools/client/inspector/shared/utils");
const {gDevTools} = require("devtools/client/framework/devtools"); const {gDevTools} = require("devtools/client/framework/devtools");
const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
loader.lazyRequireGetter(this, "overlays", loader.lazyRequireGetter(this, "overlays",
"devtools/client/inspector/shared/style-inspector-overlays"); "devtools/client/inspector/shared/style-inspector-overlays");
@ -27,8 +28,6 @@ loader.lazyRequireGetter(this, "StyleInspectorMenu",
loader.lazyRequireGetter(this, "KeyShortcuts", loader.lazyRequireGetter(this, "KeyShortcuts",
"devtools/client/shared/key-shortcuts", true); "devtools/client/shared/key-shortcuts", true);
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PluralForm", XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
"resource://gre/modules/PluralForm.jsm"); "resource://gre/modules/PluralForm.jsm");

Просмотреть файл

@ -7,7 +7,7 @@
"use strict"; "use strict";
const {Cc, Cu, Ci} = require("chrome"); const {Cc, Ci} = require("chrome");
// Page size for pageup/pagedown // Page size for pageup/pagedown
const PAGE_SIZE = 10; const PAGE_SIZE = 10;
@ -49,8 +49,7 @@ const {PrefObserver} = require("devtools/client/styleeditor/utils");
const {KeyShortcuts} = require("devtools/client/shared/key-shortcuts"); const {KeyShortcuts} = require("devtools/client/shared/key-shortcuts");
const {template} = require("devtools/shared/gcli/templater"); const {template} = require("devtools/shared/gcli/templater");
const nodeConstants = require("devtools/shared/dom-node-constants"); const nodeConstants = require("devtools/shared/dom-node-constants");
const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
loader.lazyRequireGetter(this, "CSS", "CSS"); loader.lazyRequireGetter(this, "CSS", "CSS");
loader.lazyGetter(this, "DOMParser", () => { loader.lazyGetter(this, "DOMParser", () => {

Просмотреть файл

@ -6,13 +6,12 @@
"use strict"; "use strict";
const {Cc, Ci, Cu} = require("chrome"); const {Cc, Ci} = require("chrome");
const promise = require("promise"); const promise = require("promise");
const {Rule} = require("devtools/client/inspector/rules/models/rule"); const {Rule} = require("devtools/client/inspector/rules/models/rule");
const {promiseWarn} = require("devtools/client/inspector/shared/utils"); const {promiseWarn} = require("devtools/client/inspector/shared/utils");
const {ELEMENT_STYLE} = require("devtools/server/actors/styles"); const {ELEMENT_STYLE} = require("devtools/server/actors/styles");
const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
loader.lazyGetter(this, "PSEUDO_ELEMENTS", () => { loader.lazyGetter(this, "PSEUDO_ELEMENTS", () => {
return domUtils.getCSSPseudoElementNames(); return domUtils.getCSSPseudoElementNames();

Просмотреть файл

@ -6,7 +6,7 @@
"use strict"; "use strict";
const {Cc, Ci, Cu} = require("chrome"); const {Cc, Ci} = require("chrome");
const promise = require("promise"); const promise = require("promise");
const {CssLogic} = require("devtools/shared/inspector/css-logic"); const {CssLogic} = require("devtools/shared/inspector/css-logic");
const {ELEMENT_STYLE} = require("devtools/server/actors/styles"); const {ELEMENT_STYLE} = require("devtools/server/actors/styles");
@ -15,8 +15,7 @@ const {TextProperty} =
const {promiseWarn} = require("devtools/client/inspector/shared/utils"); const {promiseWarn} = require("devtools/client/inspector/shared/utils");
const {parseDeclarations} = require("devtools/shared/css-parsing-utils"); const {parseDeclarations} = require("devtools/shared/css-parsing-utils");
const {getCssProperties} = require("devtools/shared/fronts/css-properties"); const {getCssProperties} = require("devtools/shared/fronts/css-properties");
const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyGetter(this, "osString", function () { XPCOMUtils.defineLazyGetter(this, "osString", function () {
return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS; return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS;

Просмотреть файл

@ -6,11 +6,10 @@
"use strict"; "use strict";
const {Cc, Ci, Cu} = require("chrome"); const {Cc, Ci} = require("chrome");
const {escapeCSSComment} = require("devtools/shared/css-parsing-utils"); const {escapeCSSComment} = require("devtools/shared/css-parsing-utils");
const {getCssProperties} = require("devtools/shared/fronts/css-properties"); const {getCssProperties} = require("devtools/shared/fronts/css-properties");
const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyGetter(this, "domUtils", function () { XPCOMUtils.defineLazyGetter(this, "domUtils", function () {
return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils); return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);

Просмотреть файл

@ -4,7 +4,7 @@
"use strict"; "use strict";
// Testing navigation between nodes in search results // Testing navigation between nodes in search results
var {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm"); const {AppConstants} = require("resource://gre/modules/AppConstants.jsm");
const TEST_URL = URL_ROOT + "doc_inspector_search.html"; const TEST_URL = URL_ROOT + "doc_inspector_search.html";

Просмотреть файл

@ -12,7 +12,7 @@ define(function (require, exports, module) {
const { JsonPanel } = createFactories(require("./json-panel")); const { JsonPanel } = createFactories(require("./json-panel"));
const { TextPanel } = createFactories(require("./text-panel")); const { TextPanel } = createFactories(require("./text-panel"));
const { HeadersPanel } = createFactories(require("./headers-panel")); const { HeadersPanel } = createFactories(require("./headers-panel"));
const { Tabs, TabPanel } = createFactories(require("./reps/tabs")); const { Tabs, TabPanel } = createFactories(require("devtools/client/shared/components/tabs/tabs"));
/** /**
* This object represents the root application template * This object represents the root application template

Просмотреть файл

@ -5,6 +5,5 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
DevToolsModules( DevToolsModules(
'tabs.js',
'toolbar.js', 'toolbar.js',
) )

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше