Merge mozilla-central to mozilla-inbound

This commit is contained in:
Carsten "Tomcat" Book 2015-06-18 15:34:31 +02:00
commit c60dd2e473
118 changed files with 1467 additions and 506 deletions

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -146,7 +146,7 @@
<project name="platform/hardware/ril" path="hardware/ril" revision="12b1977cc704b35f2e9db2bb423fa405348bc2f3"/>
<project name="platform/system/bluetooth" path="system/bluetooth" revision="985bf15264d865fe7b9c5b45f61c451cbaafa43d"/>
<project name="platform/system/core" path="system/core" revision="42839aedcf70bf6bc92a3b7ea4a5cc9bf9aef3f9"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="476b3e194d8582ec8bc9968190d896c10c7b3be7"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
<project name="platform/system/qcom" path="system/qcom" revision="63e3f6f176caad587d42bba4c16b66d953fb23c2"/>
<project name="platform/vendor/qcom/copper" path="device/qcom/msm8974" revision="ec7bc1a26610922156d7d412b4d3de6b4adb93da"/>
<project name="vendor_broadcom_wlan" path="vendor/broadcom/wlan" remote="b2g" revision="114b9491a8a919687da4e22fbd89fab511d6d8d7"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<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="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="87a2d8ab9248540910e56921654367b78a587095"/>

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="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="46da1a05ac04157669685246d70ac59d48699c9e"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="94516f787d477dc307e4566f415e0d2f0794f6b9"/>
@ -135,7 +135,7 @@
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c5f8d282efe4a4e8b1e31a37300944e338e60e4f"/>
<project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="0e56e450367cd802241b27164a2979188242b95f"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="9f28c4faea3b2f01db227b2467b08aeba96d9bec"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="476b3e194d8582ec8bc9968190d896c10c7b3be7"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
<project name="android-sdk" path="sdk" remote="b2g" revision="8b1365af38c9a653df97349ee53a3f5d64fd590a"/>
<project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>
</manifest>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -133,7 +133,7 @@
<project name="platform/external/libnfc-nci" path="external/libnfc-nci" revision="f37bd545063039e30a92f2550ae78c0e6e4e2d08"/>
<project name="platform_external_wpa_supplicant_8" path="external/wpa_supplicant_8" remote="b2g" revision="0c6a6547cd1fd302fa2b0f6e375654df36bf0ec4"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="2b62676f02abb7633aac619e0f92c7fd70216860"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="476b3e194d8582ec8bc9968190d896c10c7b3be7"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
<project name="platform/development" path="development" revision="5968ff4e13e0d696ad8d972281fc27ae5a12829b"/>
<project name="android-sdk" path="sdk" remote="b2g" revision="0951179277915335251c5e11d242e4e1a8c2236f"/>
<project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>

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="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<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="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="87a2d8ab9248540910e56921654367b78a587095"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -146,7 +146,7 @@
<project name="platform/hardware/ril" path="hardware/ril" revision="12b1977cc704b35f2e9db2bb423fa405348bc2f3"/>
<project name="platform/system/bluetooth" path="system/bluetooth" revision="985bf15264d865fe7b9c5b45f61c451cbaafa43d"/>
<project name="platform/system/core" path="system/core" revision="42839aedcf70bf6bc92a3b7ea4a5cc9bf9aef3f9"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="476b3e194d8582ec8bc9968190d896c10c7b3be7"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
<project name="platform/system/qcom" path="system/qcom" revision="63e3f6f176caad587d42bba4c16b66d953fb23c2"/>
<project name="platform/vendor/qcom-opensource/wlan/prima" path="vendor/qcom/opensource/wlan/prima" revision="d8952a42771045fca73ec600e2b42a4c7129d723"/>
<project name="platform/vendor/qcom/msm8610" path="device/qcom/msm8610" revision="4c187c1f3a0dffd8e51a961735474ea703535b99"/>

View File

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "b404c41c5471c31610e64defb74ec066b411e724",
"git_revision": "c3f8a3346787c0fcb61775769f559540e253e6bf",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "b96d0d2057e470a3d47fd6d1cb4a5af2b61b7583",
"revision": "e03dd96aa4ef19404c34e64c1a5f4340aa9535b7",
"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="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="46da1a05ac04157669685246d70ac59d48699c9e"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="94516f787d477dc307e4566f415e0d2f0794f6b9"/>
@ -130,7 +130,7 @@
<project name="device-mako" path="device/lge/mako" remote="b2g" revision="78d17f0c117f0c66dd55ee8d5c5dde8ccc93ecba"/>
<project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="3a9a17613cc685aa232432566ad6cc607eab4ec1"/>
<project name="device/lge/mako-kernel" path="device/lge/mako-kernel" revision="d1729e53d71d711c8fde25eab8728ff2b9b4df0e"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="476b3e194d8582ec8bc9968190d896c10c7b3be7"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
<project name="platform/external/libnfc-nci" path="external/libnfc-nci" revision="7d33aaf740bbf6c7c6e9c34a92b371eda311b66b"/>
<project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="0e56e450367cd802241b27164a2979188242b95f"/>
<project name="platform/hardware/broadcom/wlan" path="hardware/broadcom/wlan" revision="0e1929fa3aa38bf9d40e9e953d619fab8164c82e"/>

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="b404c41c5471c31610e64defb74ec066b411e724"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="c3f8a3346787c0fcb61775769f559540e253e6bf"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3477513bcd385571aa01c0d074849e35bd5e2376"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -156,5 +156,5 @@
<project name="platform/hardware/qcom/sensors" path="hardware/qcom/sensors" revision="fde83fdf67e9b919f8a49008725bd595221bf33f"/>
<project name="platform/hardware/qcom/wlan" path="hardware/qcom/wlan" revision="6417804bea95f6e46094a01a06025a86e28c5b0d"/>
<project name="platform/hardware/ril" path="hardware/ril" revision="e00d716e7e3d31729f75399855b6921e90cb0b66"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="476b3e194d8582ec8bc9968190d896c10c7b3be7"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
</manifest>

View File

@ -1470,7 +1470,7 @@ pref("devtools.performance.ui.show-idle-blocks", true);
pref("devtools.performance.ui.enable-memory", false);
pref("devtools.performance.ui.enable-allocations", false);
pref("devtools.performance.ui.enable-framerate", true);
pref("devtools.performance.ui.show-jit-optimizations", false);
pref("devtools.performance.ui.enable-jit-optimizations", false);
// Enable experimental options in the UI only in Nightly
#if defined(NIGHTLY_BUILD)

View File

@ -22,70 +22,95 @@ let gCustomize = {
this._nodes[idSuffix] = document.getElementById("newtab-customize-" + idSuffix);
}
this._nodes.button.addEventListener("click", e => this.showPanel());
this._nodes.blank.addEventListener("click", e => {
gAllPages.enabled = false;
});
this._nodes.classic.addEventListener("click", e => {
gAllPages.enabled = true;
if (this._nodes.enhanced.getAttribute("selected")) {
gAllPages.enhanced = true;
} else {
gAllPages.enhanced = false;
}
});
this._nodes.enhanced.addEventListener("click", e => {
if (!gAllPages.enabled) {
gAllPages.enabled = true;
return;
}
gAllPages.enhanced = !gAllPages.enhanced;
});
this._nodes.learn.addEventListener("click", e => {
window.open(TILES_INTRO_LINK,'new_window');
this._onHidden();
});
this._nodes.button.addEventListener("click", e => this.showPanel(e));
this._nodes.blank.addEventListener("click", this);
this._nodes.classic.addEventListener("click", this);
this._nodes.enhanced.addEventListener("click", this);
this._nodes.learn.addEventListener("click", this);
this.updateSelected();
},
_onHidden: function() {
let nodes = gCustomize._nodes;
nodes.overlay.addEventListener("transitionend", function onTransitionEnd() {
nodes.overlay.removeEventListener("transitionend", onTransitionEnd);
nodes.overlay.style.display = "none";
hidePanel: function() {
this._nodes.overlay.addEventListener("transitionend", function onTransitionEnd() {
gCustomize._nodes.overlay.removeEventListener("transitionend", onTransitionEnd);
gCustomize._nodes.overlay.style.display = "none";
});
nodes.overlay.style.opacity = 0;
nodes.panel.removeEventListener("popuphidden", gCustomize._onHidden);
nodes.panel.hidden = true;
nodes.button.removeAttribute("active");
this._nodes.overlay.style.opacity = 0;
this._nodes.button.removeAttribute("active");
this._nodes.panel.removeAttribute("open");
document.removeEventListener("click", this);
document.removeEventListener("keydown", this);
},
showPanel: function() {
this._nodes.overlay.style.display = "block";
setTimeout(() => {
// Wait for display update to take place, then animate.
this._nodes.overlay.style.opacity = 0.8;
}, 0);
let nodes = this._nodes;
let {button, panel} = nodes;
if (button.hasAttribute("active")) {
return Promise.resolve(nodes);
showPanel: function(event) {
if (this._nodes.panel.getAttribute("open") == "true") {
return;
}
panel.hidden = false;
panel.openPopup(button);
button.setAttribute("active", true);
panel.addEventListener("popuphidden", this._onHidden);
let {panel, button, overlay} = this._nodes;
overlay.style.display = "block";
panel.setAttribute("open", "true");
button.setAttribute("active", "true");
setTimeout(() => {
// Wait for display update to take place, then animate.
overlay.style.opacity = 0.8;
}, 0);
return new Promise(resolve => {
panel.addEventListener("popupshown", function onShown() {
panel.removeEventListener("popupshown", onShown);
resolve(nodes);
});
});
document.addEventListener("click", this);
document.addEventListener("keydown", this);
// Stop the event propogation to prevent panel from immediately closing
// via the document click event that we just added.
event.stopPropagation();
},
handleEvent: function(event) {
switch (event.type) {
case "click":
this.onClick(event);
break;
case "keydown":
this.onKeyDown(event);
break;
}
},
onClick: function(event) {
if (event.currentTarget == document) {
if (!this._nodes.panel.contains(event.target)) {
this.hidePanel();
}
}
switch (event.currentTarget.id) {
case "newtab-customize-blank":
sendAsyncMessage("NewTab:Customize", {enabled: false, enhanced: false});
break;
case "newtab-customize-classic":
if (this._nodes.enhanced.getAttribute("selected")){
sendAsyncMessage("NewTab:Customize", {enabled: true, enhanced: true});
} else {
sendAsyncMessage("NewTab:Customize", {enabled: true, enhanced: false});
}
break;
case "newtab-customize-enhanced":
sendAsyncMessage("NewTab:Customize", {enabled: true, enhanced: !gAllPages.enhanced});
break;
case "newtab-customize-learn":
this.showLearn();
break;
}
},
onKeyDown: function(event) {
if (event.keyCode == event.DOM_VK_ESCAPE) {
this.hidePanel();
}
},
showLearn: function() {
window.open(TILES_INTRO_LINK, 'new_window');
this.hidePanel();
},
updateSelected: function() {

View File

@ -481,10 +481,38 @@ input[type=button] {
transition: opacity .07s linear;
}
.newtab-customize-panel-container {
position: absolute;
margin-right: 40px;
}
#newtab-customize-panel {
z-index: 101;
margin-top: -5px;
z-index: 999;
margin-top: 55px;
min-width: 270px;
position: absolute;
top: 100%;
right: -25px;
background-color: white;
border-radius: 6px;
filter: drop-shadow(0 0 1px rgba(0,0,0,0.4)) drop-shadow(0 3px 4px rgba(0,0,0,0.4));
transition: all 200ms ease-in-out;
transform-origin: top right;
transform: translate(-30px, -20px) scale(0) translate(30px, 20px);
}
#newtab-customize-panel[open="true"] {
transform: translate(-30px, -20px) scale(1) translate(30px, 20px);
}
#newtab-customize-panel-anchor {
width: 18px;
height: 18px;
background-color: white;
transform: rotate(45deg);
position: absolute;
top: -6px;
right: 15px;
}
#newtab-customize-title {
@ -499,6 +527,7 @@ input[type=button] {
max-width: 300px;
overflow: hidden;
display: table-cell;
border-top: none;
}
#newtab-customize-title > label {
@ -518,6 +547,7 @@ input[type=button] {
-moz-padding-start: 40px;
font-size: 14px;
cursor: pointer;
max-width: 300px;
}
.newtab-customize-panel-item:not(:first-child),
@ -544,10 +574,8 @@ input[type=button] {
.newtab-customize-panel-item,
.newtab-customize-complex-option {
width: 100%;
display: block;
text-align: start;
max-width: 300px;
background-color: #F9F9F9;
}
@ -615,6 +643,7 @@ input[type=button] {
padding: 0px 15px 15px 15px;
-moz-padding-start: 40px;
display: block;
max-width: 300px;
}
.newtab-customize-panel-subitem > label {
@ -788,7 +817,7 @@ input[type=button] {
.newtab-intro-image-customize {
box-shadow: 3px 3px 5px #888;
margin: 0 !important;
margin-top: 0px;
background-color: #FFF;
float: left;
z-index: 101;
@ -799,7 +828,7 @@ input[type=button] {
.newtab-intro-image-customize #newtab-customize-title {
display: block;
max-height: 72px;
max-height: 40px;
}
.newtab-intro-image-customize .newtab-customize-panel-item:not([selected]):hover {

View File

@ -22,8 +22,6 @@
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="&newtab.pageTitle;">
<div id="newtab-customize-overlay"></div>
<xul:panel id="newtab-search-panel" orient="vertical" type="arrow"
noautohide="true" hidden="true">
<xul:hbox id="newtab-search-manage">
@ -31,27 +29,32 @@
</xul:hbox>
</xul:panel>
<xul:panel id="newtab-customize-panel" orient="vertical" type="arrow"
noautohide="true" hidden="true">
<xul:hbox id="newtab-customize-title" class="newtab-customize-panel-item">
<xul:label>&newtab.customize.cog.title2;</xul:label>
</xul:hbox>
<xul:vbox class="newtab-customize-complex-option">
<xul:hbox id="newtab-customize-classic" class="newtab-customize-panel-superitem newtab-customize-panel-item selectable">
<xul:label>&newtab.customize.classic;</xul:label>
</xul:hbox>
<xul:hbox id="newtab-customize-enhanced" class="newtab-customize-panel-subitem">
<xul:label class="checkbox"></xul:label>
<xul:label>&newtab.customize.cog.enhanced;</xul:label>
</xul:hbox>
</xul:vbox>
<xul:hbox id="newtab-customize-blank" class="newtab-customize-panel-item selectable">
<xul:label>&newtab.customize.blank2;</xul:label>
</xul:hbox>
<xul:hbox id="newtab-customize-learn" class="newtab-customize-panel-item">
<xul:label>&newtab.customize.cog.learn;</xul:label>
</xul:hbox>
</xul:panel>
<div class="newtab-customize-panel-container">
<div id="newtab-customize-panel" orient="vertical">
<div id="newtab-customize-panel-anchor"></div>
<div id="newtab-customize-title" class="newtab-customize-panel-item">
<label>&newtab.customize.cog.title2;</label>
</div>
<div class="newtab-customize-complex-option">
<div id="newtab-customize-classic" class="newtab-customize-panel-superitem newtab-customize-panel-item selectable">
<label>&newtab.customize.classic;</label>
</div>
<div id="newtab-customize-enhanced" class="newtab-customize-panel-subitem">
<label class="checkbox"></label>
<label>&newtab.customize.cog.enhanced;</label>
</div>
</div>
<div id="newtab-customize-blank" class="newtab-customize-panel-item selectable">
<label>&newtab.customize.blank2;</label>
</div>
<div id="newtab-customize-learn" class="newtab-customize-panel-item">
<label>&newtab.customize.cog.learn;</label>
</div>
</div>
</div>
<div id="newtab-customize-overlay"></div>
<div id="newtab-intro-mask">
<div id="newtab-intro-modal">
@ -126,7 +129,6 @@
<div id="newtab-margin-bottom"/>
</div>
<input id="newtab-customize-button" type="button" title="&newtab.customize.title;"/>
</div>

View File

@ -351,6 +351,7 @@ skip-if = buildapp == 'mulet' || e10s # Bug 1101973 - breaks the next test in e1
skip-if = buildapp == 'mulet'
[browser_private_no_prompt.js]
skip-if = buildapp == 'mulet'
[browser_PageMetaData_pushstate.js]
[browser_relatedTabs.js]
[browser_remoteTroubleshoot.js]
support-files =
@ -418,7 +419,11 @@ skip-if = e10s # Bug 1100664 - test relies on linkedBrowser.docShell
[browser_tabs_owner.js]
[browser_testOpenNewRemoteTabsFromNonRemoteBrowsers.js]
run-if = e10s
[browser_trackingUI.js]
[browser_trackingUI_1.js]
support-files =
trackingPage.html
benignPage.html
[browser_trackingUI_2.js]
support-files =
trackingPage.html
benignPage.html

View File

@ -0,0 +1,32 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
add_task(function* () {
let rooturi = "https://example.com/browser/toolkit/modules/tests/browser/";
yield BrowserTestUtils.openNewForegroundTab(gBrowser, rooturi + "metadata_simple.html");
let result = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return PageMetadata.getData(content.document);
});
// result should have description
is(result.url, rooturi + "metadata_simple.html", "metadata url is correct");
is(result.title, "Test Title", "metadata title is correct");
is(result.description, "A very simple test page", "description is correct");
result = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
content.history.pushState({}, "2", "2.html");
return PageMetadata.getData(content.document);
});
// result should not have description
is(result.url, rooturi + "2.html", "metadata url is correct");
is(result.title, "Test Title", "metadata title is correct");
ok(!result.description, "description is undefined");
let documentURI = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return content.document.documentURI;
});
is(gBrowser.currentURI.spec, rooturi + "2.html", "gBrowser has correct url");
is(documentURI, rooturi + "2.html", "content.document has correct url");
gBrowser.removeTab(gBrowser.selectedTab);
});

View File

@ -6,50 +6,8 @@
// and has the correct state when tracking content is blocked (Bug 1043801)
var PREF = "privacy.trackingprotection.enabled";
var TABLE = "urlclassifier.trackingTable";
// Update tracking database
function doUpdate() {
// Add some URLs to the tracking database (to be blocked)
var testData = "tracking.example.com/";
var testUpdate =
"n:1000\ni:test-track-simple\nad:1\n" +
"a:524:32:" + testData.length + "\n" +
testData;
var dbService = Cc["@mozilla.org/url-classifier/dbservice;1"]
.getService(Ci.nsIUrlClassifierDBService);
let deferred = Promise.defer();
var listener = {
QueryInterface: function(iid)
{
if (iid.equals(Ci.nsISupports) ||
iid.equals(Ci.nsIUrlClassifierUpdateObserver))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
},
updateUrlRequested: function(url) { },
streamFinished: function(status) { },
updateError: function(errorCode) {
ok(false, "Couldn't update classifier.");
deferred.resolve();
},
updateSuccess: function(requestedTimeout) {
deferred.resolve();
}
};
dbService.beginUpdate(listener, "test-track-simple", "");
dbService.beginStream("", "");
dbService.updateStream(testUpdate);
dbService.finishStream();
dbService.finishUpdate();
return deferred.promise;
}
var BENIGN_PAGE = "http://tracking.example.org/browser/browser/base/content/test/general/benignPage.html";
var TRACKING_PAGE = "http://tracking.example.org/browser/browser/base/content/test/general/trackingPage.html";
function testBenignPage(gTestBrowser)
{
@ -64,38 +22,43 @@ function* testTrackingPage(gTestBrowser)
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
isnot(notification, null, "Tracking Content Doorhanger did appear when protection was ON and tracking was present");
notification.reshow();
var notificationElement = PopupNotifications.panel.firstChild;
// Wait for the method to be attached after showing the popup
yield promiseWaitForCondition(() => {
return PopupNotifications.panel.firstChild.disableTrackingContentProtection;
return notificationElement.disableTrackingContentProtection;
});
// Make sure the state of the doorhanger includes blocking tracking elements
is(PopupNotifications.panel.firstChild.isTrackingContentBlocked,
Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT,
ok(notificationElement.isTrackingContentBlocked,
"Tracking Content is being blocked");
// Make sure the notification has no trackingblockdisabled attribute
ok(!PopupNotifications.panel.firstChild.hasAttribute("trackingblockdisabled"),
ok(!notificationElement.hasAttribute("trackingblockdisabled"),
"Doorhanger must have no trackingblockdisabled attribute");
// Disable Tracking Content Protection for the page (which reloads the page)
PopupNotifications.panel.firstChild.disableTrackingContentProtection();
}
function testTrackingPageWhitelisted(gTestBrowser)
function* testTrackingPageWhitelisted(gTestBrowser)
{
// Make sure the doorhanger appears
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
isnot(notification, null, "Tracking Content Doorhanger did appear when protection was ON and tracking was present but white-listed");
notification.reshow();
var notificationElement = PopupNotifications.panel.firstChild;
// Wait for the method to be attached after showing the popup
yield promiseWaitForCondition(() => {
return notificationElement.disableTrackingContentProtection;
});
var notificationElement = PopupNotifications.panel.firstChild;
// Make sure the state of the doorhanger does NOT include blocking tracking elements
is(PopupNotifications.panel.firstChild.isTrackingContentBlocked, 0,
ok(!notificationElement.isTrackingContentBlocked,
"Tracking Content is NOT being blocked");
// Make sure the notification has the trackingblockdisabled attribute set to true
is(PopupNotifications.panel.firstChild.getAttribute("trackingblockdisabled"), "true",
is(notificationElement.getAttribute("trackingblockdisabled"), "true",
"Doorhanger must have [trackingblockdisabled='true'] attribute");
}
@ -116,13 +79,10 @@ function testBenignPageOFF(gTestBrowser)
add_task(function* () {
registerCleanupFunction(function() {
Services.prefs.clearUserPref(PREF);
Services.prefs.clearUserPref(TABLE);
gBrowser.removeCurrentTab();
});
// Populate and use 'test-track-simple' for tracking protection lookups
Services.prefs.setCharPref(TABLE, "test-track-simple");
yield doUpdate();
yield updateTrackingProtectionDatabase();
let tab = gBrowser.selectedTab = gBrowser.addTab();
@ -130,26 +90,30 @@ add_task(function* () {
Services.prefs.setBoolPref(PREF, true);
// Point tab to a test page NOT containing tracking elements
yield promiseTabLoadEvent(tab, "http://tracking.example.org/browser/browser/base/content/test/general/benignPage.html");
yield promiseTabLoadEvent(tab, BENIGN_PAGE);
testBenignPage(gBrowser.getBrowserForTab(tab));
// Point tab to a test page containing tracking elements
yield promiseTabLoadEvent(tab, "http://tracking.example.org/browser/browser/base/content/test/general/trackingPage.html");
yield promiseTabLoadEvent(tab, TRACKING_PAGE);
// Tracking content must be blocked
yield testTrackingPage(gBrowser.getBrowserForTab(tab));
// Disable Tracking Content Protection for the page (which reloads the page)
PopupNotifications.panel.firstChild.disableTrackingContentProtection();
// Wait for tab to reload following tracking-protection page white-listing
yield promiseTabLoadEvent(tab);
// Tracking content must be white-listed (NOT blocked)
testTrackingPageWhitelisted(gBrowser.getBrowserForTab(tab));
yield testTrackingPageWhitelisted(gBrowser.getBrowserForTab(tab));
// Disable Tracking Protection
Services.prefs.setBoolPref(PREF, false);
// Re-enable Tracking Content Protection for the page (which reloads the page)
PopupNotifications.panel.firstChild.enableTrackingContentProtection();
// Point tab to a test page containing tracking elements
yield promiseTabLoadEvent(tab, "http://tracking.example.org/browser/browser/base/content/test/general/trackingPage.html");
testTrackingPageOFF(gBrowser.getBrowserForTab(tab));
// Wait for tab to reload following tracking-protection page white-listing
yield promiseTabLoadEvent(tab);
// Point tab to a test page NOT containing tracking elements
yield promiseTabLoadEvent(tab, "http://tracking.example.org/browser/browser/base/content/test/general/benignPage.html");
testBenignPageOFF(gBrowser.getBrowserForTab(tab));
// Tracking content must be blocked
yield testTrackingPage(gBrowser.getBrowserForTab(tab));
});

View File

@ -0,0 +1,46 @@
/* 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/. */
// Test that the Tracking Protection Doorhanger does not ever appear
// when the feature is off (Bug 1043801)
var PREF = "privacy.trackingprotection.enabled";
var BENIGN_PAGE = "http://tracking.example.org/browser/browser/base/content/test/general/benignPage.html";
var TRACKING_PAGE = "http://tracking.example.org/browser/browser/base/content/test/general/trackingPage.html";
function testTrackingPageOFF(gTestBrowser)
{
// Make sure the doorhanger does NOT appear
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
is(notification, null, "Tracking Content Doorhanger did NOT appear when protection was OFF and tracking was present");
}
function testBenignPageOFF(gTestBrowser)
{
// Make sure the doorhanger does NOT appear
var notification = PopupNotifications.getNotification("bad-content", gTestBrowser);
is(notification, null, "Tracking Content Doorhanger did NOT appear when protection was OFF and tracking was NOT present");
}
add_task(function* () {
registerCleanupFunction(function() {
Services.prefs.clearUserPref(PREF);
gBrowser.removeCurrentTab();
});
yield updateTrackingProtectionDatabase();
let tab = gBrowser.selectedTab = gBrowser.addTab();
// Disable Tracking Protection
Services.prefs.setBoolPref(PREF, false);
// Point tab to a test page containing tracking elements
yield promiseTabLoadEvent(tab, TRACKING_PAGE);
testTrackingPageOFF(gBrowser.getBrowserForTab(tab));
// Point tab to a test page NOT containing tracking elements
yield promiseTabLoadEvent(tab, BENIGN_PAGE);
testBenignPageOFF(gBrowser.getBrowserForTab(tab));
});

View File

@ -660,6 +660,55 @@ function promiseIndicatorWindow() {
return promiseWindow("chrome://browser/content/webrtcIndicator.xul");
}
/**
* Add some entries to a test tracking protection database, and reset
* back to the default database after the test ends.
*/
function updateTrackingProtectionDatabase() {
let TABLE = "urlclassifier.trackingTable";
Services.prefs.setCharPref(TABLE, "test-track-simple");
registerCleanupFunction(function() {
Services.prefs.clearUserPref(TABLE);
});
// Add some URLs to the tracking database (to be blocked)
let testData = "tracking.example.com/";
let testUpdate =
"n:1000\ni:test-track-simple\nad:1\n" +
"a:524:32:" + testData.length + "\n" +
testData;
return new Promise((resolve, reject) => {
let dbService = Cc["@mozilla.org/url-classifier/dbservice;1"]
.getService(Ci.nsIUrlClassifierDBService);
let listener = {
QueryInterface: iid => {
if (iid.equals(Ci.nsISupports) ||
iid.equals(Ci.nsIUrlClassifierUpdateObserver))
return listener;
throw Cr.NS_ERROR_NO_INTERFACE;
},
updateUrlRequested: url => { },
streamFinished: status => { },
updateError: errorCode => {
ok(false, "Couldn't update classifier.");
resolve();
},
updateSuccess: requestedTimeout => {
resolve();
}
};
dbService.beginUpdate(listener, "test-track-simple", "");
dbService.beginStream("", "");
dbService.updateStream(testUpdate);
dbService.finishStream();
dbService.finishUpdate();
});
}
function assertWebRTCIndicatorStatus(expected) {
let ui = Cu.import("resource:///modules/webrtcUI.jsm", {}).webrtcUI;
let expectedState = expected ? "visible" : "hidden";

View File

@ -742,26 +742,36 @@ function whenSearchInitDone() {
* Can be any of("blank"|"classic"|"enhanced")
*/
function customizeNewTabPage(aTheme) {
let document = getContentDocument();
let panel = document.getElementById("newtab-customize-panel");
let customizeButton = document.getElementById("newtab-customize-button");
let promise = ContentTask.spawn(gBrowser.selectedBrowser, aTheme, function*(aTheme) {
// Attache onShown the listener on panel
panel.addEventListener("popupshown", function onShown() {
panel.removeEventListener("popupshown", onShown);
let document = content.document;
let panel = document.getElementById("newtab-customize-panel");
let customizeButton = document.getElementById("newtab-customize-button");
// Get the element for the specific option and click on it,
// then trigger an escape to close the panel
document.getElementById("newtab-customize-" + aTheme).click();
executeSoon(() => { panel.hidePopup(); });
function panelOpened(opened) {
return new Promise( (resolve) => {
let options = {attributes: true, oldValue: true};
let observer = new content.MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
document.getElementById("newtab-customize-" + aTheme).click();
observer.disconnect();
if (opened == panel.hasAttribute("open")) {
resolve();
}
});
});
observer.observe(panel, options);
});
}
let opened = panelOpened(true);
customizeButton.click();
yield opened;
let closed = panelOpened(false);
customizeButton.click();
yield closed;
});
// Attache the listener for panel closing, this will resolve the promise
panel.addEventListener("popuphidden", function onHidden() {
panel.removeEventListener("popuphidden", onHidden);
executeSoon(TestRunner.next);
});
// Click on the customize button to display the panel
customizeButton.click();
promise.then(TestRunner.next);
}

View File

@ -2303,8 +2303,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
</field>
<property name="isTrackingContentBlocked" readonly="true">
<getter><![CDATA[
return this.notification.options.state &
Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT;
return !!(this.notification.options.state &
Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT);
]]></getter>
</property>
<constructor><![CDATA[

View File

@ -485,9 +485,9 @@ loop.contacts = (function(_, mozL10n) {
message: mozL10n.get("confirm_delete_contact_alert"),
okButton: mozL10n.get("confirm_delete_contact_remove_button"),
cancelButton: mozL10n.get("confirm_delete_contact_cancel_button")
}, (err, result) => {
if (err) {
throw err;
}, (error, result) => {
if (error) {
throw error;
}
if (!result) {

View File

@ -92,9 +92,10 @@ loop.roomViews = (function(mozL10n) {
event.preventDefault();
var origin = event.currentTarget.dataset.provider;
var provider = this.props.socialShareProviders.filter(function(provider) {
return provider.origin == origin;
})[0];
var provider = this.props.socialShareProviders
.filter(function(socialProvider) {
return socialProvider.origin == origin;
})[0];
this.props.dispatcher.dispatch(new sharedActions.ShareRoomUrl({
provider: provider,
@ -304,12 +305,12 @@ loop.roomViews = (function(mozL10n) {
this.props.mozLoop.getSelectedTabMetadata(function(metadata) {
var previewImage = metadata.favicon || "";
var description = metadata.title || metadata.description;
var url = metadata.url;
var metaUrl = metadata.url;
this.setState({
availableContext: {
previewImage: previewImage,
description: description,
url: url
url: metaUrl
}
});
}.bind(this));

View File

@ -391,14 +391,14 @@ loop.shared.views = (function(_, l10n) {
// Suppress OT GuM custom dialog, see bug 1018875
this.listenTo(this.publisher, "accessDialogOpened accessDenied",
function(event) {
event.preventDefault();
function(ev) {
ev.preventDefault();
});
this.listenTo(this.publisher, "streamCreated", function(event) {
this.listenTo(this.publisher, "streamCreated", function(ev) {
this.setState({
audio: {enabled: event.stream.hasAudio},
video: {enabled: event.stream.hasVideo}
audio: {enabled: ev.stream.hasAudio},
video: {enabled: ev.stream.hasVideo}
});
}.bind(this));

View File

@ -9,9 +9,12 @@
<link rel="stylesheet" type="text/css" href="../content/shared/css/reset.css">
<link rel="stylesheet" type="text/css" href="../content/shared/css/common.css">
<link rel="stylesheet" type="text/css" href="../content/shared/css/conversation.css">
<link rel="stylesheet" type="text/css" href="../content/css/panel.css">
<link rel="stylesheet" type="text/css" href="../content/css/contacts.css">
<link rel="stylesheet" type="text/css" href="../content/css/webapp.css">
<link class="fx-embedded-panel" rel="stylesheet" type="text/css"
href="../content/css/panel.css">
<link class="fx-embedded-panel" rel="stylesheet" type="text/css"
href="../content/css/contacts.css">
<link class="standalone" rel="stylesheet" type="text/css"
href="../content/css/webapp.css">
<link rel="stylesheet" type="text/css" href="ui-showcase.css">
</head>
<body>

View File

@ -29,31 +29,55 @@ window.Frame = React.createClass({
head: React.PropTypes.node,
width: React.PropTypes.number,
height: React.PropTypes.number,
onContentsRendered: React.PropTypes.func
onContentsRendered: React.PropTypes.func,
className: React.PropTypes.string,
/* By default, <link rel="stylesheet> nodes from the containing frame's
head will be cloned into this iframe. However, if the link also has
a "class" attribute, we only clone it if that class attribute is the
same as cssClass. This allows us to avoid injecting stylesheets that
aren't intended for this rendering of this component. */
cssClass: React.PropTypes.string
},
render: function() {
return React.createElement("iframe", {
style: this.props.style,
head: this.props.head,
width: this.props.width,
height: this.props.height
height: this.props.height,
className: this.props.className
});
},
componentDidMount: function() {
this.renderFrameContents();
},
renderFrameContents: function() {
var doc = this.getDOMNode().contentDocument;
if (doc && doc.readyState === "complete") {
function isStyleSheet(node) {
return node.tagName.toLowerCase() === "link" &&
node.getAttribute("rel") === "stylesheet";
}
var childDoc = this.getDOMNode().contentDocument;
if (childDoc && childDoc.readyState === "complete") {
// Remove this from the queue.
window.queuedFrames.splice(window.queuedFrames.indexOf(this), 1);
var iframeHead = doc.querySelector("head");
var iframeHead = childDoc.querySelector("head");
var parentHeadChildren = document.querySelector("head").children;
[].forEach.call(parentHeadChildren, function(parentHeadNode) {
// if this node is a CSS stylesheet...
if (isStyleSheet(parentHeadNode)) {
// and it has a class different from the one that this frame does,
// return immediately instead of appending it.
if (parentHeadNode.hasAttribute("class") && this.props.cssClass &&
parentHeadNode.getAttribute("class") !== this.props.cssClass) {
return;
}
}
iframeHead.appendChild(parentHeadNode.cloneNode(true));
});
}.bind(this));
var contents = React.createElement("div",
undefined,
@ -61,14 +85,14 @@ window.Frame = React.createClass({
this.props.children
);
React.render(contents, doc.body, this.fireOnContentsRendered.bind(this));
React.render(contents, childDoc.body, this.fireOnContentsRendered);
// Set the RTL mode. We assume for now that rtl is the only query parameter.
//
// See also "ShowCase" in ui-showcase.jsx
if (document.location.search === "?rtl=1") {
doc.documentElement.setAttribute("lang", "ar");
doc.documentElement.setAttribute("dir", "rtl");
childDoc.documentElement.setAttribute("lang", "ar");
childDoc.documentElement.setAttribute("dir", "rtl");
}
} else {
// Queue it, only if it isn't already. We do need to set the timeout
@ -76,7 +100,7 @@ window.Frame = React.createClass({
if (window.queuedFrames.indexOf(this) === -1) {
window.queuedFrames.push(this);
}
setTimeout(this.renderFrameContents.bind(this), 0);
setTimeout(this.renderFrameContents, 0);
}
},
/**

View File

@ -57,7 +57,9 @@ body {
margin: 0 auto; /* width is usually set programmatically */
}
.showcase > section .comp.dashed {
.showcase > section .comp.dashed,
.showcase > section .comp > iframe.dashed
{
border: 1px dashed #ccc;
}

View File

@ -100,9 +100,9 @@
* @returns {loop.store.ActiveRoomStore}
*/
function makeActiveRoomStore(options) {
var dispatcher = new loop.Dispatcher();
var roomDispatcher = new loop.Dispatcher();
var store = new loop.store.ActiveRoomStore(dispatcher, {
var store = new loop.store.ActiveRoomStore(roomDispatcher, {
mozLoop: navigator.mozLoop,
sdkDriver: mockSDK
});
@ -370,7 +370,9 @@
propTypes: {
width: React.PropTypes.number,
height: React.PropTypes.number,
onContentsRendered: React.PropTypes.func
onContentsRendered: React.PropTypes.func,
dashed: React.PropTypes.bool,
cssClass: React.PropTypes.string
},
makeId: function(prefix) {
@ -378,6 +380,15 @@
},
render: function() {
var height = this.props.height;
var width = this.props.width;
// make room for a 1-pixel border on each edge
if (this.props.dashed) {
height += 2;
width += 2;
}
var cx = React.addons.classSet;
return (
React.createElement("div", {className: "example"},
@ -385,10 +396,11 @@
this.props.summary,
React.createElement("a", {href: this.makeId("#")}, " ¶")
),
React.createElement("div", {className: cx({comp: true, dashed: this.props.dashed}),
style: this.props.style},
React.createElement(Frame, {width: this.props.width, height: this.props.height,
onContentsRendered: this.props.onContentsRendered},
React.createElement("div", {className: "comp"},
React.createElement(Frame, {width: width, height: height,
onContentsRendered: this.props.onContentsRendered,
className: cx({dashed: this.props.dashed}),
cssClass: this.props.cssClass},
this.props.children
)
)
@ -815,8 +827,9 @@
),
React.createElement(Section, {name: "StandaloneRoomView"},
React.createElement(FramedExample, {width: 644, height: 483,
summary: "Standalone room conversation (ready)"},
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
summary: "Standalone room conversation (ready)"},
React.createElement("div", {className: "standalone"},
React.createElement(StandaloneRoomView, {
dispatcher: dispatcher,
@ -826,8 +839,9 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
summary: "Standalone room conversation (joined)",
cssClass: "standalone",
onContentsRendered: joinedRoomStore.forcedUpdate},
React.createElement("div", {className: "standalone"},
React.createElement(StandaloneRoomView, {
@ -838,7 +852,8 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
onContentsRendered: updatingActiveRoomStore.forcedUpdate,
summary: "Standalone room conversation (has-participants, 644x483)"},
React.createElement("div", {className: "standalone"},
@ -852,7 +867,8 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
onContentsRendered: localFaceMuteRoomStore.forcedUpdate,
summary: "Standalone room conversation (local face mute, has-participants, 644x483)"},
React.createElement("div", {className: "standalone"},
@ -865,7 +881,8 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
onContentsRendered: remoteFaceMuteRoomStore.forcedUpdate,
summary: "Standalone room conversation (remote face mute, has-participants, 644x483)"},
React.createElement("div", {className: "standalone"},
@ -878,7 +895,8 @@
)
),
React.createElement(FramedExample, {width: 800, height: 660,
React.createElement(FramedExample, {width: 800, height: 660, dashed: true,
cssClass: "standalone",
onContentsRendered: updatingSharingRoomStore.forcedUpdate,
summary: "Standalone room convo (has-participants, receivingScreenShare, 800x660)"},
React.createElement("div", {className: "standalone"},
@ -894,7 +912,8 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
summary: "Standalone room conversation (full - FFx user)"},
React.createElement("div", {className: "standalone"},
React.createElement(StandaloneRoomView, {
@ -904,8 +923,9 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
summary: "Standalone room conversation (full - non FFx user)"},
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
summary: "Standalone room conversation (full - non FFx user)"},
React.createElement("div", {className: "standalone"},
React.createElement(StandaloneRoomView, {
dispatcher: dispatcher,
@ -914,8 +934,9 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
summary: "Standalone room conversation (feedback)"},
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
summary: "Standalone room conversation (feedback)"},
React.createElement("div", {className: "standalone"},
React.createElement(StandaloneRoomView, {
dispatcher: dispatcher,
@ -925,7 +946,8 @@
)
),
React.createElement(FramedExample, {width: 644, height: 483,
React.createElement(FramedExample, {width: 644, height: 483, dashed: true,
cssClass: "standalone",
summary: "Standalone room conversation (failed)"},
React.createElement("div", {className: "standalone"},
React.createElement(StandaloneRoomView, {
@ -937,7 +959,7 @@
),
React.createElement(Section, {name: "StandaloneRoomView (Mobile)"},
React.createElement(FramedExample, {width: 600, height: 480,
React.createElement(FramedExample, {width: 600, height: 480, cssClass: "standalone",
onContentsRendered: updatingActiveRoomStore.forcedUpdate,
summary: "Standalone room conversation (has-participants, 600x480)"},
React.createElement("div", {className: "standalone"},
@ -953,7 +975,7 @@
),
React.createElement(Section, {name: "TextChatView (standalone)"},
React.createElement(FramedExample, {width: 200, height: 400,
React.createElement(FramedExample, {width: 200, height: 400, cssClass: "standalone",
summary: "Standalone Text Chat conversation (200 x 400)"},
React.createElement("div", {className: "standalone text-chat-example"},
React.createElement(TextChatView, {
@ -995,7 +1017,7 @@
// Wait until all the FramedExamples have been fully loaded.
setTimeout(function waitForQueuedFrames() {
if (window.queuedFrames.length != 0) {
if (window.queuedFrames.length !== 0) {
setTimeout(waitForQueuedFrames, 500);
return;
}

View File

@ -370,7 +370,9 @@
propTypes: {
width: React.PropTypes.number,
height: React.PropTypes.number,
onContentsRendered: React.PropTypes.func
onContentsRendered: React.PropTypes.func,
dashed: React.PropTypes.bool,
cssClass: React.PropTypes.string
},
makeId: function(prefix) {
@ -378,6 +380,15 @@
},
render: function() {
var height = this.props.height;
var width = this.props.width;
// make room for a 1-pixel border on each edge
if (this.props.dashed) {
height += 2;
width += 2;
}
var cx = React.addons.classSet;
return (
<div className="example">
@ -385,10 +396,11 @@
{this.props.summary}
<a href={this.makeId("#")}>&nbsp;</a>
</h3>
<div className={cx({comp: true, dashed: this.props.dashed})}
style={this.props.style}>
<Frame width={this.props.width} height={this.props.height}
onContentsRendered={this.props.onContentsRendered}>
<div className="comp">
<Frame width={width} height={height}
onContentsRendered={this.props.onContentsRendered}
className={cx({dashed: this.props.dashed})}
cssClass={this.props.cssClass}>
{this.props.children}
</Frame>
</div>
@ -815,8 +827,9 @@
</Section>
<Section name="StandaloneRoomView">
<FramedExample width={644} height={483}
summary="Standalone room conversation (ready)">
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
summary="Standalone room conversation (ready)">
<div className="standalone">
<StandaloneRoomView
dispatcher={dispatcher}
@ -826,8 +839,9 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
<FramedExample width={644} height={483} dashed={true}
summary="Standalone room conversation (joined)"
cssClass="standalone"
onContentsRendered={joinedRoomStore.forcedUpdate}>
<div className="standalone">
<StandaloneRoomView
@ -838,7 +852,8 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
onContentsRendered={updatingActiveRoomStore.forcedUpdate}
summary="Standalone room conversation (has-participants, 644x483)">
<div className="standalone">
@ -852,7 +867,8 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
onContentsRendered={localFaceMuteRoomStore.forcedUpdate}
summary="Standalone room conversation (local face mute, has-participants, 644x483)">
<div className="standalone">
@ -865,7 +881,8 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
onContentsRendered={remoteFaceMuteRoomStore.forcedUpdate}
summary="Standalone room conversation (remote face mute, has-participants, 644x483)">
<div className="standalone">
@ -878,7 +895,8 @@
</div>
</FramedExample>
<FramedExample width={800} height={660}
<FramedExample width={800} height={660} dashed={true}
cssClass="standalone"
onContentsRendered={updatingSharingRoomStore.forcedUpdate}
summary="Standalone room convo (has-participants, receivingScreenShare, 800x660)">
<div className="standalone">
@ -894,7 +912,8 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
summary="Standalone room conversation (full - FFx user)">
<div className="standalone">
<StandaloneRoomView
@ -904,8 +923,9 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
summary="Standalone room conversation (full - non FFx user)">
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
summary="Standalone room conversation (full - non FFx user)">
<div className="standalone">
<StandaloneRoomView
dispatcher={dispatcher}
@ -914,8 +934,9 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
summary="Standalone room conversation (feedback)">
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
summary="Standalone room conversation (feedback)">
<div className="standalone">
<StandaloneRoomView
dispatcher={dispatcher}
@ -925,7 +946,8 @@
</div>
</FramedExample>
<FramedExample width={644} height={483}
<FramedExample width={644} height={483} dashed={true}
cssClass="standalone"
summary="Standalone room conversation (failed)">
<div className="standalone">
<StandaloneRoomView
@ -937,7 +959,7 @@
</Section>
<Section name="StandaloneRoomView (Mobile)">
<FramedExample width={600} height={480}
<FramedExample width={600} height={480} cssClass="standalone"
onContentsRendered={updatingActiveRoomStore.forcedUpdate}
summary="Standalone room conversation (has-participants, 600x480)">
<div className="standalone">
@ -953,7 +975,7 @@
</Section>
<Section name="TextChatView (standalone)">
<FramedExample width={200} height={400}
<FramedExample width={200} height={400} cssClass="standalone"
summary="Standalone Text Chat conversation (200 x 400)">
<div className="standalone text-chat-example">
<TextChatView

View File

@ -17,6 +17,9 @@ Cu.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AboutHome",
"resource:///modules/AboutHome.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "AboutNewTab",
"resource:///modules/AboutNewTab.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "UITour",
"resource:///modules/UITour.jsm");
@ -690,6 +693,7 @@ BrowserGlue.prototype = {
#endif
webrtcUI.init();
AboutHome.init();
AboutNewTab.init();
SessionStore.init();
BrowserUITelemetry.init();
ContentSearch.init();
@ -1015,6 +1019,7 @@ BrowserGlue.prototype = {
CustomizationTabPreloader.uninit();
WebappManager.uninit();
AboutNewTab.uninit();
#ifdef NIGHTLY_BUILD
if (Services.prefs.getBoolPref("dom.identity.enabled")) {
SignInToWebsiteUX.uninit();

View File

@ -2068,7 +2068,7 @@ Toolbox.prototype = {
}),
/**
* Disconnects the underlying Performance Actor Connection. If the connection
* Disconnects the underlying Performance actor. If the connection
* has not finished initializing, as opening a toolbox does not wait,
* the performance connection destroy method will wait for it on its own.
*/

View File

@ -249,7 +249,7 @@ TimelineFrontFacade.prototype = {
/**
* An aggregate of all events (markers, frames, memory, ticks) and exposes
* to PerformanceActorsConnection as a single event.
* to PerformanceFront as a single event.
*/
_onTimelineData: function (type, ...data) {
this.emit("timeline-data", type, ...data);

View File

@ -259,6 +259,7 @@ function getOrAddInflatedFrame(cache, index, frameTable, stringTable, allocation
*/
function InflatedFrame(index, frameTable, stringTable, allocationsTable) {
const LOCATION_SLOT = frameTable.schema.location;
const IMPLEMENTATION_SLOT = frameTable.schema.implementation;
const OPTIMIZATIONS_SLOT = frameTable.schema.optimizations;
const LINE_SLOT = frameTable.schema.line;
const CATEGORY_SLOT = frameTable.schema.category;
@ -266,6 +267,7 @@ function InflatedFrame(index, frameTable, stringTable, allocationsTable) {
let frame = frameTable.data[index];
let category = frame[CATEGORY_SLOT];
this.location = stringTable[frame[LOCATION_SLOT]];
this.implementation = frame[IMPLEMENTATION_SLOT];
this.optimizations = frame[OPTIMIZATIONS_SLOT];
this.line = frame[LINE_SLOT];
this.column = undefined;

View File

@ -35,8 +35,8 @@ let PerformanceFronts = new WeakMap();
*
* @param Target target
* The target owning this connection.
* @return PerformanceActorsConnection
* The shared connection for the specified target.
* @return PerformanceFront
* The pseudofront for all the underlying actors.
*/
PerformanceFronts.forTarget = function(target) {
if (this.has(target)) {
@ -350,7 +350,7 @@ PerformanceFront.prototype = {
* Returns the same model, populated with the profiling data.
*/
stopRecording: Task.async(function*(model) {
// If model isn't in the PerformanceActorsConnections internal store,
// If model isn't in the PerformanceFront internal store,
// then do nothing.
if (this._recordings.indexOf(model) === -1) {
return;
@ -460,6 +460,7 @@ function getRecordingModelPrefs () {
withMemory: Services.prefs.getBoolPref("devtools.performance.ui.enable-memory"),
withTicks: Services.prefs.getBoolPref("devtools.performance.ui.enable-framerate"),
withAllocations: Services.prefs.getBoolPref("devtools.performance.ui.enable-allocations"),
withJITOptimizations: Services.prefs.getBoolPref("devtools.performance.ui.enable-jit-optimizations"),
allocationsSampleProbability: +Services.prefs.getCharPref("devtools.performance.memory.sample-probability"),
allocationsMaxLogLength: Services.prefs.getIntPref("devtools.performance.memory.max-log-length")
};

View File

@ -207,7 +207,7 @@ const JITOptimizations = function (rawSites, stringTable) {
};
}
this.optimizationSites = sites.sort((a, b) => b.samples - a.samples);;
this.optimizationSites = sites.sort((a, b) => b.samples - a.samples);
};
/**
@ -252,5 +252,94 @@ function maybeTypeset(typeset, stringTable) {
});
}
// Map of optimization implementation names to an enum.
const IMPLEMENTATION_MAP = {
"interpreter": 0,
"baseline": 1,
"ion": 2
};
const IMPLEMENTATION_NAMES = Object.keys(IMPLEMENTATION_MAP);
/**
* Takes data from a FrameNode and computes rendering positions for
* a stacked mountain graph, to visualize JIT optimization tiers over time.
*
* @param {FrameNode} frameNode
* The FrameNode who's optimizations we're iterating.
* @param {Array<number>} sampleTimes
* An array of every sample time within the range we're counting.
* From a ThreadNode's `sampleTimes` property.
* @param {number} op.startTime
* The start time of the first sample.
* @param {number} op.endTime
* The end time of the last sample.
* @param {number} op.resolution
* The maximum amount of possible data points returned.
* Also determines the size in milliseconds of each bucket
* via `(endTime - startTime) / resolution`
* @return {?Array<object>}
*/
function createTierGraphDataFromFrameNode (frameNode, sampleTimes, { startTime, endTime, resolution }) {
if (!frameNode.hasOptimizations()) {
return;
}
let tierData = frameNode.getOptimizationTierData();
let duration = endTime - startTime;
let stringTable = frameNode._stringTable;
let output = [];
let implEnum;
let tierDataIndex = 0;
let nextOptSample = tierData[tierDataIndex];
// Bucket data
let samplesInCurrentBucket = 0;
let currentBucketStartTime = sampleTimes[0];
let bucket = [];
// Size of each bucket in milliseconds
let bucketSize = Math.ceil(duration / resolution);
// Iterate one after the samples, so we can finalize the last bucket
for (let i = 0; i <= sampleTimes.length; i++) {
let sampleTime = sampleTimes[i];
// If this sample is in the next bucket, or we're done
// checking sampleTimes and on the last iteration, finalize previous bucket
if (sampleTime >= (currentBucketStartTime + bucketSize) ||
i >= sampleTimes.length) {
let dataPoint = {};
dataPoint.ys = [];
dataPoint.x = currentBucketStartTime;
// Map the opt site counts as a normalized percentage (0-1)
// of its count in context of total samples this bucket
for (let j = 0; j < IMPLEMENTATION_NAMES.length; j++) {
dataPoint.ys[j] = (bucket[j] || 0) / (samplesInCurrentBucket || 1);
}
output.push(dataPoint);
// Set the new start time of this bucket and reset its count
currentBucketStartTime += bucketSize;
samplesInCurrentBucket = 0;
bucket = [];
}
// If this sample observed an optimization in this frame, record it
if (nextOptSample && nextOptSample.time === sampleTime) {
// If no implementation defined, it was the "interpreter".
implEnum = IMPLEMENTATION_MAP[stringTable[nextOptSample.implementation] || "interpreter"];
bucket[implEnum] = (bucket[implEnum] || 0) + 1;
nextOptSample = tierData[++tierDataIndex];
}
samplesInCurrentBucket++;
}
return output;
}
exports.createTierGraphDataFromFrameNode = createTierGraphDataFromFrameNode;
exports.OptimizationSite = OptimizationSite;
exports.JITOptimizations = JITOptimizations;

View File

@ -25,6 +25,7 @@ const RecordingModel = function (options={}) {
withTicks: options.withTicks || false,
withMemory: options.withMemory || false,
withAllocations: options.withAllocations || false,
withJITOptimizations: options.withJITOptimizations || false,
allocationsSampleProbability: options.allocationsSampleProbability || 0,
allocationsMaxLogLength: options.allocationsMaxLogLength || 0,
bufferSize: options.bufferSize || 0,
@ -88,8 +89,8 @@ RecordingModel.prototype = {
}),
/**
* Sets up the instance with data from the SharedPerformanceConnection when
* starting a recording. Should only be called by SharedPerformanceConnection.
* Sets up the instance with data from the PerformanceFront when
* starting a recording. Should only be called by PerformanceFront.
*/
_populate: function (info) {
// Times must come from the actor in order to be self-consistent.
@ -130,8 +131,8 @@ RecordingModel.prototype = {
},
/**
* Sets results available from stopping a recording from SharedPerformanceConnection.
* Should only be called by SharedPerformanceConnection.
* Sets results available from stopping a recording from PerformanceFront.
* Should only be called by PerformanceFront.
*/
_onStopRecording: Task.async(function *({ profilerEndTime, profile }) {
// Update the duration with the accurate profilerEndTime, so we don't have
@ -184,7 +185,8 @@ RecordingModel.prototype = {
/**
* Returns configuration object of specifying whether the recording
* was started withTicks, withMemory and withAllocations.
* was started withTicks, withMemory and withAllocations and other
* recording options.
* @return object
*/
getConfiguration: function () {

View File

@ -318,6 +318,20 @@ function deflateMarkers(markers, uniqueStacks) {
* @return object
*/
function deflateThread(thread, uniqueStacks) {
// Some extra threads in a profile come stringified as a full profile (so
// it has nested threads itself) so the top level "thread" does not have markers
// or samples. We don't use this anyway so just make this safe to deflate.
// can be a string rather than an object on import. Bug 1173695
if (typeof thread === "string") {
thread = JSON.parse(thread);
}
if (!thread.samples) {
thread.samples = [];
}
if (!thread.markers) {
thread.markers = [];
}
return {
name: thread.name,
tid: thread.tid,

View File

@ -35,6 +35,7 @@ function ThreadNode(thread, options = {}) {
throw new Error("ThreadNode requires both `startTime` and `endTime`.");
}
this.samples = 0;
this.sampleTimes = [];
this.youngestFrameSamples = 0;
this.calls = [];
this.duration = options.endTime - options.startTime;
@ -131,11 +132,6 @@ ThreadNode.prototype = {
let endTime = options.endTime;
let flattenRecursion = options.flattenRecursion;
// Take the timestamp of the first sample as prevSampleTime. 0 is
// incorrect due to circular buffer wraparound. If wraparound happens,
// then the first sample will have an incorrect, large duration.
let prevSampleTime = samplesData[0][SAMPLE_TIME_SLOT];
// Reused options object passed to InflatedFrame.prototype.getFrameKey.
let mutableFrameKeyOptions = {
contentOnly: options.contentOnly,
@ -144,9 +140,7 @@ ThreadNode.prototype = {
isMetaCategoryOut: false
};
// Start iteration at the second sample, as we use the first sample to
// compute prevSampleTime.
for (let i = 1; i < samplesData.length; i++) {
for (let i = 0; i < samplesData.length; i++) {
let sample = samplesData[i];
let sampleTime = sample[SAMPLE_TIME_SLOT];
@ -156,7 +150,6 @@ ThreadNode.prototype = {
// Thus, we compare sampleTime <= start instead of < to filter out
// samples that end exactly at the start time.
if (!sampleTime || sampleTime <= startTime || sampleTime > endTime) {
prevSampleTime = sampleTime;
continue;
}
@ -235,7 +228,10 @@ ThreadNode.prototype = {
leafTable);
if (isLeaf) {
frameNode.youngestFrameSamples++;
frameNode._addOptimizations(inflatedFrame.optimizations, stringTable);
if (inflatedFrame.optimizations) {
frameNode._addOptimizations(inflatedFrame.optimizations, inflatedFrame.implementation,
sampleTime, stringTable);
}
}
frameNode.samples++;
@ -245,6 +241,7 @@ ThreadNode.prototype = {
}
this.samples++;
this.sampleTimes.push(sampleTime);
}
},
@ -372,6 +369,7 @@ function FrameNode(frameKey, { location, line, category, allocations, isContent
this.calls = [];
this.isContent = !!isContent;
this._optimizations = null;
this._tierData = null;
this._stringTable = null;
this.isMetaCategory = !!isMetaCategory;
this.category = category;
@ -384,19 +382,30 @@ FrameNode.prototype = {
* @param object optimizationSite
* Any JIT optimization information attached to the current
* sample. Lazily inflated via stringTable.
* @param number implementation
* JIT implementation used for this observed frame (interpreter,
* baseline, ion);
* @param number time
* The time this optimization occurred.
* @param object stringTable
* The string table used to inflate the optimizationSite.
*/
_addOptimizations: function (optimizationSite, stringTable) {
_addOptimizations: function (site, implementation, time, stringTable) {
// Simply accumulate optimization sites for now. Processing is done lazily
// by JITOptimizations, if optimization information is actually displayed.
if (optimizationSite) {
if (site) {
let opts = this._optimizations;
if (opts === null) {
opts = this._optimizations = [];
this._stringTable = stringTable;
}
opts.push(optimizationSite);
opts.push(site);
if (this._tierData === null) {
this._tierData = [];
}
// Record type of implementation used and the sample time
this._tierData.push({ implementation, time });
}
},
@ -475,6 +484,18 @@ FrameNode.prototype = {
}
return new JITOptimizations(this._optimizations, this._stringTable);
},
/**
* Returns the optimization tiers used overtime.
*
* @return {?Array<object>}
*/
getOptimizationTierData: function () {
if (!this._tierData) {
return null;
}
return this._tierData;
}
};
exports.ThreadNode = ThreadNode;

View File

@ -9,10 +9,10 @@
const { Cc, Ci, Cu, Cr } = require("chrome");
const { Task } = require("resource://gre/modules/Task.jsm");
const { LineGraphWidget } = require("resource:///modules/devtools/Graphs.jsm");
const { BarGraphWidget } = require("resource:///modules/devtools/Graphs.jsm");
const { CanvasGraphUtils } = require("resource:///modules/devtools/Graphs.jsm");
const { Heritage } = require("resource:///modules/devtools/ViewHelpers.jsm");
const { LineGraphWidget } = require("devtools/shared/widgets/Graphs");
const { BarGraphWidget } = require("devtools/shared/widgets/Graphs");
const { CanvasGraphUtils } = require("devtools/shared/widgets/Graphs");
loader.lazyRequireGetter(this, "promise");
loader.lazyRequireGetter(this, "EventEmitter",
@ -325,7 +325,7 @@ GraphsController.prototype = {
/**
* Fetches the currently mapped selection. If graphs are not yet rendered,
* (which throws in Graphs.jsm), return null.
* (which throws in Graphs.js), return null.
*/
getMappedSelection: function ({ mapStart, mapEnd }) {
let primary = this._getPrimaryLink();

View File

@ -10,8 +10,8 @@
*/
const { Cc, Ci, Cu, Cr } = require("chrome");
const { AbstractCanvasGraph } = require("resource:///modules/devtools/Graphs.jsm");
const { Heritage } = require("resource:///modules/devtools/ViewHelpers.jsm");
const { AbstractCanvasGraph } = require("devtools/shared/widgets/Graphs");
loader.lazyRequireGetter(this, "colorUtils",
"devtools/css-color", true);

View File

@ -295,6 +295,7 @@ let PerformanceController = {
withMarkers: true,
withMemory: this.getOption("enable-memory"),
withTicks: this.getOption("enable-framerate"),
withJITOptimizations: this.getOption("enable-jit-optimizations"),
withAllocations: this.getOption("enable-allocations"),
allocationsSampleProbability: this.getPref("memory-sample-probability"),
allocationsMaxLogLength: this.getPref("memory-max-log-length"),

View File

@ -69,12 +69,12 @@
data-pref="flatten-tree-recursion"
label="&profilerUI.flattenTreeRecursion;"
tooltiptext="&profilerUI.flattenTreeRecursion.tooltiptext;"/>
<menuitem id="option-show-jit-optimizations"
<menuitem id="option-enable-jit-optimizations"
class="experimental-option"
type="checkbox"
data-pref="show-jit-optimizations"
label="&profilerUI.showJITOptimizations;"
tooltiptext="&profilerUI.showJITOptimizations.tooltiptext;"/>
data-pref="enable-jit-optimizations"
label="&profilerUI.enableJITOptimizations;"
tooltiptext="&profilerUI.enableJITOptimizations.tooltiptext;"/>
</menupopup>
</popupset>

View File

@ -68,8 +68,6 @@ support-files =
[browser_perf-highlighted.js]
[browser_perf-jit-view-01.js]
[browser_perf-jit-view-02.js]
[browser_perf-jit-model-01.js]
[browser_perf-jit-model-02.js]
[browser_perf-loading-01.js]
[browser_perf-loading-02.js]
[browser_perf-marker-details-01.js]
@ -88,6 +86,7 @@ support-files =
[browser_perf-options-show-idle-blocks-02.js]
[browser_perf-options-enable-memory-01.js]
[browser_perf-options-enable-memory-02.js]
[browser_perf-options-enable-optimizations.js]
[browser_perf-options-enable-framerate.js]
[browser_perf-options-allocations.js]
[browser_perf-options-profiler.js]
@ -116,6 +115,7 @@ support-files =
[browser_perf_recordings-io-03.js]
[browser_perf_recordings-io-04.js]
[browser_perf_recordings-io-05.js]
[browser_perf_recordings-io-06.js]
[browser_perf-range-changed-render.js]
[browser_perf-recording-selected-01.js]
[browser_perf-recording-selected-02.js]

View File

@ -17,7 +17,9 @@ function* spawnTest() {
let profilerData = { threads: [gThread] }
is(Services.prefs.getBoolPref(JIT_PREF), false, "show JIT Optimizations pref off by default");
is(Services.prefs.getBoolPref(JIT_PREF), false, "record JIT Optimizations pref off by default");
Services.prefs.setBoolPref(JIT_PREF, true);
is(Services.prefs.getBoolPref(JIT_PREF), true, "toggle on record JIT Optimizations");
// Make two recordings, so we have one to switch to later, as the
// second one will have fake sample data
@ -56,27 +58,20 @@ function* spawnTest() {
let recording = PerformanceController.getCurrentRecording();
recording._profile = profilerData;
is($("#jit-optimizations-view").hidden, true, "JIT Optimizations panel is hidden when pref off.");
// Force a rerender
let rendered = once(JsCallTreeView, EVENTS.JS_CALL_TREE_RENDERED);
JsCallTreeView.render(OverviewView.getTimeInterval());
yield rendered;
is($("#jit-optimizations-view").hidden, true, "JIT Optimizations panel still hidden when rerendered");
Services.prefs.setBoolPref(JIT_PREF, true);
is($("#jit-optimizations-view").hidden, false, "JIT Optimizations should be visible when pref is on");
ok($("#jit-optimizations-view").classList.contains("empty"),
"JIT Optimizations view has empty message when no frames selected.");
Services.prefs.setBoolPref(JIT_PREF, false);
}
function *checkFrame (frameIndex, expectedOpts=[]) {
// Click the frame
let rendered = once(JITOptimizationsView, EVENTS.OPTIMIZATIONS_RENDERED);
mousedown(window, $$(".call-tree-item")[frameIndex]);
Services.prefs.setBoolPref(JIT_PREF, true);
yield rendered;
ok(true, "JITOptimizationsView rendered when enabling with the current frame node selected");

View File

@ -19,7 +19,7 @@ function* spawnTest() {
let profilerData = { threads: [gThread] };
is(Services.prefs.getBoolPref(JIT_PREF), false, "show JIT Optimizations pref off by default");
Services.prefs.setBoolPref(JIT_PREF, true);
// Make two recordings, so we have one to switch to later, as the
// second one will have fake sample data
@ -33,7 +33,6 @@ function* spawnTest() {
yield injectAndRenderProfilerData();
Services.prefs.setBoolPref(JIT_PREF, true);
// Click the frame
let rendered = once(JITOptimizationsView, EVENTS.OPTIMIZATIONS_RENDERED);
mousedown(window, $$(".call-tree-item")[2]);
@ -64,11 +63,8 @@ function* spawnTest() {
JsCallTreeView.render(OverviewView.getTimeInterval());
yield rendered;
Services.prefs.setBoolPref(JIT_PREF, true);
ok($("#jit-optimizations-view").classList.contains("empty"),
"JIT Optimizations view has empty message when no frames selected.");
Services.prefs.setBoolPref(JIT_PREF, false);
}
}

View File

@ -0,0 +1,44 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that `enable-jit-optimizations` sets the recording to subsequently
* display optimizations info.
*/
function* spawnTest() {
let { panel } = yield initPerformance(SIMPLE_URL);
let { EVENTS, PerformanceController, $, DetailsView, JsCallTreeView } = panel.panelWin;
Services.prefs.setBoolPref(JIT_PREF, true);
yield startRecording(panel);
let rendered = once(JsCallTreeView, EVENTS.JS_CALL_TREE_RENDERED);
yield stopRecording(panel);
yield DetailsView.selectView("js-calltree");
ok(DetailsView.isViewSelected(JsCallTreeView), "The call tree is now selected.");
yield rendered;
let recording = PerformanceController.getCurrentRecording();
is(recording.getConfiguration().withJITOptimizations, true, "recording model has withJITOptimizations as true");
// Set back to false, should not affect display of first recording
info("Disabling enable-jit-optimizations");
Services.prefs.setBoolPref(JIT_PREF, false);
is($("#jit-optimizations-view").hidden, false, "JIT Optimizations panel is displayed when feature enabled.");
yield startRecording(panel);
rendered = once(JsCallTreeView, EVENTS.JS_CALL_TREE_RENDERED);
yield stopRecording(panel);
yield DetailsView.selectView("js-calltree");
ok(DetailsView.isViewSelected(JsCallTreeView), "The call tree is now selected.");
yield rendered;
recording = PerformanceController.getCurrentRecording();
is(recording.getConfiguration().withJITOptimizations, false, "recording model has withJITOptimizations as false");
is($("#jit-optimizations-view").hidden, true, "JIT Optimizations panel is hidden when feature disabled");
yield teardown(panel);
finish();
}

View File

@ -2,7 +2,7 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests if the shared PerformanceActorsConnection is only opened once.
* Tests if the shared PerformanceFront is only opened once.
*/
let gProfilerConnectionsOpened = 0;

View File

@ -2,7 +2,7 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests if the shared PerformanceActorsConnection can properly send requests.
* Tests if the shared PerformanceFront can properly send requests.
*/
function* spawnTest() {

View File

@ -0,0 +1,142 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests if the performance tool can import profiler data when Profiler is v2
* and requires deflating, and has an extra thread that's a string. Not sure
* what causes this.
*/
let RecordingUtils = devtools.require("devtools/performance/recording-utils");
let STRINGED_THREAD = (function () {
let thread = {};
thread.libs = [{
start: 123,
end: 456,
offset: 0,
name: "",
breakpadId: ""
}];
thread.meta = { version: 2, interval: 1, stackwalk: 0, processType: 1, startTime: 0 };
thread.threads = [{
name: "Plugin",
tid: 4197,
samples: [],
markers: [],
}];
return JSON.stringify(thread);
})();
let PROFILER_DATA = (function () {
let data = {};
let threads = data.threads = [];
let thread = {};
threads.push(thread);
threads.push(STRINGED_THREAD);
thread.name = "Content";
thread.samples = [{
time: 5,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "B" },
{ location: "C" }
]
}, {
time: 5 + 6,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "B" },
{ location: "D" }
]
}, {
time: 5 + 6 + 7,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "E" },
{ location: "F" }
]
}, {
time: 20,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "B" },
{ location: "C" },
{ location: "D" },
{ location: "E" },
{ location: "F" },
{ location: "G" }
]
}];
// Handled in other deflating tests
thread.markers = [];
let meta = data.meta = {};
meta.version = 2;
meta.interval = 1;
meta.stackwalk = 0;
meta.product = "Firefox";
return data;
})();
let test = Task.async(function*() {
let { target, panel, toolbox } = yield initPerformance(SIMPLE_URL);
let { $, EVENTS, PerformanceController, DetailsView, JsCallTreeView } = panel.panelWin;
let profilerData = {
profile: PROFILER_DATA,
duration: 10000,
configuration: {},
fileType: "Recorded Performance Data",
version: 2
};
let file = FileUtils.getFile("TmpD", ["tmpprofile.json"]);
file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("666", 8));
yield asyncCopy(profilerData, file);
// Import recording.
let calltreeRendered = once(JsCallTreeView, EVENTS.JS_CALL_TREE_RENDERED);
let imported = once(PerformanceController, EVENTS.RECORDING_IMPORTED);
yield PerformanceController.importRecording("", file);
yield imported;
ok(true, "The profiler data appears to have been successfully imported.");
yield calltreeRendered;
ok(true, "The imported data was re-rendered.");
yield teardown(panel);
finish();
});
function getUnicodeConverter() {
let className = "@mozilla.org/intl/scriptableunicodeconverter";
let converter = Cc[className].createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
return converter;
}
function asyncCopy(data, file) {
let deferred = Promise.defer();
let string = JSON.stringify(data);
let inputStream = getUnicodeConverter().convertToInputStream(string);
let outputStream = FileUtils.openSafeFileOutputStream(file);
NetUtil.asyncCopy(inputStream, outputStream, status => {
if (!Components.isSuccessCode(status)) {
deferred.reject(new Error("Could not save data to file."));
}
deferred.resolve();
});
return deferred.promise;
}

View File

@ -39,7 +39,7 @@ const IDLE_PREF = "devtools.performance.ui.show-idle-blocks";
const INVERT_PREF = "devtools.performance.ui.invert-call-tree";
const INVERT_FLAME_PREF = "devtools.performance.ui.invert-flame-graph";
const FLATTEN_PREF = "devtools.performance.ui.flatten-tree-recursion";
const JIT_PREF = "devtools.performance.ui.show-jit-optimizations";
const JIT_PREF = "devtools.performance.ui.enable-jit-optimizations";
const EXPERIMENTAL_PREF = "devtools.performance.ui.experimental";
// All tests are asynchronous.
@ -56,7 +56,7 @@ let DEFAULT_PREFS = [
"devtools.performance.ui.enable-memory",
"devtools.performance.ui.enable-allocations",
"devtools.performance.ui.enable-framerate",
"devtools.performance.ui.show-jit-optimizations",
"devtools.performance.ui.enable-jit-optimizations",
"devtools.performance.memory.sample-probability",
"devtools.performance.memory.max-log-length",
"devtools.performance.profiler.buffer-size",

View File

@ -0,0 +1,186 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Unit test for `createTierGraphDataFromFrameNode` function.
*/
function run_test() {
run_next_test();
}
const SAMPLE_COUNT = 1000;
const RESOLUTION = 50;
const TIME_PER_SAMPLE = 5;
// Offset needed since ThreadNode requires the first sample to be strictly
// greater than its start time. This lets us still have pretty numbers
// in this test to keep it (more) simple, which it sorely needs.
const TIME_OFFSET = 5;
add_task(function test() {
let { ThreadNode } = devtools.require("devtools/performance/tree-model");
let { createTierGraphDataFromFrameNode } = devtools.require("devtools/performance/jit");
// Select the second half of the set of samples
let startTime = (SAMPLE_COUNT / 2 * TIME_PER_SAMPLE) - TIME_OFFSET;
let endTime = (SAMPLE_COUNT * TIME_PER_SAMPLE) - TIME_OFFSET;
let invertTree = true;
let root = new ThreadNode(gThread, { invertTree, startTime, endTime });
equal(root.samples, SAMPLE_COUNT / 2, "root has correct amount of samples");
equal(root.sampleTimes.length, SAMPLE_COUNT / 2, "root has correct amount of sample times");
// Add time offset since the first sample begins TIME_OFFSET after startTime
equal(root.sampleTimes[0], startTime + TIME_OFFSET, "root recorded first sample time in scope");
equal(root.sampleTimes[root.sampleTimes.length - 1], endTime, "root recorded last sample time in scope");
let frame = getFrameNodePath(root, "X");
let data = createTierGraphDataFromFrameNode(frame, root.sampleTimes, { startTime, endTime, resolution: RESOLUTION });
let TIME_PER_WINDOW = SAMPLE_COUNT / 2 / RESOLUTION * TIME_PER_SAMPLE;
for (let i = 0; i < 10; i++) {
equal(data[i].x, startTime + TIME_OFFSET + (TIME_PER_WINDOW * i), "first window has correct x");
equal(data[i].ys[0], 0.2, "first window has 2 frames in interpreter");
equal(data[i].ys[1], 0.2, "first window has 2 frames in baseline");
equal(data[i].ys[2], 0.2, "first window has 2 frames in ion");
}
for (let i = 10; i < 20; i++) {
equal(data[i].x, startTime + TIME_OFFSET + (TIME_PER_WINDOW * i), "second window has correct x");
equal(data[i].ys[0], 0, "second window observed no optimizations");
equal(data[i].ys[1], 0, "second window observed no optimizations");
equal(data[i].ys[2], 0, "second window observed no optimizations");
}
for (let i = 20; i < 30; i++) {
equal(data[i].x, startTime + TIME_OFFSET + (TIME_PER_WINDOW * i), "third window has correct x");
equal(data[i].ys[0], 0.3, "third window has 3 frames in interpreter");
equal(data[i].ys[1], 0, "third window has 0 frames in baseline");
equal(data[i].ys[2], 0, "third window has 0 frames in ion");
}
});
let gUniqueStacks = new RecordingUtils.UniqueStacks();
function uniqStr(s) {
return gUniqueStacks.getOrAddStringIndex(s);
}
const TIER_PATTERNS = [
// 0-99
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
// 100-199
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
// 200-299
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
// 300-399
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
// 400-499
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
// 500-599
// Test current frames in all opts, including that
// the same frame with no opts does not get counted
["X", "X", "A", "A", "X_1", "X_2", "X_1", "X_2", "X_0", "X_0"],
// 600-699
// Nothing for current frame
["A", "B", "A", "B", "A", "B", "A", "B", "A", "B"],
// 700-799
// A few frames where the frame is not the leaf node
["X_2 -> Y", "X_2 -> Y", "X_2 -> Y", "X_0", "X_0", "X_0", "A", "A", "A", "A"],
// 800-899
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
// 900-999
["X", "X", "X", "X", "X", "X", "X", "X", "X", "X"],
];
function createSample (i, frames) {
let sample = {};
sample.time = i * TIME_PER_SAMPLE;
sample.frames = [{ location: "(root)" }];
if (i === 0) {
return sample;
}
if (frames) {
frames.split(" -> ").forEach(frame => sample.frames.push({ location: frame }));
}
return sample;
}
let SAMPLES = (function () {
let samples = [];
for (let i = 0; i < SAMPLE_COUNT;) {
let pattern = TIER_PATTERNS[Math.floor(i/100)];
for (let j = 0; j < pattern.length; j++) {
samples.push(createSample(i+j, pattern[j]));
}
i += 10;
}
return samples;
})();
let gThread = RecordingUtils.deflateThread({ samples: SAMPLES, markers: [] }, gUniqueStacks);
let gRawSite1 = {
line: 12,
column: 2,
types: [{
mirType: uniqStr("Object"),
site: uniqStr("B (http://foo/bar:10)"),
typeset: [{
keyedBy: uniqStr("constructor"),
name: uniqStr("Foo"),
location: uniqStr("B (http://foo/bar:10)")
}, {
keyedBy: uniqStr("primitive"),
location: uniqStr("self-hosted")
}]
}],
attempts: {
schema: {
outcome: 0,
strategy: 1
},
data: [
[uniqStr("Failure1"), uniqStr("SomeGetter1")],
[uniqStr("Failure2"), uniqStr("SomeGetter2")],
[uniqStr("Inlined"), uniqStr("SomeGetter3")]
]
}
};
function serialize (x) {
return JSON.parse(JSON.stringify(x));
}
gThread.frameTable.data.forEach((frame) => {
const LOCATION_SLOT = gThread.frameTable.schema.location;
const OPTIMIZATIONS_SLOT = gThread.frameTable.schema.optimizations;
const IMPLEMENTATION_SLOT = gThread.frameTable.schema.implementation;
let l = gThread.stringTable[frame[LOCATION_SLOT]];
switch (l) {
// Rename some of the location sites so we can register different
// frames with different opt sites
case "X_0":
frame[LOCATION_SLOT] = uniqStr("X");
frame[OPTIMIZATIONS_SLOT] = serialize(gRawSite1);
frame[IMPLEMENTATION_SLOT] = null;
break;
case "X_1":
frame[LOCATION_SLOT] = uniqStr("X");
frame[OPTIMIZATIONS_SLOT] = serialize(gRawSite1);
frame[IMPLEMENTATION_SLOT] = uniqStr("baseline");
break;
case "X_2":
frame[LOCATION_SLOT] = uniqStr("X");
frame[OPTIMIZATIONS_SLOT] = serialize(gRawSite1);
frame[IMPLEMENTATION_SLOT] = uniqStr("ion");
break;
}
});

View File

@ -7,9 +7,11 @@
* FrameNode, and the returning of that data is as expected.
*/
const RecordingUtils = devtools.require("devtools/performance/recording-utils");
function run_test() {
run_next_test();
}
function test() {
add_task(function test() {
let { JITOptimizations } = devtools.require("devtools/performance/jit");
let rawSites = [];
@ -25,18 +27,16 @@ function test() {
let [first, second, third] = sites;
is(first.id, 0, "site id is array index");
is(first.samples, 3, "first OptimizationSiteProfile has correct sample count");
is(first.data.line, 34, "includes OptimizationSite as reference under `data`");
is(second.id, 1, "site id is array index");
is(second.samples, 2, "second OptimizationSiteProfile has correct sample count");
is(second.data.line, 12, "includes OptimizationSite as reference under `data`");
is(third.id, 2, "site id is array index");
is(third.samples, 1, "third OptimizationSiteProfile has correct sample count");
is(third.data.line, 78, "includes OptimizationSite as reference under `data`");
finish();
}
equal(first.id, 0, "site id is array index");
equal(first.samples, 3, "first OptimizationSiteProfile has correct sample count");
equal(first.data.line, 34, "includes OptimizationSite as reference under `data`");
equal(second.id, 1, "site id is array index");
equal(second.samples, 2, "second OptimizationSiteProfile has correct sample count");
equal(second.data.line, 12, "includes OptimizationSite as reference under `data`");
equal(third.id, 2, "site id is array index");
equal(third.samples, 1, "third OptimizationSiteProfile has correct sample count");
equal(third.data.line, 78, "includes OptimizationSite as reference under `data`");
});
let gStringTable = new RecordingUtils.UniqueStrings();

View File

@ -6,9 +6,11 @@
* OptimizationSites methods work as expected.
*/
const RecordingUtils = devtools.require("devtools/performance/recording-utils");
function run_test() {
run_next_test();
}
function test() {
add_task(function test() {
let { JITOptimizations, OptimizationSite } = devtools.require("devtools/performance/jit");
let rawSites = [];
@ -25,22 +27,20 @@ function test() {
let [first, second, third] = sites;
/* hasSuccessfulOutcome */
is(first.hasSuccessfulOutcome(), false, "optSite.hasSuccessfulOutcome() returns expected (1)");
is(second.hasSuccessfulOutcome(), true, "optSite.hasSuccessfulOutcome() returns expected (2)");
is(third.hasSuccessfulOutcome(), true, "optSite.hasSuccessfulOutcome() returns expected (3)");
equal(first.hasSuccessfulOutcome(), false, "optSite.hasSuccessfulOutcome() returns expected (1)");
equal(second.hasSuccessfulOutcome(), true, "optSite.hasSuccessfulOutcome() returns expected (2)");
equal(third.hasSuccessfulOutcome(), true, "optSite.hasSuccessfulOutcome() returns expected (3)");
/* getAttempts */
is(first.getAttempts().length, 2, "optSite.getAttempts() has the correct amount of attempts (1)");
is(second.getAttempts().length, 5, "optSite.getAttempts() has the correct amount of attempts (2)");
is(third.getAttempts().length, 3, "optSite.getAttempts() has the correct amount of attempts (3)");
equal(first.getAttempts().length, 2, "optSite.getAttempts() has the correct amount of attempts (1)");
equal(second.getAttempts().length, 5, "optSite.getAttempts() has the correct amount of attempts (2)");
equal(third.getAttempts().length, 3, "optSite.getAttempts() has the correct amount of attempts (3)");
/* getIonTypes */
is(first.getIonTypes().length, 1, "optSite.getIonTypes() has the correct amount of IonTypes (1)");
is(second.getIonTypes().length, 2, "optSite.getIonTypes() has the correct amount of IonTypes (2)");
is(third.getIonTypes().length, 1, "optSite.getIonTypes() has the correct amount of IonTypes (3)");
finish();
}
equal(first.getIonTypes().length, 1, "optSite.getIonTypes() has the correct amount of IonTypes (1)");
equal(second.getIonTypes().length, 2, "optSite.getIonTypes() has the correct amount of IonTypes (2)");
equal(third.getIonTypes().length, 1, "optSite.getIonTypes() has the correct amount of IonTypes (3)");
});
let gStringTable = new RecordingUtils.UniqueStrings();

View File

@ -10,6 +10,9 @@ skip-if = toolkit == 'android' || toolkit == 'gonk'
[test_marker-blueprint.js]
[test_marker-utils.js]
[test_profiler-categories.js]
[test_jit-graph-data.js]
[test_jit-model-01.js]
[test_jit-model-02.js]
[test_tree-model-01.js]
[test_tree-model-02.js]
[test_tree-model-03.js]

View File

@ -54,6 +54,7 @@ let JsCallTreeView = Heritage.extend(DetailsSubview, {
let profile = recording.getProfile();
let threadNode = this._prepareCallTree(profile, interval, options);
this._populateCallTree(threadNode, options);
this._toggleJITOptimizationsView(recording);
this.emit(EVENTS.JS_CALL_TREE_RENDERED);
},
@ -129,6 +130,21 @@ let JsCallTreeView = Heritage.extend(DetailsSubview, {
return root;
},
/**
* Displays or hides the optimizations view based on the recordings
* optimizations feature.
*
* @param {RecordingModel} recording
*/
_toggleJITOptimizationsView: function (recording) {
if (recording && recording.getConfiguration().withJITOptimizations) {
JITOptimizationsView.show();
JITOptimizationsView.render();
} else {
JITOptimizationsView.hide();
}
},
toString: () => "[object JsCallTreeView]"
});

View File

@ -25,7 +25,6 @@ let JITOptimizationsView = {
initialize: function () {
this.reset = this.reset.bind(this);
this._onFocusFrame = this._onFocusFrame.bind(this);
this._toggleVisibility = this._toggleVisibility.bind(this);
this.el = $("#jit-optimizations-view");
this.$headerName = $("#jit-optimizations-header .header-function-name");
@ -40,10 +39,7 @@ let JITOptimizationsView = {
// Start the tree by resetting.
this.reset();
this._toggleVisibility();
PerformanceController.on(EVENTS.RECORDING_SELECTED, this.reset);
PerformanceController.on(EVENTS.PREF_CHANGED, this._toggleVisibility);
JsCallTreeView.on("focus", this._onFocusFrame);
},
@ -54,7 +50,6 @@ let JITOptimizationsView = {
this.tree = null;
this.$headerName = this.$headerFile = this.$headerLine = this.el = null;
PerformanceController.off(EVENTS.RECORDING_SELECTED, this.reset);
PerformanceController.off(EVENTS.PREF_CHANGED, this._toggleVisibility);
JsCallTreeView.off("focus", this._onFocusFrame);
},
@ -98,11 +93,20 @@ let JITOptimizationsView = {
this.tree.clear();
},
show: function () {
this.el.hidden = false;
},
hide: function () {
this.el.hidden = true;
},
/**
* Helper to determine whether or not this view should be enabled.
*/
isEnabled: function () {
return PerformanceController.getOption("show-jit-optimizations");
let recording = PerformanceController.getCurrentRecording();
return !!(recording && recording.getConfiguration().withJITOptimizations);
},
/**
@ -381,22 +385,6 @@ let JITOptimizationsView = {
url.indexOf("file://") === 0);
},
/**
* Toggles the visibility of the JITOptimizationsView based on the preference
* devtools.performance.ui.show-jit-optimizations.
*/
_toggleVisibility: function () {
let enabled = this.isEnabled();
this.el.hidden = !enabled;
// If view is toggled on, and there's a frame node selected,
// attempt to render it
if (enabled) {
this.render();
}
},
/**
* Called when the JSCallTreeView focuses on a frame.
*/

View File

@ -178,7 +178,7 @@ let OverviewView = {
* Method for handling all the set up for rendering the overview graphs.
*
* @param number resolution
* The fps graph resolution. @see Graphs.jsm
* The fps graph resolution. @see Graphs.js
*/
render: Task.async(function *(resolution) {
if (this.isDisabled()) {

View File

@ -93,7 +93,7 @@ let ToolbarView = {
* hiding or showing all elements with class "experimental-option".
*
* TODO re-enable "#option-enable-memory" permanently once stable in bug 1163350
* TODO re-enable "#option-show-jit-optimizations" permanently once stable in bug 1163351
* TODO re-enable "#option-enable-jit-optimizations" permanently once stable in bug 1163351
*
* @param {boolean} isEnabled
*/

View File

@ -21,7 +21,6 @@ EXTRA_JS_MODULES.devtools += [
'widgets/AbstractTreeItem.jsm',
'widgets/BreadcrumbsWidget.jsm',
'widgets/Chart.jsm',
'widgets/Graphs.jsm',
'widgets/GraphsWorker.js',
'widgets/SideMenuWidget.jsm',
'widgets/SimpleListWidget.jsm',
@ -54,6 +53,7 @@ EXTRA_JS_MODULES.devtools.shared.widgets += [
'widgets/FastListWidget.js',
'widgets/FilterWidget.js',
'widgets/FlameGraph.js',
'widgets/Graphs.js',
'widgets/MdnDocsWidget.js',
'widgets/Spectrum.js',
'widgets/TableWidget.js',

View File

@ -3,7 +3,7 @@
// Tests that graph widgets works properly.
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
const TEST_REGIONS = [{ start: 320, end: 460 }, { start: 780, end: 860 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that graph widgets can handle clients getting/setting the
// selection or cursor.
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -3,7 +3,7 @@
// Tests that graph widgets can correctly compare selections and cursors.
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
const TEST_REGIONS = [{ start: 320, end: 460 }, { start: 780, end: 860 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
const TEST_REGIONS = [{ start: 320, end: 460 }, { start: 780, end: 860 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests if selecting, resizing, moving selections and zooming in/out works.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests if selections can't be added via clicking, while not allowed.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -6,7 +6,7 @@
// callbacks with textX / testY for convenience.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
const TEST_REGIONS = [{ start: 320, end: 460 }, { start: 780, end: 860 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that selections are drawn onto the canvas.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
let CURRENT_ZOOM = 1;

View File

@ -4,7 +4,7 @@
// Tests if a selection is dropped when clicking outside of it.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that line graphs properly create the gutter and tooltips.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that line graphs properly use the tooltips configuration properties.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that line graphs hide the tooltips when there's no data available.
const TEST_DATA = [];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
// the 'min' and 'max' tooltip is too small.
const TEST_DATA = [{ delta: 100, value: 60 }, { delta: 200, value: 59.9 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -7,7 +7,7 @@
const NO_DATA = [];
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
// gutter/tooltips and lines.
const TEST_DATA = [{ delta: 100, value: 60 }, { delta: 200, value: 1 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that graphs properly handle resizing.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -5,7 +5,7 @@
// the graph dimensions stay the same.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -2,7 +2,7 @@
// Tests that graphs properly handle resizing.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -3,7 +3,7 @@
// Tests that bar graph create a legend as expected.
let {BarGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {BarGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
const CATEGORIES = [

View File

@ -3,7 +3,7 @@
// Tests that bar graph's legend items handle mouseover/mouseout.
let {BarGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {BarGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
const CATEGORIES = [

View File

@ -3,7 +3,7 @@
// Tests that canvas graphs can have their selection linked.
let {LineGraphWidget, BarGraphWidget, CanvasGraphUtils} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget,BarGraphWidget,CanvasGraphUtils} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -3,7 +3,7 @@
// Tests that graph widgets may have a fixed width or height.
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -4,7 +4,7 @@
// Tests that graph widgets correctly emit mouse input events.
const TEST_DATA = [{ delta: 112, value: 48 }, { delta: 213, value: 59 }, { delta: 313, value: 60 }, { delta: 413, value: 59 }, { delta: 530, value: 59 }, { delta: 646, value: 58 }, { delta: 747, value: 60 }, { delta: 863, value: 48 }, { delta: 980, value: 37 }, { delta: 1097, value: 30 }, { delta: 1213, value: 29 }, { delta: 1330, value: 23 }, { delta: 1430, value: 10 }, { delta: 1534, value: 17 }, { delta: 1645, value: 20 }, { delta: 1746, value: 22 }, { delta: 1846, value: 39 }, { delta: 1963, value: 26 }, { delta: 2080, value: 27 }, { delta: 2197, value: 35 }, { delta: 2312, value: 47 }, { delta: 2412, value: 53 }, { delta: 2514, value: 60 }, { delta: 2630, value: 37 }, { delta: 2730, value: 36 }, { delta: 2830, value: 37 }, { delta: 2946, value: 36 }, { delta: 3046, value: 40 }, { delta: 3163, value: 47 }, { delta: 3280, value: 41 }, { delta: 3380, value: 35 }, { delta: 3480, value: 27 }, { delta: 3580, value: 39 }, { delta: 3680, value: 42 }, { delta: 3780, value: 49 }, { delta: 3880, value: 55 }, { delta: 3980, value: 60 }, { delta: 4080, value: 60 }, { delta: 4180, value: 60 }];
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -19,7 +19,7 @@ for (let frameRate of FRAMES) {
}
}
let {LineGraphWidget} = Cu.import("resource:///modules/devtools/Graphs.jsm", {});
let {LineGraphWidget} = devtools.require("devtools/shared/widgets/Graphs");
let {Promise} = devtools.require("resource://gre/modules/Promise.jsm");
add_task(function*() {

View File

@ -19,12 +19,12 @@ loader.lazyRequireGetter(this, "CATEGORY_MAPPINGS",
loader.lazyRequireGetter(this, "FrameUtils",
"devtools/performance/frame-utils");
loader.lazyImporter(this, "AbstractCanvasGraph",
"resource:///modules/devtools/Graphs.jsm");
loader.lazyImporter(this, "GraphArea",
"resource:///modules/devtools/Graphs.jsm");
loader.lazyImporter(this, "GraphAreaDragger",
"resource:///modules/devtools/Graphs.jsm");
loader.lazyRequireGetter(this, "AbstractCanvasGraph",
"devtools/shared/widgets/Graphs", true);
loader.lazyRequireGetter(this, "GraphArea",
"devtools/shared/widgets/Graphs", true);
loader.lazyRequireGetter(this, "GraphAreaDragger",
"devtools/shared/widgets/Graphs", true);
const HTML_NS = "http://www.w3.org/1999/xhtml";
const GRAPH_SRC = "chrome://browser/content/devtools/graphs-frame.xhtml";

View File

@ -3,29 +3,25 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const Cu = Components.utils;
const { Cc, Ci, Cu, Cr } = require("chrome");
Cu.import("resource:///modules/devtools/ViewHelpers.jsm");
const promise = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise;
const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
const {EventEmitter} = Cu.import("resource://gre/modules/devtools/event-emitter.js", {});
const {DevToolsWorker} = Cu.import("resource://gre/modules/devtools/shared/worker.js", {});
const {LayoutHelpers} = Cu.import("resource://gre/modules/devtools/LayoutHelpers.jsm", {});
const { Task } = Cu.import("resource://gre/modules/Task.jsm", {});
const { ViewHelpers } = require("resource:///modules/devtools/ViewHelpers.jsm");
const { Heritage, setNamedTimeout, clearNamedTimeout } = require("resource:///modules/devtools/ViewHelpers.jsm");
this.EXPORTED_SYMBOLS = [
"GraphCursor",
"GraphArea",
"GraphAreaDragger",
"GraphAreaResizer",
"AbstractCanvasGraph",
"LineGraphWidget",
"BarGraphWidget",
"CanvasGraphUtils"
];
loader.lazyRequireGetter(this, "promise");
loader.lazyRequireGetter(this, "EventEmitter",
"devtools/toolkit/event-emitter");
loader.lazyImporter(this, "DevToolsWorker",
"resource://gre/modules/devtools/shared/worker.js");
loader.lazyImporter(this, "LayoutHelpers",
"resource://gre/modules/devtools/LayoutHelpers.jsm");
const HTML_NS = "http://www.w3.org/1999/xhtml";
const GRAPH_SRC = "chrome://browser/content/devtools/graphs-frame.xhtml";
const WORKER_URL = "resource:///modules/devtools/GraphsWorker.js";
const L10N = new ViewHelpers.L10N();
// Generic constants.
@ -2225,6 +2221,15 @@ function findFirst(array, predicate) {
}
}
exports.GraphCursor = GraphCursor;
exports.GraphArea = GraphArea;
exports.GraphAreaDragger = GraphAreaDragger;
exports.GraphAreaResizer = GraphAreaResizer;
exports.AbstractCanvasGraph = AbstractCanvasGraph;
exports.LineGraphWidget = LineGraphWidget;
exports.BarGraphWidget = BarGraphWidget;
exports.CanvasGraphUtils = CanvasGraphUtils;
/**
* Finds the last element in an array that validates a predicate.
* @param array

View File

@ -10,7 +10,7 @@ importScripts("resource://gre/modules/workers/require.js");
const { createTask } = require("resource://gre/modules/devtools/shared/worker-helper");
/**
* @see LineGraphWidget.prototype.setDataFromTimestamps in Graphs.jsm
* @see LineGraphWidget.prototype.setDataFromTimestamps in Graphs.js
* @param number id
* @param array timestamps
* @param number interval

View File

@ -23,8 +23,9 @@ const STRINGS_URI = "chrome://browser/locale/devtools/webaudioeditor.properties"
const L10N = new ViewHelpers.L10N(STRINGS_URI);
const Telemetry = require("devtools/shared/telemetry");
const telemetry = new Telemetry();
devtools.lazyImporter(this, "LineGraphWidget",
"resource:///modules/devtools/Graphs.jsm");
devtools.lazyRequireGetter(this, "LineGraphWidget",
"devtools/shared/widgets/Graphs", true);
// `AUDIO_NODE_DEFINITION` defined in the controller's initialization,
// which describes all the properties of an AudioNode

View File

@ -142,11 +142,11 @@
<!ENTITY profilerUI.enableFramerate "Record Framerate">
<!ENTITY profilerUI.enableFramerate.tooltiptext "Record framerate while profiling.">
<!-- LOCALIZATION NOTE (profilerUI.showJITOptimizations): This string
<!-- LOCALIZATION NOTE (profilerUI.enableJITOptimizations): This string
- is displayed next to a checkbox determining whether or not JIT optimization data
- should be shown. -->
<!ENTITY profilerUI.showJITOptimizations "Show JIT Optimizations">
<!ENTITY profilerUI.showJITOptimizations.tooltiptext "Show JIT optimization data sampled in each frame of the JS call tree.">
- should be recorded. -->
<!ENTITY profilerUI.enableJITOptimizations "Record JIT Optimizations">
<!ENTITY profilerUI.enableJITOptimizations.tooltiptext "Record JIT optimization data sampled in each JavaScript frame.">
<!-- LOCALIZATION NOTE (profilerUI.JITOptimizationsTitle): This string
- is displayed as the title of the JIT Optimizations panel. -->

View File

@ -0,0 +1,39 @@
/* 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";
let Cc = Components.classes;
let Ci = Components.interfaces;
let Cu = Components.utils;
this.EXPORTED_SYMBOLS = [ "AboutNewTab" ];
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "RemotePages",
"resource://gre/modules/RemotePageManager.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
"resource://gre/modules/NewTabUtils.jsm");
let AboutNewTab = {
pageListener: null,
init: function() {
this.pageListener = new RemotePages("about:newtab");
this.pageListener.addMessageListener("NewTab:Customize", this.customize.bind(this));
},
customize: function(message) {
NewTabUtils.allPages.enabled = message.data.enabled;
NewTabUtils.allPages.enhanced = message.data.enhanced;
},
uninit: function() {
this.pageListener.destroy();
this.pageListener = null;
},
};

View File

@ -12,6 +12,7 @@ XPCSHELL_TESTS_MANIFESTS += [
EXTRA_JS_MODULES += [
'AboutHome.jsm',
'AboutNewTab.jsm',
'BrowserUITelemetry.jsm',
'CastingApps.jsm',
'Chat.jsm',

View File

@ -14,12 +14,16 @@
#endif
android:targetSdkVersion="@ANDROID_TARGET_SDK@"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<instrumentation
android:name="org.mozilla.gecko.FennecInstrumentationTestRunner"
android:targetPackage="@ANDROID_PACKAGE_NAME@" />
<application
android:label="@string/app_name" >
android:label="@string/app_name"
android:debuggable="true">
<uses-library android:name="android.test.runner" />
<!-- Fake handlers to ensure that we have some share intents to show in our share handler list -->

View File

@ -138,8 +138,9 @@ described below.
## Timestamps
Timestamps are expressed in units of microseconds since the epoch (midnight,
January 1st, 1970).
Timestamps are expressed in units of milliseconds since an arbitrary,
but fixed, epoch. The resolution of timestamps is generally greater
than milliseconds, though no specific resolution is guaranteed.
## The `Debugger.DebuggeeWouldRun` Exception

View File

@ -4,20 +4,20 @@ load(libdir + 'asserts.js');
var allocTimes = [];
allocTimes.push(1000 * dateNow());
allocTimes.push(dateNow());
const root = newGlobal();
const dbg = new Debugger(root);
dbg.memory.trackingAllocationSites = true;
root.eval("this.alloc1 = {}");
allocTimes.push(1000 * dateNow());
allocTimes.push(dateNow());
root.eval("this.alloc2 = {}");
allocTimes.push(1000 * dateNow());
allocTimes.push(dateNow());
root.eval("this.alloc3 = {}");
allocTimes.push(1000 * dateNow());
allocTimes.push(dateNow());
root.eval("this.alloc4 = {}");
allocTimes.push(1000 * dateNow());
allocTimes.push(dateNow());
allocs = dbg.memory.drainAllocationsLog();
assertEq(allocs.length >= 4, true);

View File

@ -338,7 +338,7 @@ IterPerformanceStats(JSContext* cx,
continue;
}
if (!(*walker)(cx, group->data, closure)) {
if (!(*walker)(cx, group->data, group->uid, closure)) {
// Issue in callback
return false;
}
@ -663,6 +663,22 @@ JS_SetICUMemoryFunctions(JS_ICUAllocFn allocFn, JS_ICUReallocFn reallocFn, JS_IC
#endif
}
static JS_CurrentEmbedderTimeFunction currentEmbedderTimeFunction;
JS_PUBLIC_API(void)
JS_SetCurrentEmbedderTimeFunction(JS_CurrentEmbedderTimeFunction timeFn)
{
currentEmbedderTimeFunction = timeFn;
}
JS_PUBLIC_API(double)
JS_GetCurrentEmbedderTime()
{
if (currentEmbedderTimeFunction)
return currentEmbedderTimeFunction();
return PRMJ_Now() / static_cast<double>(PRMJ_USEC_PER_MSEC);
}
JS_PUBLIC_API(void*)
JS_GetRuntimePrivate(JSRuntime* rt)
{

View File

@ -1053,6 +1053,25 @@ typedef void (*JS_ICUFreeFn)(const void*, void* p);
extern JS_PUBLIC_API(bool)
JS_SetICUMemoryFunctions(JS_ICUAllocFn allocFn, JS_ICUReallocFn reallocFn, JS_ICUFreeFn freeFn);
typedef double (*JS_CurrentEmbedderTimeFunction)();
/*
* The embedding can specify a time function that will be used in some
* situations. The function can return the time however it likes; but
* the norm is to return times in units of milliseconds since an
* arbitrary, but consistent, epoch. If the time function is not set,
* a built-in default will be used.
*/
JS_PUBLIC_API(void)
JS_SetCurrentEmbedderTimeFunction(JS_CurrentEmbedderTimeFunction timeFn);
/*
* Return the time as computed using the current time function, or a
* suitable default if one has not been set.
*/
JS_PUBLIC_API(double)
JS_GetCurrentEmbedderTime();
JS_PUBLIC_API(void*)
JS_GetRuntimePrivate(JSRuntime* rt);
@ -5442,6 +5461,9 @@ struct PerformanceGroup {
// Performance data for this group.
PerformanceData data;
// An id unique to this runtime.
const uint64_t uid;
// `true` if an instance of `AutoStopwatch` is already monitoring
// the performance of this performance group for this iteration
// of the event loop, `false` otherwise.
@ -5466,12 +5488,7 @@ struct PerformanceGroup {
stopwatch_ = nullptr;
}
explicit PerformanceGroup(void* key)
: stopwatch_(nullptr)
, iteration_(0)
, key_(key)
, refCount_(0)
{ }
explicit PerformanceGroup(JSContext* cx, void* key);
~PerformanceGroup()
{
MOZ_ASSERT(refCount_ == 0);
@ -5583,7 +5600,7 @@ extern JS_PUBLIC_API(PerformanceData*)
GetPerformanceData(JSRuntime*);
typedef bool
(PerformanceStatsWalker)(JSContext* cx, const PerformanceData& stats, void* closure);
(PerformanceStatsWalker)(JSContext* cx, const PerformanceData& stats, uint64_t uid, void* closure);
/**
* Extract the performance statistics.

View File

@ -1652,7 +1652,7 @@ Debugger::slowPathOnNewGlobalObject(JSContext* cx, Handle<GlobalObject*> global)
/* static */ bool
Debugger::slowPathOnLogAllocationSite(JSContext* cx, HandleObject obj, HandleSavedFrame frame,
int64_t when, GlobalObject::DebuggerVector& dbgs)
double when, GlobalObject::DebuggerVector& dbgs)
{
MOZ_ASSERT(!dbgs.empty());
mozilla::DebugOnly<Debugger**> begin = dbgs.begin();
@ -1700,7 +1700,7 @@ Debugger::isDebuggee(const JSCompartment* compartment) const
}
/* static */ Debugger::AllocationSite*
Debugger::AllocationSite::create(JSContext* cx, HandleObject frame, int64_t when, HandleObject obj)
Debugger::AllocationSite::create(JSContext* cx, HandleObject frame, double when, HandleObject obj)
{
assertSameCompartment(cx, frame);
@ -1723,7 +1723,7 @@ Debugger::AllocationSite::create(JSContext* cx, HandleObject frame, int64_t when
bool
Debugger::appendAllocationSite(JSContext* cx, HandleObject obj, HandleSavedFrame frame,
int64_t when)
double when)
{
MOZ_ASSERT(trackingAllocationSites);

Some files were not shown because too many files have changed in this diff Show More