Merge m-c to m-i
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="a8ace1361d702eef293e48f2ea525dac686daa86">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="a8ace1361d702eef293e48f2ea525dac686daa86">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
|
||||
|
@ -19,7 +19,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
|
||||
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="9a9797062c6001d6346504161c51187a2968466b"/>
|
||||
|
@ -17,7 +17,7 @@
|
||||
</project>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="46da1a05ac04157669685246d70ac59d48699c9e"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0627790166dccd8dd370fa7d9f434ed9fc027fb4"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="a8ace1361d702eef293e48f2ea525dac686daa86">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="61e82f99bb8bc78d52b5717e9a2481ec7267fa33">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
|
||||
|
@ -19,7 +19,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
|
||||
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="9a9797062c6001d6346504161c51187a2968466b"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="a8ace1361d702eef293e48f2ea525dac686daa86">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
|
||||
|
@ -1,9 +1,9 @@
|
||||
{
|
||||
"git": {
|
||||
"git_revision": "84d77c1f3cbe06b91d4a5acac02a6c829e9a7488",
|
||||
"git_revision": "4c0f36e9dfe017bf2a698d416a57c8156b43383d",
|
||||
"remote": "https://git.mozilla.org/releases/gaia.git",
|
||||
"branch": ""
|
||||
},
|
||||
"revision": "65b78de3c7968e078018096712a5e14321fe0a14",
|
||||
"revision": "310f2f629ea46fcda38315c087b54a04b4677573",
|
||||
"repo_path": "integration/gaia-central"
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
</project>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="46da1a05ac04157669685246d70ac59d48699c9e"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="0627790166dccd8dd370fa7d9f434ed9fc027fb4"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="61e82f99bb8bc78d52b5717e9a2481ec7267fa33">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="84d77c1f3cbe06b91d4a5acac02a6c829e9a7488"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="4c0f36e9dfe017bf2a698d416a57c8156b43383d"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
|
||||
|
@ -1449,14 +1449,6 @@ pref("devtools.performance.ui.show-idle-blocks", true);
|
||||
pref("devtools.performance.ui.enable-memory", false);
|
||||
pref("devtools.performance.ui.enable-framerate", true);
|
||||
pref("devtools.performance.ui.show-jit-optimizations", false);
|
||||
// If in aurora/dev edition (40.0, will revert for 40.1), set default
|
||||
// to retro mode.
|
||||
// TODO bug 1160313
|
||||
#ifdef MOZ_DEV_EDITION
|
||||
pref("devtools.performance.ui.retro-mode", true);
|
||||
#else
|
||||
pref("devtools.performance.ui.retro-mode", false);
|
||||
#endif
|
||||
|
||||
// The default cache UI setting
|
||||
pref("devtools.cache.disabled", false);
|
||||
|
@ -54,6 +54,22 @@ const gXPInstallObserver = {
|
||||
// originatingURI might be missing or 'host' might throw for non-nsStandardURL nsIURIs.
|
||||
}
|
||||
|
||||
let cancelInstallation = () => {
|
||||
if (installInfo) {
|
||||
for (let install of installInfo.installs)
|
||||
install.cancel();
|
||||
}
|
||||
|
||||
if (aTopic == "addon-install-confirmation")
|
||||
this.acceptInstallation = null;
|
||||
|
||||
let tab = gBrowser.getTabForBrowser(browser);
|
||||
if (tab)
|
||||
tab.removeEventListener("TabClose", cancelInstallation);
|
||||
|
||||
window.removeEventListener("unload", cancelInstallation);
|
||||
};
|
||||
|
||||
switch (aTopic) {
|
||||
case "addon-install-disabled": {
|
||||
notificationID = "xpinstall-disabled";
|
||||
@ -170,11 +186,7 @@ const gXPInstallObserver = {
|
||||
options.eventCallback = (aEvent) => {
|
||||
switch (aEvent) {
|
||||
case "removed":
|
||||
if (installInfo) {
|
||||
for (let install of installInfo.installs)
|
||||
install.cancel();
|
||||
}
|
||||
this.acceptInstallation = null;
|
||||
cancelInstallation();
|
||||
break;
|
||||
case "shown":
|
||||
let addonList = document.getElementById("addon-install-confirmation-content");
|
||||
@ -215,18 +227,22 @@ const gXPInstallObserver = {
|
||||
options.learnMoreURL = Services.urlFormatter.formatURLPref("app.support.baseURL") +
|
||||
"find-and-install-add-ons";
|
||||
|
||||
let notification = document.getElementById("addon-install-confirmation-notification");
|
||||
if (unsigned.length == installInfo.installs.length) {
|
||||
// None of the add-ons are verified
|
||||
messageString = gNavigatorBundle.getString("addonConfirmInstallUnsigned.message");
|
||||
notification.setAttribute("warning", "true");
|
||||
}
|
||||
else if (unsigned.length == 0) {
|
||||
// All add-ons are verified or don't need to be verified
|
||||
messageString = gNavigatorBundle.getString("addonConfirmInstall.message");
|
||||
notification.removeAttribute("warning");
|
||||
}
|
||||
else {
|
||||
// Some of the add-ons are unverified, the list of names will indicate
|
||||
// which
|
||||
messageString = gNavigatorBundle.getString("addonConfirmInstallSomeUnsigned.message");
|
||||
notification.setAttribute("warning", "true");
|
||||
}
|
||||
|
||||
messageString = PluralForm.get(installInfo.installs.length, messageString);
|
||||
@ -243,8 +259,12 @@ const gXPInstallObserver = {
|
||||
|
||||
let showNotification = () => {
|
||||
let tab = gBrowser.getTabForBrowser(browser);
|
||||
if (tab)
|
||||
if (tab) {
|
||||
gBrowser.selectedTab = tab;
|
||||
tab.addEventListener("TabClose", cancelInstallation);
|
||||
}
|
||||
|
||||
window.addEventListener("unload", cancelInstallation);
|
||||
|
||||
if (PopupNotifications.isPanelOpen) {
|
||||
let rect = document.getElementById("addon-progress-notification").getBoundingClientRect();
|
||||
@ -283,6 +303,7 @@ const gXPInstallObserver = {
|
||||
});
|
||||
|
||||
if (needsRestart) {
|
||||
notificationID = "addon-install-restart";
|
||||
messageString = gNavigatorBundle.getString("addonsInstalledNeedsRestart");
|
||||
action = {
|
||||
label: gNavigatorBundle.getString("addonInstallRestartButton"),
|
||||
|
@ -400,7 +400,7 @@
|
||||
#ifndef XP_MACOSX
|
||||
class="menuitem-iconic"
|
||||
#endif
|
||||
oncommand="openUILink(Pocket.listURL, event);"/>
|
||||
oncommand="window.pktUI.openTabWithUrl(Pocket.listURL);"/>
|
||||
<menuseparator id="menu_pocketSeparator"/>
|
||||
<menuitem id="menu_bookmarkThisPage"
|
||||
command="Browser:AddBookmarkAs"
|
||||
|
@ -29,6 +29,8 @@ function get_observer_topic(aNotificationId) {
|
||||
topic = "addon-install-disabled";
|
||||
else if (topic == "addon-progress")
|
||||
topic = "addon-install-started";
|
||||
else if (topic == "addon-install-restart")
|
||||
topic = "addon-install-complete";
|
||||
return topic;
|
||||
}
|
||||
|
||||
@ -214,7 +216,7 @@ function test_blocked_install() {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
@ -260,7 +262,7 @@ function test_whitelisted_install() {
|
||||
"tab selected in response to the addon-install-confirmation notification");
|
||||
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
@ -419,7 +421,7 @@ function test_multiple() {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
@ -482,7 +484,7 @@ function test_someunverified() {
|
||||
is(container.childNodes[1].childNodes.length, 1, "Shouldn't have the unverified marker");
|
||||
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
AddonManager.getAddonsByIDs(["restartless-xpi@tests.mozilla.org",
|
||||
"theme-xpi@tests.mozilla.org"], function([a, t]) {
|
||||
a.uninstall();
|
||||
@ -565,7 +567,7 @@ function test_url() {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
@ -618,6 +620,35 @@ function test_localfile() {
|
||||
gBrowser.loadURI(path);
|
||||
},
|
||||
|
||||
function test_tabclose() {
|
||||
if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
|
||||
runNextTest();
|
||||
return;
|
||||
}
|
||||
|
||||
// Wait for the progress notification
|
||||
wait_for_progress_notification(aPanel => {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(() => {
|
||||
AddonManager.getAllInstalls(aInstalls => {
|
||||
is(aInstalls.length, 1, "Should be one pending install");
|
||||
|
||||
wait_for_notification_close(() => {
|
||||
AddonManager.getAllInstalls(aInstalls => {
|
||||
is(aInstalls.length, 0, "Should be no pending install since the tab is closed");
|
||||
runNextTest();
|
||||
});
|
||||
});
|
||||
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "unsigned.xpi");
|
||||
},
|
||||
|
||||
function test_wronghost() {
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.addEventListener("load", function() {
|
||||
@ -652,7 +683,7 @@ function test_reload() {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
@ -705,7 +736,7 @@ function test_theme() {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
@ -783,7 +814,7 @@ function test_renotify_installed() {
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
// Dismiss the notification
|
||||
wait_for_notification_close(function () {
|
||||
// Install another
|
||||
@ -795,7 +826,7 @@ function test_renotify_installed() {
|
||||
info("Timeouts after this probably mean bug 589954 regressed");
|
||||
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-complete", function(aPanel) {
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 1, "Should be one pending installs");
|
||||
aInstalls[0].cancel();
|
||||
|
@ -3000,7 +3000,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
return "passwords";
|
||||
if (type == "editBookmarkPanel")
|
||||
return "bookmarks";
|
||||
if (type == "addon-install-complete") {
|
||||
if (type == "addon-install-complete" || type == "addon-install-restart") {
|
||||
if (!Services.prefs.prefHasUserValue("services.sync.username"))
|
||||
return "addons";
|
||||
if (!Services.prefs.getBoolPref("services.sync.engine.addons"))
|
||||
|
@ -739,9 +739,6 @@ BrowserGlue.prototype = {
|
||||
LightweightThemeManager.addBuiltInTheme({
|
||||
id: "firefox-devedition@mozilla.org",
|
||||
name: themeName,
|
||||
#ifdef XP_WIN
|
||||
accentcolor: "transparent",
|
||||
#endif
|
||||
headerURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.header.png",
|
||||
iconURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.icon.png",
|
||||
author: vendorShortName,
|
||||
|
@ -42,7 +42,12 @@
|
||||
// TODO : [nice to have] - Immediately save, buffer the actions in a local queue and send (so it works offline, works like our native extensions)
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode", "resource://gre/modules/ReaderMode.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
|
||||
"resource://gre/modules/AppConstants.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
|
||||
"resource://gre/modules/PrivateBrowsingUtils.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
|
||||
"resource://gre/modules/ReaderMode.jsm");
|
||||
|
||||
var pktUI = (function() {
|
||||
|
||||
@ -616,11 +621,38 @@ var pktUI = (function() {
|
||||
* Open a new tab with a given url and notify the iframe panel that it was opened
|
||||
*/
|
||||
|
||||
function openTabWithUrl(url, activate) {
|
||||
var tab = gBrowser.addTab(url);
|
||||
if (activate) {
|
||||
gBrowser.selectedTab = tab;
|
||||
function openTabWithUrl(url) {
|
||||
let recentWindow = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
if (!recentWindow) {
|
||||
if (this.AppConstants.platform == "macosx") {
|
||||
let hiddenWindow = Services.appShell.hiddenDOMWindow;
|
||||
// If there are no open browser windows, open a new one.
|
||||
hiddenWindow.openDialog("chrome://browser/content/", "_blank",
|
||||
"chrome,all,dialog=no", url);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// If the user is in permanent private browsing than this is not an issue,
|
||||
// since the current window will always share the same cookie jar as the other
|
||||
// windows.
|
||||
if (!PrivateBrowsingUtils.isWindowPrivate(recentWindow) ||
|
||||
PrivateBrowsingUtils.permanentPrivateBrowsing) {
|
||||
recentWindow.openUILinkIn(url, "tab");
|
||||
return;
|
||||
}
|
||||
|
||||
let windows = Services.wm.getEnumerator("navigator:browser");
|
||||
while (windows.hasMoreElements()) {
|
||||
let win = windows.getNext();
|
||||
if (!PrivateBrowsingUtils.isWindowPrivate(win)) {
|
||||
win.openUILinkIn(url, "tab");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If there were no non-private windows opened already.
|
||||
recentWindow.openUILinkIn(url, "window");
|
||||
}
|
||||
|
||||
|
||||
@ -789,6 +821,8 @@ var pktUI = (function() {
|
||||
onLoad: onLoad,
|
||||
getPanelFrame: getPanelFrame,
|
||||
|
||||
openTabWithUrl: openTabWithUrl,
|
||||
|
||||
pocketButtonOnCommand: pocketButtonOnCommand,
|
||||
pocketPanelDidShow: pocketPanelDidShow,
|
||||
pocketPanelDidHide: pocketPanelDidHide,
|
||||
|
@ -390,4 +390,10 @@
|
||||
.pkt_ext_signup_ja .pkt_ext_introdetailhero .pkt_ext_tagline,
|
||||
.pkt_ext_signup_ru .pkt_ext_introdetailhero .pkt_ext_tagline {
|
||||
font-size: 13px;
|
||||
}
|
||||
.pkt_ext_signup_overflow.pkt_ext_signup_de .signup-btn-firefox .logo,
|
||||
.pkt_ext_signup_overflow.pkt_ext_signup_es .signup-btn-firefox .logo,
|
||||
.pkt_ext_signup_overflow.pkt_ext_signup_ja .signup-btn-firefox .logo,
|
||||
.pkt_ext_signup_overflow.pkt_ext_signup_ru .signup-btn-firefox .logo {
|
||||
display: none;
|
||||
}
|
@ -604,28 +604,21 @@ var pktApi = (function() {
|
||||
* Helper function to get current signup AB group the user is in
|
||||
*/
|
||||
function getSignupAB() {
|
||||
if (!getSetting('signupAB'))
|
||||
var setting = getSetting('signupAB');
|
||||
if (!setting || setting.contains('hero'))
|
||||
{
|
||||
var rand = (Math.floor(Math.random()*100+1));
|
||||
if (rand > 95)
|
||||
if (rand > 90)
|
||||
{
|
||||
setSetting('signupAB','storyboard_nlm');
|
||||
}
|
||||
else if (rand > 90)
|
||||
{
|
||||
setSetting('signupAB','hero_nlm');
|
||||
}
|
||||
else if (rand > 45)
|
||||
{
|
||||
setSetting('signupAB','storyboard_lm');
|
||||
setting = 'storyboard_nlm';
|
||||
}
|
||||
else
|
||||
{
|
||||
setSetting('signupAB','hero_lm');
|
||||
setting = 'storyboard_lm';
|
||||
}
|
||||
|
||||
setSetting('signupAB',setting);
|
||||
}
|
||||
return getSetting('signupAB');
|
||||
return setting;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -26,9 +26,6 @@ loader.lazyRequireGetter(this, "MarkersOverview",
|
||||
loader.lazyRequireGetter(this, "EventEmitter",
|
||||
"devtools/toolkit/event-emitter");
|
||||
|
||||
// TODO get rid of retro mode in bug 1160313
|
||||
loader.lazyRequireGetter(this, "Services");
|
||||
|
||||
/**
|
||||
* For line graphs
|
||||
*/
|
||||
@ -168,24 +165,6 @@ const GRAPH_DEFINITIONS = {
|
||||
}
|
||||
};
|
||||
|
||||
// TODO get rid of retro mode in bug 1160313
|
||||
const GRAPH_DEFINITIONS_RETRO = {
|
||||
memory: {
|
||||
constructor: MemoryGraph,
|
||||
selector: "#memory-overview",
|
||||
},
|
||||
framerate: {
|
||||
constructor: FramerateGraph,
|
||||
selector: "#time-framerate",
|
||||
needsBlueprints: true,
|
||||
primaryLink: true
|
||||
},
|
||||
timeline: {
|
||||
constructor: TimelineGraph,
|
||||
selector: "#markers-overview",
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A controller for orchestrating the performance's tool overview graphs. Constructs,
|
||||
* syncs, toggles displays and defines the memory, framerate and timeline view.
|
||||
@ -198,9 +177,7 @@ const GRAPH_DEFINITIONS_RETRO = {
|
||||
function GraphsController ({ definition, root, getBlueprint, getTheme }) {
|
||||
this._graphs = {};
|
||||
this._enabled = new Set();
|
||||
// TODO get rid of retro mode in bug 1160313
|
||||
let RETRO_MODE = Services.prefs.getBoolPref("devtools.performance.ui.retro-mode");
|
||||
this._definition = definition || (RETRO_MODE ? GRAPH_DEFINITIONS_RETRO : GRAPH_DEFINITIONS);
|
||||
this._definition = definition || GRAPH_DEFINITIONS;
|
||||
this._root = root;
|
||||
this._getBlueprint = getBlueprint;
|
||||
this._getTheme = getTheme;
|
||||
|
@ -285,16 +285,11 @@ let PerformanceController = {
|
||||
* when the front has started to record.
|
||||
*/
|
||||
startRecording: Task.async(function *() {
|
||||
// Store retro-mode here so we can easily list true/false
|
||||
// values for reverting.
|
||||
// TODO bug 1160313
|
||||
let superMode = !this.getOption("retro-mode");
|
||||
|
||||
let options = {
|
||||
withMarkers: superMode ? true : false,
|
||||
withMemory: superMode ? this.getOption("enable-memory") : false,
|
||||
withMarkers: true,
|
||||
withMemory: this.getOption("enable-memory"),
|
||||
withTicks: this.getOption("enable-framerate"),
|
||||
withAllocations: superMode ? this.getOption("enable-memory") : false,
|
||||
withAllocations: this.getOption("enable-memory"),
|
||||
allocationsSampleProbability: this.getPref("memory-sample-probability"),
|
||||
allocationsMaxLogLength: this.getPref("memory-max-log-length"),
|
||||
bufferSize: this.getPref("profiler-buffer-size"),
|
||||
|
@ -132,11 +132,10 @@ support-files =
|
||||
[browser_profiler_tree-view-06.js]
|
||||
[browser_profiler_tree-view-07.js]
|
||||
[browser_profiler_tree-view-08.js]
|
||||
[browser_profiler_tree-view-09.js]
|
||||
[browser_profiler-frame-utils-01.js]
|
||||
[browser_timeline-blueprint.js]
|
||||
[browser_timeline-filters.js]
|
||||
[browser_timeline-waterfall-background.js]
|
||||
[browser_timeline-waterfall-generic.js]
|
||||
[browser_timeline-waterfall-sidebar.js]
|
||||
# remove in bug 1160313
|
||||
[browser_retro-test.js]
|
||||
|
@ -21,7 +21,9 @@ function test() {
|
||||
treeRoot.autoExpandDepth = 0;
|
||||
treeRoot.attachTo(container);
|
||||
|
||||
let $$fun = node => container.querySelectorAll(".call-tree-cell[type=function] > " + node);
|
||||
let $$ = node => container.querySelectorAll(node);
|
||||
let $fun = (node, ancestor) => (ancestor || container).querySelector(".call-tree-cell[type=function] > " + node);
|
||||
let $$fun = (node, ancestor) => (ancestor || container).querySelectorAll(".call-tree-cell[type=function] > " + node);
|
||||
let $$dur = i => container.querySelectorAll(".call-tree-cell[type=duration]")[i];
|
||||
let $$perc = i => container.querySelectorAll(".call-tree-cell[type=percentage]")[i];
|
||||
let $$sampl = i => container.querySelectorAll(".call-tree-cell[type=samples]")[i];
|
||||
@ -39,13 +41,13 @@ function test() {
|
||||
"The root's samples cell displays the correct value.");
|
||||
is($$fun(".call-tree-name")[0].getAttribute("value"), "(root)",
|
||||
"The root's function cell displays the correct name.");
|
||||
is($$fun(".call-tree-url")[0].getAttribute("value"), "",
|
||||
"The root's function cell displays the correct url.");
|
||||
is($$fun(".call-tree-line")[0].getAttribute("value"), "",
|
||||
"The root's function cell displays the correct line.");
|
||||
is($$fun(".call-tree-host")[0].getAttribute("value"), "",
|
||||
is($$fun(".call-tree-url")[0], null,
|
||||
"The root's function cell displays no url.");
|
||||
is($$fun(".call-tree-line")[0], null,
|
||||
"The root's function cell displays no line.");
|
||||
is($$fun(".call-tree-host")[0], null,
|
||||
"The root's function cell displays the correct host.");
|
||||
is($$fun(".call-tree-category")[0].getAttribute("value"), "",
|
||||
is($$fun(".call-tree-category")[0], null,
|
||||
"The root's function cell displays the correct category.");
|
||||
|
||||
treeRoot.expand();
|
||||
@ -63,17 +65,17 @@ function test() {
|
||||
"The .A node's percentage cell displays the correct value.");
|
||||
is($$sampl(1).getAttribute("value"), "4",
|
||||
"The .A node's samples cell displays the correct value.");
|
||||
is($$fun(".call-tree-name")[1].getAttribute("value"), "A",
|
||||
is($fun(".call-tree-name", $$(".call-tree-item")[1]).getAttribute("value"), "A",
|
||||
"The .A node's function cell displays the correct name.");
|
||||
is($$fun(".call-tree-url")[1].getAttribute("value"), "baz",
|
||||
is($fun(".call-tree-url", $$(".call-tree-item")[1]).getAttribute("value"), "baz",
|
||||
"The .A node's function cell displays the correct url.");
|
||||
ok($$fun(".call-tree-url")[1].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
|
||||
ok($fun(".call-tree-url", $$(".call-tree-item")[1]).getAttribute("tooltiptext").includes("http://foo/bar/baz"),
|
||||
"The .A node's function cell displays the correct url tooltiptext.");
|
||||
is($$fun(".call-tree-line")[1].getAttribute("value"), ":12",
|
||||
is($fun(".call-tree-line", $$(".call-tree-item")[1]).getAttribute("value"), ":12",
|
||||
"The .A node's function cell displays the correct line.");
|
||||
is($$fun(".call-tree-host")[1].getAttribute("value"), "foo",
|
||||
is($fun(".call-tree-host", $$(".call-tree-item")[1]).getAttribute("value"), "foo",
|
||||
"The .A node's function cell displays the correct host.");
|
||||
is($$fun(".call-tree-category")[1].getAttribute("value"), "Gecko",
|
||||
is($fun(".call-tree-category", $$(".call-tree-item")[1]).getAttribute("value"), "Gecko",
|
||||
"The .A node's function cell displays the correct category.");
|
||||
|
||||
let A = treeRoot.getChild();
|
||||
@ -92,17 +94,17 @@ function test() {
|
||||
"The .A.B node's percentage cell displays the correct value.");
|
||||
is($$sampl(2).getAttribute("value"), "3",
|
||||
"The .A.B node's samples cell displays the correct value.");
|
||||
is($$fun(".call-tree-name")[2].getAttribute("value"), "B",
|
||||
is($fun(".call-tree-name", $$(".call-tree-item")[2]).getAttribute("value"), "B",
|
||||
"The .A.B node's function cell displays the correct name.");
|
||||
is($$fun(".call-tree-url")[2].getAttribute("value"), "baz",
|
||||
is($fun(".call-tree-url", $$(".call-tree-item")[2]).getAttribute("value"), "baz",
|
||||
"The .A.B node's function cell displays the correct url.");
|
||||
ok($$fun(".call-tree-url")[2].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
|
||||
ok($fun(".call-tree-url", $$(".call-tree-item")[2]).getAttribute("tooltiptext").includes("http://foo/bar/baz"),
|
||||
"The .A.B node's function cell displays the correct url tooltiptext.");
|
||||
is($$fun(".call-tree-line")[2].getAttribute("value"), ":34",
|
||||
is($fun(".call-tree-line", $$(".call-tree-item")[2]).getAttribute("value"), ":34",
|
||||
"The .A.B node's function cell displays the correct line.");
|
||||
is($$fun(".call-tree-host")[2].getAttribute("value"), "foo",
|
||||
is($fun(".call-tree-host", $$(".call-tree-item")[2]).getAttribute("value"), "foo",
|
||||
"The .A.B node's function cell displays the correct host.");
|
||||
is($$fun(".call-tree-category")[2].getAttribute("value"), "Styles",
|
||||
is($fun(".call-tree-category", $$(".call-tree-item")[2]).getAttribute("value"), "Styles",
|
||||
"The .A.B node's function cell displays the correct category.");
|
||||
|
||||
is($$dur(3).getAttribute("value"), "7 ms",
|
||||
@ -111,17 +113,17 @@ function test() {
|
||||
"The .A.E node's percentage cell displays the correct value.");
|
||||
is($$sampl(3).getAttribute("value"), "1",
|
||||
"The .A.E node's samples cell displays the correct value.");
|
||||
is($$fun(".call-tree-name")[3].getAttribute("value"), "E",
|
||||
is($fun(".call-tree-name", $$(".call-tree-item")[3]).getAttribute("value"), "E",
|
||||
"The .A.E node's function cell displays the correct name.");
|
||||
is($$fun(".call-tree-url")[3].getAttribute("value"), "baz",
|
||||
is($fun(".call-tree-url", $$(".call-tree-item")[3]).getAttribute("value"), "baz",
|
||||
"The .A.E node's function cell displays the correct url.");
|
||||
ok($$fun(".call-tree-url")[3].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
|
||||
ok($fun(".call-tree-url", $$(".call-tree-item")[3]).getAttribute("tooltiptext").includes("http://foo/bar/baz"),
|
||||
"The .A.E node's function cell displays the correct url tooltiptext.");
|
||||
is($$fun(".call-tree-line")[3].getAttribute("value"), ":90",
|
||||
is($fun(".call-tree-line", $$(".call-tree-item")[3]).getAttribute("value"), ":90",
|
||||
"The .A.E node's function cell displays the correct line.");
|
||||
is($$fun(".call-tree-host")[3].getAttribute("value"), "foo",
|
||||
is($fun(".call-tree-host", $$(".call-tree-item")[3]).getAttribute("value"), "foo",
|
||||
"The .A.E node's function cell displays the correct host.");
|
||||
is($$fun(".call-tree-category")[3].getAttribute("value"), "GC",
|
||||
is($fun(".call-tree-category", $$(".call-tree-item")[3]).getAttribute("value"), "GC",
|
||||
"The .A.E node's function cell displays the correct category.");
|
||||
|
||||
finish();
|
||||
|
@ -26,7 +26,7 @@ function test() {
|
||||
"The root node's 'category' attribute is correct.");
|
||||
is(treeRoot.target.getAttribute("tooltiptext"), "",
|
||||
"The root node's 'tooltiptext' attribute is correct.");
|
||||
ok(treeRoot.target.querySelector(".call-tree-category").hidden,
|
||||
is(treeRoot.target.querySelector(".call-tree-category"), null,
|
||||
"The root node's category label cell should be hidden.");
|
||||
|
||||
let A = treeRoot.getChild();
|
||||
@ -37,7 +37,7 @@ function test() {
|
||||
"The .A.B.D node's 'origin' attribute is correct.");
|
||||
is(D.target.getAttribute("category"), "gc",
|
||||
"The .A.B.D node's 'category' attribute is correct.");
|
||||
is(D.target.getAttribute("tooltiptext"), "D (http://foo/bar/baz:78)",
|
||||
is(D.target.getAttribute("tooltiptext"), "D (http://foo/bar/baz:78:1337)",
|
||||
"The .A.B.D node's 'tooltiptext' attribute is correct.");
|
||||
ok(!A.target.querySelector(".call-tree-category").hidden,
|
||||
"The .A.B.D node's category label cell should not be hidden.");
|
||||
@ -72,7 +72,7 @@ function test() {
|
||||
is(functionCell.childNodes[4].className, "plain call-tree-column",
|
||||
"The fifth node displayed for function cells is correct.");
|
||||
is(functionCell.childNodes[5].className, "plain call-tree-host",
|
||||
"The fifth node displayed for function cells is correct.");
|
||||
"The sixth node displayed for function cells is correct.");
|
||||
is(functionCell.childNodes[6].tagName, "spacer",
|
||||
"The seventh node displayed for function cells is correct.");
|
||||
is(functionCell.childNodes[7].className, "plain call-tree-category",
|
||||
@ -95,7 +95,7 @@ let gThread = synthesizeProfileForTest([{
|
||||
{ category: CATEGORY_MASK('other'), location: "(root)" },
|
||||
{ category: CATEGORY_MASK('other'), location: "A (http://foo/bar/baz:12)" },
|
||||
{ category: CATEGORY_MASK('css'), location: "B (http://foo/bar/baz:34)" },
|
||||
{ category: CATEGORY_MASK('gc', 1), location: "D (http://foo/bar/baz:78)" }
|
||||
{ category: CATEGORY_MASK('gc', 1), location: "D (http://foo/bar/baz:78:1337)" }
|
||||
]
|
||||
}, {
|
||||
time: 5 + 1 + 2,
|
||||
@ -103,7 +103,7 @@ let gThread = synthesizeProfileForTest([{
|
||||
{ category: CATEGORY_MASK('other'), location: "(root)" },
|
||||
{ category: CATEGORY_MASK('other'), location: "A (http://foo/bar/baz:12)" },
|
||||
{ category: CATEGORY_MASK('css'), location: "B (http://foo/bar/baz:34)" },
|
||||
{ category: CATEGORY_MASK('gc', 1), location: "D (http://foo/bar/baz:78)" }
|
||||
{ category: CATEGORY_MASK('gc', 1), location: "D (http://foo/bar/baz:78:1337)" }
|
||||
]
|
||||
}, {
|
||||
time: 5 + 1 + 2 + 7,
|
||||
|
@ -19,13 +19,13 @@ function test() {
|
||||
treeRoot.attachTo(container);
|
||||
|
||||
let categories = container.querySelectorAll(".call-tree-category");
|
||||
is(categories.length, 7,
|
||||
is(categories.length, 5,
|
||||
"The call tree displays a correct number of categories.");
|
||||
ok(!container.hasAttribute("categories-hidden"),
|
||||
"All categories should be visible in the tree.");
|
||||
|
||||
treeRoot.toggleCategories(false);
|
||||
is(categories.length, 7,
|
||||
is(categories.length, 5,
|
||||
"The call tree displays the same number of categories.");
|
||||
ok(container.hasAttribute("categories-hidden"),
|
||||
"All categories should now be hidden in the tree.");
|
||||
|
@ -0,0 +1,56 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* Tests that the profiler's tree view sorts inverted call trees by
|
||||
* "self cost" and not "total cost".
|
||||
*/
|
||||
|
||||
let { CATEGORY_MASK } = devtools.require("devtools/shared/profiler/global");
|
||||
|
||||
let test = Task.async(function*() {
|
||||
let { ThreadNode } = devtools.require("devtools/shared/profiler/tree-model");
|
||||
let { CallView } = devtools.require("devtools/shared/profiler/tree-view");
|
||||
|
||||
let threadNode = new ThreadNode(gSamples, { invertTree: true });
|
||||
let treeRoot = new CallView({ frame: threadNode, inverted: true, autoExpandDepth: 1 });
|
||||
|
||||
let container = document.createElement("vbox");
|
||||
treeRoot.attachTo(container);
|
||||
|
||||
is(treeRoot.getChild(0).frame.location, "B",
|
||||
"The tree root's first child is the `B` function.");
|
||||
is(treeRoot.getChild(1).frame.location, "A",
|
||||
"The tree root's second child is the `A` function.");
|
||||
|
||||
finish();
|
||||
});
|
||||
|
||||
let gSamples = synthesizeProfileForTest([{
|
||||
time: 1,
|
||||
frames: [
|
||||
{ location: "(root)" },
|
||||
{ location: "A" },
|
||||
{ location: "B" },
|
||||
]
|
||||
}, {
|
||||
time: 2,
|
||||
frames: [
|
||||
{ location: "(root)" },
|
||||
{ location: "A" },
|
||||
{ location: "B" }
|
||||
]
|
||||
}, {
|
||||
time: 3,
|
||||
frames: [
|
||||
{ location: "(root)" },
|
||||
{ location: "A" },
|
||||
{ location: "B" },
|
||||
]
|
||||
}, {
|
||||
time: 4,
|
||||
frames: [
|
||||
{ location: "(root)" },
|
||||
{ location: "A" }
|
||||
]
|
||||
}]);
|
@ -1,49 +0,0 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* Tests that only js-calltree view is on, default, and many things are hidden
|
||||
* when in retro mode.
|
||||
*/
|
||||
const HIDDEN_OPTIONS = ["option-enable-memory", "option-invert-flame-graph", "option-show-jit-optimizations", "option-flatten-tree-recursion"];
|
||||
|
||||
Services.prefs.setBoolPref("devtools.performance.ui.retro-mode", true);
|
||||
|
||||
function spawnTest () {
|
||||
let { panel } = yield initPerformance(SIMPLE_URL);
|
||||
let { EVENTS, DetailsView, PerformanceController, $, $$, JsCallTreeView } = panel.panelWin;
|
||||
|
||||
yield startRecording(panel);
|
||||
yield stopRecording(panel);
|
||||
|
||||
let model = PerformanceController.getCurrentRecording();
|
||||
|
||||
ok(model.getMemory().length === 0, "model did not record memory.");
|
||||
ok(model.getTicks().length !== 0, "model did get ticks.");
|
||||
ok(model.getAllocations().sites.length === 0, "model did get allocation data.");
|
||||
ok(model.getAllocations().timestamps.length === 0, "model did get allocation data.");
|
||||
ok(model.getAllocations().frames.length === 0, "model did get allocation data.");
|
||||
ok(model.getAllocations().counts.length === 0, "model did get allocation data.");
|
||||
|
||||
ok(DetailsView.isViewSelected(JsCallTreeView),
|
||||
"The jscalltree view is selected by default");
|
||||
|
||||
for (let option of $$("#performance-options-menupopup > menuitem")) {
|
||||
if (HIDDEN_OPTIONS.indexOf(option.id) !== -1) {
|
||||
ok(option.hidden === true, `${option.id} should be hidden.`);
|
||||
} else {
|
||||
ok(option.hidden === false, `${option.id} should be visible.`);
|
||||
}
|
||||
}
|
||||
|
||||
for (let viewbutton of $$("#performance-toolbar-controls-detail-views > toolbarbutton")) {
|
||||
ok (viewbutton.hidden === true, `${viewbutton.id} should be hidden.`);
|
||||
}
|
||||
|
||||
ok($("#markers-overview").hidden, "markers overview should be hidden.");
|
||||
ok($("#memory-overview").hidden, "memory overview should be hidden.");
|
||||
ok(!$("#time-framerate").hidden, "framerate should be shown.");
|
||||
|
||||
yield teardown(panel);
|
||||
finish();
|
||||
}
|
@ -56,7 +56,6 @@ let DEFAULT_PREFS = [
|
||||
"devtools.performance.memory.max-log-length",
|
||||
"devtools.performance.profiler.buffer-size",
|
||||
"devtools.performance.profiler.sample-frequency-khz",
|
||||
"devtools.performance.ui.retro-mode",
|
||||
].reduce((prefs, pref) => {
|
||||
prefs[pref] = Preferences.get(pref);
|
||||
return prefs;
|
||||
@ -68,10 +67,6 @@ Services.prefs.setBoolPref("devtools.performance.enabled", true);
|
||||
// be affected by this pref.
|
||||
Services.prefs.setBoolPref("devtools.debugger.log", false);
|
||||
|
||||
// Disable retro mode.
|
||||
// TODO bug 1160313
|
||||
Services.prefs.setBoolPref("devtools.performance.ui.retro-mode", false);
|
||||
|
||||
/**
|
||||
* Call manually in tests that use frame script utils after initializing
|
||||
* the tool. Must be called after initializing so we can detect
|
||||
|
@ -92,12 +92,9 @@ let DetailsView = {
|
||||
let invalidCurrentView = false;
|
||||
|
||||
for (let [name, { view }] of Iterator(this.components)) {
|
||||
// TODO bug 1160313 get rid of retro mode checks.
|
||||
let isRetro = PerformanceController.getOption("retro-mode");
|
||||
let isSupported = isRetro ? name === "js-calltree" : this._isViewSupported(name, true);
|
||||
let isSupported = this._isViewSupported(name, true);
|
||||
|
||||
// TODO bug 1160313 hide all view buttons, but let js-calltree still be "supported"
|
||||
$(`toolbarbutton[data-view=${name}]`).hidden = isRetro ? true : !isSupported;
|
||||
$(`toolbarbutton[data-view=${name}]`).hidden = !isSupported;
|
||||
|
||||
// If the view is currently selected and not supported, go back to the
|
||||
// default view.
|
||||
|
@ -21,24 +21,6 @@ let ToolbarView = {
|
||||
menupopup: $("#performance-options-menupopup")
|
||||
});
|
||||
|
||||
// TODO bug 1160313 get rid of retro mode checks
|
||||
// hide option buttons here, and any other buttons in the toolbar
|
||||
// (details.js takes care of view buttons)
|
||||
if (PerformanceController.getOption("retro-mode")) {
|
||||
let RETRO_ELEMENTS = [
|
||||
"#option-flatten-tree-recursion",
|
||||
"#option-invert-flame-graph",
|
||||
"#filter-button",
|
||||
// TODO re-enable in bug 1163350
|
||||
// "#option-enable-memory",
|
||||
// TODO re-enable in bug 1163351
|
||||
// "#option-show-jit-optimizations",
|
||||
];
|
||||
for (let selector of RETRO_ELEMENTS) {
|
||||
$(selector).hidden = true;
|
||||
}
|
||||
}
|
||||
|
||||
yield this.optionsView.initialize();
|
||||
this.optionsView.on("pref-changed", this._onPrefChanged);
|
||||
|
||||
|
@ -18,7 +18,15 @@ const PERCENTAGE_UNITS = L10N.getStr("table.percentage");
|
||||
const URL_LABEL_TOOLTIP = L10N.getStr("table.url.tooltiptext");
|
||||
const CALL_TREE_INDENTATION = 16; // px
|
||||
|
||||
const DEFAULT_SORTING_PREDICATE = (a, b) => a.frame.samples < b.frame.samples ? 1 : -1;
|
||||
const DEFAULT_SORTING_PREDICATE = (frameA, frameB) => {
|
||||
let dataA = frameA.getDisplayedData();
|
||||
let dataB = frameB.getDisplayedData();
|
||||
|
||||
return this.inverted
|
||||
? (dataA.selfPercentage < dataB.selfPercentage ? 1 : -1)
|
||||
: (dataA.samples < dataB.samples ? 1 : -1);
|
||||
};
|
||||
|
||||
const DEFAULT_AUTO_EXPAND_DEPTH = 3; // depth
|
||||
const DEFAULT_VISIBLE_CELLS = {
|
||||
duration: true,
|
||||
@ -118,72 +126,43 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
|
||||
_displaySelf: function(document, arrowNode) {
|
||||
this.document = document;
|
||||
|
||||
let displayedData = this.getDisplayedData();
|
||||
let frameInfo = this.frame.getInfo();
|
||||
let framePercentage = this._getPercentage(this.frame.samples);
|
||||
|
||||
let selfPercentage;
|
||||
let selfDuration;
|
||||
let totalAllocations;
|
||||
|
||||
let frameKey = this.frame.key;
|
||||
if (this.visibleCells.selfPercentage) {
|
||||
selfPercentage = this._getPercentage(this.root.frame.selfCount[frameKey]);
|
||||
}
|
||||
if (this.visibleCells.selfDuration) {
|
||||
selfDuration = this.root.frame.selfDuration[frameKey];
|
||||
}
|
||||
|
||||
if (!this.frame.calls.length) {
|
||||
if (this.visibleCells.allocations) {
|
||||
totalAllocations = this.frame.allocations;
|
||||
}
|
||||
} else {
|
||||
if (this.visibleCells.allocations) {
|
||||
let childrenAllocations = this.frame.calls.reduce((acc, node) => acc + node.allocations, 0);
|
||||
totalAllocations = this.frame.allocations + childrenAllocations;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.visibleCells.duration) {
|
||||
var durationCell = this._createTimeCell(this.frame.duration);
|
||||
var durationCell = this._createTimeCell(displayedData.totalDuration);
|
||||
}
|
||||
if (this.visibleCells.selfDuration) {
|
||||
var selfDurationCell = this._createTimeCell(selfDuration, true);
|
||||
var selfDurationCell = this._createTimeCell(displayedData.selfDuration, true);
|
||||
}
|
||||
if (this.visibleCells.percentage) {
|
||||
var percentageCell = this._createExecutionCell(framePercentage);
|
||||
var percentageCell = this._createExecutionCell(displayedData.totalPercentage);
|
||||
}
|
||||
if (this.visibleCells.selfPercentage) {
|
||||
var selfPercentageCell = this._createExecutionCell(selfPercentage, true);
|
||||
var selfPercentageCell = this._createExecutionCell(displayedData.selfPercentage, true);
|
||||
}
|
||||
if (this.visibleCells.allocations) {
|
||||
var allocationsCell = this._createAllocationsCell(totalAllocations);
|
||||
var allocationsCell = this._createAllocationsCell(displayedData.totalAllocations);
|
||||
}
|
||||
if (this.visibleCells.selfAllocations) {
|
||||
var selfAllocationsCell = this._createAllocationsCell(this.frame.allocations, true);
|
||||
var selfAllocationsCell = this._createAllocationsCell(displayedData.selfAllocations, true);
|
||||
}
|
||||
if (this.visibleCells.samples) {
|
||||
var samplesCell = this._createSamplesCell(this.frame.samples);
|
||||
var samplesCell = this._createSamplesCell(displayedData.samples);
|
||||
}
|
||||
if (this.visibleCells.function) {
|
||||
var functionCell = this._createFunctionCell(arrowNode, frameInfo, this.level);
|
||||
var functionCell = this._createFunctionCell(arrowNode, displayedData.name, frameInfo, this.level);
|
||||
}
|
||||
|
||||
let targetNode = document.createElement("hbox");
|
||||
targetNode.className = "call-tree-item";
|
||||
targetNode.setAttribute("origin", frameInfo.isContent ? "content" : "chrome");
|
||||
targetNode.setAttribute("category", frameInfo.categoryData.abbrev || "");
|
||||
targetNode.setAttribute("tooltiptext", frameInfo.isMetaCategory ? frameInfo.categoryData.label :
|
||||
this.frame.location || "");
|
||||
targetNode.setAttribute("tooltiptext", displayedData.tooltiptext);
|
||||
|
||||
if (this.hidden) {
|
||||
targetNode.style.display = "none";
|
||||
}
|
||||
|
||||
let isRoot = frameInfo.nodeType == "Thread";
|
||||
if (isRoot) {
|
||||
functionCell.querySelector(".call-tree-category").hidden = true;
|
||||
}
|
||||
|
||||
if (this.visibleCells.duration) {
|
||||
targetNode.appendChild(durationCell);
|
||||
}
|
||||
@ -212,13 +191,6 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
|
||||
return targetNode;
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculate what percentage of all samples the given number of samples is.
|
||||
*/
|
||||
_getPercentage: function(samples) {
|
||||
return samples / this.root.frame.samples * 100;
|
||||
},
|
||||
|
||||
/**
|
||||
* Populates this node in the call tree with the corresponding "callees".
|
||||
* These are defined in the `frame` data source for this call view.
|
||||
@ -238,7 +210,7 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
|
||||
|
||||
// Sort the "callees" asc. by samples, before inserting them in the tree,
|
||||
// if no other sorting predicate was specified on this on the root item.
|
||||
children.sort(this.sortingPredicate);
|
||||
children.sort(this.sortingPredicate.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
@ -277,7 +249,7 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
|
||||
cell.setAttribute("value", count || "");
|
||||
return cell;
|
||||
},
|
||||
_createFunctionCell: function(arrowNode, frameInfo, frameLevel) {
|
||||
_createFunctionCell: function(arrowNode, frameName, frameInfo, frameLevel) {
|
||||
let cell = this.document.createElement("hbox");
|
||||
cell.className = "call-tree-cell";
|
||||
cell.style.MozMarginStart = (frameLevel * CALL_TREE_INDENTATION) + "px";
|
||||
@ -288,37 +260,56 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
|
||||
nameNode.className = "plain call-tree-name";
|
||||
nameNode.setAttribute("flex", "1");
|
||||
nameNode.setAttribute("crop", "end");
|
||||
nameNode.setAttribute("value", frameInfo.isMetaCategory
|
||||
? frameInfo.categoryData.label
|
||||
: frameInfo.functionName || "");
|
||||
nameNode.setAttribute("value", frameName);
|
||||
cell.appendChild(nameNode);
|
||||
|
||||
// Don't render detailed labels for meta category frames
|
||||
if (!frameInfo.isMetaCategory) {
|
||||
this._appendFunctionDetailsCells(cell, frameInfo);
|
||||
}
|
||||
|
||||
// Don't render an expando-arrow for leaf nodes.
|
||||
let hasDescendants = Object.keys(this.frame.calls).length > 0;
|
||||
if (!hasDescendants) {
|
||||
arrowNode.setAttribute("invisible", "");
|
||||
}
|
||||
|
||||
return cell;
|
||||
},
|
||||
_appendFunctionDetailsCells: function(cell, frameInfo) {
|
||||
if (frameInfo.fileName) {
|
||||
let urlNode = this.document.createElement("label");
|
||||
urlNode.className = "plain call-tree-url";
|
||||
urlNode.setAttribute("flex", "1");
|
||||
urlNode.setAttribute("crop", "end");
|
||||
urlNode.setAttribute("value", frameInfo.fileName || "");
|
||||
urlNode.setAttribute("value", frameInfo.fileName);
|
||||
urlNode.setAttribute("tooltiptext", URL_LABEL_TOOLTIP + " → " + frameInfo.url);
|
||||
urlNode.addEventListener("mousedown", this._onUrlClick);
|
||||
cell.appendChild(urlNode);
|
||||
}
|
||||
|
||||
if (frameInfo.line) {
|
||||
let lineNode = this.document.createElement("label");
|
||||
lineNode.className = "plain call-tree-line";
|
||||
lineNode.setAttribute("value", frameInfo.line ? ":" + frameInfo.line : "");
|
||||
lineNode.setAttribute("value", ":" + frameInfo.line);
|
||||
cell.appendChild(lineNode);
|
||||
}
|
||||
|
||||
if (frameInfo.column) {
|
||||
let columnNode = this.document.createElement("label");
|
||||
columnNode.className = "plain call-tree-column";
|
||||
columnNode.setAttribute("value", frameInfo.column ? ":" + frameInfo.column : "");
|
||||
columnNode.setAttribute("value", ":" + frameInfo.column);
|
||||
cell.appendChild(columnNode);
|
||||
}
|
||||
|
||||
if (frameInfo.host) {
|
||||
let hostNode = this.document.createElement("label");
|
||||
hostNode.className = "plain call-tree-host";
|
||||
hostNode.setAttribute("value", frameInfo.host || "");
|
||||
hostNode.setAttribute("value", frameInfo.host);
|
||||
cell.appendChild(hostNode);
|
||||
}
|
||||
|
||||
if (frameInfo.categoryData.label) {
|
||||
let spacerNode = this.document.createElement("spacer");
|
||||
spacerNode.setAttribute("flex", "10000");
|
||||
cell.appendChild(spacerNode);
|
||||
@ -326,16 +317,65 @@ CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
|
||||
let categoryNode = this.document.createElement("label");
|
||||
categoryNode.className = "plain call-tree-category";
|
||||
categoryNode.style.color = frameInfo.categoryData.color;
|
||||
categoryNode.setAttribute("value", frameInfo.categoryData.label || "");
|
||||
categoryNode.setAttribute("value", frameInfo.categoryData.label);
|
||||
cell.appendChild(categoryNode);
|
||||
}
|
||||
},
|
||||
|
||||
let hasDescendants = Object.keys(this.frame.calls).length > 0;
|
||||
if (hasDescendants == false) {
|
||||
arrowNode.setAttribute("invisible", "");
|
||||
/**
|
||||
* Gets the data displayed about this tree item, based on the FrameNode
|
||||
* model associated with this view.
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
getDisplayedData: function() {
|
||||
if (this._cachedDisplayedData) {
|
||||
return this._cachedDisplayedData;
|
||||
}
|
||||
|
||||
return cell;
|
||||
let data = this._cachedDisplayedData = Object.create(null);
|
||||
let frameInfo = this.frame.getInfo();
|
||||
|
||||
// Self/total duration.
|
||||
if (this.visibleCells.duration) {
|
||||
data.totalDuration = this.frame.duration;
|
||||
}
|
||||
if (this.visibleCells.selfDuration) {
|
||||
data.selfDuration = this.root.frame.selfDuration[this.frame.key];
|
||||
}
|
||||
|
||||
// Self/total samples percentage.
|
||||
if (this.visibleCells.percentage) {
|
||||
data.totalPercentage = this.frame.samples / this.root.frame.samples * 100;
|
||||
}
|
||||
if (this.visibleCells.selfPercentage) {
|
||||
data.selfPercentage = this.root.frame.selfCount[this.frame.key] / this.root.frame.samples * 100;
|
||||
}
|
||||
|
||||
// Self/total allocations count.
|
||||
if (this.visibleCells.allocations) {
|
||||
let childrenAllocations = this.frame.calls.reduce((acc, node) => acc + node.allocations, 0);
|
||||
data.totalAllocations = this.frame.allocations + childrenAllocations;
|
||||
}
|
||||
if (this.visibleCells.selfAllocations) {
|
||||
data.selfAllocations = this.frame.allocations;
|
||||
}
|
||||
|
||||
// Raw samples.
|
||||
if (this.visibleCells.samples) {
|
||||
data.samples = this.frame.samples;
|
||||
}
|
||||
|
||||
// Frame name (function location or some meta information).
|
||||
data.name = frameInfo.isMetaCategory
|
||||
? frameInfo.categoryData.label
|
||||
: frameInfo.functionName || "";
|
||||
|
||||
data.tooltiptext = frameInfo.isMetaCategory
|
||||
? frameInfo.categoryData.label
|
||||
: this.frame.location || "";
|
||||
|
||||
return this._cachedDisplayedData;
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1,8 +0,0 @@
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
EXTRA_JS_MODULES.devtools.timeline += [
|
||||
'panel.js',
|
||||
]
|
@ -1,65 +0,0 @@
|
||||
/* -*- 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
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
"use strict";
|
||||
|
||||
const { Cc, Ci, Cu, Cr } = require("chrome");
|
||||
|
||||
Cu.import("resource://gre/modules/Task.jsm");
|
||||
|
||||
loader.lazyRequireGetter(this, "promise");
|
||||
loader.lazyRequireGetter(this, "EventEmitter",
|
||||
"devtools/toolkit/event-emitter");
|
||||
|
||||
loader.lazyRequireGetter(this, "TimelineFront",
|
||||
"devtools/server/actors/timeline", true);
|
||||
|
||||
function TimelinePanel(iframeWindow, toolbox) {
|
||||
this.panelWin = iframeWindow;
|
||||
this._toolbox = toolbox;
|
||||
|
||||
EventEmitter.decorate(this);
|
||||
};
|
||||
|
||||
exports.TimelinePanel = TimelinePanel;
|
||||
|
||||
TimelinePanel.prototype = {
|
||||
/**
|
||||
* Open is effectively an asynchronous constructor.
|
||||
*
|
||||
* @return object
|
||||
* A promise that is resolved when the timeline completes opening.
|
||||
*/
|
||||
open: Task.async(function*() {
|
||||
// Local debugging needs to make the target remote.
|
||||
yield this.target.makeRemote();
|
||||
|
||||
this.panelWin.gToolbox = this._toolbox;
|
||||
this.panelWin.gTarget = this.target;
|
||||
this.panelWin.gFront = new TimelineFront(this.target.client, this.target.form);
|
||||
yield this.panelWin.startupTimeline();
|
||||
|
||||
this.isReady = true;
|
||||
this.emit("ready");
|
||||
return this;
|
||||
}),
|
||||
|
||||
// DevToolPanel API
|
||||
|
||||
get target() this._toolbox.target,
|
||||
|
||||
destroy: Task.async(function*() {
|
||||
// Make sure this panel is not already destroyed.
|
||||
if (this._destroyed) {
|
||||
return;
|
||||
}
|
||||
|
||||
yield this.panelWin.shutdownTimeline();
|
||||
// Destroy front to ensure packet handler is removed from client
|
||||
this.panelWin.gFront.destroy();
|
||||
this.emit("destroyed");
|
||||
this._destroyed = true;
|
||||
})
|
||||
};
|
@ -1,627 +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/. */
|
||||
"use strict";
|
||||
|
||||
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
|
||||
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/Task.jsm");
|
||||
Cu.import("resource://gre/modules/devtools/Loader.jsm");
|
||||
Cu.import("resource:///modules/devtools/ViewHelpers.jsm");
|
||||
Cu.import("resource:///modules/devtools/gDevTools.jsm");
|
||||
|
||||
devtools.lazyRequireGetter(this, "promise");
|
||||
devtools.lazyRequireGetter(this, "EventEmitter",
|
||||
"devtools/toolkit/event-emitter");
|
||||
|
||||
devtools.lazyRequireGetter(this, "MarkersOverview",
|
||||
"devtools/shared/timeline/markers-overview", true);
|
||||
devtools.lazyRequireGetter(this, "MemoryOverview",
|
||||
"devtools/shared/timeline/memory-overview", true);
|
||||
devtools.lazyRequireGetter(this, "Waterfall",
|
||||
"devtools/shared/timeline/waterfall", true);
|
||||
devtools.lazyRequireGetter(this, "MarkerDetails",
|
||||
"devtools/shared/timeline/marker-details", true);
|
||||
devtools.lazyRequireGetter(this, "TIMELINE_BLUEPRINT",
|
||||
"devtools/shared/timeline/global", true);
|
||||
|
||||
devtools.lazyImporter(this, "CanvasGraphUtils",
|
||||
"resource:///modules/devtools/Graphs.jsm");
|
||||
|
||||
devtools.lazyImporter(this, "PluralForm",
|
||||
"resource://gre/modules/PluralForm.jsm");
|
||||
|
||||
const OVERVIEW_UPDATE_INTERVAL = 200;
|
||||
const OVERVIEW_INITIAL_SELECTION_RATIO = 0.15;
|
||||
|
||||
/**
|
||||
* Preference for devtools.timeline.hiddenMarkers.
|
||||
* Stores which markers should be hidden.
|
||||
*/
|
||||
const Prefs = new ViewHelpers.Prefs("devtools.timeline", {
|
||||
hiddenMarkers: ["Json", "hiddenMarkers"]
|
||||
});
|
||||
|
||||
// The panel's window global is an EventEmitter firing the following events:
|
||||
const EVENTS = {
|
||||
// When a recording is started or stopped, via the `stopwatch` button.
|
||||
RECORDING_STARTED: "Timeline:RecordingStarted",
|
||||
RECORDING_ENDED: "Timeline:RecordingEnded",
|
||||
|
||||
// When the overview graphs are populated with new markers.
|
||||
OVERVIEW_UPDATED: "Timeline:OverviewUpdated",
|
||||
|
||||
// When the waterfall view is populated with new markers.
|
||||
WATERFALL_UPDATED: "Timeline:WaterfallUpdated"
|
||||
};
|
||||
|
||||
/**
|
||||
* The current target and the timeline front, set by this tool's host.
|
||||
*/
|
||||
let gToolbox, gTarget, gFront;
|
||||
|
||||
/**
|
||||
* Initializes the timeline controller and views.
|
||||
*/
|
||||
let startupTimeline = Task.async(function*() {
|
||||
yield TimelineView.initialize();
|
||||
yield TimelineController.initialize();
|
||||
});
|
||||
|
||||
/**
|
||||
* Destroys the timeline controller and views.
|
||||
*/
|
||||
let shutdownTimeline = Task.async(function*() {
|
||||
yield TimelineView.destroy();
|
||||
yield TimelineController.destroy();
|
||||
yield gFront.stop();
|
||||
});
|
||||
|
||||
/**
|
||||
* Functions handling the timeline frontend controller.
|
||||
*/
|
||||
let TimelineController = {
|
||||
/**
|
||||
* Permanent storage for the markers and the memory measurements streamed by
|
||||
* the backend, along with the start and end timestamps.
|
||||
*/
|
||||
_starTime: 0,
|
||||
_endTime: 0,
|
||||
_markers: [],
|
||||
_memory: [],
|
||||
_frames: [],
|
||||
|
||||
/**
|
||||
* Initialization function, called when the tool is started.
|
||||
*/
|
||||
initialize: function() {
|
||||
this._onRecordingTick = this._onRecordingTick.bind(this);
|
||||
this._onMarkers = this._onMarkers.bind(this);
|
||||
this._onMemory = this._onMemory.bind(this);
|
||||
this._onFrames = this._onFrames.bind(this);
|
||||
|
||||
gFront.on("markers", this._onMarkers);
|
||||
gFront.on("memory", this._onMemory);
|
||||
gFront.on("frames", this._onFrames);
|
||||
},
|
||||
|
||||
/**
|
||||
* Destruction function, called when the tool is closed.
|
||||
*/
|
||||
destroy: function() {
|
||||
gFront.off("markers", this._onMarkers);
|
||||
gFront.off("memory", this._onMemory);
|
||||
gFront.off("frames", this._onFrames);
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the { stat, end } time interval for this recording.
|
||||
* @return object
|
||||
*/
|
||||
getInterval: function() {
|
||||
return { startTime: this._startTime, endTime: this._endTime };
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the accumulated markers in this recording.
|
||||
* @return array
|
||||
*/
|
||||
getMarkers: function() {
|
||||
return this._markers;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the accumulated memory measurements in this recording.
|
||||
* @return array
|
||||
*/
|
||||
getMemory: function() {
|
||||
return this._memory;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets stack frame array reported by the actor. The marker "stack"
|
||||
* and "endStack" properties are indices into this array. See
|
||||
* actors/utils/stack.js for more details.
|
||||
* @return array
|
||||
*/
|
||||
getFrames: function() {
|
||||
return this._frames;
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates the views to show or hide the memory recording data.
|
||||
*/
|
||||
updateMemoryRecording: Task.async(function*() {
|
||||
if ($("#memory-checkbox").checked) {
|
||||
yield TimelineView.showMemoryOverview();
|
||||
} else {
|
||||
yield TimelineView.hideMemoryOverview();
|
||||
}
|
||||
}),
|
||||
|
||||
/**
|
||||
* Starts/stops the timeline recording and streaming.
|
||||
*/
|
||||
toggleRecording: Task.async(function*() {
|
||||
let isRecording = yield gFront.isRecording();
|
||||
if (isRecording == false) {
|
||||
yield this._startRecording();
|
||||
} else {
|
||||
yield this._stopRecording();
|
||||
}
|
||||
}),
|
||||
|
||||
/**
|
||||
* Starts the recording, updating the UI as needed.
|
||||
*/
|
||||
_startRecording: function*() {
|
||||
TimelineView.handleRecordingStarted();
|
||||
|
||||
let withMemory = $("#memory-checkbox").checked;
|
||||
let startTime = yield gFront.start({ withMemory });
|
||||
|
||||
// Times must come from the actor in order to be self-consistent.
|
||||
// However, we also want to update the view with the elapsed time
|
||||
// even when the actor is not generating data. To do this we get
|
||||
// the local time and use it to compute a reasonable elapsed time.
|
||||
// See _onRecordingTick.
|
||||
this._localStartTime = performance.now();
|
||||
this._startTime = startTime;
|
||||
this._endTime = startTime;
|
||||
this._markers = [];
|
||||
this._memory = [];
|
||||
this._frames = [];
|
||||
this._updateId = setInterval(this._onRecordingTick, OVERVIEW_UPDATE_INTERVAL);
|
||||
},
|
||||
|
||||
/**
|
||||
* Stops the recording, updating the UI as needed.
|
||||
*/
|
||||
_stopRecording: function*() {
|
||||
clearInterval(this._updateId);
|
||||
|
||||
// Sorting markers is only important when displayed in the waterfall.
|
||||
this._markers = this._markers.sort((a,b) => (a.start > b.start));
|
||||
|
||||
TimelineView.handleRecordingUpdate();
|
||||
TimelineView.handleRecordingEnded();
|
||||
yield gFront.stop();
|
||||
},
|
||||
|
||||
/**
|
||||
* Used in tests. Stops the recording, discarding the accumulated markers and
|
||||
* updating the UI as needed.
|
||||
*/
|
||||
_stopRecordingAndDiscardData: function*() {
|
||||
// Clear the markers before calling async method _stopRecording to properly
|
||||
// reset the selection if markers were already received. Bug 1092452.
|
||||
this._markers.length = 0;
|
||||
this._memory.length = 0;
|
||||
|
||||
yield this._stopRecording();
|
||||
|
||||
// Clear the markers after _stopRecording has finished. It's possible that
|
||||
// server sent new markers before it received the request to stop sending
|
||||
// them and client received them while we were waiting for _stopRecording
|
||||
// to finish. Bug 1067287.
|
||||
this._markers.length = 0;
|
||||
this._memory.length = 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback handling the "markers" event on the timeline front.
|
||||
*
|
||||
* @param array markers
|
||||
* A list of new markers collected since the last time this
|
||||
* function was invoked.
|
||||
* @param number endTime
|
||||
* A time after the last marker in markers was collected.
|
||||
*/
|
||||
_onMarkers: function(markers, endTime) {
|
||||
for (let marker of markers) {
|
||||
marker.start -= this._startTime;
|
||||
marker.end -= this._startTime;
|
||||
}
|
||||
Array.prototype.push.apply(this._markers, markers);
|
||||
this._endTime = endTime;
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback handling the "memory" event on the timeline front.
|
||||
*
|
||||
* @param number delta
|
||||
* The number of milliseconds elapsed since epoch.
|
||||
* @param object measurement
|
||||
* A detailed breakdown of the current memory usage.
|
||||
*/
|
||||
_onMemory: function(delta, measurement) {
|
||||
this._memory.push({
|
||||
delta: delta - this._startTime,
|
||||
value: measurement.total / 1024 / 1024
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback handling the "frames" event on the timeline front.
|
||||
*
|
||||
* @param number delta
|
||||
* The number of milliseconds elapsed since epoch.
|
||||
* @param object frames
|
||||
* Newly generated frame objects.
|
||||
*/
|
||||
_onFrames: function(delta, frames) {
|
||||
Array.prototype.push.apply(this._frames, frames);
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback invoked at a fixed interval while recording.
|
||||
* Updates the current time and the timeline overview.
|
||||
*/
|
||||
_onRecordingTick: function() {
|
||||
// Compute an approximate ending time for the view. This is
|
||||
// needed to ensure that the view updates even when new data is
|
||||
// not being generated.
|
||||
let fakeTime = this._startTime + (performance.now() - this._localStartTime);
|
||||
if (fakeTime > this._endTime) {
|
||||
this._endTime = fakeTime;
|
||||
}
|
||||
TimelineView.handleRecordingUpdate();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Functions handling the timeline frontend view.
|
||||
*/
|
||||
let TimelineView = {
|
||||
/**
|
||||
* Initialization function, called when the tool is started.
|
||||
*/
|
||||
initialize: Task.async(function*() {
|
||||
let blueprint = this._getFilteredBluePrint();
|
||||
this.markersOverview = new MarkersOverview($("#markers-overview"), blueprint);
|
||||
this.waterfall = new Waterfall($("#timeline-waterfall"), $("#timeline-pane"), blueprint);
|
||||
this.markerDetails = new MarkerDetails($("#timeline-waterfall-details"), $("#timeline-waterfall-container > splitter"));
|
||||
|
||||
this._onThemeChange = this._onThemeChange.bind(this);
|
||||
this._onSelecting = this._onSelecting.bind(this);
|
||||
this._onRefresh = this._onRefresh.bind(this);
|
||||
|
||||
gDevTools.on("pref-changed", this._onThemeChange);
|
||||
this.markersOverview.on("selecting", this._onSelecting);
|
||||
this.markersOverview.on("refresh", this._onRefresh);
|
||||
this.markerDetails.on("resize", this._onRefresh);
|
||||
|
||||
this._onMarkerSelected = this._onMarkerSelected.bind(this);
|
||||
this.waterfall.on("selected", this._onMarkerSelected);
|
||||
this.waterfall.on("unselected", this._onMarkerSelected);
|
||||
|
||||
let theme = Services.prefs.getCharPref("devtools.theme");
|
||||
this.markersOverview.setTheme(theme);
|
||||
|
||||
yield this.markersOverview.ready();
|
||||
|
||||
yield this.waterfall.recalculateBounds();
|
||||
|
||||
this._buildFilterPopup();
|
||||
}),
|
||||
|
||||
/**
|
||||
* Destruction function, called when the tool is closed.
|
||||
*/
|
||||
destroy: function() {
|
||||
gDevTools.off("pref-changed", this._onThemeChange);
|
||||
this.markerDetails.off("resize", this._onRefresh);
|
||||
this.markerDetails.destroy();
|
||||
this.waterfall.off("selected", this._onMarkerSelected);
|
||||
this.waterfall.off("unselected", this._onMarkerSelected);
|
||||
this.waterfall.destroy();
|
||||
this.markersOverview.off("selecting", this._onSelecting);
|
||||
this.markersOverview.off("refresh", this._onRefresh);
|
||||
this.markersOverview.destroy();
|
||||
|
||||
// The memory overview graph is not always available.
|
||||
if (this.memoryOverview) {
|
||||
this.memoryOverview.destroy();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Shows the memory overview graph.
|
||||
*/
|
||||
showMemoryOverview: Task.async(function*() {
|
||||
let theme = Services.prefs.getCharPref("devtools.theme");
|
||||
|
||||
this.memoryOverview = new MemoryOverview($("#memory-overview"));
|
||||
this.memoryOverview.setTheme(theme);
|
||||
yield this.memoryOverview.ready();
|
||||
|
||||
let memory = TimelineController.getMemory();
|
||||
this.memoryOverview.setData(memory);
|
||||
|
||||
CanvasGraphUtils.linkAnimation(this.markersOverview, this.memoryOverview);
|
||||
CanvasGraphUtils.linkSelection(this.markersOverview, this.memoryOverview);
|
||||
}),
|
||||
|
||||
/**
|
||||
* Hides the memory overview graph.
|
||||
*/
|
||||
hideMemoryOverview: function() {
|
||||
if (!this.memoryOverview) {
|
||||
return;
|
||||
}
|
||||
this.memoryOverview.destroy();
|
||||
this.memoryOverview = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* A marker has been selected in the waterfall.
|
||||
*/
|
||||
_onMarkerSelected: function(event, marker) {
|
||||
if (event == "selected") {
|
||||
this.markerDetails.render({
|
||||
toolbox: gToolbox,
|
||||
marker: marker,
|
||||
frames: TimelineController.getFrames()
|
||||
});
|
||||
}
|
||||
if (event == "unselected") {
|
||||
this.markerDetails.empty();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Signals that a recording session has started and triggers the appropriate
|
||||
* changes in the UI.
|
||||
*/
|
||||
handleRecordingStarted: function() {
|
||||
$("#record-button").setAttribute("checked", "true");
|
||||
$("#memory-checkbox").setAttribute("disabled", "true");
|
||||
$("#timeline-pane").selectedPanel = $("#recording-notice");
|
||||
|
||||
this.markersOverview.clearView();
|
||||
|
||||
// The memory overview graph is not always available.
|
||||
if (this.memoryOverview) {
|
||||
this.memoryOverview.clearView();
|
||||
}
|
||||
|
||||
this.waterfall.clearView();
|
||||
|
||||
window.emit(EVENTS.RECORDING_STARTED);
|
||||
},
|
||||
|
||||
/**
|
||||
* Signals that a recording session has ended and triggers the appropriate
|
||||
* changes in the UI.
|
||||
*/
|
||||
handleRecordingEnded: function() {
|
||||
$("#record-button").removeAttribute("checked");
|
||||
$("#memory-checkbox").removeAttribute("disabled");
|
||||
$("#timeline-pane").selectedPanel = $("#timeline-waterfall-container");
|
||||
|
||||
this.markersOverview.selectionEnabled = true;
|
||||
|
||||
// The memory overview graph is not always available.
|
||||
if (this.memoryOverview) {
|
||||
this.memoryOverview.selectionEnabled = true;
|
||||
}
|
||||
|
||||
let interval = TimelineController.getInterval();
|
||||
let markers = TimelineController.getMarkers();
|
||||
let memory = TimelineController.getMemory();
|
||||
|
||||
if (markers.length) {
|
||||
let start = markers[0].start * this.markersOverview.dataScaleX;
|
||||
let end = start + this.markersOverview.width * OVERVIEW_INITIAL_SELECTION_RATIO;
|
||||
this.markersOverview.setSelection({ start, end });
|
||||
} else {
|
||||
let startTime = interval.startTime;
|
||||
let endTime = interval.endTime;
|
||||
this.waterfall.setData({ markers, interval: { startTime, endTime } });
|
||||
}
|
||||
|
||||
window.emit(EVENTS.RECORDING_ENDED);
|
||||
},
|
||||
|
||||
/**
|
||||
* Signals that a new set of markers was made available by the controller,
|
||||
* or that the overview graph needs to be updated.
|
||||
*/
|
||||
handleRecordingUpdate: function() {
|
||||
let interval = TimelineController.getInterval();
|
||||
let markers = TimelineController.getMarkers();
|
||||
let memory = TimelineController.getMemory();
|
||||
|
||||
let duration = interval.endTime - interval.startTime;
|
||||
this.markersOverview.setData({ markers, duration });
|
||||
|
||||
// The memory overview graph is not always available.
|
||||
if (this.memoryOverview) {
|
||||
this.memoryOverview.setData(memory);
|
||||
}
|
||||
|
||||
window.emit(EVENTS.OVERVIEW_UPDATED);
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback handling the "selecting" event on the timeline overview.
|
||||
*/
|
||||
_onSelecting: function() {
|
||||
if (!this.markersOverview.hasSelection() &&
|
||||
!this.markersOverview.hasSelectionInProgress()) {
|
||||
this.waterfall.clearView();
|
||||
return;
|
||||
}
|
||||
this.waterfall.resetSelection();
|
||||
this.updateWaterfall();
|
||||
},
|
||||
|
||||
/**
|
||||
* Rebuild the waterfall.
|
||||
*/
|
||||
updateWaterfall: function() {
|
||||
let selection = this.markersOverview.getSelection();
|
||||
let start = selection.start / this.markersOverview.dataScaleX;
|
||||
let end = selection.end / this.markersOverview.dataScaleX;
|
||||
|
||||
let markers = TimelineController.getMarkers();
|
||||
let interval = TimelineController.getInterval();
|
||||
|
||||
let startTime = Math.min(start, end);
|
||||
let endTime = Math.max(start, end);
|
||||
|
||||
this.waterfall.setData({ markers, interval: { startTime, endTime } });
|
||||
},
|
||||
|
||||
/**
|
||||
* Callback handling the "refresh" event on the timeline overview.
|
||||
*/
|
||||
_onRefresh: function() {
|
||||
this.waterfall.recalculateBounds();
|
||||
this.updateWaterfall();
|
||||
},
|
||||
|
||||
/**
|
||||
* Rebuild a blueprint without hidden markers.
|
||||
*/
|
||||
_getFilteredBluePrint: function() {
|
||||
let hiddenMarkers = Prefs.hiddenMarkers;
|
||||
let filteredBlueprint = Cu.cloneInto(TIMELINE_BLUEPRINT, {});
|
||||
let maybeRemovedGroups = new Set();
|
||||
let removedGroups = new Set();
|
||||
|
||||
// 1. Remove hidden markers from the blueprint.
|
||||
|
||||
for (let hiddenMarkerName of hiddenMarkers) {
|
||||
maybeRemovedGroups.add(filteredBlueprint[hiddenMarkerName].group);
|
||||
delete filteredBlueprint[hiddenMarkerName];
|
||||
}
|
||||
|
||||
// 2. Get a list of all the groups that will be removed.
|
||||
|
||||
for (let removedGroup of maybeRemovedGroups) {
|
||||
let markerNames = Object.keys(filteredBlueprint);
|
||||
let allGroupsRemoved = markerNames.every(e => filteredBlueprint[e].group != removedGroup);
|
||||
if (allGroupsRemoved) {
|
||||
removedGroups.add(removedGroup);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Offset groups.
|
||||
|
||||
for (let removedGroup of removedGroups) {
|
||||
for (let [, markerDetails] of Iterator(filteredBlueprint)) {
|
||||
if (markerDetails.group > removedGroup) {
|
||||
markerDetails.group--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return filteredBlueprint;
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* When the list of hidden markers changes, update waterfall
|
||||
* and overview.
|
||||
*/
|
||||
_onHiddenMarkersChanged: function(e) {
|
||||
let menuItems = $$("#timelineFilterPopup menuitem[marker-type]:not([checked])");
|
||||
let hiddenMarkers = Array.map(menuItems, e => e.getAttribute("marker-type"));
|
||||
|
||||
Prefs.hiddenMarkers = hiddenMarkers;
|
||||
let blueprint = this._getFilteredBluePrint();
|
||||
|
||||
this.waterfall.setBlueprint(blueprint);
|
||||
this.updateWaterfall();
|
||||
|
||||
this.markersOverview.setBlueprint(blueprint);
|
||||
this.markersOverview.refresh({ force: true });
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates the filter popup.
|
||||
*/
|
||||
_buildFilterPopup: function() {
|
||||
let popup = $("#timelineFilterPopup");
|
||||
let button = $("#filter-button");
|
||||
|
||||
popup.addEventListener("popupshowing", () => button.setAttribute("open", "true"));
|
||||
popup.addEventListener("popuphiding", () => button.removeAttribute("open"));
|
||||
|
||||
this._onHiddenMarkersChanged = this._onHiddenMarkersChanged.bind(this);
|
||||
|
||||
for (let [markerName, markerDetails] of Iterator(TIMELINE_BLUEPRINT)) {
|
||||
let menuitem = document.createElement("menuitem");
|
||||
menuitem.setAttribute("closemenu", "none");
|
||||
menuitem.setAttribute("type", "checkbox");
|
||||
menuitem.setAttribute("marker-type", markerName);
|
||||
menuitem.setAttribute("label", markerDetails.label);
|
||||
menuitem.setAttribute("flex", "1");
|
||||
menuitem.setAttribute("align", "center");
|
||||
|
||||
menuitem.addEventListener("command", this._onHiddenMarkersChanged);
|
||||
|
||||
if (Prefs.hiddenMarkers.indexOf(markerName) == -1) {
|
||||
menuitem.setAttribute("checked", "true");
|
||||
}
|
||||
|
||||
// Style used by pseudo element ::before in timeline.css.in
|
||||
let bulletStyle = `--bullet-bg: ${markerDetails.fill};`
|
||||
bulletStyle += `--bullet-border: ${markerDetails.stroke}`;
|
||||
menuitem.setAttribute("style", bulletStyle);
|
||||
|
||||
popup.appendChild(menuitem);
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
* Called when the developer tools theme changes. Redraws
|
||||
* the graphs with the new theme setting.
|
||||
*/
|
||||
_onThemeChange: function (_, theme) {
|
||||
if (this.memoryOverview) {
|
||||
this.memoryOverview.setTheme(theme.newValue);
|
||||
this.memoryOverview.refresh({ force: true });
|
||||
}
|
||||
|
||||
this.markersOverview.setTheme(theme.newValue);
|
||||
this.markersOverview.refresh({ force: true });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Convenient way of emitting events from the panel window.
|
||||
*/
|
||||
EventEmitter.decorate(this);
|
||||
|
||||
/**
|
||||
* DOM query helpers.
|
||||
*/
|
||||
function $(selector, target = document) {
|
||||
return target.querySelector(selector);
|
||||
}
|
||||
function $$(selector, target = document) {
|
||||
return target.querySelectorAll(selector);
|
||||
}
|
@ -1,86 +0,0 @@
|
||||
<?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/. -->
|
||||
<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://browser/content/devtools/widgets.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://browser/skin/devtools/widgets.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://browser/skin/devtools/common.css" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://browser/skin/devtools/timeline.css" type="text/css"?>
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % timelineDTD SYSTEM "chrome://browser/locale/devtools/timeline.dtd">
|
||||
%timelineDTD;
|
||||
]>
|
||||
|
||||
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
<script src="chrome://browser/content/devtools/theme-switching.js"/>
|
||||
<script type="application/javascript" src="timeline.js"/>
|
||||
|
||||
<popupset id="timelinePopupset">
|
||||
<menupopup id="timelineFilterPopup" position="after_start"/>
|
||||
</popupset>
|
||||
|
||||
<vbox class="theme-body" flex="1">
|
||||
<toolbar id="timeline-toolbar"
|
||||
class="devtools-toolbar">
|
||||
<hbox id="recordings-controls"
|
||||
class="devtools-toolbarbutton-group"
|
||||
align="center">
|
||||
<toolbarbutton id="record-button"
|
||||
class="devtools-toolbarbutton"
|
||||
oncommand="TimelineController.toggleRecording()"
|
||||
tooltiptext="&timelineUI.recordButton.tooltip;"/>
|
||||
<toolbarbutton id="filter-button"
|
||||
popup="timelineFilterPopup"
|
||||
class="devtools-toolbarbutton"
|
||||
tooltiptext="&timelineUI.filterButton.tooltip;"/>
|
||||
<checkbox id="memory-checkbox"
|
||||
label="&timelineUI.memoryCheckbox.label;"
|
||||
oncommand="TimelineController.updateMemoryRecording()"
|
||||
tooltiptext="&timelineUI.memoryCheckbox.tooltip;"/>
|
||||
<label id="record-label"
|
||||
value="&timelineUI.recordLabel;"/>
|
||||
</hbox>
|
||||
</toolbar>
|
||||
|
||||
<vbox id="markers-overview"/>
|
||||
<vbox id="memory-overview"/>
|
||||
|
||||
<deck id="timeline-pane"
|
||||
flex="1">
|
||||
<hbox id="empty-notice"
|
||||
class="notice-container"
|
||||
align="center"
|
||||
pack="center"
|
||||
flex="1">
|
||||
<label value="&timelineUI.emptyNotice1;"/>
|
||||
<button id="profiling-notice-button"
|
||||
class="devtools-toolbarbutton"
|
||||
standalone="true"
|
||||
oncommand="TimelineController.toggleRecording()"/>
|
||||
<label value="&timelineUI.emptyNotice2;"/>
|
||||
</hbox>
|
||||
|
||||
<hbox id="recording-notice"
|
||||
class="notice-container"
|
||||
align="center"
|
||||
pack="center"
|
||||
flex="1">
|
||||
<label value="&timelineUI.stopNotice1;"/>
|
||||
<button id="profiling-notice-button"
|
||||
class="devtools-toolbarbutton"
|
||||
standalone="true"
|
||||
checked="true"
|
||||
oncommand="TimelineController.toggleRecording()"/>
|
||||
<label value="&timelineUI.stopNotice2;"/>
|
||||
</hbox>
|
||||
|
||||
<hbox id="timeline-waterfall-container" class="devtools-responsive-container" flex="1">
|
||||
<vbox id="timeline-waterfall" flex="1"/>
|
||||
<splitter class="devtools-side-splitter"/>
|
||||
<vbox id="timeline-waterfall-details" class="theme-sidebar" width="150" height="150"/>
|
||||
</hbox>
|
||||
</deck>
|
||||
</vbox>
|
||||
</window>
|
@ -995,148 +995,22 @@ ${EndIf}
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\talkback@mozilla.org"
|
||||
${EndIf}
|
||||
|
||||
; Remove the Java Console extension (bug 597235)
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0013-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0013-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0014-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0014-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0015-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0015-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0016-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0016-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0017-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0017-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0018-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0018-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0019-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0019-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0020-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0020-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0021-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0021-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0022-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0022-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0001-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0001-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0002-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0002-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0003-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0003-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0004-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0004-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0005-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0005-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0006-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0006-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0007-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0007-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0010-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0010-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0011-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0011-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0012-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0012-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0013-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0013-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0014-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0014-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0015-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0015-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0016-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0016-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0017-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0017-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0018-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0018-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0019-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0019-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0020-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0020-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0021-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0021-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0022-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0022-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0023-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0023-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0024-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0024-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0025-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0025-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0026-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0026-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0027-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0027-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0028-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0028-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0029-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0029-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0030-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0030-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
; Remove the Java Console extension (bug 1165156)
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0031-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0031-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0032-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0032-ABCDEFFEDCBA}"
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0034-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0034-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0039-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0039-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0045-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0045-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0000-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0000-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0001-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0001-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0002-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0002-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0003-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0003-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0004-ABCDEFFEDCBA}"
|
||||
RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0004-ABCDEFFEDCBA}"
|
||||
${EndIf}
|
||||
!macroend
|
||||
!define RemoveDeprecatedFiles "!insertmacro RemoveDeprecatedFiles"
|
||||
|
||||
|
@ -1,5 +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/. */
|
||||
|
||||
%include ../../shared/devtools/timeline.inc.css
|
@ -23,6 +23,14 @@ browser.jar:
|
||||
#endif
|
||||
skin/classic/browser/aboutTabCrashed.css (../shared/aboutTabCrashed.css)
|
||||
skin/classic/browser/actionicon-tab.png
|
||||
skin/classic/browser/addons/addon-install-blocked.svg (../shared/addons/addon-install-blocked.svg)
|
||||
skin/classic/browser/addons/addon-install-confirm.svg (../shared/addons/addon-install-confirm.svg)
|
||||
skin/classic/browser/addons/addon-install-downloading.svg (../shared/addons/addon-install-downloading.svg)
|
||||
skin/classic/browser/addons/addon-install-error.svg (../shared/addons/addon-install-error.svg)
|
||||
skin/classic/browser/addons/addon-install-installed.svg (../shared/addons/addon-install-installed.svg)
|
||||
skin/classic/browser/addons/addon-install-restart.svg (../shared/addons/addon-install-restart.svg)
|
||||
skin/classic/browser/addons/addon-install-warning.svg (../shared/addons/addon-install-warning.svg)
|
||||
skin/classic/browser/addons/addon-install-anchor.svg (../shared/addons/addon-install-anchor.svg)
|
||||
* skin/classic/browser/browser.css
|
||||
* skin/classic/browser/devedition.css
|
||||
* skin/classic/browser/browser-lightweightTheme.css
|
||||
@ -292,7 +300,6 @@ browser.jar:
|
||||
* skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
|
||||
* skin/classic/browser/devtools/profiler.css (devtools/profiler.css)
|
||||
* skin/classic/browser/devtools/performance.css (devtools/performance.css)
|
||||
* skin/classic/browser/devtools/timeline.css (devtools/timeline.css)
|
||||
skin/classic/browser/devtools/timeline-filter.svg (../shared/devtools/images/timeline-filter.svg)
|
||||
* skin/classic/browser/devtools/scratchpad.css (devtools/scratchpad.css)
|
||||
* skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css)
|
||||
|
@ -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/. */
|
||||
|
||||
%include ../shared.inc
|
||||
%include ../../shared/devtools/timeline.inc.css
|
@ -23,6 +23,14 @@ browser.jar:
|
||||
skin/classic/browser/aboutTabCrashed.css (../shared/aboutTabCrashed.css)
|
||||
skin/classic/browser/actionicon-tab.png
|
||||
skin/classic/browser/actionicon-tab@2x.png
|
||||
skin/classic/browser/addons/addon-install-blocked.svg (../shared/addons/addon-install-blocked.svg)
|
||||
skin/classic/browser/addons/addon-install-confirm.svg (../shared/addons/addon-install-confirm.svg)
|
||||
skin/classic/browser/addons/addon-install-downloading.svg (../shared/addons/addon-install-downloading.svg)
|
||||
skin/classic/browser/addons/addon-install-error.svg (../shared/addons/addon-install-error.svg)
|
||||
skin/classic/browser/addons/addon-install-installed.svg (../shared/addons/addon-install-installed.svg)
|
||||
skin/classic/browser/addons/addon-install-restart.svg (../shared/addons/addon-install-restart.svg)
|
||||
skin/classic/browser/addons/addon-install-warning.svg (../shared/addons/addon-install-warning.svg)
|
||||
skin/classic/browser/addons/addon-install-anchor.svg (../shared/addons/addon-install-anchor.svg)
|
||||
* skin/classic/browser/browser.css (browser.css)
|
||||
* skin/classic/browser/devedition.css
|
||||
* skin/classic/browser/browser-lightweightTheme.css
|
||||
@ -425,7 +433,6 @@ browser.jar:
|
||||
* skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
|
||||
* skin/classic/browser/devtools/profiler.css (devtools/profiler.css)
|
||||
* skin/classic/browser/devtools/performance.css (devtools/performance.css)
|
||||
* skin/classic/browser/devtools/timeline.css (devtools/timeline.css)
|
||||
skin/classic/browser/devtools/timeline-filter.svg (../shared/devtools/images/timeline-filter.svg)
|
||||
* skin/classic/browser/devtools/scratchpad.css (devtools/scratchpad.css)
|
||||
* skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css)
|
||||
|
49
browser/themes/shared/addons/addon-install-anchor.svg
Normal file
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="48"
|
||||
height="16"
|
||||
viewBox="0 0 16 16">
|
||||
<style>
|
||||
g:not(:target) {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
|
||||
.style-icon-notification {
|
||||
fill: #666666;
|
||||
}
|
||||
|
||||
.style-icon-notification.hover {
|
||||
fill: #808080;
|
||||
}
|
||||
|
||||
.style-icon-notification.active {
|
||||
fill: #4d4d4d;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<path id="shape-notifcations-addons" d="M10,15c0.5,0,1-0.4,1-1v-3c0,0,0-0.8,0.8-0.8c0.6,0,0.6,0.8,1.8,0.8c0.6,0,1.5-0.2,1.5-2c0-1.8-0.9-2-1.5-2 c-1.1,0-1.1,0.7-1.8,0.7C11,7.7,11,7,11,7V6c0-0.6-0.5-1-1-1H8c0,0-0.8,0-0.8-0.8C7.2,3.6,8,3.6,8,2.5C8,1.9,7.8,1,6,1 C4.2,1,4,1.9,4,2.5c0,1.1,0.8,1.1,0.8,1.8C4.8,5,4,5,4,5H2C1.5,5,1,5.4,1,6l0,1.5c0,0-0.1,1,1.1,1c0.8,0,0.9-1,1.9-1 C4.5,7.4,5,8,5,9c0,1-0.5,1.6-1,1.6c-1,0-1.1-1.1-1.9-1.1C0.9,9.5,1,10.8,1,10.8V14c0,0.6,0.5,1,1,1l2.6,0c0,0,1.1,0,1.1-1 c0-0.8-1-0.1-1-1.1c0-0.5,0.7-1.2,1.8-1.2s1.8,0.7,1.8,1.2c0,1-1.1,0.3-1.1,1.1c0,1,1.2,1,1.2,1H10z"/>
|
||||
|
||||
</defs>
|
||||
|
||||
<g id="default">
|
||||
<use xlink:href="#shape-notifcations-addons" class="style-icon-notification" />
|
||||
</g>
|
||||
<g id="hover">
|
||||
<use xlink:href="#shape-notifcations-addons" class="style-icon-notification hover" />
|
||||
</g>
|
||||
<g id="active">
|
||||
<use xlink:href="#shape-notifcations-addons" class="style-icon-notification active" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
54
browser/themes/shared/addons/addon-install-blocked.svg
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
}
|
||||
|
||||
.style-badge-shadow {
|
||||
fill: #0d131a;
|
||||
fill-opacity: .15;
|
||||
}
|
||||
|
||||
.style-badge-background {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.style-badge-inside {
|
||||
fill: #e62117;
|
||||
}
|
||||
|
||||
.style-badge-icon {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#999999" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#8c8c8c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
<svg id="badge-state" width="32" height="32" x="32" y="0">
|
||||
<ellipse class="style-badge-shadow" rx="14" ry="15" cx="16" cy="17" />
|
||||
<circle class="style-badge-background" r="15" cy="15" cx="16" />
|
||||
<circle class="style-badge-inside" r="12" cy="15" cx="16" />
|
||||
<rect class="style-badge-icon" x="9" y="13" width="14" height="4" rx="1" ry="1" />
|
||||
</svg>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
31
browser/themes/shared/addons/addon-install-confirm.svg
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
54
browser/themes/shared/addons/addon-install-downloading.svg
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
}
|
||||
|
||||
.style-badge-shadow {
|
||||
fill: #0d131a;
|
||||
fill-opacity: .15;
|
||||
}
|
||||
|
||||
.style-badge-background {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.style-badge-inside {
|
||||
fill: #55cc3d;
|
||||
}
|
||||
|
||||
.style-badge-icon {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
<svg id="badge-state" width="32" height="32" x="32" y="0">
|
||||
<ellipse class="style-badge-shadow" rx="14" ry="15" cx="16" cy="17" />
|
||||
<circle class="style-badge-background" r="15" cy="15" cx="16" />
|
||||
<circle class="style-badge-inside" r="12" cy="15" cx="16" />
|
||||
<path class="style-badge-icon" d="M22.7,16.1l-5.6,5.5C16.8,21.9,16.4,22,16,22c-0.4,0-0.7-0.1-1-0.4 l-5.6-5.5C8.8,15.5,8.9,15,9.8,15l3.2,0V9c0-0.6,0.5-1,1.1-1h4c0.6,0,1,0.4,1,1v6h3.2C23.1,15,23.3,15.5,22.7,16.1z"/>
|
||||
</svg>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
54
browser/themes/shared/addons/addon-install-error.svg
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
}
|
||||
|
||||
.style-badge-shadow {
|
||||
fill: #0d131a;
|
||||
fill-opacity: .15;
|
||||
}
|
||||
|
||||
.style-badge-background {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.style-badge-inside {
|
||||
fill: #e62117;
|
||||
}
|
||||
|
||||
.style-badge-icon {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#999999" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#8c8c8c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
<svg id="badge-state" width="32" height="32" x="32" y="0">
|
||||
<ellipse class="style-badge-shadow" rx="14" ry="15" cx="16" cy="17" />
|
||||
<circle class="style-badge-background" r="15" cy="15" cx="16" />
|
||||
<circle class="style-badge-inside" r="12" cy="15" cx="16" />
|
||||
<path class="style-badge-icon" d="M14.9,16.2c0,0,0.1,0.8,1.1,0.8c1,0,1.1-0.8,1.1-0.8 s0.7-3.5,0.8-5.2C18,9.3,18.4,7,16,7s-2,2.4-1.9,4C14.2,12.7,14.9,16.2,14.9,16.2z M16,19c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2 c1.1,0,2-0.9,2-2C18,19.9,17.1,19,16,19z" />
|
||||
</svg>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
54
browser/themes/shared/addons/addon-install-installed.svg
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
}
|
||||
|
||||
.style-badge-shadow {
|
||||
fill: #0d131a;
|
||||
fill-opacity: .15;
|
||||
}
|
||||
|
||||
.style-badge-background {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.style-badge-inside {
|
||||
fill: #55cc3d;
|
||||
}
|
||||
|
||||
.style-badge-icon {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
<svg id="badge-state" width="32" height="32" x="32" y="0">
|
||||
<ellipse class="style-badge-shadow" rx="14" ry="15" cx="16" cy="17" />
|
||||
<circle class="style-badge-background" r="15" cy="15" cx="16" />
|
||||
<circle class="style-badge-inside" r="12" cy="15" cx="16" />
|
||||
<path class="style-badge-icon" d="M22.8,12.3c0,0-6.7,8.1-6.9,8.3c-0.4,0.5-1.5,0.3-1.7,0 c-0.2-0.3-5-5.8-5-5.8c-0.3-0.3-0.3-0.7,0-1l1-1c0.4-0.4,0.9,0,1.2,0.3c0.3,0.4,3.4,3.8,3.4,3.8s5.2-6.1,5.4-6.4 c0.5-0.8,1.6-0.8,1.9-0.5l0.7,0.6C23.1,11.1,23.1,12,22.8,12.3z" />
|
||||
</svg>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
64
browser/themes/shared/addons/addon-install-restart.svg
Normal file
@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
fill-opacity: .25;
|
||||
}
|
||||
|
||||
.style-puzzle-piece-outline {
|
||||
fill: none;
|
||||
stroke-width: 2;
|
||||
stroke: #52b33e;
|
||||
stroke-dasharray: 4 2;
|
||||
}
|
||||
|
||||
.style-badge-shadow {
|
||||
fill: #0d131a;
|
||||
fill-opacity: .15;
|
||||
}
|
||||
|
||||
.style-badge-background {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.style-badge-inside {
|
||||
fill: #00a1e5;
|
||||
}
|
||||
|
||||
.style-badge-icon {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
<!-- <path id="puzzle-piece-outline" class="style-puzzle-piece-outline" d="M23.6,2.5c6.8,0,7.8,3.4,7.8,5.4c0,2.4-1.1,3.4-2.2,4.4c-0.8,0.7-1.6,1.5-1.6,2.7c0,2.8,3.7,3.5,3.9,3.5l0,0 h0H42c1.9,0,3.5,1.6,3.5,3.5l0,5.9c0,0.2,0.4,4.2,3.3,4.2c1.3,0,1.9-0.8,2.6-1.6c0.9-1,1.7-2.1,4.1-2.1c3.8,0,5.7,2.5,5.7,7.4 c0,2.3-0.6,7.7-5.7,7.7c-2.4,0-3.3-1.1-4.1-2.2c-0.7-0.8-1.3-1.7-2.6-1.7c-2.9,0-3.3,3.9-3.3,4.2l0,14.2c0,1.9-1.5,3.5-3.5,3.5 l-5.3,0c0,0-0.1,0-0.3,0c-4.9,0-5.4-2.8-5.4-3.9c0-1.2,0.7-2,1.6-2.9c1.1-1.1,2.3-2.4,2.3-4.7c0-2.4-2.9-5-7.1-5 c-3.3,0-6.9,1.9-6.9,5c0,2.4,1.2,3.6,2.3,4.7c0.9,0.9,1.6,1.7,1.6,2.9c0,1.2-0.5,3.9-5.4,3.9c-0.2,0-0.3,0-0.4,0H6 c-1.9,0-3.5-1.6-3.5-3.5l0-12.3c0,0-0.2-2.7,1.2-4.2c0.6-0.7,1.6-1.1,2.7-1.1c1.2,0,1.9,0.7,2.7,1.7c1,1.1,2.2,2.4,4.6,2.4 c3,0,4.5-3.4,4.5-6.8c0-4.5-2.3-6.5-4.5-6.5c-2.4,0-3.5,1.3-4.6,2.4c-0.8,0.9-1.5,1.7-2.7,1.7c-1.1,0-2-0.3-2.6-1 c-1.5-1.6-1.3-4.4-1.3-4.5l0-7.8c0-1.9,1.5-3.5,3.5-3.5h9.7h0l0,0c0.2,0,3.9-0.7,3.9-3.5c0-1.2-0.7-2-1.5-2.7c-0.9-0.9-2-2-2-4.4 C16.1,4.3,18.6,2.5,23.6,2.5"/> -->
|
||||
<path id="puzzle-piece-outline" class="style-puzzle-piece-outline" d="M23.6,3c6.3,0,7.3,3,7.3,4.9c0,2.2-1,3.1-2,4c-0.8,0.8-1.8,1.6-1.8,3.1c0,2.6,2.7,3.7,4.3,4l0.1,0h0.1H42 c1.7,0,3,1.4,3,3v5.8v0l0,0c0.2,1.7,1.2,4.7,3.8,4.7c1.5,0,2.3-0.9,3-1.8c0.8-1,1.6-1.9,3.7-1.9c3.5,0,5.2,2.2,5.2,6.9 c0,6.2-3.2,7.2-5.2,7.2c-2.1,0-2.9-1-3.7-2c-0.7-0.9-1.5-1.9-3-1.9c-2.6,0-3.6,2.9-3.8,4.6l0,0l0,0L45,58c0,1.6-1.3,3-3,3h-5.2l0,0 l0,0c0,0-0.1,0-0.3,0c-4.5,0-4.9-2.4-4.9-3.4c0-1,0.5-1.6,1.5-2.6c1.1-1.1,2.4-2.5,2.4-5.1c0-3.3-3.9-5.5-7.6-5.5 c-4.6,0-7.4,2.8-7.4,5.5c0,2.6,1.4,4,2.5,5.1c1,1,1.5,1.6,1.5,2.6c0,3.1-3.4,3.4-4.9,3.4c-0.2,0-0.3,0-0.3,0l0,0h0H6 c-1.6,0-3-1.3-3-3l0-12.2l0,0l0,0c0,0-0.1-2.5,1.1-3.9c0.6-0.6,1.3-0.9,2.3-0.9c0.9,0,1.5,0.5,2.3,1.5c1,1.2,2.3,2.6,4.9,2.6 c3.3,0,5-3.6,5-7.3c0-3.4-1.6-7-5-7c-2.6,0-3.9,1.4-4.9,2.6c-0.9,1-1.4,1.5-2.3,1.5c-1,0-1.7-0.3-2.3-0.9C2.8,32.6,3,29.9,3,29.9 l0,0l0,0L3,22c0-1.7,1.3-3,3-3h9.7h0.1l0.1,0c1.6-0.3,4.3-1.4,4.3-4c0-1.4-0.9-2.3-1.6-3.1c-0.9-1-1.8-1.9-1.8-4.1 C16.6,4.6,18.9,3,23.6,3"/>
|
||||
<svg id="badge-state" width="32" height="32" x="32" y="0">
|
||||
<ellipse class="style-badge-shadow" rx="14" ry="15" cx="16" cy="17" />
|
||||
<circle class="style-badge-background" r="15" cy="15" cx="16" />
|
||||
<circle class="style-badge-inside" r="12" cy="15" cx="16" />
|
||||
<path class="style-badge-icon" d="M21,15h-6l2.4-2.4c-0.6-0.4-1.2-0.6-1.9-0.6c-2,0-3.5,1.6-3.5,3.5 c0,2,1.6,3.5,3.5,3.5c1,0,2-0.5,2.6-1.2l1.7,1c-1,1.3-2.6,2.1-4.3,2.1c-3,0-5.5-2.5-5.5-5.5c0-3,2.5-5.5,5.5-5.5 c1.3,0,2.4,0.4,3.3,1.2L21,9V15z"/>
|
||||
</svg>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 4.4 KiB |
54
browser/themes/shared/addons/addon-install-warning.svg
Normal file
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64">
|
||||
|
||||
<defs>
|
||||
|
||||
<style type="text/css">
|
||||
<![CDATA[
|
||||
.style-puzzle-piece {
|
||||
fill: url('#gradient-linear-puzzle-piece');
|
||||
}
|
||||
|
||||
.style-badge-shadow {
|
||||
fill: #0d131a;
|
||||
fill-opacity: .15;
|
||||
}
|
||||
|
||||
.style-badge-background {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.style-badge-inside {
|
||||
fill: #ffcd02;
|
||||
}
|
||||
|
||||
.style-badge-icon {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
]]>
|
||||
</style>
|
||||
|
||||
<linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
|
||||
<stop offset="0%" stop-color="#999999" stop-opacity="1"/>
|
||||
<stop offset="100%" stop-color="#8c8c8c" stop-opacity="1"/>
|
||||
</linearGradient>
|
||||
|
||||
</defs>
|
||||
|
||||
<path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
|
||||
<svg id="badge-state" width="32" height="32" x="32" y="0">
|
||||
<path class="style-badge-shadow" d="M29.5,25.8L18.7,4c-0.6-1.2-1.6-2-2.7-2c-1.1,0-2.1,0.7-2.7,2L2.5,25.8 c-0.6,1.2-0.6,2.5-0.1,3.6C2.9,30.4,4,31,5.2,31h21.6c1.2,0,2.3-0.6,2.8-1.6C30.2,28.4,30.1,27.1,29.5,25.8z" />
|
||||
<path class="style-badge-background" d="M16,0c-1.7,0-3.2,1-4.1,2.7L1.7,21.9c-0.9,1.7-0.9,3.4,0,4.8C2.5,28.2,4.1,29,5.9,29H26 c1.9,0,3.4-0.8,4.3-2.2c0.9-1.4,0.8-3.2,0-4.8L20.1,2.7C19.2,1,17.7,0,16,0L16,0z" />
|
||||
<path class="style-badge-inside" d="M5.9,26c-1.7,0-2.4-1.2-1.6-2.7L14.6,4.1c0.8-1.5,2.1-1.5,2.8,0l10.3,19.3 c0.8,1.5,0.1,2.7-1.6,2.7H5.9z" />
|
||||
<path class="style-badge-icon" d="M14.9,17.6c0,0,0.1,0.7,1.1,0.7c1,0,1.1-0.7,1.1-0.7 s0.7-2.9,0.8-4.2c0.1-1.3,0.5-3.2-1.9-3.2c-2.4,0-2,1.9-1.9,3.2C14.2,14.8,14.9,17.6,14.9,17.6z M16,20c-1.1,0-2,0.9-2,2 c0,1.1,0.9,2,2,2c1.1,0,2-0.9,2-2C18,20.9,17.1,20,16,20z" />
|
||||
</svg>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
@ -1,246 +0,0 @@
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* 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/. */
|
||||
|
||||
#record-button {
|
||||
list-style-image: url(profiler-stopwatch.svg);
|
||||
min-width: 24px;
|
||||
}
|
||||
|
||||
#record-button[checked] {
|
||||
list-style-image: url(profiler-stopwatch-checked.svg);
|
||||
}
|
||||
|
||||
#record-button:not([checked]) ~ #record-label {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#memory-checkbox .checkbox-label {
|
||||
line-height: 100%;
|
||||
}
|
||||
|
||||
#filter-button {
|
||||
list-style-image: url(timeline-filter.svg#filter);
|
||||
min-width: 24px;
|
||||
}
|
||||
|
||||
#filter-button[disabled] {
|
||||
list-style-image: url(timeline-filter.svg#filter-disabled);
|
||||
}
|
||||
|
||||
#filter-button[open] {
|
||||
list-style-image: url(timeline-filter.svg#filter-open);
|
||||
}
|
||||
|
||||
#timelineFilterPopup > menuitem:before {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
margin: 0 8px;
|
||||
border: 1px solid;
|
||||
border-radius: 1px;
|
||||
background-color: var(--bullet-bg);
|
||||
border-color: var(--bullet-border);
|
||||
}
|
||||
|
||||
.notice-container {
|
||||
font-size: 120%;
|
||||
padding-bottom: 35vh;
|
||||
}
|
||||
|
||||
.theme-dark .notice-container {
|
||||
background: #343c45; /* Toolbars */
|
||||
color: #f5f7fa; /* Light foreground text */
|
||||
}
|
||||
|
||||
.theme-light .notice-container {
|
||||
background: #f0f1f2; /* Toolbars */
|
||||
color: #585959; /* Grey foreground text */
|
||||
}
|
||||
|
||||
#empty-notice button,
|
||||
#recording-notice button {
|
||||
min-width: 30px;
|
||||
min-height: 28px;
|
||||
margin: 0;
|
||||
list-style-image: url(profiler-stopwatch.svg);
|
||||
}
|
||||
|
||||
#empty-notice button[checked],
|
||||
#recording-notice button[checked] {
|
||||
list-style-image: url(profiler-stopwatch-checked.svg);
|
||||
}
|
||||
|
||||
#empty-notice button .button-text,
|
||||
#recording-notice button .button-text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.theme-dark #timeline-pane {
|
||||
border-top: 1px solid #000;
|
||||
}
|
||||
|
||||
.theme-light #timeline-pane {
|
||||
border-top: 1px solid #aaa;
|
||||
}
|
||||
|
||||
.waterfall-list-contents {
|
||||
/* Hack: force hardware acceleration */
|
||||
transform: translateZ(1px);
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.waterfall-header-contents {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.waterfall-background-ticks {
|
||||
/* Background created on a <canvas> in js. */
|
||||
/* @see browser/devtools/timeline/widgets/waterfall.js */
|
||||
background-image: -moz-element(#waterfall-background);
|
||||
background-repeat: repeat-y;
|
||||
background-position: -1px center;
|
||||
}
|
||||
|
||||
.waterfall-marker-container[is-spacer] {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.theme-dark .waterfall-marker-container:not([is-spacer]):nth-child(2n) {
|
||||
background-color: rgba(255,255,255,0.03);
|
||||
}
|
||||
|
||||
.theme-light .waterfall-marker-container:not([is-spacer]):nth-child(2n) {
|
||||
background-color: rgba(128,128,128,0.03);
|
||||
}
|
||||
|
||||
.theme-dark .waterfall-marker-container:hover {
|
||||
background-color: rgba(255,255,255,0.1) !important;
|
||||
}
|
||||
|
||||
.theme-light .waterfall-marker-container:hover {
|
||||
background-color: rgba(128,128,128,0.1) !important;
|
||||
}
|
||||
|
||||
.waterfall-marker-item {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.waterfall-sidebar {
|
||||
-moz-border-end: 1px solid;
|
||||
}
|
||||
|
||||
.theme-dark .waterfall-sidebar {
|
||||
-moz-border-end-color: #000;
|
||||
}
|
||||
|
||||
.theme-light .waterfall-sidebar {
|
||||
-moz-border-end-color: #aaa;
|
||||
}
|
||||
|
||||
.waterfall-marker-container:hover > .waterfall-sidebar {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.waterfall-header-name {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.waterfall-header-tick {
|
||||
width: 100px;
|
||||
font-size: 9px;
|
||||
transform-origin: left center;
|
||||
}
|
||||
|
||||
.theme-dark .waterfall-header-tick {
|
||||
color: #a9bacb;
|
||||
}
|
||||
|
||||
.theme-light .waterfall-header-tick {
|
||||
color: #292e33;
|
||||
}
|
||||
|
||||
.waterfall-header-tick:not(:first-child) {
|
||||
-moz-margin-start: -100px !important; /* Don't affect layout. */
|
||||
}
|
||||
|
||||
.waterfall-marker-bullet {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
-moz-margin-start: 8px;
|
||||
-moz-margin-end: 6px;
|
||||
border: 1px solid;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
.waterfall-marker-name {
|
||||
font-size: 95%;
|
||||
padding-bottom: 1px !important;
|
||||
}
|
||||
|
||||
.waterfall-marker-bar {
|
||||
height: 9px;
|
||||
border: 1px solid;
|
||||
border-radius: 1px;
|
||||
transform-origin: left center;
|
||||
}
|
||||
|
||||
.theme-light .waterfall-marker-container.selected > .waterfall-sidebar,
|
||||
.theme-light .waterfall-marker-container.selected > .waterfall-marker-item {
|
||||
background-color: #4c9ed9; /* Select Highlight Blue */
|
||||
color: #f5f7fa; /* Light foreground text */
|
||||
}
|
||||
|
||||
.theme-dark .waterfall-marker-container.selected > .waterfall-sidebar,
|
||||
.theme-dark .waterfall-marker-container.selected > .waterfall-marker-item {
|
||||
background-color: #1d4f73; /* Select Highlight Blue */
|
||||
color: #f5f7fa; /* Light foreground text */
|
||||
}
|
||||
|
||||
.waterfall-marker-container.selected .waterfall-marker-bullet,
|
||||
.waterfall-marker-container.selected .waterfall-marker-bar {
|
||||
border-color: initial!important;
|
||||
}
|
||||
|
||||
.waterfall-marker-location {
|
||||
color: -moz-nativehyperlinktext;
|
||||
}
|
||||
|
||||
.waterfall-marker-location:hover,
|
||||
.waterfall-marker-location:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#timeline-waterfall-details {
|
||||
-moz-padding-start: 8px;
|
||||
-moz-padding-end: 8px;
|
||||
padding-top: 2vh;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.marker-details-bullet {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border: 1px solid;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
#timeline-waterfall-details > * {
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
.marker-details-labelname {
|
||||
-moz-padding-end: 4px;
|
||||
}
|
||||
|
||||
.marker-details-type {
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.marker-details-duration {
|
||||
font-weight: bold;
|
||||
}
|
@ -19,14 +19,32 @@
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="xpinstall-disabled"],
|
||||
.popup-notification-icon[popupid="addon-progress"],
|
||||
.popup-notification-icon[popupid="addon-install-blocked"],
|
||||
.popup-notification-icon[popupid="addon-install-failed"],
|
||||
.popup-notification-icon[popupid="addon-install-confirmation"],
|
||||
.popup-notification-icon[popupid="addon-install-blocked"] {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-blocked.svg);
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="addon-progress"] {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-downloading.svg);
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="addon-install-failed"] {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-error.svg);
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="addon-install-confirmation"] {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-confirm.svg);
|
||||
}
|
||||
|
||||
#addon-install-confirmation-notification[warning] .popup-notification-icon[popupid="addon-install-confirmation"] {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-warning.svg);
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="addon-install-complete"] {
|
||||
list-style-image: url(chrome://mozapps/skin/extensions/extensionGeneric.png);
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-installed.svg);
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="addon-install-restart"] {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-restart.svg);
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="click-to-play-plugins"] {
|
||||
@ -128,7 +146,15 @@
|
||||
}
|
||||
|
||||
#addons-notification-icon {
|
||||
list-style-image: url(chrome://mozapps/skin/extensions/extensionGeneric-16.png);
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#default);
|
||||
}
|
||||
|
||||
#addons-notification-icon:hover {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#hover);
|
||||
}
|
||||
|
||||
#addons-notification-icon:hover:active {
|
||||
list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#active);
|
||||
}
|
||||
|
||||
.indexedDB-notification-icon,
|
||||
|
@ -10,6 +10,27 @@
|
||||
--chrome-nav-bar-separator-color: rgba(10, 31, 51, 0.35);
|
||||
}
|
||||
|
||||
/* The window background is white due to no accentcolor in the lightweight
|
||||
theme. It can't be changed to transparent when there is no compositor
|
||||
(Win XP or 7 in classic / basic theme), or else dragging and focus become
|
||||
broken. So instead just show the normal titlebar in that case, and override
|
||||
the window color as transparent when the compositor is available. */
|
||||
@media not all and (-moz-windows-compositor) {
|
||||
#main-window[tabsintitlebar] #titlebar:-moz-lwtheme {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
#main-window {
|
||||
background: var(--chrome-background-color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (-moz-windows-compositor) {
|
||||
#main-window {
|
||||
background: transparent !important;
|
||||
}
|
||||
}
|
||||
|
||||
#TabsToolbar::after {
|
||||
display: none;
|
||||
}
|
||||
@ -26,6 +47,20 @@
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
|
||||
/* Force 1x image for back/forward button for now, otherwise it breaks the
|
||||
layout - Bug 1165360. */
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
#back-button,
|
||||
#forward-button {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar.png");
|
||||
}
|
||||
/* The back button region is already set in devedition.inc.css */
|
||||
#forward-button {
|
||||
-moz-image-region: rect(0px, 72px, 18px, 54px);
|
||||
}
|
||||
}
|
||||
|
||||
#forward-button > .toolbarbutton-icon {
|
||||
-moz-border-start: none !important;
|
||||
}
|
||||
|
@ -1,5 +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/. */
|
||||
|
||||
%include ../../shared/devtools/timeline.inc.css
|
@ -22,6 +22,14 @@ browser.jar:
|
||||
#endif
|
||||
skin/classic/browser/aboutTabCrashed.css (../shared/aboutTabCrashed.css)
|
||||
skin/classic/browser/actionicon-tab.png
|
||||
skin/classic/browser/addons/addon-install-blocked.svg (../shared/addons/addon-install-blocked.svg)
|
||||
skin/classic/browser/addons/addon-install-confirm.svg (../shared/addons/addon-install-confirm.svg)
|
||||
skin/classic/browser/addons/addon-install-downloading.svg (../shared/addons/addon-install-downloading.svg)
|
||||
skin/classic/browser/addons/addon-install-error.svg (../shared/addons/addon-install-error.svg)
|
||||
skin/classic/browser/addons/addon-install-installed.svg (../shared/addons/addon-install-installed.svg)
|
||||
skin/classic/browser/addons/addon-install-restart.svg (../shared/addons/addon-install-restart.svg)
|
||||
skin/classic/browser/addons/addon-install-warning.svg (../shared/addons/addon-install-warning.svg)
|
||||
skin/classic/browser/addons/addon-install-anchor.svg (../shared/addons/addon-install-anchor.svg)
|
||||
* skin/classic/browser/browser.css
|
||||
* skin/classic/browser/devedition.css
|
||||
* skin/classic/browser/browser-lightweightTheme.css
|
||||
@ -368,7 +376,6 @@ browser.jar:
|
||||
* skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css)
|
||||
* skin/classic/browser/devtools/profiler.css (devtools/profiler.css)
|
||||
* skin/classic/browser/devtools/performance.css (devtools/performance.css)
|
||||
* skin/classic/browser/devtools/timeline.css (devtools/timeline.css)
|
||||
skin/classic/browser/devtools/timeline-filter.svg (../shared/devtools/images/timeline-filter.svg)
|
||||
* skin/classic/browser/devtools/scratchpad.css (devtools/scratchpad.css)
|
||||
* skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css)
|
||||
|
@ -427,13 +427,16 @@ let Activities = {
|
||||
break;
|
||||
|
||||
case "Activities:Register":
|
||||
let self = this;
|
||||
this.db.add(msg,
|
||||
function onSuccess(aEvent) {
|
||||
debug("Activities:Register:OK");
|
||||
Services.obs.notifyObservers(null, "new-activity-registered-success", null);
|
||||
mm.sendAsyncMessage("Activities:Register:OK", null);
|
||||
},
|
||||
function onError(aEvent) {
|
||||
msg.error = "REGISTER_ERROR";
|
||||
debug("Activities:Register:KO");
|
||||
Services.obs.notifyObservers(null, "new-activity-registered-failure", null);
|
||||
mm.sendAsyncMessage("Activities:Register:KO", msg);
|
||||
});
|
||||
break;
|
||||
|
@ -184,8 +184,14 @@ function continueTest() {
|
||||
}
|
||||
}
|
||||
|
||||
var obsService = Cc["@mozilla.org/observer-service;1"]
|
||||
.getService(Ci.nsIObserverService);
|
||||
|
||||
obsService.addObserver(continueTest, "new-activity-registered-success", false);
|
||||
obsService.addObserver(continueTest, "new-activity-registered-failure", false);
|
||||
|
||||
/**
|
||||
* Test exporting and importing hosted and packaged apps.
|
||||
* Test dev mode activity.
|
||||
*/
|
||||
function runTest() {
|
||||
SpecialPowers.setAllAppsLaunchable(true);
|
||||
@ -227,6 +233,9 @@ function runTest() {
|
||||
var systemApp = request.result;
|
||||
ok(systemApp, "systemApp is non-null");
|
||||
|
||||
// yielding for the activity install observer.
|
||||
yield undefined;
|
||||
|
||||
activity = new MozActivity({ name: "import-app" });
|
||||
activity.onerror = function() {
|
||||
ok(true, "2) No dev mode, system app installed");
|
||||
@ -241,6 +250,9 @@ function runTest() {
|
||||
var otherApp = request.result;
|
||||
ok(otherApp, "otherApp is non-null");
|
||||
|
||||
// yielding for the activity install observer.
|
||||
yield undefined;
|
||||
|
||||
activity = new MozActivity({ name: "import-app" });
|
||||
activity.onerror = function() {
|
||||
ok(true, "3) No dev mode, system app and other app installed");
|
||||
@ -249,7 +261,7 @@ function runTest() {
|
||||
activity.onsuccess = unexpectedSuccess("3) No dev mode, system app and other app installed");
|
||||
yield undefined;
|
||||
|
||||
// 4) Dev mode, no system app installed.
|
||||
// 4) Dev mode, system app and other app installed.
|
||||
SpecialPowers.pushPrefEnv(
|
||||
{'set': [["dom.apps.developer_mode", true]]},
|
||||
continueTest);
|
||||
@ -260,8 +272,8 @@ function runTest() {
|
||||
ok(true, "4) Dev mode, system app and other app installed");
|
||||
continueTest();
|
||||
}
|
||||
activity.onerror = function(aError) {
|
||||
ok(false, "Got error: " + aError.name);
|
||||
activity.onerror = function(aEvent) {
|
||||
ok(false, "4) Got error: " + aEvent.error.name);
|
||||
finish();
|
||||
}
|
||||
yield undefined;
|
||||
|
@ -1029,6 +1029,7 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
||||
{ "mbasic.facebook.com", true, false, false, -1, &kPinset_facebook },
|
||||
{ "mobile.twitter.com", true, false, false, -1, &kPinset_twitterCom },
|
||||
{ "mtouch.facebook.com", true, false, false, -1, &kPinset_facebook },
|
||||
{ "myaccount.google.com", true, false, false, -1, &kPinset_google_root_pems },
|
||||
{ "oauth.twitter.com", true, false, false, -1, &kPinset_twitterCom },
|
||||
{ "passwords.google.com", true, false, false, -1, &kPinset_google_root_pems },
|
||||
{ "pinningtest.appspot.com", true, false, false, -1, &kPinset_test },
|
||||
@ -1087,8 +1088,8 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
||||
{ "ytimg.com", true, false, false, -1, &kPinset_google_root_pems },
|
||||
};
|
||||
|
||||
// Pinning Preload List Length = 348;
|
||||
// Pinning Preload List Length = 349;
|
||||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1439634142984000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1440238853731000);
|
||||
|
@ -6,7 +6,6 @@ adsfund.org: could not connect to host
|
||||
afp548.tk: could not connect to host
|
||||
airbnb.com: did not receive HSTS header
|
||||
aiticon.de: did not receive HSTS header
|
||||
alpha.irccloud.com: could not connect to host
|
||||
alphabit-secure.com: did not receive HSTS header
|
||||
altmv.com: max-age too low: 7776000
|
||||
amigogeek.net: could not connect to host
|
||||
@ -18,12 +17,13 @@ apn-einstellungen.de: could not connect to host
|
||||
app.manilla.com: could not connect to host
|
||||
appengine.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
appseccalifornia.org: could not connect to host
|
||||
astaxi.net: did not receive HSTS header
|
||||
astaxi.net: could not connect to host
|
||||
at.search.yahoo.com: did not receive HSTS header
|
||||
atavio.at: could not connect to host
|
||||
atavio.ch: could not connect to host
|
||||
atavio.de: did not receive HSTS header
|
||||
au.search.yahoo.com: did not receive HSTS header
|
||||
aurainfosec.com.au: could not connect to host
|
||||
auth.mail.ru: did not receive HSTS header
|
||||
auto4trade.nl: did not receive HSTS header
|
||||
az.search.yahoo.com: did not receive HSTS header
|
||||
@ -45,13 +45,14 @@ bitgo.com: max-age too low: 0
|
||||
bizon.sk: did not receive HSTS header
|
||||
blacklane.com: did not receive HSTS header
|
||||
blog.lookout.com: did not receive HSTS header
|
||||
bonigo.de: did not receive HSTS header
|
||||
br.search.yahoo.com: did not receive HSTS header
|
||||
brainfork.ml: did not receive HSTS header
|
||||
braintreepayments.com: did not receive HSTS header
|
||||
brainvation.de: did not receive HSTS header
|
||||
bran.cc: could not connect to host
|
||||
browserid.org: did not receive HSTS header
|
||||
business.medbank.com.mt: could not connect to host
|
||||
business.medbank.com.mt: did not receive HSTS header
|
||||
buttercoin.com: did not receive HSTS header
|
||||
ca.search.yahoo.com: did not receive HSTS header
|
||||
cake.care: could not connect to host
|
||||
@ -77,6 +78,7 @@ chrome.google.com: did not receive HSTS header (error ignored - included regardl
|
||||
cimballa.com: did not receive HSTS header
|
||||
cl.search.yahoo.com: did not receive HSTS header
|
||||
climaprecio.es: did not receive HSTS header
|
||||
cloudns.com.au: could not connect to host
|
||||
cn.search.yahoo.com: did not receive HSTS header
|
||||
co.search.yahoo.com: did not receive HSTS header
|
||||
code.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
@ -159,10 +161,10 @@ grandmascookieblog.com: did not receive HSTS header
|
||||
greplin.com: could not connect to host
|
||||
groups.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
guidetoiceland.is: did not receive HSTS header
|
||||
gwijaya.com: did not receive HSTS header
|
||||
hackerone-user-content.com: could not connect to host
|
||||
hangouts.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
hatoko.net: could not connect to host
|
||||
hexony.com: could not connect to host
|
||||
history.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
hk.search.yahoo.com: did not receive HSTS header
|
||||
hn.search.yahoo.com: did not receive HSTS header
|
||||
@ -185,7 +187,6 @@ in.search.yahoo.com: did not receive HSTS header
|
||||
inertianetworks.com: did not receive HSTS header
|
||||
iniiter.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
|
||||
intercom.io: did not receive HSTS header
|
||||
interserved.com: did not receive HSTS header
|
||||
ionas-law.ro: did not receive HSTS header
|
||||
iop.intuit.com: max-age too low: 86400
|
||||
irccloud.com: did not receive HSTS header
|
||||
@ -218,11 +219,11 @@ kryptera.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERRO
|
||||
kz.search.yahoo.com: did not receive HSTS header
|
||||
labina.com.tr: did not receive HSTS header
|
||||
landscape.canonical.com: max-age too low: 2592000
|
||||
ledgerscope.net: max-age too low: 86400
|
||||
li.search.yahoo.com: did not receive HSTS header
|
||||
library.linode.com: did not receive HSTS header
|
||||
libraryfreedomproject.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
|
||||
lifeguard.aecom.com: max-age too low: 86400
|
||||
linorman1997.me: could not connect to host
|
||||
lists.fedoraproject.org: did not receive HSTS header
|
||||
lockify.com: could not connect to host
|
||||
login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless)
|
||||
@ -252,6 +253,7 @@ meinebo.it: could not connect to host
|
||||
micropple.net: could not connect to host
|
||||
minikneet.nl: could not connect to host
|
||||
mirindadomo.ru: did not receive HSTS header
|
||||
mirrorx.com: did not receive HSTS header
|
||||
mnemotiv.com: could not connect to host
|
||||
mobilethreat.net: could not connect to host
|
||||
mobilethreatnetwork.net: could not connect to host
|
||||
@ -326,7 +328,6 @@ rme.li: did not receive HSTS header
|
||||
ro.search.yahoo.com: did not receive HSTS header
|
||||
roddis.net: did not receive HSTS header
|
||||
ru.search.yahoo.com: did not receive HSTS header
|
||||
rubyshop.nl: did not receive HSTS header
|
||||
rw.search.yahoo.com: did not receive HSTS header
|
||||
sah3.net: could not connect to host
|
||||
saturngames.co.uk: could not connect to host
|
||||
@ -349,6 +350,7 @@ simplyfixit.co.uk: [Exception... "Component returned failure code: 0x80004005 (N
|
||||
sistemy48.ru: did not receive HSTS header
|
||||
sites.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
smartlend.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
|
||||
snowflake.ch: max-age too low: 0
|
||||
sol.io: could not connect to host
|
||||
souyar.de: could not connect to host
|
||||
souyar.net: could not connect to host
|
||||
@ -358,6 +360,7 @@ spreadsheets.google.com: did not receive HSTS header (error ignored - included r
|
||||
square.com: did not receive HSTS header
|
||||
ssl.google-analytics.com: did not receive HSTS header (error ignored - included regardless)
|
||||
ssl.panoramio.com: did not receive HSTS header
|
||||
stillyarts.com: did not receive HSTS header
|
||||
stocktrade.de: could not connect to host
|
||||
suite73.org: could not connect to host
|
||||
sunshinepress.org: could not connect to host
|
||||
@ -375,6 +378,7 @@ tapka.cz: did not receive HSTS header
|
||||
taxsquirrel.com: did not receive HSTS header
|
||||
tc-bonito.de: did not receive HSTS header
|
||||
techllage.com: could not connect to host
|
||||
techloaner.com: could not connect to host
|
||||
tektoria.de: did not receive HSTS header
|
||||
temehu.com: did not receive HSTS header
|
||||
terrax.berlin: could not connect to host
|
||||
@ -382,6 +386,7 @@ th.search.yahoo.com: did not receive HSTS header
|
||||
the-sky-of-valkyries.com: could not connect to host
|
||||
thomasgriffin.io: did not receive HSTS header
|
||||
thorncreek.net: did not receive HSTS header
|
||||
tipsyk.ru: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
|
||||
tomfisher.eu: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
|
||||
tr.search.yahoo.com: did not receive HSTS header
|
||||
tradingcentre.com.au: did not receive HSTS header
|
||||
@ -392,6 +397,7 @@ tv.search.yahoo.com: could not connect to host
|
||||
tw.search.yahoo.com: did not receive HSTS header
|
||||
ua.search.yahoo.com: did not receive HSTS header
|
||||
uk.search.yahoo.com: did not receive HSTS header
|
||||
unbanthe.net: did not receive HSTS header
|
||||
uonstaffhub.com: could not connect to host
|
||||
uprotect.it: could not connect to host
|
||||
ustr.gov: max-age too low: 86400
|
||||
@ -402,10 +408,11 @@ vhost.co.id: could not connect to host
|
||||
viennan.net: did not receive HSTS header
|
||||
vn.search.yahoo.com: did not receive HSTS header
|
||||
vyncke.org: did not receive HSTS header
|
||||
wallet.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
webmail.mayfirst.org: did not receive HSTS header
|
||||
wf-training-master.appspot.com: could not connect to host
|
||||
wf-training-master.appspot.com: could not connect to host (error ignored - included regardless)
|
||||
wideup.net: did not receive HSTS header
|
||||
wikidsystems.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
|
||||
wikidsystems.com: did not receive HSTS header
|
||||
withustrading.com: did not receive HSTS header
|
||||
wiz.biz: could not connect to host
|
||||
wohnungsbau-ludwigsburg.de: did not receive HSTS header
|
||||
@ -418,6 +425,7 @@ www.gmail.com: did not receive HSTS header (error ignored - included regardless)
|
||||
www.googlemail.com: did not receive HSTS header (error ignored - included regardless)
|
||||
www.greplin.com: could not connect to host
|
||||
www.jitsi.org: did not receive HSTS header
|
||||
www.ledgerscope.net: max-age too low: 86400
|
||||
www.logentries.com: did not receive HSTS header
|
||||
www.moneybookers.com: did not receive HSTS header
|
||||
www.neonisi.com: could not connect to host
|
||||
@ -431,6 +439,7 @@ xtream-hosting.com: could not connect to host
|
||||
xtream-hosting.de: could not connect to host
|
||||
xtream-hosting.eu: could not connect to host
|
||||
xtreamhosting.eu: could not connect to host
|
||||
yetii.net: did not receive HSTS header
|
||||
za.search.yahoo.com: did not receive HSTS header
|
||||
zarooba.com: did not receive HSTS header
|
||||
zh.search.yahoo.com: did not receive HSTS header
|
||||
|
@ -8,7 +8,7 @@
|
||||
/*****************************************************************************/
|
||||
|
||||
#include <stdint.h>
|
||||
const PRTime gPreloadListExpirationTime = INT64_C(1442053337830000);
|
||||
const PRTime gPreloadListExpirationTime = INT64_C(1442658048132000);
|
||||
|
||||
class nsSTSPreload
|
||||
{
|
||||
@ -237,7 +237,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "bodo-wolff.de", true },
|
||||
{ "bohramt.de", true },
|
||||
{ "boiseonlinemall.com", true },
|
||||
{ "bonigo.de", true },
|
||||
{ "bonitabrazilian.co.nz", true },
|
||||
{ "bookingapp.nl", true },
|
||||
{ "boxcryptor.com", true },
|
||||
@ -663,6 +662,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "gurusupe.com", true },
|
||||
{ "guthabenkarten-billiger.de", true },
|
||||
{ "gw2treasures.com", true },
|
||||
{ "gwijaya.com", true },
|
||||
{ "haber1903.com", true },
|
||||
{ "hachre.de", false },
|
||||
{ "hack.li", true },
|
||||
@ -759,6 +759,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "instasex.ch", true },
|
||||
{ "integromat.com", true },
|
||||
{ "interasistmen.se", true },
|
||||
{ "interserved.com", true },
|
||||
{ "iostips.ru", true },
|
||||
{ "ipmimagazine.com", true },
|
||||
{ "ipomue.com", false },
|
||||
@ -791,7 +792,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "jetaprices.com", true },
|
||||
{ "jettshome.org", true },
|
||||
{ "jfreitag.de", true },
|
||||
{ "jh-media.eu", true },
|
||||
{ "jh-media.eu", false },
|
||||
{ "jimshaver.net", true },
|
||||
{ "jira.com", true },
|
||||
{ "jitsi.org", false },
|
||||
@ -894,7 +895,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "leadbook.ru", true },
|
||||
{ "leakedminecraft.net", true },
|
||||
{ "leanclub.org", true },
|
||||
{ "ledgerscope.net", false },
|
||||
{ "ledhouse.sk", true },
|
||||
{ "leibniz-remscheid.de", true },
|
||||
{ "leifdreizler.com", true },
|
||||
@ -1033,7 +1033,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "minnesotadata.com", true },
|
||||
{ "minora.io", true },
|
||||
{ "mironet.cz", true },
|
||||
{ "mirrorx.com", true },
|
||||
{ "miskatonic.org", true },
|
||||
{ "miss-inventory.co.uk", true },
|
||||
{ "mister.hosting", true },
|
||||
@ -1079,6 +1078,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "mwe.st", true },
|
||||
{ "my.onlime.ch", false },
|
||||
{ "my.xero.com", false },
|
||||
{ "myaccount.google.com", true },
|
||||
{ "mygadgetguardian.lookout.com", false },
|
||||
{ "mykontool.de", true },
|
||||
{ "mylookout.com", false },
|
||||
@ -1346,6 +1346,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "ru-sprachstudio.ch", true },
|
||||
{ "rubecodeberg.com", true },
|
||||
{ "rubendv.be", true },
|
||||
{ "rubyshop.nl", true },
|
||||
{ "rudloff.pro", true },
|
||||
{ "rusadmin.biz", true },
|
||||
{ "ruudkoot.nl", true },
|
||||
@ -1360,7 +1361,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "sale4ru.ru", true },
|
||||
{ "salserocafe.com", true },
|
||||
{ "samba.org", true },
|
||||
{ "samfunnet.no", true },
|
||||
{ "samfunnet.no", false },
|
||||
{ "samizdat.cz", true },
|
||||
{ "samuelkeeley.com", true },
|
||||
{ "sanatfilan.com", false },
|
||||
@ -1448,7 +1449,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "smith.is", true },
|
||||
{ "snakehosting.dk", true },
|
||||
{ "sneezry.com", true },
|
||||
{ "snowflake.ch", false },
|
||||
{ "sockeye.cc", true },
|
||||
{ "soia.ca", true },
|
||||
{ "sorz.org", true },
|
||||
@ -1486,7 +1486,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "stevegrav.es", true },
|
||||
{ "steventress.com", true },
|
||||
{ "sticklerjs.org", true },
|
||||
{ "stillyarts.com", true },
|
||||
{ "stirling.co", true },
|
||||
{ "stocktrade.de", false },
|
||||
{ "storedsafe.com", true },
|
||||
@ -1662,7 +1661,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "ukdefencejournal.org.uk", true },
|
||||
{ "ukhas.net", true },
|
||||
{ "ukrainians.ch", true },
|
||||
{ "unbanthe.net", true },
|
||||
{ "unison.com", true },
|
||||
{ "unitedadmins.com", true },
|
||||
{ "unknownphenomena.net", true },
|
||||
@ -1794,7 +1792,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "www.intercom.io", false },
|
||||
{ "www.irccloud.com", false },
|
||||
{ "www.lastpass.com", false },
|
||||
{ "www.ledgerscope.net", false },
|
||||
{ "www.linode.com", false },
|
||||
{ "www.lookout.com", false },
|
||||
{ "www.makeyourlaws.org", true },
|
||||
@ -1838,7 +1835,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
|
||||
{ "yenniferallulli.es", true },
|
||||
{ "yenniferallulli.moda", true },
|
||||
{ "yenniferallulli.nl", true },
|
||||
{ "yetii.net", true },
|
||||
{ "yksityisyydensuoja.fi", true },
|
||||
{ "yokeepo.com", true },
|
||||
{ "yorcom.nl", true },
|
||||
|
@ -8,6 +8,8 @@ RUN yum install -y epel-release && \
|
||||
yum makecache && \
|
||||
yum install -y \
|
||||
# From Building B2G docs
|
||||
# cmake \
|
||||
# cmake: is disabled intentionally to work around: bug 1141417
|
||||
GConf2-devel \
|
||||
alsa-lib-devel \
|
||||
autoconf213 \
|
||||
@ -15,22 +17,21 @@ RUN yum install -y epel-release && \
|
||||
bison \
|
||||
bzip2 \
|
||||
ccache \
|
||||
# cmake: is disabled intentionally to work around: bug 1141417
|
||||
# cmake \
|
||||
curl \
|
||||
curl-devel \
|
||||
dbus-devel \
|
||||
dbus-glib-devel \
|
||||
dbus-glib-devel \
|
||||
dbus-python \
|
||||
expat-devel \
|
||||
file \
|
||||
flex \
|
||||
gawk \
|
||||
gcc473_0moz1 \
|
||||
gettext-devel \
|
||||
glibc-devel \
|
||||
glibc-devel.i686 \
|
||||
glibc-static \
|
||||
glibc-static \
|
||||
gstreamer-devel \
|
||||
gstreamer-plugins-base-devel \
|
||||
gtk2-devel \
|
||||
@ -48,7 +49,6 @@ RUN yum install -y epel-release && \
|
||||
make \
|
||||
mesa-libGL-devel \
|
||||
mesa-libGL-devel.i686 \
|
||||
mozilla-git \
|
||||
mozilla-python27 \
|
||||
mozilla-python27-mercurial \
|
||||
mpfr-devel.x86_64 \
|
||||
@ -56,9 +56,11 @@ RUN yum install -y epel-release && \
|
||||
ncurses:-devel \
|
||||
openssh-clients \
|
||||
openssl-devel \
|
||||
openssl-devel \
|
||||
patch \
|
||||
perl-DBI \
|
||||
perl-Digest-SHA \
|
||||
perl-ExtUtils-MakeMaker \
|
||||
pulseaudio-libs-devel \
|
||||
readline-devel.i686 \
|
||||
rsync \
|
||||
@ -99,6 +101,14 @@ RUN useradd -d /home/worker -s /bin/bash -m worker
|
||||
# Terrible symlink hacks so cc points to the gcc version we intend to use...
|
||||
RUN ls -lah /tools/gcc-4.7.3-0moz1/bin && ln -s /tools/gcc-4.7.3-0moz1/bin/gcc /tools/gcc-4.7.3-0moz1/bin/cc
|
||||
|
||||
# Terrible Hack to correctly install git-2.4.1
|
||||
RUN mkdir -p /tmp/git && cd /tmp/git && \
|
||||
curl -L https://s3-us-west-2.amazonaws.com/test-caching/git-2.4.1.tar.gz | tar -xz && \
|
||||
cd git* && \
|
||||
make prefix=/usr/local/ all -j10 && \
|
||||
make prefix=/usr/local/ install && \
|
||||
rm -Rf /tmp/git
|
||||
|
||||
# Install node from node's own dist...
|
||||
ENV NODE_VERSION v0.10.36
|
||||
RUN cd /usr/local/ && \
|
||||
|
@ -1 +1 @@
|
||||
0.2.7
|
||||
0.2.8
|
||||
|
@ -1,4 +1,4 @@
|
||||
FROM quay.io/mozilla/b2g-build:0.2.7
|
||||
FROM quay.io/mozilla/b2g-build:0.2.8
|
||||
MAINTAINER Dustin J. Mitchell <dustin@mozilla.com>
|
||||
|
||||
ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH
|
||||
|
@ -1 +1 @@
|
||||
0.5.4
|
||||
0.5.5
|
||||
|