Merge m-c to m-i

This commit is contained in:
Phil Ringnalda 2015-05-16 09:49:14 -07:00
commit 456c3d502b
63 changed files with 913 additions and 1492 deletions

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"
}

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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);

View File

@ -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"),

View File

@ -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"

View File

@ -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();

View File

@ -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"))

View File

@ -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,

View File

@ -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,

View File

@ -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;
}

View File

@ -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;
}
/**

View File

@ -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;

View File

@ -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"),

View File

@ -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]

View File

@ -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();

View File

@ -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,

View File

@ -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.");

View File

@ -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" }
]
}]);

View File

@ -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();
}

View File

@ -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

View File

@ -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.

View File

@ -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);

View File

@ -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;
},
/**

View File

@ -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',
]

View File

@ -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;
})
};

View File

@ -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);
}

View File

@ -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>

View File

@ -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"

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@ -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;
}

View File

@ -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,

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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 },

View File

@ -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/ && \

View File

@ -1 +1 @@
0.2.7
0.2.8

View File

@ -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

View File

@ -1 +1 @@
0.5.4
0.5.5