Merge mozilla-central to mozilla-inbound
|
@ -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);
|
|
||||||
checkPopup(win.PopupNotifications.panel, notifyObj);
|
yield new Promise(resolve => {
|
||||||
ok(notifyObj.swappingCallbackTriggered, "the swapping callback was triggered");
|
notification.options.eventCallback = function (eventName) {
|
||||||
win.close();
|
if (eventName == "shown") {
|
||||||
goNext();
|
resolve();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
info("Showing the notification again");
|
||||||
|
notification.reshow();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
checkPopup(win.PopupNotifications.panel, notifyObj);
|
||||||
|
ok(notifyObj.swappingCallbackTriggered, "the swapping callback was triggered");
|
||||||
|
win.close();
|
||||||
|
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) {
|
||||||
Services.obs.addObserver(function observer(aSubject, aTopic) {
|
return new Promise(resolve => {
|
||||||
if (aWindow == aSubject) {
|
info("Waiting for delayed startup to finish");
|
||||||
Services.obs.removeObserver(observer, aTopic);
|
Services.obs.addObserver(function observer(aSubject, aTopic) {
|
||||||
executeSoon(aCallback);
|
if (aWindow == aSubject) {
|
||||||
}
|
Services.obs.removeObserver(observer, aTopic);
|
||||||
}, "browser-delayed-startup-finished", false);
|
if (aCallback) {
|
||||||
|
executeSoon(aCallback);
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}, "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,7 +169,13 @@ var gSearchPane = {
|
||||||
gSearchPane.remove(aEngine);
|
gSearchPane.remove(aEngine);
|
||||||
break;
|
break;
|
||||||
case "engine-current":
|
case "engine-current":
|
||||||
gSearchPane.buildDefaultEngineDropDown();
|
// 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();
|
||||||
break;
|
break;
|
||||||
case "engine-default":
|
case "engine-default":
|
||||||
// Not relevant
|
// Not relevant
|
||||||
|
|
|
@ -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 |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareDevice-16.png
До Ширина: | Высота: | Размер: 224 B |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareDevice-16@2x.png
До Ширина: | Высота: | Размер: 367 B |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareDevice-64.png
До Ширина: | Высота: | Размер: 1.1 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareDevice-64@2x.png
До Ширина: | Высота: | Размер: 1.6 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareMicrophone-16.png
До Ширина: | Высота: | Размер: 1.1 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareMicrophone-16@2x.png
До Ширина: | Высота: | Размер: 1.3 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareMicrophone-64.png
До Ширина: | Высота: | Размер: 2.5 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareMicrophone-64@2x.png
До Ширина: | Высота: | Размер: 5.6 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareScreen-16.png
До Ширина: | Высота: | Размер: 3.7 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareScreen-16@2x.png
До Ширина: | Высота: | Размер: 3.9 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareScreen-64.png
До Ширина: | Высота: | Размер: 4.6 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-shareScreen-64@2x.png
До Ширина: | Высота: | Размер: 5.6 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-sharingDevice-16.png
До Ширина: | Высота: | Размер: 3.8 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-sharingDevice-16@2x.png
До Ширина: | Высота: | Размер: 3.9 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-sharingMicrophone-16.png
До Ширина: | Высота: | Размер: 3.8 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-sharingMicrophone-16@2x.png
До Ширина: | Высота: | Размер: 4.0 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-sharingScreen-16.png
До Ширина: | Высота: | Размер: 3.7 KiB |
Двоичные данные
browser/themes/shared/webrtc/webRTC-sharingScreen-16@2x.png
До Ширина: | Высота: | Размер: 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',
|
||||||
)
|
)
|
||||||
|
|