mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 16:55:40 +00:00
Merge m-c to inbound, a=merge
MozReview-Commit-ID: HfJqvXF2Ux7
This commit is contained in:
commit
5cba60441b
@ -1492,7 +1492,8 @@ var CustomizableUIInternal = {
|
||||
let anchor = aNode;
|
||||
if (area != CustomizableUI.AREA_PANEL) {
|
||||
let wrapper = this.wrapWidget(aWidget.id).forWindow(ownerWindow);
|
||||
if (wrapper && wrapper.anchor) {
|
||||
|
||||
if (wrapper && !wrapper.overflowed && wrapper.anchor) {
|
||||
this.hidePanelForNode(aNode);
|
||||
anchor = wrapper.anchor;
|
||||
}
|
||||
@ -4118,7 +4119,9 @@ OverflowableToolbar.prototype = {
|
||||
return new Promise(resolve => {
|
||||
let doc = this._panel.ownerDocument;
|
||||
this._panel.hidden = false;
|
||||
let contextMenu = doc.getElementById(this._panel.getAttribute("context"));
|
||||
let mainViewId = this._panel.querySelector("panelmultiview").getAttribute("mainViewId");
|
||||
let mainView = doc.getElementById(mainViewId);
|
||||
let contextMenu = doc.getElementById(mainView.getAttribute("context"));
|
||||
gELS.addSystemEventListener(contextMenu, "command", this, true);
|
||||
let anchor = doc.getAnonymousElementByAttribute(this._chevron, "class", "toolbarbutton-icon");
|
||||
this._panel.openPopup(anchor || this._chevron);
|
||||
|
@ -377,13 +377,17 @@
|
||||
role="group"
|
||||
type="arrow"
|
||||
noautofocus="true"
|
||||
context="toolbar-context-menu"
|
||||
position="bottomcenter topright"
|
||||
hidden="true">
|
||||
<vbox id="widget-overflow-scroller">
|
||||
<vbox id="widget-overflow-list" class="widget-overflow-list"
|
||||
overflowfortoolbar="nav-bar"/>
|
||||
</vbox>
|
||||
<panelmultiview mainViewId="widget-overflow-mainView">
|
||||
<panelview id="widget-overflow-mainView"
|
||||
context="toolbar-context-menu">
|
||||
<vbox id="widget-overflow-scroller">
|
||||
<vbox id="widget-overflow-list" class="widget-overflow-list"
|
||||
overflowfortoolbar="nav-bar"/>
|
||||
</vbox>
|
||||
</panelview>
|
||||
</panelmultiview>
|
||||
</panel>
|
||||
|
||||
<panel id="customization-tipPanel"
|
||||
|
@ -431,8 +431,9 @@ const PanelUI = {
|
||||
return;
|
||||
}
|
||||
|
||||
if (aPlacementArea == CustomizableUI.AREA_PANEL) {
|
||||
this.multiView.showSubView(aViewId, aAnchor);
|
||||
let container = aAnchor.closest("panelmultiview");
|
||||
if (container) {
|
||||
container.showSubView(aViewId, aAnchor);
|
||||
} else if (!aAnchor.open) {
|
||||
aAnchor.open = true;
|
||||
|
||||
|
@ -178,6 +178,14 @@
|
||||
<body><![CDATA[
|
||||
Task.spawn(function*() {
|
||||
let viewNode = this.querySelector("#" + aViewId);
|
||||
if (!viewNode) {
|
||||
viewNode = document.getElementById(aViewId);
|
||||
if (viewNode) {
|
||||
this._subViews.appendChild(viewNode);
|
||||
} else {
|
||||
throw new Error(`Subview ${aViewId} doesn't exist!`);
|
||||
}
|
||||
}
|
||||
viewNode.setAttribute("current", true);
|
||||
// Emit the ViewShowing event so that the widget definition has a chance
|
||||
// to lazily populate the subview with things.
|
||||
|
@ -149,6 +149,7 @@ skip-if = os == "mac"
|
||||
[browser_bootstrapped_custom_toolbar.js]
|
||||
[browser_customizemode_contextmenu_menubuttonstate.js]
|
||||
[browser_exit_background_customize_mode.js]
|
||||
[browser_overflow_use_subviews.js]
|
||||
[browser_panel_toggle.js]
|
||||
[browser_panelUINotifications.js]
|
||||
[browser_switch_to_customize_mode.js]
|
||||
|
@ -0,0 +1,69 @@
|
||||
"use strict";
|
||||
|
||||
const kOverflowPanel = document.getElementById("widget-overflow");
|
||||
|
||||
var gOriginalWidth;
|
||||
registerCleanupFunction(function*() {
|
||||
kOverflowPanel.removeAttribute("animate");
|
||||
window.resizeTo(gOriginalWidth, window.outerHeight);
|
||||
CustomizableUI.reset();
|
||||
});
|
||||
|
||||
/**
|
||||
* This checks that subview-compatible items show up as subviews rather than
|
||||
* re-anchored panels. If we ever remove the character encoding widget, please
|
||||
* replace this test with another subview - don't remove it.
|
||||
*/
|
||||
add_task(async function check_character_encoding_subview_in_overflow() {
|
||||
kOverflowPanel.setAttribute("animate", "false");
|
||||
gOriginalWidth = window.outerWidth;
|
||||
|
||||
CustomizableUI.addWidgetToArea("developer-button", CustomizableUI.AREA_NAVBAR);
|
||||
|
||||
let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
|
||||
ok(!navbar.hasAttribute("overflowing"), "Should start with a non-overflowing toolbar.");
|
||||
window.resizeTo(400, window.outerHeight);
|
||||
|
||||
await waitForCondition(() => navbar.hasAttribute("overflowing"));
|
||||
|
||||
let chevron = document.getElementById("nav-bar-overflow-button");
|
||||
let shownPanelPromise = promisePanelElementShown(window, kOverflowPanel);
|
||||
chevron.click();
|
||||
await shownPanelPromise;
|
||||
|
||||
let developerView = document.getElementById("PanelUI-developer");
|
||||
let button = document.getElementById("developer-button");
|
||||
let subviewShownPromise = subviewShown(developerView);
|
||||
button.click();
|
||||
await subviewShownPromise;
|
||||
is(developerView.closest("panel"), kOverflowPanel, "Should be inside the panel");
|
||||
kOverflowPanel.hidePopup();
|
||||
await Promise.resolve(); // wait for popup to hide fully.
|
||||
|
||||
CustomizableUI.reset();
|
||||
});
|
||||
|
||||
/**
|
||||
* This checks that non-subview-compatible items still work correctly.
|
||||
* Ideally we should make the downloads panel and bookmarks/library item
|
||||
* proper subview items, then this test can go away, and potentially we can
|
||||
* simplify some of the subview anchoring code.
|
||||
*/
|
||||
add_task(async function check_downloads_panel_in_overflow() {
|
||||
let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
|
||||
ok(navbar.hasAttribute("overflowing"), "Should still be overflowing");
|
||||
let chevron = document.getElementById("nav-bar-overflow-button");
|
||||
let shownPanelPromise = promisePanelElementShown(window, kOverflowPanel);
|
||||
chevron.click();
|
||||
await shownPanelPromise;
|
||||
|
||||
let button = document.getElementById("downloads-button");
|
||||
button.click();
|
||||
await waitForCondition(() => {
|
||||
let panel = document.getElementById("downloadsPanel");
|
||||
return panel && panel.state != "closed";
|
||||
});
|
||||
let downloadsPanel = document.getElementById("downloadsPanel");
|
||||
isnot(downloadsPanel.state, "closed", "Should be attempting to show the downloads panel.");
|
||||
downloadsPanel.hidePopup();
|
||||
});
|
@ -10,7 +10,8 @@
|
||||
- loaded as a stacked subdialog. -->
|
||||
<link rel="stylesheet" href="chrome://global/skin/in-content/common.css" />
|
||||
<link rel="stylesheet" href="chrome://browser/skin/preferences/in-content/dialog.css" />
|
||||
<link rel="stylesheet" href="chrome://formautofill/content/editProfile.css" />
|
||||
<link rel="stylesheet" href="chrome://formautofill-shared/skin/editProfile.css" />
|
||||
<link rel="stylesheet" href="chrome://formautofill/skin/editProfile.css" />
|
||||
<script src="chrome://formautofill/content/editProfile.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
@ -0,0 +1,5 @@
|
||||
/* 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/. */
|
||||
|
||||
/* Linux specific rules */
|
5
browser/extensions/formautofill/skin/osx/editProfile.css
Normal file
5
browser/extensions/formautofill/skin/osx/editProfile.css
Normal file
@ -0,0 +1,5 @@
|
||||
/* 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/. */
|
||||
|
||||
/* OSX specific rules */
|
12
browser/extensions/formautofill/skin/windows/editProfile.css
Normal file
12
browser/extensions/formautofill/skin/windows/editProfile.css
Normal file
@ -0,0 +1,12 @@
|
||||
/* 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/. */
|
||||
|
||||
/* The save button should be on the left and cancel on the right for Windows */
|
||||
#save {
|
||||
order: 0;
|
||||
}
|
||||
|
||||
#cancel {
|
||||
order: 1;
|
||||
}
|
@ -553,7 +553,7 @@ menuitem.bookmark-item {
|
||||
|
||||
/* Menu panel buttons */
|
||||
|
||||
%include ../shared/toolbarbuttons.inc.css
|
||||
%include ../shared/toolbarbutton-icons.inc.css
|
||||
%include ../shared/menupanel.inc.css
|
||||
|
||||
#main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon,
|
||||
|
@ -726,7 +726,7 @@ toolbar .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-ic
|
||||
-moz-box-align: center;
|
||||
}
|
||||
|
||||
%include ../shared/toolbarbuttons.inc.css
|
||||
%include ../shared/toolbarbutton-icons.inc.css
|
||||
%include ../shared/menupanel.inc.css
|
||||
|
||||
@media not all and (min-resolution: 1.1dppx) {
|
||||
|
@ -578,7 +578,7 @@ menuitem.bookmark-item {
|
||||
|
||||
/* ::::: primary toolbar buttons ::::: */
|
||||
|
||||
%include ../shared/toolbarbuttons.inc.css
|
||||
%include ../shared/toolbarbutton-icons.inc.css
|
||||
|
||||
#main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon,
|
||||
#main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-menu-dropmarker,
|
||||
|
@ -79,7 +79,6 @@ function loadTelemetryAndRecordLogs() {
|
||||
info("Mock the Telemetry log function to record logged information");
|
||||
|
||||
let Telemetry = require("devtools/client/shared/telemetry");
|
||||
|
||||
Telemetry.prototype.telemetryInfo = {};
|
||||
Telemetry.prototype._oldlog = Telemetry.prototype.log;
|
||||
Telemetry.prototype.log = function (histogramId, value) {
|
||||
@ -94,6 +93,8 @@ function loadTelemetryAndRecordLogs() {
|
||||
this.telemetryInfo[histogramId].push(value);
|
||||
}
|
||||
};
|
||||
Telemetry.prototype._oldlogScalar = Telemetry.prototype.logScalar;
|
||||
Telemetry.prototype.logScalar = Telemetry.prototype.log;
|
||||
Telemetry.prototype._oldlogKeyed = Telemetry.prototype.logKeyed;
|
||||
Telemetry.prototype.logKeyed = function (histogramId, key, value) {
|
||||
this.log(`${histogramId}|${key}`, value);
|
||||
@ -110,8 +111,10 @@ function loadTelemetryAndRecordLogs() {
|
||||
function stopRecordingTelemetryLogs(Telemetry) {
|
||||
info("Stopping Telemetry");
|
||||
Telemetry.prototype.log = Telemetry.prototype._oldlog;
|
||||
Telemetry.prototype.logScalar = Telemetry.prototype._oldlogScalar;
|
||||
Telemetry.prototype.logKeyed = Telemetry.prototype._oldlogKeyed;
|
||||
delete Telemetry.prototype._oldlog;
|
||||
delete Telemetry.prototype._oldlogScalar;
|
||||
delete Telemetry.prototype._oldlogKeyed;
|
||||
delete Telemetry.prototype.telemetryInfo;
|
||||
}
|
||||
|
@ -584,6 +584,8 @@ function loadTelemetryAndRecordLogs() {
|
||||
this.telemetryInfo[histogramId].push(value);
|
||||
}
|
||||
};
|
||||
Telemetry.prototype._oldlogScalar = Telemetry.prototype.logScalar;
|
||||
Telemetry.prototype.logScalar = Telemetry.prototype.log;
|
||||
Telemetry.prototype._oldlogKeyed = Telemetry.prototype.logKeyed;
|
||||
Telemetry.prototype.logKeyed = function (histogramId, key, value) {
|
||||
this.log(`${histogramId}|${key}`, value);
|
||||
@ -600,8 +602,10 @@ function loadTelemetryAndRecordLogs() {
|
||||
function stopRecordingTelemetryLogs(Telemetry) {
|
||||
info("Stopping Telemetry");
|
||||
Telemetry.prototype.log = Telemetry.prototype._oldlog;
|
||||
Telemetry.prototype.logScalar = Telemetry.prototype._oldlogScalar;
|
||||
Telemetry.prototype.logKeyed = Telemetry.prototype._oldlogKeyed;
|
||||
delete Telemetry.prototype._oldlog;
|
||||
delete Telemetry.prototype._oldlogScalar;
|
||||
delete Telemetry.prototype._oldlogKeyed;
|
||||
delete Telemetry.prototype.telemetryInfo;
|
||||
}
|
||||
|
@ -6,6 +6,8 @@ http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
// Test that the various copy items in the context menu works correctly.
|
||||
|
||||
const TEST_URL = URL_ROOT + "doc_inspector_menu.html";
|
||||
const SELECTOR_UNIQUE = "devtools.copy.unique.css.selector.opened";
|
||||
const SELECTOR_FULL = "devtools.copy.full.css.selector.opened";
|
||||
const COPY_ITEMS_TEST_DATA = [
|
||||
{
|
||||
desc: "copy inner html",
|
||||
@ -26,7 +28,7 @@ const COPY_ITEMS_TEST_DATA = [
|
||||
text: "body > div:nth-child(1) > p:nth-child(2)",
|
||||
},
|
||||
{
|
||||
desc: "copy css path",
|
||||
desc: "copy CSS path",
|
||||
id: "node-menu-copycsspath",
|
||||
selector: "[data-id=\"copy\"]",
|
||||
text: "html body div p",
|
||||
@ -41,7 +43,9 @@ const COPY_ITEMS_TEST_DATA = [
|
||||
];
|
||||
|
||||
add_task(function* () {
|
||||
let Telemetry = loadTelemetryAndRecordLogs();
|
||||
let { inspector } = yield openInspectorForURL(TEST_URL);
|
||||
|
||||
for (let {desc, id, selector, text} of COPY_ITEMS_TEST_DATA) {
|
||||
info("Testing " + desc);
|
||||
yield selectNode(selector, inspector);
|
||||
@ -52,4 +56,32 @@ add_task(function* () {
|
||||
|
||||
yield waitForClipboardPromise(() => item.click(), text);
|
||||
}
|
||||
|
||||
checkTelemetryResults(Telemetry);
|
||||
stopRecordingTelemetryLogs(Telemetry);
|
||||
});
|
||||
|
||||
function checkTelemetryResults(Telemetry) {
|
||||
let data = Telemetry.prototype.telemetryInfo;
|
||||
let results = new Map();
|
||||
|
||||
for (let key in data) {
|
||||
if (key.toLowerCase() === key) {
|
||||
let pings = data[key].length;
|
||||
|
||||
results.set(key, pings);
|
||||
}
|
||||
}
|
||||
|
||||
is(results.size, 2, "The correct number of scalars were logged");
|
||||
|
||||
let pings = checkPings(SELECTOR_UNIQUE, results);
|
||||
is(pings, 1, `${SELECTOR_UNIQUE} has just 1 ping`);
|
||||
|
||||
pings = checkPings(SELECTOR_FULL, results);
|
||||
is(pings, 1, `${SELECTOR_FULL} has just 1 ping`);
|
||||
}
|
||||
|
||||
function checkPings(scalarId, results) {
|
||||
return results.get(scalarId);
|
||||
}
|
||||
|
@ -11,7 +11,6 @@
|
||||
# A good criteria is the language in which you'd find the best
|
||||
# documentation on web development on the web.
|
||||
|
||||
|
||||
# LOCALIZATION NOTE (responsiveUI.rotate2): tooltip of the rotate button.
|
||||
responsiveUI.rotate2=Rotate
|
||||
|
||||
@ -67,3 +66,13 @@ responsiveUI.notificationReload=Reload
|
||||
responsiveUI.notificationReload_accesskey=R
|
||||
responsiveUI.dontShowReloadNotification=Never show again
|
||||
responsiveUI.dontShowReloadNotification_accesskey=N
|
||||
|
||||
# LOCALIZATION NOTE (responsiveUI.newVersionUserDisabled): notification that appears
|
||||
# when old RDM is displayed because the user has disabled new RDM.
|
||||
responsiveUI.newVersionUserDisabled=A new version of Responsive Design Mode is available, but it appears to be disabled. Please enable it and provide feedback, as this version will be removed.
|
||||
# LOCALIZATION NOTE (responsiveUI.newVersionE10sDisabled): notification that appears
|
||||
# when old RDM is displayed because e10s is disabled.
|
||||
responsiveUI.newVersionE10sDisabled=A new version of Responsive Design Mode is available, but it requires multi-process mode, which is currently disabled. Please enable it and provide feedback, as this version will be removed.
|
||||
# LOCALIZATION NOTE (responsiveUI.newVersionEnableAndRestart): button text in notification
|
||||
# to enable new RDM itself or e10s as a prerequisite for new RDM.
|
||||
responsiveUI.newVersionEnableAndRestart=Enable and Restart
|
@ -14,6 +14,8 @@ const EventEmitter = require("devtools/shared/event-emitter");
|
||||
|
||||
loader.lazyImporter(this, "SystemAppProxy",
|
||||
"resource://gre/modules/SystemAppProxy.jsm");
|
||||
loader.lazyImporter(this, "BrowserUtils",
|
||||
"resource://gre/modules/BrowserUtils.jsm");
|
||||
loader.lazyRequireGetter(this, "Telemetry", "devtools/client/shared/telemetry");
|
||||
loader.lazyRequireGetter(this, "showDoorhanger",
|
||||
"devtools/client/shared/doorhanger", true);
|
||||
@ -27,9 +29,12 @@ loader.lazyRequireGetter(this, "DebuggerClient",
|
||||
"devtools/shared/client/main", true);
|
||||
loader.lazyRequireGetter(this, "DebuggerServer",
|
||||
"devtools/server/main", true);
|
||||
loader.lazyRequireGetter(this, "system", "devtools/shared/system");
|
||||
|
||||
this.EXPORTED_SYMBOLS = ["ResponsiveUIManager"];
|
||||
|
||||
const NEW_RDM_ENABLED = "devtools.responsive.html.enabled";
|
||||
|
||||
const MIN_WIDTH = 50;
|
||||
const MIN_HEIGHT = 50;
|
||||
|
||||
@ -136,7 +141,7 @@ EventEmitter.decorate(Manager);
|
||||
// the new HTML RDM UI to function), delegate the ResponsiveUIManager API over to that
|
||||
// tool instead. Performing this delegation here allows us to contain the pref check to a
|
||||
// single place.
|
||||
if (Services.prefs.getBoolPref("devtools.responsive.html.enabled") &&
|
||||
if (Services.prefs.getBoolPref(NEW_RDM_ENABLED) &&
|
||||
Services.appinfo.browserTabsRemoteAutostart) {
|
||||
let { ResponsiveUIManager } =
|
||||
require("devtools/client/responsive.html/manager");
|
||||
@ -266,6 +271,8 @@ ResponsiveUI.prototype = {
|
||||
anchor: this.chromeDoc.querySelector("#content")
|
||||
});
|
||||
|
||||
this.showNewUINotification();
|
||||
|
||||
// Notify that responsive mode is on.
|
||||
this._telemetry.toolOpened("responsive");
|
||||
ResponsiveUIManager.emit("on", { tab: this.tab });
|
||||
@ -399,12 +406,14 @@ ResponsiveUI.prototype = {
|
||||
|
||||
this._telemetry.toolClosed("responsive");
|
||||
|
||||
if (this.tab.linkedBrowser.messageManager) {
|
||||
if (this.tab.linkedBrowser && this.tab.linkedBrowser.messageManager) {
|
||||
let stopped = this.waitForMessage("ResponsiveMode:Stop:Done");
|
||||
this.tab.linkedBrowser.messageManager.sendAsyncMessage("ResponsiveMode:Stop");
|
||||
yield stopped;
|
||||
}
|
||||
|
||||
this.hideNewUINotification();
|
||||
|
||||
this.inited = null;
|
||||
ResponsiveUIManager.emit("off", { tab: this.tab });
|
||||
}),
|
||||
@ -683,6 +692,69 @@ ResponsiveUI.prototype = {
|
||||
this.container.appendChild(bottomToolbar);
|
||||
},
|
||||
|
||||
showNewUINotification() {
|
||||
let nbox = this.mainWindow.gBrowser.getNotificationBox(this.browser);
|
||||
|
||||
// One reason we might be using old RDM is that the user explcitly disabled new RDM.
|
||||
// We should encourage them to use the new one, since the old one will be removed.
|
||||
if (Services.prefs.prefHasUserValue(NEW_RDM_ENABLED) &&
|
||||
!Services.prefs.getBoolPref(NEW_RDM_ENABLED)) {
|
||||
let buttons = [{
|
||||
label: this.strings.GetStringFromName("responsiveUI.newVersionEnableAndRestart"),
|
||||
callback: () => {
|
||||
Services.prefs.setBoolPref(NEW_RDM_ENABLED, true);
|
||||
BrowserUtils.restartApplication();
|
||||
},
|
||||
}];
|
||||
nbox.appendNotification(
|
||||
this.strings.GetStringFromName("responsiveUI.newVersionUserDisabled"),
|
||||
"responsive-ui-new-version-user-disabled",
|
||||
null,
|
||||
nbox.PRIORITY_INFO_LOW,
|
||||
buttons
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// Only show a notification about the new RDM UI on channels where there is an e10s
|
||||
// switch in the preferences UI (Dev. Ed, Nightly). On other channels, it is less
|
||||
// clear how a user would proceed here, so don't show a message.
|
||||
if (!system.constants.E10S_TESTING_ONLY) {
|
||||
return;
|
||||
}
|
||||
|
||||
let buttons = [{
|
||||
label: this.strings.GetStringFromName("responsiveUI.newVersionEnableAndRestart"),
|
||||
callback: () => {
|
||||
Services.prefs.setBoolPref("browser.tabs.remote.autostart", true);
|
||||
Services.prefs.setBoolPref("browser.tabs.remote.autostart.2", true);
|
||||
BrowserUtils.restartApplication();
|
||||
},
|
||||
}];
|
||||
nbox.appendNotification(
|
||||
this.strings.GetStringFromName("responsiveUI.newVersionE10sDisabled"),
|
||||
"responsive-ui-new-version-e10s-disabled",
|
||||
null,
|
||||
nbox.PRIORITY_INFO_LOW,
|
||||
buttons
|
||||
);
|
||||
},
|
||||
|
||||
hideNewUINotification() {
|
||||
if (!this.mainWindow.gBrowser || !this.mainWindow.gBrowser.getNotificationBox) {
|
||||
return;
|
||||
}
|
||||
let nbox = this.mainWindow.gBrowser.getNotificationBox(this.browser);
|
||||
let n = nbox.getNotificationWithValue("responsive-ui-new-version-user-disabled");
|
||||
if (n) {
|
||||
n.close();
|
||||
}
|
||||
n = nbox.getNotificationWithValue("responsive-ui-new-version-e10s-disabled");
|
||||
if (n) {
|
||||
n.close();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Validate and apply any user input on the editable menulist
|
||||
*/
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -69,7 +69,3 @@ function testRepRenderModes(modeTests, testName, componentUnderTest, gripStub,
|
||||
is(rendered.textContent, expectedOutput, message);
|
||||
});
|
||||
}
|
||||
|
||||
function getStubAttachedActorIds(gripStubs) {
|
||||
return gripStubs.map(gripStub => gripStub.actor);
|
||||
}
|
||||
|
@ -20,8 +20,12 @@ Test ArrayRep rep
|
||||
/* import-globals-from head.js */
|
||||
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS, MODE } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, ArrayRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { ArrayRep } = REPS;
|
||||
|
||||
let componentUnderTest = ArrayRep;
|
||||
const maxLength = {
|
||||
@ -52,9 +56,7 @@ window.onload = Task.async(function* () {
|
||||
function testBasic() {
|
||||
// Test that correct rep is chosen
|
||||
const stub = [];
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ArrayRep.rep,
|
||||
`Rep correctly selects ${ArrayRep.rep.displayName}`);
|
||||
is(getRep(stub), ArrayRep.rep, "Rep correctly selects Array Rep");
|
||||
|
||||
|
||||
// Test rendering
|
||||
|
@ -17,8 +17,11 @@ Test Attribute rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Attribute } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Attribute } = REPS;
|
||||
|
||||
try {
|
||||
testBasic();
|
||||
@ -31,8 +34,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testBasic() {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getStub() });
|
||||
is(renderedRep.type, Attribute.rep, `Rep correctly selects ${Attribute.rep.displayName}`);
|
||||
is(getRep(getStub()), Attribute.rep, "Rep correctly selects Attribute Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(Attribute.rep, { object: getStub() });
|
||||
|
@ -20,8 +20,12 @@ Test comment-node rep
|
||||
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const { REPS, MODE } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, CommentNode } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { CommentNode } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "object",
|
||||
@ -40,9 +44,7 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, CommentNode.rep,
|
||||
`Rep correctly selects ${CommentNode.rep.displayName}`);
|
||||
is(getRep(gripStub), CommentNode.rep, "Rep correctly selects CommentNode Rep");
|
||||
|
||||
// Test rendering.
|
||||
const renderedComponent = renderComponent(CommentNode.rep, { object: gripStub });
|
||||
|
@ -17,8 +17,11 @@ Test DateTime rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, DateTime } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { DateTime } = REPS;
|
||||
|
||||
try {
|
||||
testValid();
|
||||
@ -45,12 +48,11 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, DateTime.rep, `Rep correctly selects ${DateTime.rep.displayName}`);
|
||||
is(getRep(gripStub), DateTime.rep, "Rep correctly selects DateTime Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(DateTime.rep, { object: gripStub });
|
||||
is(renderedComponent.textContent, "2016-03-30T21:17:24.859Z", "DateTime rep has expected text content for valid date");
|
||||
is(renderedComponent.textContent, "Date 2016-03-30T21:17:24.859Z", "DateTime rep has expected text content for valid date");
|
||||
}
|
||||
|
||||
function testInvalid() {
|
||||
|
@ -17,8 +17,11 @@ Test Document rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Document } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Document } = REPS;
|
||||
|
||||
try {
|
||||
testBasic();
|
||||
@ -31,12 +34,11 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testBasic() {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getStub() });
|
||||
is(renderedRep.type, Document.rep, `Rep correctly selects ${Document.rep.displayName}`);
|
||||
is(getRep(getStub()), Document.rep, "Rep correctly selects Document Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(Document.rep, { object: getStub() });
|
||||
is(renderedComponent.textContent, "https://www.mozilla.org/en-US/firefox/new/",
|
||||
is(renderedComponent.textContent, "HTMLDocument https://www.mozilla.org/en-US/firefox/new/",
|
||||
"Document rep has expected text content");
|
||||
}
|
||||
|
||||
|
@ -22,9 +22,10 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, ElementNode } = REPS;
|
||||
let { ElementNode } = REPS;
|
||||
|
||||
try {
|
||||
yield testBodyNode();
|
||||
@ -48,9 +49,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testBodyNode() {
|
||||
const stub = getGripStub("testBodyNode");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ElementNode.rep,
|
||||
`Rep correctly selects ${ElementNode.rep.displayName} for body node`);
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
"Rep correctly selects ElementNode Rep for body node");
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
is(renderedComponent.textContent, `<body id="body-id" class="body-class">`,
|
||||
@ -64,9 +64,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testDocumentElement() {
|
||||
const stub = getGripStub("testDocumentElement");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ElementNode.rep,
|
||||
`Rep correctly selects ${ElementNode.rep.displayName} for document element node`);
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
"Rep correctly selects ElementNode Rep for document element node");
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
is(renderedComponent.textContent, `<html dir="ltr" lang="en-US">`,
|
||||
@ -80,9 +79,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testNode() {
|
||||
const stub = getGripStub("testNode");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ElementNode.rep,
|
||||
`Rep correctly selects ${ElementNode.rep.displayName} for element node`);
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
"Rep correctly selects ElementNode Rep for element node");
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
is(renderedComponent.textContent,
|
||||
@ -99,9 +97,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testNodeWithLeadingAndTrailingSpacesClassName() {
|
||||
const stub = getGripStub("testNodeWithLeadingAndTrailingSpacesClassName");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ElementNode.rep,
|
||||
`Rep correctly selects ${ElementNode.rep.displayName} for element node`);
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
"Rep correctly selects ElementNode Rep for element node");
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
is(renderedComponent.textContent,
|
||||
@ -119,8 +116,7 @@ window.onload = Task.async(function* () {
|
||||
function testNodeWithoutAttributes() {
|
||||
const stub = getGripStub("testNodeWithoutAttributes");
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
is(renderedComponent.textContent, "<p>",
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
"Element node rep has expected text content for element node without attributes");
|
||||
|
||||
const tinyRenderedComponent = renderComponent(
|
||||
@ -147,8 +143,7 @@ window.onload = Task.async(function* () {
|
||||
function testSvgNode() {
|
||||
const stub = getGripStub("testSvgNode");
|
||||
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ElementNode.rep,
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
`Rep correctly selects ${ElementNode.rep.displayName} for SVG element node`);
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
@ -165,8 +160,7 @@ window.onload = Task.async(function* () {
|
||||
function testSvgNodeInXHTML() {
|
||||
const stub = getGripStub("testSvgNodeInXHTML");
|
||||
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, ElementNode.rep,
|
||||
is(getRep(stub), ElementNode.rep,
|
||||
`Rep correctly selects ${ElementNode.rep.displayName} for XHTML SVG element node`);
|
||||
|
||||
const renderedComponent = renderComponent(ElementNode.rep, { object: stub });
|
||||
@ -182,12 +176,9 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testOnMouseOver() {
|
||||
const stub = getGripStub("testNode");
|
||||
debugger;
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let mouseOverValue;
|
||||
let onDOMNodeMouseOver = (object) => {
|
||||
mouseOverValue = object;
|
||||
@ -195,7 +186,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(ElementNode.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
TestUtils.Simulate.mouseOver(renderedComponent);
|
||||
@ -209,8 +199,6 @@ window.onload = Task.async(function* () {
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let called = false;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
called = true;
|
||||
@ -218,7 +206,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(ElementNode.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
TestUtils.Simulate.mouseOut(renderedComponent);
|
||||
@ -231,8 +218,6 @@ window.onload = Task.async(function* () {
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let inspectIconClickedValue = null;
|
||||
let inspectIconClickedEvent = null;
|
||||
|
||||
@ -242,28 +227,18 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
const renderedComponentWithoutInspectIcon = renderComponent(ElementNode.rep, {
|
||||
object: stub,
|
||||
object: getGripStub("testDisconnectedNode"),
|
||||
onInspectIconClick,
|
||||
attachedActorIds: ["someOtherId"]
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when actor is not in attachedActorIds");
|
||||
"There isn't an inspect icon when the node is not in the DOM tree");
|
||||
|
||||
let renderedComponent = renderComponent(ElementNode.rep, {
|
||||
const renderedComponent = renderComponent(ElementNode.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
});
|
||||
let inspectIconNode = renderedComponent.querySelector(".open-inspector");
|
||||
ok(inspectIconNode !== null,
|
||||
"There is an inspect icon when attachedActorIds is not specified");
|
||||
|
||||
renderedComponent = renderComponent(ElementNode.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
inspectIconNode = renderedComponent.querySelector(".open-inspector");
|
||||
const inspectIconNode = renderedComponent.querySelector(".open-inspector");
|
||||
ok(inspectIconNode !== null, "There is an inspect icon as expected");
|
||||
TestUtils.Simulate.click(inspectIconNode);
|
||||
|
||||
@ -345,6 +320,32 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "input",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "newtab-customize-button",
|
||||
"dir": "ltr",
|
||||
"title": "Customize your New Tab page",
|
||||
"class": "bar baz",
|
||||
"value": "foo",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 6
|
||||
}
|
||||
};
|
||||
case "testDisconnectedNode":
|
||||
return {
|
||||
"type": "object",
|
||||
"actor": "server1.conn2.child1/obj116",
|
||||
"class": "HTMLInputElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "input",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "newtab-customize-button",
|
||||
"dir": "ltr",
|
||||
|
@ -19,8 +19,12 @@ Test Error rep
|
||||
"use strict";
|
||||
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS, MODE } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, ErrorRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { ErrorRep } = REPS;
|
||||
|
||||
try {
|
||||
// Test errors with different properties
|
||||
@ -47,9 +51,7 @@ window.onload = Task.async(function* () {
|
||||
function testSimpleError() {
|
||||
// Test object = `new Error("Error message")`
|
||||
const stub = getGripStub("testSimpleError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for Error object`);
|
||||
is(getRep(stub), ErrorRep.rep, "Rep correctly selects Error Rep for Error object");
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -77,9 +79,8 @@ window.onload = Task.async(function* () {
|
||||
* errorFoo();`
|
||||
*/
|
||||
const stub = getGripStub("testMultilineStackError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for Error object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for Error object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -99,9 +100,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testErrorWithoutStacktrace() {
|
||||
const stub = getGripStub("testErrorWithoutStacktrace");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for Error object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for Error object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -118,9 +118,8 @@ window.onload = Task.async(function* () {
|
||||
function testEvalError() {
|
||||
// Test object = `new EvalError("EvalError message")`
|
||||
const stub = getGripStub("testEvalError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for EvalError object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for EvalError object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -139,9 +138,8 @@ window.onload = Task.async(function* () {
|
||||
function testInternalError() {
|
||||
// Test object = `new InternalError("InternalError message")`
|
||||
const stub = getGripStub("testInternalError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for InternalError object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for InternalError object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -160,9 +158,8 @@ window.onload = Task.async(function* () {
|
||||
function testRangeError() {
|
||||
// Test object = `new RangeError("RangeError message")`
|
||||
const stub = getGripStub("testRangeError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for RangeError object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for RangeError object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -181,9 +178,8 @@ window.onload = Task.async(function* () {
|
||||
function testReferenceError() {
|
||||
// Test object = `new ReferenceError("ReferenceError message"`
|
||||
const stub = getGripStub("testReferenceError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for ReferenceError object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for ReferenceError object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -202,9 +198,8 @@ window.onload = Task.async(function* () {
|
||||
function testSyntaxError() {
|
||||
// Test object = `new SyntaxError("SyntaxError message"`
|
||||
const stub = getGripStub("testSyntaxError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for SyntaxError object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for SyntaxError object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -223,9 +218,8 @@ window.onload = Task.async(function* () {
|
||||
function testTypeError() {
|
||||
// Test object = `new TypeError("TypeError message"`
|
||||
const stub = getGripStub("testTypeError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for TypeError`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for TypeError`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
@ -244,9 +238,8 @@ window.onload = Task.async(function* () {
|
||||
function testURIError() {
|
||||
// Test object = `new URIError("URIError message")`
|
||||
const stub = getGripStub("testURIError");
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, ErrorRep.rep,
|
||||
`Rep correctly selects ${ErrorRep.rep.displayName} for URIError object`);
|
||||
is(getRep(stub), ErrorRep.rep,
|
||||
`Rep correctly selects Error Rep for URIError object`);
|
||||
|
||||
const renderedComponent = renderComponent(ErrorRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent,
|
||||
|
@ -20,14 +20,14 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Event } = REPS;
|
||||
let { Event } = REPS;
|
||||
|
||||
try {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getGripStub("testEvent") });
|
||||
is(renderedRep.type, Event.rep, `Rep correctly selects ${Event.rep.displayName}`);
|
||||
is(getRep(getGripStub("testEvent")), Event.rep, "Rep correctly selects Event Rep");
|
||||
|
||||
yield testEvent();
|
||||
yield testMouseEvent();
|
||||
@ -129,8 +129,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let mouseOverValue;
|
||||
let onDOMNodeMouseOver = (object) => {
|
||||
mouseOverValue = object;
|
||||
@ -138,7 +136,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(Event.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const node = renderedComponent.querySelector(".objectBox-node");
|
||||
@ -153,8 +150,6 @@ window.onload = Task.async(function* () {
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let called = false;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
called = true;
|
||||
@ -162,7 +157,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(Event.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds
|
||||
});
|
||||
|
||||
const node = renderedComponent.querySelector(".objectBox-node");
|
||||
@ -176,34 +170,19 @@ window.onload = Task.async(function* () {
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let inspectIconClickedValue = null;
|
||||
let onInspectIconClick = (object) => {
|
||||
inspectIconClickedValue = object;
|
||||
};
|
||||
|
||||
let renderedComponentWithoutInspectIcon = renderComponent(Event.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds: ["someOtherId"]
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when the actor is not in attachedActorIds");
|
||||
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when attachedActorIds does not have keys " +
|
||||
"matching grip event's target item");
|
||||
|
||||
const renderedComponent = renderComponent(Event.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds
|
||||
});
|
||||
|
||||
const icon = renderedComponent.querySelector(".open-inspector");
|
||||
ok(icon !== null, "There is an icon as expected when passing a matching " +
|
||||
"attachedActorIds item");
|
||||
ok(icon !== null,
|
||||
"There is an inspect icon when the node is connected to the DOM tree");
|
||||
|
||||
TestUtils.Simulate.click(icon);
|
||||
|
||||
@ -344,6 +323,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "div",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "test"
|
||||
},
|
||||
|
@ -18,8 +18,11 @@ Test fallback for rep rendering when a rep fails to render.
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, ArrayRep, RegExp } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { ArrayRep, RegExp } = REPS;
|
||||
|
||||
// Force the RegExp rep to crash by creating RegExp grip that throws when accessing
|
||||
// the displayString property
|
||||
@ -37,8 +40,7 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, RegExp.rep, `Rep correctly selects ${RegExp.rep.displayName}`);
|
||||
is(getRep(gripStub), RegExp.rep, "Rep correctly selects RegExp Rep");
|
||||
|
||||
// Test fallback message is displayed when rendering bad rep directly.
|
||||
let renderedComponent = renderComponent(RegExp.rep, { object: gripStub });
|
||||
|
@ -17,16 +17,19 @@ Test Func rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS, MODE } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Func } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Func } = REPS;
|
||||
|
||||
const componentUnderTest = Func;
|
||||
|
||||
try {
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub("testNamed");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Func.rep, `Rep correctly selects ${Func.rep.displayName}`);
|
||||
is(getRep(gripStub), Func.rep, "Rep correctly selects Func Rep");
|
||||
|
||||
yield testNamed();
|
||||
yield testVarNamed();
|
||||
|
@ -20,9 +20,10 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, GripArray } = REPS;
|
||||
let { GripArray } = REPS;
|
||||
|
||||
let componentUnderTest = GripArray;
|
||||
const maxLength = {
|
||||
@ -60,8 +61,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub("testBasic");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, GripArray.rep, `Rep correctly selects ${GripArray.rep.displayName}`);
|
||||
is(getRep(gripStub), GripArray.rep, "Rep correctly selects GripArray Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Array []`;
|
||||
@ -328,8 +328,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
is(grips.length, 3, "the stub has three node grips");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let mouseOverValue;
|
||||
let onDOMNodeMouseOver = (object) => {
|
||||
mouseOverValue = object;
|
||||
@ -337,7 +335,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(GripArray.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const nodes = renderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -357,8 +354,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
is(grips.length, 3, "the stub has three node grips");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let called = 0;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
called++;
|
||||
@ -366,7 +361,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(GripArray.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const nodes = renderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -377,35 +371,30 @@ window.onload = Task.async(function* () {
|
||||
}
|
||||
|
||||
function testOnDomNodeInspectIconClick() {
|
||||
const stub = getGripStub("testNodeList");
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
|
||||
is(grips.length, 3, "the stub has three node grips");
|
||||
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let inspectIconClickedValue = null;
|
||||
let onInspectIconClick = (object) => {
|
||||
inspectIconClickedValue = object;
|
||||
};
|
||||
|
||||
let renderedComponentWithoutInspectIcon = renderComponent(GripArray.rep, {
|
||||
object: stub,
|
||||
object: getGripStub("testDisconnectedNodeList"),
|
||||
onInspectIconClick,
|
||||
attachedActorIds: ["someOtherId"],
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when the actor is not in attachedActorIds");
|
||||
"There isn't an inspect icon when the nodes are not connected to the DOM tree");
|
||||
|
||||
const stub = getGripStub("testNodeList");
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
|
||||
is(grips.length, 3, "the stub has three node grips");
|
||||
const renderedComponent = renderComponent(GripArray.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const icons = renderedComponent.querySelectorAll(".open-inspector");
|
||||
is(icons.length, grips.length,
|
||||
"There is an icon for each grip array item with a matching attachedNodeFront");
|
||||
"There is an icon for each node connected to the DOM tree");
|
||||
|
||||
icons.forEach((icon, index) => {
|
||||
TestUtils.Simulate.click(icon);
|
||||
@ -678,6 +667,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
@ -698,6 +688,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-2",
|
||||
"class": "btn btn-err",
|
||||
@ -718,6 +709,87 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-3",
|
||||
"class": "btn btn-count",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
case "testDisconnectedNodeList":
|
||||
return {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj51",
|
||||
"class": "NodeList",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 3,
|
||||
"preview": {
|
||||
"kind": "ArrayLike",
|
||||
"length": 3,
|
||||
"items": [
|
||||
{
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj52",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj53",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-2",
|
||||
"class": "btn btn-err",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj54",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-3",
|
||||
"class": "btn btn-count",
|
||||
|
@ -22,9 +22,10 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, GripMap } = REPS;
|
||||
let { GripMap } = REPS;
|
||||
|
||||
const componentUnderTest = GripMap;
|
||||
|
||||
@ -55,8 +56,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub("testEmptyMap");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, GripMap.rep, `Rep correctly selects ${GripMap.rep.displayName}`);
|
||||
is(getRep(gripStub), GripMap.rep, "Rep correctly selects GripMap Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Map { }`;
|
||||
@ -118,8 +118,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub("testWeakMap");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, GripMap.rep, `Rep correctly selects ${GripMap.rep.displayName}`);
|
||||
is(getRep(gripStub), GripMap.rep, "Rep correctly selects GripMap Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `WeakMap { Object: "value-a" }`;
|
||||
@ -254,11 +253,9 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const valuesGrips = getSelectableInInspectorGrips(nodeValuedStub);
|
||||
is(valuesGrips.length, 3, "the stub has three node grips");
|
||||
const valuesattachedActorIds = getStubAttachedActorIds(valuesGrips);
|
||||
|
||||
const keysGrips = getSelectableInInspectorGrips(nodeKeyedStub);
|
||||
is(keysGrips.length, 3, "the stub has three node grips");
|
||||
const keysAttachedActorIds = getStubAttachedActorIds(keysGrips);
|
||||
|
||||
let mouseOverValue;
|
||||
let onDOMNodeMouseOver = (object) => {
|
||||
@ -269,7 +266,6 @@ window.onload = Task.async(function* () {
|
||||
const nodeValuedRenderedComponent = renderComponent(GripMap.rep, {
|
||||
object: nodeValuedStub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds: valuesattachedActorIds,
|
||||
});
|
||||
|
||||
let nodes = nodeValuedRenderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -284,7 +280,6 @@ window.onload = Task.async(function* () {
|
||||
const nodeKeyedRenderedComponent = renderComponent(GripMap.rep, {
|
||||
object: nodeKeyedStub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds: keysAttachedActorIds,
|
||||
});
|
||||
|
||||
nodes = nodeKeyedRenderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -302,11 +297,9 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const valuesGrips = getSelectableInInspectorGrips(nodeValuedStub);
|
||||
is(valuesGrips.length, 3, "the stub has three node grips");
|
||||
const valuesattachedActorIds = getStubAttachedActorIds(valuesGrips);
|
||||
|
||||
const keysGrips = getSelectableInInspectorGrips(nodeKeyedStub);
|
||||
is(keysGrips.length, 3, "the stub has three node grips");
|
||||
const keysAttachedActorIds = getStubAttachedActorIds(keysGrips);
|
||||
|
||||
let called = 0;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
@ -317,7 +310,6 @@ window.onload = Task.async(function* () {
|
||||
const nodeValuedRenderedComponent = renderComponent(GripMap.rep, {
|
||||
object: nodeValuedStub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds: valuesattachedActorIds,
|
||||
});
|
||||
|
||||
let nodes = nodeValuedRenderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -330,7 +322,6 @@ window.onload = Task.async(function* () {
|
||||
const nodeKeyedRenderedComponent = renderComponent(GripMap.rep, {
|
||||
object: nodeKeyedStub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds: keysAttachedActorIds,
|
||||
});
|
||||
|
||||
nodes = nodeKeyedRenderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -348,11 +339,9 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const valuesGrips = getSelectableInInspectorGrips(nodeValuedStub);
|
||||
is(valuesGrips.length, 3, "the stub has three node grips");
|
||||
const valuesattachedActorIds = getStubAttachedActorIds(valuesGrips);
|
||||
|
||||
const keysGrips = getSelectableInInspectorGrips(nodeKeyedStub);
|
||||
is(keysGrips.length, 3, "the stub has three node grips");
|
||||
const keysAttachedActorIds = getStubAttachedActorIds(keysGrips);
|
||||
|
||||
let inspectIconClickedValue = null;
|
||||
let onInspectIconClick = (object) => {
|
||||
@ -360,23 +349,21 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
const renderedComponentWithoutInspectIcon = renderComponent(GripMap.rep, {
|
||||
object: nodeValuedStub,
|
||||
object: getGripStub("testDisconnectedNodeValuedMap"),
|
||||
onInspectIconClick,
|
||||
attachedActorIds: [],
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when the actor is not in attachedActorIds");
|
||||
"There isn't an inspect icon when nodes are not connected to the DOM tree");
|
||||
|
||||
info("Testing onInspectIconClick on node valued Map");
|
||||
const nodeValuedRenderedComponent = renderComponent(GripMap.rep, {
|
||||
object: nodeValuedStub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds: valuesattachedActorIds,
|
||||
});
|
||||
|
||||
let icons = nodeValuedRenderedComponent.querySelectorAll(".open-inspector");
|
||||
is(icons.length, valuesGrips.length,
|
||||
"There is an icon for each map value with a matching attachedNodeFront");
|
||||
"There is an icon for each node connected to the DOM tree");
|
||||
|
||||
icons.forEach((icon, index) => {
|
||||
TestUtils.Simulate.click(icon);
|
||||
@ -388,12 +375,11 @@ window.onload = Task.async(function* () {
|
||||
const nodeKeyedRenderedComponent = renderComponent(GripMap.rep, {
|
||||
object: nodeKeyedStub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds: keysAttachedActorIds,
|
||||
});
|
||||
|
||||
icons = nodeKeyedRenderedComponent.querySelectorAll(".open-inspector");
|
||||
is(icons.length, keysGrips.length,
|
||||
"There is an icon for each map key with a matching attachedNodeFront");
|
||||
"There is an icon for each node connected to the DOM tree");
|
||||
|
||||
icons.forEach((icon, index) => {
|
||||
TestUtils.Simulate.click(icon);
|
||||
@ -607,6 +593,92 @@ window.onload = Task.async(function* () {
|
||||
}
|
||||
};
|
||||
|
||||
case "testDisconnectedNodeValuedMap":
|
||||
return {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj213",
|
||||
"class": "Map",
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "MapLike",
|
||||
"size": 3,
|
||||
"entries": [
|
||||
[
|
||||
"item-0",
|
||||
{
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj214",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
"item-1",
|
||||
{
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj215",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-2",
|
||||
"class": "btn btn-err",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
"item-2",
|
||||
{
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj216",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-3",
|
||||
"class": "btn btn-count",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
case "testNodeValuedMap":
|
||||
return {
|
||||
"type": "object",
|
||||
@ -631,6 +703,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
@ -654,6 +727,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-2",
|
||||
"class": "btn btn-err",
|
||||
@ -677,6 +751,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-3",
|
||||
"class": "btn btn-count",
|
||||
@ -713,6 +788,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
@ -736,6 +812,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-3",
|
||||
"class": "btn btn-count",
|
||||
@ -759,6 +836,7 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-2",
|
||||
"class": "btn btn-err",
|
||||
|
@ -20,9 +20,10 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Grip } = REPS;
|
||||
let { Grip } = REPS;
|
||||
|
||||
const componentUnderTest = Grip;
|
||||
|
||||
@ -66,8 +67,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub("testBasic");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Object { }`;
|
||||
@ -100,8 +100,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Boolean { true }`;
|
||||
@ -134,8 +133,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Number { 42 }`;
|
||||
@ -168,8 +166,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `String { "foo" }`;
|
||||
@ -202,8 +199,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Proxy { <target>: Object, <handler>: [3] }`;
|
||||
@ -236,8 +232,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `ArrayBuffer { byteLength: 10 }`;
|
||||
@ -270,8 +265,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `SharedArrayBuffer { byteLength: 5 }`;
|
||||
@ -304,8 +298,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub(testName);
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput =
|
||||
@ -412,8 +405,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const gripStub = getGripStub("testNonEnumerableProps");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Grip.rep, `Rep correctly selects ${Grip.rep.displayName}`);
|
||||
is(getRep(gripStub), Grip.rep, "Rep correctly selects Grip Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Object { }`;
|
||||
@ -537,7 +529,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 2, "the stub has two node grips");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let mouseOverValue;
|
||||
let called = 0;
|
||||
@ -549,7 +540,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(Grip.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const nodes = renderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -568,7 +558,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 2, "the stub has two node grips");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let called = 0;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
@ -578,7 +567,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(Grip.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const nodes = renderedComponent.querySelectorAll(".objectBox-node");
|
||||
@ -593,7 +581,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 2, "the stub has two node grips");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let inspectIconClickedValue = null;
|
||||
let onInspectIconClick = (object) => {
|
||||
@ -601,26 +588,20 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
let renderedComponentWithoutInspectIcon = renderComponent(Grip.rep, {
|
||||
object: stub,
|
||||
object: getGripStub("testObjectWithDisconnectedNodes"),
|
||||
onInspectIconClick,
|
||||
attachedActorIds: ["someOtherId"],
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when the actor is not in attachedActorIds");
|
||||
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when attachedActorIds does not have keys " +
|
||||
"matching grip properties");
|
||||
"There isn't an inspect icon when the node is not connected to the DOM tree");
|
||||
|
||||
const renderedComponent = renderComponent(Grip.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const icons = renderedComponent.querySelectorAll(".open-inspector");
|
||||
is(icons.length, 2,
|
||||
"There is an icon for each grip property matching an attachedNodeFront");
|
||||
"There is an icon for each node connected to the DOM tree");
|
||||
|
||||
icons.forEach((icon, index) => {
|
||||
TestUtils.Simulate.click(icon);
|
||||
@ -1169,6 +1150,72 @@ window.onload = Task.async(function* () {
|
||||
}
|
||||
};
|
||||
case "testObjectWithNodes":
|
||||
return {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj214",
|
||||
"class": "Object",
|
||||
"ownPropertyLength": 2,
|
||||
"preview": {
|
||||
"kind": "Object",
|
||||
"ownProperties": {
|
||||
"foo": {
|
||||
"configurable": true,
|
||||
"enumerable": true,
|
||||
"writable": true,
|
||||
"value": {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj215",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
}
|
||||
},
|
||||
"bar": {
|
||||
"configurable": true,
|
||||
"enumerable": true,
|
||||
"writable": true,
|
||||
"value": {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj216",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-2",
|
||||
"class": "btn btn-err",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ownPropertiesLength": 2,
|
||||
"safeGetterValues": {}
|
||||
}
|
||||
};
|
||||
case "testObjectWithDisconnectedNodes":
|
||||
return {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj214",
|
||||
|
@ -19,8 +19,11 @@ Test Infinity rep
|
||||
"use strict";
|
||||
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, InfinityRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { InfinityRep } = REPS;
|
||||
|
||||
try {
|
||||
yield testInfinity();
|
||||
@ -33,9 +36,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testInfinity() {
|
||||
const stub = getGripStub("testInfinity");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, InfinityRep.rep,
|
||||
`Rep correctly selects ${InfinityRep.rep.displayName} for Infinity value`);
|
||||
is(getRep(stub), InfinityRep.rep, "Rep correctly selects Infinity Rep");
|
||||
|
||||
const renderedComponent = renderComponent(InfinityRep.rep, { object: stub });
|
||||
is(renderedComponent.textContent, "Infinity",
|
||||
@ -44,9 +45,7 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testNegativeInfinity() {
|
||||
const stub = getGripStub("testNegativeInfinity");
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, InfinityRep.rep,
|
||||
`Rep correctly selects ${InfinityRep.rep.displayName} for negative Infinity value`);
|
||||
is(getRep(stub), InfinityRep.rep, "Rep correctly selects Infinity Rep");
|
||||
|
||||
const renderedComponent = renderComponent(InfinityRep.rep, { object: stub });
|
||||
is(renderedComponent.textContent, "-Infinity",
|
||||
|
@ -17,14 +17,16 @@ Test LongString rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, LongStringRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { LongStringRep } = REPS;
|
||||
|
||||
try {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getGripStub("testMultiline") });
|
||||
is(renderedRep.type, LongStringRep.rep,
|
||||
`Rep correctly selects ${LongStringRep.rep.displayName}`);
|
||||
is(getRep(getGripStub("testMultiline")), LongStringRep.rep,
|
||||
"Rep correctly selects LongString Rep");
|
||||
|
||||
// Test rendering
|
||||
yield testMultiline();
|
||||
|
@ -19,8 +19,11 @@ Test NaN rep
|
||||
"use strict";
|
||||
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, NaNRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { NaNRep } = REPS;
|
||||
|
||||
try {
|
||||
yield testNaN();
|
||||
@ -34,9 +37,7 @@ window.onload = Task.async(function* () {
|
||||
const stub = {
|
||||
type: "NaN"
|
||||
};
|
||||
const renderedRep = shallowRenderComponent(Rep, {object: stub});
|
||||
is(renderedRep.type, NaNRep.rep,
|
||||
`Rep correctly selects ${NaNRep.rep.displayName} for NaN value`);
|
||||
is(getRep(stub), NaNRep.rep, "Rep correctly selects NaN Rep");
|
||||
|
||||
const renderedComponent = renderComponent(NaNRep.rep, {object: stub});
|
||||
is(renderedComponent.textContent, "NaN", "NaN rep has expected text content");
|
||||
|
@ -18,16 +18,18 @@ Test Null rep
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Null } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Null } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "null"
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Null.rep, `Rep correctly selects ${Null.rep.displayName}`);
|
||||
is(getRep(gripStub), Null.rep, "Rep correctly selects Null Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(Null.rep, { object: gripStub });
|
||||
|
@ -17,8 +17,11 @@ Test Number rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Number } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Number } = REPS;
|
||||
|
||||
try {
|
||||
yield testInt();
|
||||
@ -33,16 +36,14 @@ window.onload = Task.async(function* () {
|
||||
|
||||
|
||||
function testInt() {
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getGripStub("testInt") });
|
||||
is(renderedRep.type, Number.rep, `Rep correctly selects ${Number.rep.displayName} for integer value`);
|
||||
is(getRep(getGripStub("testInt")), Number.rep, "Rep correctly selects Number Rep");
|
||||
|
||||
const renderedComponent = renderComponent(Number.rep, { object: getGripStub("testInt") });
|
||||
is(renderedComponent.textContent, "5", "Number rep has expected text content for integer");
|
||||
}
|
||||
|
||||
function testBoolean() {
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getGripStub("testTrue") });
|
||||
is(renderedRep.type, Number.rep, `Rep correctly selects ${Number.rep.displayName} for boolean value`);
|
||||
is(getRep(getGripStub("testTrue")), Number.rep, "Rep correctly selects Number Rep for boolean value");
|
||||
|
||||
let renderedComponent = renderComponent(Number.rep, { object: getGripStub("testTrue") });
|
||||
is(renderedComponent.textContent, "true", "Number rep has expected text content for boolean true");
|
||||
@ -52,8 +53,7 @@ window.onload = Task.async(function* () {
|
||||
}
|
||||
|
||||
function testNegativeZero() {
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: getGripStub("testNegZeroGrip") });
|
||||
is(renderedRep.type, Number.rep, `Rep correctly selects ${Number.rep.displayName} for negative zero value`);
|
||||
is(getRep(getGripStub("testNegZeroGrip")), Number.rep, "Rep correctly selects Number Rep for negative zero value");
|
||||
|
||||
let renderedComponent = renderComponent(Number.rep, { object: getGripStub("testNegZeroGrip") });
|
||||
is(renderedComponent.textContent, "-0", "Number rep has expected text content for negative zero grip");
|
||||
|
@ -18,8 +18,11 @@ Test ObjectWithText rep
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, ObjectWithText } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { ObjectWithText } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "object",
|
||||
@ -36,8 +39,7 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, ObjectWithText.rep, `Rep correctly selects ${ObjectWithText.rep.displayName}`);
|
||||
is(getRep(gripStub), ObjectWithText.rep, "Rep correctly selects ObjectWithText Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(ObjectWithText.rep, { object: gripStub });
|
||||
|
@ -21,8 +21,11 @@ window.onload = Task.async(function* () {
|
||||
let ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
|
||||
let React = browserRequire("devtools/client/shared/vendor/react");
|
||||
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, ObjectWithURL } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { ObjectWithURL } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "object",
|
||||
@ -39,8 +42,7 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, ObjectWithURL.rep, `Rep correctly selects ${ObjectWithURL.rep.displayName}`);
|
||||
is(getRep(gripStub), ObjectWithURL.rep, "Rep correctly selects ObjectWithURL Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(ObjectWithURL.rep, { object: gripStub });
|
||||
|
@ -17,8 +17,12 @@ Test Obj rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS, MODE } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Obj } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Obj } = REPS;
|
||||
|
||||
const componentUnderTest = Obj;
|
||||
|
||||
@ -54,8 +58,7 @@ window.onload = Task.async(function* () {
|
||||
const stub = {};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, Obj.rep, `Rep correctly selects ${Obj.rep.displayName}`);
|
||||
is(getRep(stub), Obj.rep, "Rep correctly selects Obj Rep");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Object`;
|
||||
|
@ -22,9 +22,10 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, PromiseRep } = REPS;
|
||||
let { PromiseRep } = REPS;
|
||||
|
||||
const componentUnderTest = PromiseRep;
|
||||
|
||||
@ -51,9 +52,8 @@ window.onload = Task.async(function* () {
|
||||
const stub = getGripStub("testPending");
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
is(renderedRep.type, PromiseRep.rep,
|
||||
`Rep correctly selects ${PromiseRep.rep.displayName} for pending Promise`);
|
||||
is(getRep(stub), PromiseRep.rep,
|
||||
"Rep correctly selects PromiseRep Rep for pending Promise");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Promise { <state>: "pending" }`;
|
||||
@ -84,10 +84,8 @@ window.onload = Task.async(function* () {
|
||||
const stub = getGripStub("testFulfilledWithNumber");
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
const {displayName} = PromiseRep.rep;
|
||||
is(renderedRep.type, PromiseRep.rep,
|
||||
`Rep correctly selects ${displayName} for Promise fulfilled with a number`);
|
||||
is(getRep(stub), PromiseRep.rep,
|
||||
"Rep correctly selects PromiseRep Rep for Promise fulfilled with a number");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Promise { <state>: "fulfilled", <value>: 42 }`;
|
||||
@ -118,10 +116,8 @@ window.onload = Task.async(function* () {
|
||||
const stub = getGripStub("testFulfilledWithString");
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
const {displayName} = PromiseRep.rep;
|
||||
is(renderedRep.type, PromiseRep.rep,
|
||||
`Rep correctly selects ${displayName} for Promise fulfilled with a string`);
|
||||
is(getRep(stub), PromiseRep.rep,
|
||||
"Rep correctly selects PromiseRep Rep for Promise fulfilled with a string");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Promise { <state>: "fulfilled", <value>: "foo" }`;
|
||||
@ -153,10 +149,8 @@ window.onload = Task.async(function* () {
|
||||
const stub = getGripStub("testFulfilledWithObject");
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
const {displayName} = PromiseRep.rep;
|
||||
is(renderedRep.type, PromiseRep.rep,
|
||||
`Rep correctly selects ${displayName} for Promise fulfilled with an object`);
|
||||
is(getRep(stub), PromiseRep.rep,
|
||||
"Rep correctly selects PromiseRep Rep for Promise fulfilled with an object");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Promise { <state>: "fulfilled", <value>: Object }`;
|
||||
@ -188,10 +182,8 @@ window.onload = Task.async(function* () {
|
||||
const stub = getGripStub("testFulfilledWithArray");
|
||||
|
||||
// Test that correct rep is chosen.
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: stub });
|
||||
const {displayName} = PromiseRep.rep;
|
||||
is(renderedRep.type, PromiseRep.rep,
|
||||
`Rep correctly selects ${displayName} for Promise fulfilled with an array`);
|
||||
is(getRep(stub), PromiseRep.rep,
|
||||
"Rep correctly selects PromiseRep Rep for Promise fulfilled with an array");
|
||||
|
||||
// Test rendering
|
||||
const defaultOutput = `Promise { <state>: "fulfilled", <value>: [3] }`;
|
||||
@ -223,7 +215,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let mouseOverValue;
|
||||
let onDOMNodeMouseOver = (object) => {
|
||||
@ -233,7 +224,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(PromiseRep.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const node = renderedComponent.querySelector(".objectBox-node");
|
||||
@ -248,7 +238,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let called = false;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
@ -257,7 +246,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(PromiseRep.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const node = renderedComponent.querySelector(".objectBox-node");
|
||||
@ -269,10 +257,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
function testOnDomNodeInspectIconClick() {
|
||||
const stub = getGripStub("testFulfilledWithNode");
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one node grip");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let inspectIconClickedValues = null;
|
||||
let onInspectIconClick = (object) => {
|
||||
@ -280,17 +266,15 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
let renderedComponentWithoutInspectIcon = renderComponent(PromiseRep.rep, {
|
||||
object: stub,
|
||||
object: getGripStub("testFulfilledWithDisconnectedNode"),
|
||||
onInspectIconClick,
|
||||
attachedActorIds: ["someOtherId"],
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when the actor is not in attachedActorIds");
|
||||
"There isn't an inspect icon when the node is not connected to the DOM tree");
|
||||
|
||||
const renderedComponent = renderComponent(PromiseRep.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const icon = renderedComponent.querySelector(".open-inspector");
|
||||
@ -474,6 +458,46 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": true,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
"type": "button"
|
||||
},
|
||||
"attributesLength": 3
|
||||
}
|
||||
},
|
||||
"creationTimestamp": 1480423091620.3716,
|
||||
"timeToSettle": 0.02842400000372436
|
||||
},
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "Object",
|
||||
"ownProperties": {},
|
||||
"ownPropertiesLength": 0,
|
||||
"safeGetterValues": {}
|
||||
}
|
||||
};
|
||||
case "testFulfilledWithDisconnectedNode":
|
||||
return {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj217",
|
||||
"class": "Promise",
|
||||
"promiseState": {
|
||||
"state": "fulfilled",
|
||||
"value": {
|
||||
"type": "object",
|
||||
"actor": "server1.conn1.child1/obj218",
|
||||
"class": "HTMLButtonElement",
|
||||
"extensible": true,
|
||||
"frozen": false,
|
||||
"sealed": false,
|
||||
"ownPropertyLength": 0,
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 1,
|
||||
"nodeName": "button",
|
||||
"isConnected": false,
|
||||
"attributes": {
|
||||
"id": "btn-1",
|
||||
"class": "btn btn-log",
|
||||
|
@ -18,8 +18,11 @@ Test RegExp rep
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, RegExp } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { RegExp } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "object",
|
||||
@ -33,8 +36,7 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, RegExp.rep, `Rep correctly selects ${RegExp.rep.displayName}`);
|
||||
is(getRep(gripStub), RegExp.rep, "Rep correctly selects RegExp Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(RegExp.rep, { object: gripStub });
|
||||
|
@ -17,8 +17,11 @@ Test String rep
|
||||
<script src="head.js" type="application/javascript"></script>
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, StringRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { StringRep } = REPS;
|
||||
|
||||
const test_cases = [{
|
||||
name: "testMultiline",
|
||||
@ -75,12 +78,20 @@ window.onload = Task.async(function* () {
|
||||
useQuotes: true
|
||||
},
|
||||
result: "\"\ud83d\udeec\""
|
||||
}, {
|
||||
name: "testNoEscapeWhitespace",
|
||||
props: {
|
||||
object: "line 1\r\nline 2\n\tline 3",
|
||||
useQuotes: true,
|
||||
escapeWhitespace: false,
|
||||
},
|
||||
result: "\"line 1\r\nline 2\n\tline 3\""
|
||||
}];
|
||||
|
||||
try {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, test_cases[0].props);
|
||||
is(renderedRep.type, StringRep.rep, `Rep correctly selects ${StringRep.rep.displayName}`);
|
||||
is(getRep(test_cases[0].props.object), StringRep.rep,
|
||||
"Rep correctly selects String Rep");
|
||||
|
||||
// Test rendering
|
||||
for (let test of test_cases) {
|
||||
|
@ -18,8 +18,11 @@ Test Stylesheet rep
|
||||
<script type="application/javascript">
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, StyleSheet } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { StyleSheet } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "object",
|
||||
@ -36,8 +39,7 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, StyleSheet.rep, `Rep correctly selects ${StyleSheet.rep.displayName}`);
|
||||
is(getRep(gripStub), StyleSheet.rep, "Rep correctly selects StyleSheet Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(StyleSheet.rep, { object: gripStub });
|
||||
|
@ -20,8 +20,11 @@ Test Symbol rep
|
||||
/* import-globals-from head.js */
|
||||
|
||||
window.onload = Task.async(function* () {
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, SymbolRep } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { SymbolRep } = REPS;
|
||||
|
||||
let gripStubs = new Map();
|
||||
gripStubs.set("testSymbolFoo", {
|
||||
@ -34,13 +37,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
try {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(
|
||||
Rep,
|
||||
{ object: gripStubs.get("testSymbolFoo")}
|
||||
);
|
||||
|
||||
is(renderedRep.type, SymbolRep.rep,
|
||||
`Rep correctly selects ${SymbolRep.rep.displayName}`);
|
||||
is(getRep(gripStubs.get("testSymbolFoo")), SymbolRep.rep,
|
||||
"Rep correctly selects SymbolRep Rep");
|
||||
|
||||
// Test rendering
|
||||
yield testSymbol();
|
||||
|
@ -22,9 +22,10 @@ window.onload = Task.async(function* () {
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
getSelectableInInspectorGrips,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, TextNode } = REPS;
|
||||
let { TextNode } = REPS;
|
||||
|
||||
let gripStubs = new Map();
|
||||
gripStubs.set("testRendering", {
|
||||
@ -34,7 +35,19 @@ window.onload = Task.async(function* () {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 3,
|
||||
"nodeName": "#text",
|
||||
"textContent": "hello world"
|
||||
"textContent": "hello world",
|
||||
"isConnected": true,
|
||||
}
|
||||
});
|
||||
gripStubs.set("testRenderingDisconnected", {
|
||||
"class": "Text",
|
||||
"actor": "server1.conn1.child1/obj50",
|
||||
"preview": {
|
||||
"kind": "DOMNode",
|
||||
"nodeType": 3,
|
||||
"nodeName": "#text",
|
||||
"textContent": "hello world",
|
||||
"isConnected": false,
|
||||
}
|
||||
});
|
||||
gripStubs.set("testRenderingWithEOL", {
|
||||
@ -50,12 +63,8 @@ window.onload = Task.async(function* () {
|
||||
|
||||
try {
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, {
|
||||
object: gripStubs.get("testRendering")
|
||||
});
|
||||
|
||||
is(renderedRep.type, TextNode.rep,
|
||||
`Rep correctly selects ${TextNode.rep.displayName}`);
|
||||
is(getRep(gripStubs.get("testRendering")), TextNode.rep,
|
||||
"Rep correctly selects TextNode Rep");
|
||||
|
||||
yield testRendering();
|
||||
yield testRenderingWithEOL();
|
||||
@ -128,7 +137,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one text node grip");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let mouseOverValue;
|
||||
let onDOMNodeMouseOver = (object) => {
|
||||
@ -137,7 +145,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(TextNode.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOver,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
TestUtils.Simulate.mouseOver(renderedComponent);
|
||||
@ -150,7 +157,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one text node grip");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let called = false;
|
||||
let onDOMNodeMouseOut = (object) => {
|
||||
@ -159,7 +165,6 @@ window.onload = Task.async(function* () {
|
||||
const renderedComponent = renderComponent(TextNode.rep, {
|
||||
object: stub,
|
||||
onDOMNodeMouseOut,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
TestUtils.Simulate.mouseOut(renderedComponent);
|
||||
@ -171,7 +176,6 @@ window.onload = Task.async(function* () {
|
||||
|
||||
const grips = getSelectableInInspectorGrips(stub);
|
||||
is(grips.length, 1, "the stub has one text node grip");
|
||||
const attachedActorIds = getStubAttachedActorIds(grips);
|
||||
|
||||
let inspectIconClickedValue = null;
|
||||
let inspectIconClickedEvent = null;
|
||||
@ -182,17 +186,15 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
const renderedComponentWithoutInspectIcon = renderComponent(TextNode.rep, {
|
||||
object: stub,
|
||||
object: gripStubs.get("testRenderingDisconnected"),
|
||||
onInspectIconClick,
|
||||
attachedActorIds: ["someOtherId"]
|
||||
});
|
||||
is(renderedComponentWithoutInspectIcon.querySelector(".open-inspector"), null,
|
||||
"There isn't an inspect icon when the actor is not in attachedActorIds");
|
||||
"There isn't an inspect icon when the node is not connected to the DOM tree");
|
||||
|
||||
const renderedComponent = renderComponent(TextNode.rep, {
|
||||
object: stub,
|
||||
onInspectIconClick,
|
||||
attachedActorIds,
|
||||
});
|
||||
|
||||
const inspectIconNode = renderedComponent.querySelector(".open-inspector");
|
||||
|
@ -20,16 +20,18 @@ window.onload = Task.async(function* () {
|
||||
try {
|
||||
let ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
|
||||
let React = browserRequire("devtools/client/shared/vendor/react");
|
||||
const { REPS } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Undefined } = REPS;
|
||||
const {
|
||||
REPS,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Undefined } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
"type": "undefined"
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Undefined.rep, `Rep correctly selects ${Undefined.rep.displayName}`);
|
||||
is(getRep(gripStub), Undefined.rep, "Rep correctly selects Undefined Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(Undefined.rep, {});
|
||||
|
@ -21,7 +21,11 @@ window.onload = Task.async(function* () {
|
||||
let ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
|
||||
let React = browserRequire("devtools/client/shared/vendor/react");
|
||||
|
||||
const { REPS, MODE } = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
const {
|
||||
REPS,
|
||||
MODE,
|
||||
getRep,
|
||||
} = browserRequire("devtools/client/shared/components/reps/reps");
|
||||
let { Rep, Window } = REPS;
|
||||
|
||||
let gripStub = {
|
||||
@ -39,11 +43,10 @@ window.onload = Task.async(function* () {
|
||||
};
|
||||
|
||||
// Test that correct rep is chosen
|
||||
const renderedRep = shallowRenderComponent(Rep, { object: gripStub });
|
||||
is(renderedRep.type, Window.rep, `Rep correctly selects ${Window.rep.displayName}`);
|
||||
is(getRep(gripStub), Window.rep, "Rep correctly selects Window Rep");
|
||||
|
||||
// Test rendering
|
||||
const renderedComponent = renderComponent(Window.rep, { object: gripStub });
|
||||
const renderedComponent = renderComponent(Rep, { object: gripStub });
|
||||
ok(renderedComponent.className.includes("objectBox-Window"), "Window rep has expected class name");
|
||||
is(renderedComponent.textContent, "Window about:newtab", "Window rep has expected text content");
|
||||
const innerNode = renderedComponent.querySelector(".objectPropValue");
|
||||
|
@ -138,13 +138,13 @@ Telemetry.prototype = {
|
||||
histogram: "DEVTOOLS_PICKER_EYEDROPPER_OPENED_COUNT",
|
||||
},
|
||||
toolbareyedropper: {
|
||||
histogram: "DEVTOOLS_TOOLBAR_EYEDROPPER_OPENED_COUNT",
|
||||
scalar: "devtools.toolbar.eyedropper.opened",
|
||||
},
|
||||
copyuniquecssselector: {
|
||||
histogram: "DEVTOOLS_COPY_UNIQUE_CSS_SELECTOR_OPENED_COUNT",
|
||||
scalar: "devtools.copy.unique.css.selector.opened",
|
||||
},
|
||||
copyfullcssselector: {
|
||||
histogram: "DEVTOOLS_COPY_FULL_CSS_SELECTOR_OPENED_COUNT",
|
||||
scalar: "devtools.copy.full.css.selector.opened",
|
||||
},
|
||||
developertoolbar: {
|
||||
histogram: "DEVTOOLS_DEVELOPERTOOLBAR_OPENED_COUNT",
|
||||
@ -199,6 +199,9 @@ Telemetry.prototype = {
|
||||
if (charts.timerHistogram) {
|
||||
this.startTimer(charts.timerHistogram);
|
||||
}
|
||||
if (charts.scalar) {
|
||||
this.logScalar(charts.scalar, 1);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@ -260,14 +263,44 @@ Telemetry.prototype = {
|
||||
* Value to store.
|
||||
*/
|
||||
log: function (histogramId, value) {
|
||||
if (histogramId) {
|
||||
try {
|
||||
let histogram = Services.telemetry.getHistogramById(histogramId);
|
||||
histogram.add(value);
|
||||
} catch (e) {
|
||||
dump("Warning: An attempt was made to write to the " + histogramId +
|
||||
" histogram, which is not defined in Histograms.json\n");
|
||||
if (!histogramId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
let histogram = Services.telemetry.getHistogramById(histogramId);
|
||||
histogram.add(value);
|
||||
} catch (e) {
|
||||
dump(`Warning: An attempt was made to write to the ${histogramId} ` +
|
||||
`histogram, which is not defined in Histograms.json\n`);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Log a value to a scalar.
|
||||
*
|
||||
* @param {String} scalarId
|
||||
* Scalar in which the data is to be stored.
|
||||
* @param value
|
||||
* Value to store.
|
||||
*/
|
||||
logScalar: function (scalarId, value) {
|
||||
if (!scalarId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (isNaN(value)) {
|
||||
dump(`Warning: An attempt was made to write a non-numeric value ` +
|
||||
`${value} to the ${scalarId} scalar. Only numeric values are ` +
|
||||
`allowed.`);
|
||||
|
||||
return;
|
||||
}
|
||||
Services.telemetry.scalarSet(scalarId, value);
|
||||
} catch (e) {
|
||||
dump(`Warning: An attempt was made to write to the ${scalarId} ` +
|
||||
`scalar, which is not defined in Scalars.yaml\n`);
|
||||
}
|
||||
},
|
||||
|
||||
@ -292,8 +325,8 @@ Telemetry.prototype = {
|
||||
histogram.add(key, value);
|
||||
}
|
||||
} catch (e) {
|
||||
dump("Warning: An attempt was made to write to the " + histogramId +
|
||||
" histogram, which is not defined in Histograms.json\n");
|
||||
dump(`Warning: An attempt was made to write to the ${histogramId} ` +
|
||||
`histogram, which is not defined in Histograms.json\n`);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
const TEST_URI = "data:text/html;charset=utf-8," +
|
||||
"<p>browser_telemetry_button_eyedropper.js</p><div>test</div>";
|
||||
const EYEDROPPER_OPENED = "devtools.toolbar.eyedropper.opened";
|
||||
|
||||
add_task(function* () {
|
||||
yield addTab(TEST_URI);
|
||||
@ -27,26 +28,27 @@ function* testButton(toolbox, Telemetry) {
|
||||
// only concerned about testing the telemetry probe.
|
||||
yield toolbox.getPanel("inspector").showEyeDropper();
|
||||
|
||||
checkResults("_EYEDROPPER_", Telemetry);
|
||||
checkTelemetryResults(Telemetry);
|
||||
}
|
||||
|
||||
function checkResults(histIdFocus, Telemetry) {
|
||||
let result = Telemetry.prototype.telemetryInfo;
|
||||
function checkTelemetryResults(Telemetry) {
|
||||
let data = Telemetry.prototype.telemetryInfo;
|
||||
let results = new Map();
|
||||
|
||||
for (let [histId, value] of Object.entries(result)) {
|
||||
if (histId.startsWith("DEVTOOLS_INSPECTOR_") ||
|
||||
!histId.includes(histIdFocus)) {
|
||||
// Inspector stats are tested in
|
||||
// browser_telemetry_toolboxtabs_{toolname}.js so we skip them here
|
||||
// because we only open the inspector once for this test.
|
||||
continue;
|
||||
}
|
||||
for (let key in data) {
|
||||
if (key.toLowerCase() === key) {
|
||||
let pings = data[key].length;
|
||||
|
||||
if (histId.endsWith("OPENED_COUNT")) {
|
||||
is(value.length, 1, histId + " has one entry");
|
||||
|
||||
let okay = value.every(element => element === true);
|
||||
ok(okay, "All " + histId + " entries are === true");
|
||||
results.set(key, pings);
|
||||
}
|
||||
}
|
||||
|
||||
is(results.size, 1, "The correct number of scalars were logged");
|
||||
|
||||
let pings = checkPings(EYEDROPPER_OPENED, results);
|
||||
is(pings, 1, `${EYEDROPPER_OPENED} has just 1 ping`);
|
||||
}
|
||||
|
||||
function checkPings(scalarId, results) {
|
||||
return results.get(scalarId);
|
||||
}
|
||||
|
@ -21,13 +21,16 @@ VariablesViewLink.propTypes = {
|
||||
|
||||
function VariablesViewLink(props) {
|
||||
const { className, object, children } = props;
|
||||
|
||||
const classes = ["cm-variable"];
|
||||
if (className) {
|
||||
classes.push(className);
|
||||
}
|
||||
return (
|
||||
dom.a({
|
||||
onClick: openVariablesView.bind(null, object),
|
||||
// Context menu can use this actor id information to enable additional menu items.
|
||||
"data-link-actor-id": object.actor,
|
||||
className: className || "cm-variable",
|
||||
className: classes.join(" "),
|
||||
draggable: false,
|
||||
}, children)
|
||||
);
|
||||
|
@ -880,8 +880,7 @@ nsAttrAndChildArray::AddAttrSlot()
|
||||
}
|
||||
|
||||
SetAttrSlotCount(slotCount + 1);
|
||||
offset[0] = nullptr;
|
||||
offset[1] = nullptr;
|
||||
memset(static_cast<void*>(offset), 0, sizeof(InternalAttr));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -10226,7 +10226,7 @@ nsContentUtils::HtmlObjectContentTypeForMIMEType(const nsCString& aMIMEType,
|
||||
}
|
||||
|
||||
/* static */ already_AddRefed<nsIEventTarget>
|
||||
nsContentUtils::GetEventTargetByLoadInfo(nsILoadInfo* aLoadInfo, TaskCategory aCategory)
|
||||
nsContentUtils::GetEventTargetByLoadInfo(nsILoadInfo* aLoadInfo, TaskCategory aCategory)
|
||||
{
|
||||
if (NS_WARN_IF(!aLoadInfo)) {
|
||||
return nullptr;
|
||||
@ -10259,3 +10259,19 @@ nsContentUtils::HtmlObjectContentTypeForMIMEType(const nsCString& aMIMEType,
|
||||
|
||||
return target.forget();
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
nsContentUtils::IsLocalRefURL(const nsString& aString)
|
||||
{
|
||||
// Find the first non-"C0 controls + space" character.
|
||||
const char16_t* current = aString.get();
|
||||
for (; *current != '\0'; current++) {
|
||||
if (*current > 0x20) {
|
||||
// if the first non-"C0 controls + space" character is '#', this is a
|
||||
// local-ref URL.
|
||||
return *current == '#';
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
@ -2863,6 +2863,13 @@ public:
|
||||
static already_AddRefed<nsIEventTarget>
|
||||
GetEventTargetByLoadInfo(nsILoadInfo* aLoadInfo, mozilla::TaskCategory aCategory);
|
||||
|
||||
/**
|
||||
* Detect whether a string is a local-url.
|
||||
* https://drafts.csswg.org/css-values/#local-urls
|
||||
*/
|
||||
static bool
|
||||
IsLocalRefURL(const nsString& aString);
|
||||
|
||||
static bool
|
||||
IsCustomElementsEnabled() { return sIsCustomElementsEnabled; }
|
||||
|
||||
|
@ -106,6 +106,12 @@ Gamepad::SetPose(const GamepadPoseState& aPose)
|
||||
UpdateTimestamp();
|
||||
}
|
||||
|
||||
void
|
||||
Gamepad::SetHand(GamepadHand aHand)
|
||||
{
|
||||
mHand = aHand;
|
||||
}
|
||||
|
||||
void
|
||||
Gamepad::SyncState(Gamepad* aOther)
|
||||
{
|
||||
|
@ -56,6 +56,7 @@ public:
|
||||
void SetAxis(uint32_t aAxis, double aValue);
|
||||
void SetIndex(uint32_t aIndex);
|
||||
void SetPose(const GamepadPoseState& aPose);
|
||||
void SetHand(GamepadHand aHand);
|
||||
|
||||
// Make the state of this gamepad equivalent to other.
|
||||
void SyncState(Gamepad* aOther);
|
||||
|
@ -451,6 +451,49 @@ GamepadManager::NewPoseEvent(uint32_t aIndex, GamepadServiceType aServiceType,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
GamepadManager::NewHandChangeEvent(uint32_t aIndex, GamepadServiceType aServiceType,
|
||||
GamepadHand aHand)
|
||||
{
|
||||
if (mShuttingDown) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t newIndex = GetGamepadIndexWithServiceType(aIndex, aServiceType);
|
||||
|
||||
RefPtr<Gamepad> gamepad = GetGamepad(newIndex);
|
||||
if (!gamepad) {
|
||||
return;
|
||||
}
|
||||
gamepad->SetHand(aHand);
|
||||
|
||||
// Hold on to listeners in a separate array because firing events
|
||||
// can mutate the mListeners array.
|
||||
nsTArray<RefPtr<nsGlobalWindow>> listeners(mListeners);
|
||||
MOZ_ASSERT(!listeners.IsEmpty());
|
||||
|
||||
for (uint32_t i = 0; i < listeners.Length(); i++) {
|
||||
|
||||
MOZ_ASSERT(listeners[i]->IsInnerWindow());
|
||||
|
||||
// Only send events to non-background windows
|
||||
if (!listeners[i]->AsInner()->IsCurrentInnerWindow() ||
|
||||
listeners[i]->GetOuterWindow()->IsBackground()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
bool firstTime = MaybeWindowHasSeenGamepad(listeners[i], newIndex);
|
||||
|
||||
RefPtr<Gamepad> listenerGamepad = listeners[i]->GetGamepad(newIndex);
|
||||
if (listenerGamepad) {
|
||||
listenerGamepad->SetHand(aHand);
|
||||
if (firstTime) {
|
||||
FireConnectionEvent(listeners[i], listenerGamepad, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
GamepadManager::NewConnectionEvent(uint32_t aIndex, bool aConnected)
|
||||
{
|
||||
@ -664,6 +707,11 @@ GamepadManager::Update(const GamepadChangeEvent& aEvent)
|
||||
NewPoseEvent(a.index(), a.service_type(), a.pose_state());
|
||||
return;
|
||||
}
|
||||
if (aEvent.type() == GamepadChangeEvent::TGamepadHandInformation) {
|
||||
const GamepadHandInformation& a = aEvent.get_GamepadHandInformation();
|
||||
NewHandChangeEvent(a.index(), a.service_type(), a.hand());
|
||||
return;
|
||||
}
|
||||
|
||||
MOZ_CRASH("We shouldn't be here!");
|
||||
|
||||
|
@ -75,6 +75,11 @@ class GamepadManager final : public nsIObserver,
|
||||
void NewPoseEvent(uint32_t aIndex, GamepadServiceType aServiceType,
|
||||
const GamepadPoseState& aState);
|
||||
|
||||
// Update the hand of |aHand| for the gamepad at |aIndex| for all
|
||||
// windows that are listening and visible.
|
||||
void NewHandChangeEvent(uint32_t aIndex, GamepadServiceType aServiceType,
|
||||
GamepadHand aHand);
|
||||
|
||||
// Synchronize the state of |aGamepad| to match the gamepad stored at |aIndex|
|
||||
void SyncGamepadState(uint32_t aIndex, Gamepad* aGamepad);
|
||||
|
||||
|
@ -49,12 +49,19 @@ struct GamepadPoseInformation {
|
||||
GamepadPoseState pose_state;
|
||||
};
|
||||
|
||||
struct GamepadHandInformation {
|
||||
uint32_t index;
|
||||
GamepadServiceType service_type;
|
||||
GamepadHand hand;
|
||||
};
|
||||
|
||||
union GamepadChangeEvent {
|
||||
GamepadAdded;
|
||||
GamepadRemoved;
|
||||
GamepadAxisInformation;
|
||||
GamepadButtonInformation;
|
||||
GamepadPoseInformation;
|
||||
GamepadHandInformation;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "nsCExternalHandlerService.h"
|
||||
#include "nsIFileStreams.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "mozilla/Telemetry.h"
|
||||
|
||||
#include "mozilla/dom/Directory.h"
|
||||
#include "mozilla/dom/EncodingUtils.h"
|
||||
@ -188,6 +189,7 @@ FSURLEncoded::AddIsindex(const nsAString& aValue)
|
||||
|
||||
// Append data to string
|
||||
if (mQueryString.IsEmpty()) {
|
||||
Telemetry::Accumulate(Telemetry::FORM_ISINDEX_USED, true);
|
||||
mQueryString.Assign(convValue);
|
||||
} else {
|
||||
mQueryString += NS_LITERAL_CSTRING("&isindex=") + convValue;
|
||||
|
@ -5024,27 +5024,10 @@ ContentParent::TransmitPermissionsFor(nsIChannel* aChannel)
|
||||
{
|
||||
MOZ_ASSERT(aChannel);
|
||||
#ifdef MOZ_PERMISSIONS
|
||||
// Check if this channel is going to be used to create a document. If it has
|
||||
// LOAD_DOCUMENT_URI set it is trivially creating a document. If
|
||||
// LOAD_HTML_OBJECT_DATA is set it may or may not be used to create a
|
||||
// document, depending on its MIME type.
|
||||
nsLoadFlags loadFlags;
|
||||
nsresult rv = aChannel->GetLoadFlags(&loadFlags);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (!(loadFlags & nsIChannel::LOAD_DOCUMENT_URI)) {
|
||||
if (loadFlags & nsIRequest::LOAD_HTML_OBJECT_DATA) {
|
||||
nsAutoCString mimeType;
|
||||
aChannel->GetContentType(mimeType);
|
||||
if (nsContentUtils::HtmlObjectContentTypeForMIMEType(mimeType, nullptr) !=
|
||||
nsIObjectLoadingContent::TYPE_DOCUMENT) {
|
||||
// The MIME type would not cause the creation of a document
|
||||
return NS_OK;
|
||||
}
|
||||
} else {
|
||||
// neither flag was set
|
||||
return NS_OK;
|
||||
}
|
||||
nsresult rv;
|
||||
if (!aChannel->IsDocument()) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Get the principal for the channel result, so that we can get the permission
|
||||
|
@ -2944,6 +2944,7 @@ public:
|
||||
NS_IMETHOD SetLoadGroup(nsILoadGroup*) NO_IMPL
|
||||
NS_IMETHOD SetLoadFlags(nsLoadFlags) NO_IMPL
|
||||
NS_IMETHOD GetLoadFlags(nsLoadFlags*) NO_IMPL
|
||||
NS_IMETHOD GetIsDocument(bool *) NO_IMPL
|
||||
NS_IMETHOD GetOriginalURI(nsIURI**) NO_IMPL
|
||||
NS_IMETHOD SetOriginalURI(nsIURI*) NO_IMPL
|
||||
NS_IMETHOD GetURI(nsIURI** aUri) override
|
||||
|
@ -442,6 +442,12 @@ nsresult nsJSChannel::Init(nsIURI* aURI, nsILoadInfo* aLoadInfo)
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsJSChannel::GetIsDocument(bool *aIsDocument)
|
||||
{
|
||||
return NS_GetIsDocumentChannel(this, aIsDocument);
|
||||
}
|
||||
|
||||
//
|
||||
// nsISupports implementation...
|
||||
//
|
||||
|
@ -752,12 +752,12 @@ ADTSTrackDemuxer::GetNextFrame(const adts::Frame& aFrame)
|
||||
|
||||
UpdateState(aFrame);
|
||||
|
||||
frame->mTime = Duration(mFrameIndex - 1).ToMicroseconds();
|
||||
frame->mTime = Duration(mFrameIndex - 1);
|
||||
frame->mDuration = Duration(1);
|
||||
frame->mTimecode = frame->mTime;
|
||||
frame->mKeyframe = true;
|
||||
|
||||
MOZ_ASSERT(frame->mTime >= 0);
|
||||
MOZ_ASSERT(!frame->mTime.IsNegative());
|
||||
MOZ_ASSERT(frame->mDuration.IsPositive());
|
||||
|
||||
ADTSLOGV("GetNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
|
||||
|
@ -604,12 +604,12 @@ MP3TrackDemuxer::GetNextFrame(const MediaByteRange& aRange)
|
||||
|
||||
UpdateState(aRange);
|
||||
|
||||
frame->mTime = Duration(mFrameIndex - 1).ToMicroseconds();
|
||||
frame->mTime = Duration(mFrameIndex - 1);
|
||||
frame->mDuration = Duration(1);
|
||||
frame->mTimecode = frame->mTime;
|
||||
frame->mKeyframe = true;
|
||||
|
||||
MOZ_ASSERT(frame->mTime >= 0);
|
||||
MOZ_ASSERT(!frame->mTime.IsNegative());
|
||||
MOZ_ASSERT(frame->mDuration.IsPositive());
|
||||
|
||||
if (mNumParsedFrames == 1) {
|
||||
|
@ -176,7 +176,7 @@ VideoData::VideoData(int64_t aOffset,
|
||||
{
|
||||
MOZ_ASSERT(!mDuration.IsNegative(), "Frame must have non-negative duration.");
|
||||
mKeyframe = aKeyframe;
|
||||
mTimecode = aTimecode;
|
||||
mTimecode = TimeUnit::FromMicroseconds(aTimecode);
|
||||
}
|
||||
|
||||
VideoData::~VideoData()
|
||||
@ -237,7 +237,7 @@ VideoData::UpdateTimestamp(const TimeUnit& aTimestamp)
|
||||
auto updatedDuration = GetEndTime() - aTimestamp;
|
||||
MOZ_ASSERT(!updatedDuration.IsNegative());
|
||||
|
||||
mTime = aTimestamp.ToMicroseconds();
|
||||
mTime = aTimestamp;
|
||||
mDuration = updatedDuration;
|
||||
}
|
||||
|
||||
|
@ -294,8 +294,8 @@ public:
|
||||
uint32_t aFrames)
|
||||
: mType(aType)
|
||||
, mOffset(aOffset)
|
||||
, mTime(aTimestamp)
|
||||
, mTimecode(aTimestamp)
|
||||
, mTime(media::TimeUnit::FromMicroseconds(aTimestamp))
|
||||
, mTimecode(media::TimeUnit::FromMicroseconds(aTimestamp))
|
||||
, mDuration(media::TimeUnit::FromMicroseconds(aDuration))
|
||||
, mFrames(aFrames)
|
||||
, mKeyframe(false)
|
||||
@ -308,12 +308,12 @@ public:
|
||||
// Approximate byte offset where this data was demuxed from its media.
|
||||
int64_t mOffset;
|
||||
|
||||
// Start time of sample, in microseconds.
|
||||
int64_t mTime;
|
||||
// Start time of sample.
|
||||
media::TimeUnit mTime;
|
||||
|
||||
// Codec specific internal time code. For Ogg based codecs this is the
|
||||
// granulepos.
|
||||
int64_t mTimecode;
|
||||
media::TimeUnit mTimecode;
|
||||
|
||||
// Duration of sample, in microseconds.
|
||||
media::TimeUnit mDuration;
|
||||
@ -325,13 +325,13 @@ public:
|
||||
|
||||
media::TimeUnit GetEndTime() const
|
||||
{
|
||||
return media::TimeUnit::FromMicroseconds(mTime) + mDuration;
|
||||
return mTime + mDuration;
|
||||
}
|
||||
|
||||
bool AdjustForStartTime(int64_t aStartTime)
|
||||
{
|
||||
mTime = mTime - aStartTime;
|
||||
return mTime >= 0;
|
||||
mTime = mTime - media::TimeUnit::FromMicroseconds(aStartTime);
|
||||
return !mTime.IsNegative();
|
||||
}
|
||||
|
||||
template <typename ReturnType>
|
||||
@ -352,8 +352,6 @@ protected:
|
||||
MediaData(Type aType, uint32_t aFrames)
|
||||
: mType(aType)
|
||||
, mOffset(0)
|
||||
, mTime(0)
|
||||
, mTimecode(0)
|
||||
, mFrames(aFrames)
|
||||
, mKeyframe(false)
|
||||
{
|
||||
|
@ -1237,8 +1237,8 @@ private:
|
||||
return seekTime;
|
||||
}
|
||||
|
||||
const int64_t audioStart = audio ? audio->mTime : INT64_MAX;
|
||||
const int64_t videoStart = video ? video->mTime : INT64_MAX;
|
||||
const int64_t audioStart = audio ? audio->mTime.ToMicroseconds() : INT64_MAX;
|
||||
const int64_t videoStart = video ? video->mTime.ToMicroseconds() : INT64_MAX;
|
||||
const int64_t audioGap = std::abs(audioStart - seekTime.ToMicroseconds());
|
||||
const int64_t videoGap = std::abs(videoStart - seekTime.ToMicroseconds());
|
||||
return TimeUnit::FromMicroseconds(
|
||||
@ -1314,7 +1314,7 @@ private:
|
||||
{
|
||||
if (mSeekJob.mTarget->IsFast()
|
||||
&& mSeekJob.mTarget->GetTime() > mCurrentTimeBeforeSeek
|
||||
&& aSample->mTime < mCurrentTimeBeforeSeek.ToMicroseconds()) {
|
||||
&& aSample->mTime < mCurrentTimeBeforeSeek) {
|
||||
// We are doing a fastSeek, but we ended up *before* the previous
|
||||
// playback position. This is surprising UX, so switch to an accurate
|
||||
// seek and decode to the seek target. This is not conformant to the
|
||||
@ -1335,7 +1335,7 @@ private:
|
||||
return NS_ERROR_DOM_MEDIA_OVERFLOW_ERR;
|
||||
}
|
||||
|
||||
auto audioTime = TimeUnit::FromMicroseconds(aAudio->mTime);
|
||||
auto audioTime = aAudio->mTime;
|
||||
if (audioTime + sampleDuration <= mSeekJob.mTarget->GetTime()) {
|
||||
// Our seek target lies after the frames in this AudioData. Don't
|
||||
// push it onto the audio queue, and keep decoding forwards.
|
||||
@ -1405,18 +1405,18 @@ private:
|
||||
{
|
||||
MOZ_ASSERT(aVideo);
|
||||
SLOG("DropVideoUpToSeekTarget() frame [%" PRId64 ", %" PRId64 "]",
|
||||
aVideo->mTime, aVideo->GetEndTime().ToMicroseconds());
|
||||
aVideo->mTime.ToMicroseconds(), aVideo->GetEndTime().ToMicroseconds());
|
||||
const auto target = mSeekJob.mTarget->GetTime();
|
||||
|
||||
// If the frame end time is less than the seek target, we won't want
|
||||
// to display this frame after the seek, so discard it.
|
||||
if (target >= aVideo->GetEndTime()) {
|
||||
SLOG("DropVideoUpToSeekTarget() pop video frame [%" PRId64 ", %" PRId64 "] target=%" PRId64,
|
||||
aVideo->mTime, aVideo->GetEndTime().ToMicroseconds(),
|
||||
aVideo->mTime.ToMicroseconds(), aVideo->GetEndTime().ToMicroseconds(),
|
||||
target.ToMicroseconds());
|
||||
mFirstVideoFrameAfterSeek = aVideo;
|
||||
} else {
|
||||
if (target.ToMicroseconds() >= aVideo->mTime &&
|
||||
if (target >= aVideo->mTime &&
|
||||
aVideo->GetEndTime() >= target) {
|
||||
// The seek target lies inside this frame's time slice. Adjust the
|
||||
// frame's start time to match the seek target.
|
||||
@ -1426,7 +1426,7 @@ private:
|
||||
|
||||
SLOG("DropVideoUpToSeekTarget() found video frame [%" PRId64 ", %" PRId64 "] "
|
||||
"containing target=%" PRId64,
|
||||
aVideo->mTime, aVideo->GetEndTime().ToMicroseconds(),
|
||||
aVideo->mTime.ToMicroseconds(), aVideo->GetEndTime().ToMicroseconds(),
|
||||
target.ToMicroseconds());
|
||||
|
||||
MOZ_ASSERT(VideoQueue().GetSize() == 0,
|
||||
@ -1475,7 +1475,7 @@ static void
|
||||
DiscardFrames(MediaQueue<Type>& aQueue, const Function& aCompare)
|
||||
{
|
||||
while(aQueue.GetSize() > 0) {
|
||||
if (aCompare(aQueue.PeekFront()->mTime)) {
|
||||
if (aCompare(aQueue.PeekFront()->mTime.ToMicroseconds())) {
|
||||
RefPtr<Type> releaseMe = aQueue.PopFront();
|
||||
continue;
|
||||
}
|
||||
@ -1575,7 +1575,7 @@ private:
|
||||
MOZ_ASSERT(!mSeekJob.mPromise.IsEmpty(), "Seek shouldn't be finished");
|
||||
MOZ_ASSERT(NeedMoreVideo());
|
||||
|
||||
if (aVideo->mTime > mCurrentTime.ToMicroseconds()) {
|
||||
if (aVideo->mTime > mCurrentTime) {
|
||||
mMaster->PushVideo(aVideo);
|
||||
FinishSeek();
|
||||
} else {
|
||||
@ -1667,7 +1667,7 @@ private:
|
||||
{
|
||||
RefPtr<VideoData> data = VideoQueue().PeekFront();
|
||||
if (data) {
|
||||
mSeekJob.mTarget->SetTime(TimeUnit::FromMicroseconds(data->mTime));
|
||||
mSeekJob.mTarget->SetTime(data->mTime);
|
||||
} else {
|
||||
MOZ_ASSERT(VideoQueue().AtEndOfStream());
|
||||
mSeekJob.mTarget->SetTime(mDuration);
|
||||
@ -3177,7 +3177,8 @@ MediaDecoderStateMachine::RequestAudioData()
|
||||
// audio->GetEndTime() is not always mono-increasing in chained ogg.
|
||||
mDecodedAudioEndTime = std::max(
|
||||
aAudio->GetEndTime(), mDecodedAudioEndTime);
|
||||
LOGV("OnAudioDecoded [%" PRId64 ",%" PRId64 "]", aAudio->mTime,
|
||||
LOGV("OnAudioDecoded [%" PRId64 ",%" PRId64 "]",
|
||||
aAudio->mTime.ToMicroseconds(),
|
||||
aAudio->GetEndTime().ToMicroseconds());
|
||||
mStateObj->HandleAudioDecoded(aAudio);
|
||||
},
|
||||
@ -3223,7 +3224,8 @@ MediaDecoderStateMachine::RequestVideoData(bool aSkipToNextKeyframe,
|
||||
// Handle abnormal or negative timestamps.
|
||||
mDecodedVideoEndTime = std::max(
|
||||
mDecodedVideoEndTime, aVideo->GetEndTime());
|
||||
LOGV("OnVideoDecoded [%" PRId64 ",%" PRId64 "]", aVideo->mTime,
|
||||
LOGV("OnVideoDecoded [%" PRId64 ",%" PRId64 "]",
|
||||
aVideo->mTime.ToMicroseconds(),
|
||||
aVideo->GetEndTime().ToMicroseconds());
|
||||
mStateObj->HandleVideoDecoded(aVideo, videoDecodeStartTime);
|
||||
},
|
||||
|
@ -1724,7 +1724,7 @@ MediaFormatReader::NotifyNewOutput(
|
||||
auto& decoder = GetDecoderData(aTrack);
|
||||
for (auto& sample : aResults) {
|
||||
LOGV("Received new %s sample time:%" PRId64 " duration:%" PRId64,
|
||||
TrackTypeToStr(aTrack), sample->mTime,
|
||||
TrackTypeToStr(aTrack), sample->mTime.ToMicroseconds(),
|
||||
sample->mDuration.ToMicroseconds());
|
||||
decoder.mOutput.AppendElement(sample);
|
||||
decoder.mNumSamplesOutput++;
|
||||
@ -2011,19 +2011,19 @@ MediaFormatReader::HandleDemuxedSamples(
|
||||
if (sample->mKeyframe) {
|
||||
ScheduleUpdate(aTrack);
|
||||
} else {
|
||||
auto time = TimeInterval(
|
||||
TimeUnit::FromMicroseconds(sample->mTime), sample->GetEndTime());
|
||||
auto time = TimeInterval(sample->mTime, sample->GetEndTime());
|
||||
InternalSeekTarget seekTarget =
|
||||
decoder.mTimeThreshold.refOr(InternalSeekTarget(time, false));
|
||||
LOG("Stream change occurred on a non-keyframe. Seeking to:%" PRId64,
|
||||
sample->mTime);
|
||||
sample->mTime.ToMicroseconds());
|
||||
InternalSeek(aTrack, seekTarget);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
LOGV("Input:%" PRId64 " (dts:%" PRId64 " kf:%d)",
|
||||
sample->mTime, sample->mTimecode, sample->mKeyframe);
|
||||
sample->mTime.ToMicroseconds(), sample->mTimecode.ToMicroseconds(),
|
||||
sample->mKeyframe);
|
||||
decoder.mNumSamplesInput++;
|
||||
decoder.mSizeOfQueue++;
|
||||
if (aTrack == TrackInfo::kVideoTrack) {
|
||||
@ -2186,7 +2186,7 @@ MediaFormatReader::Update(TrackType aTrack)
|
||||
while (decoder.mTimeThreshold && decoder.mOutput.Length()) {
|
||||
RefPtr<MediaData>& output = decoder.mOutput[0];
|
||||
InternalSeekTarget target = decoder.mTimeThreshold.ref();
|
||||
media::TimeUnit time = media::TimeUnit::FromMicroseconds(output->mTime);
|
||||
media::TimeUnit time = output->mTime;
|
||||
if (time >= target.Time()) {
|
||||
// We have reached our internal seek target.
|
||||
decoder.mTimeThreshold.reset();
|
||||
@ -2196,7 +2196,7 @@ MediaFormatReader::Update(TrackType aTrack)
|
||||
if (time < target.Time() || (target.mDropTarget && target.Contains(time))) {
|
||||
LOGV("Internal Seeking: Dropping %s frame time:%f wanted:%f (kf:%d)",
|
||||
TrackTypeToStr(aTrack),
|
||||
media::TimeUnit::FromMicroseconds(output->mTime).ToSeconds(),
|
||||
output->mTime.ToSeconds(),
|
||||
target.Time().ToSeconds(),
|
||||
output->mKeyframe);
|
||||
decoder.mOutput.RemoveElementAt(0);
|
||||
@ -2206,7 +2206,8 @@ MediaFormatReader::Update(TrackType aTrack)
|
||||
|
||||
while (decoder.mOutput.Length()
|
||||
&& decoder.mOutput[0]->mType == MediaData::NULL_DATA) {
|
||||
LOGV("Dropping null data. Time: %" PRId64, decoder.mOutput[0]->mTime);
|
||||
LOGV("Dropping null data. Time: %" PRId64,
|
||||
decoder.mOutput[0]->mTime.ToMicroseconds());
|
||||
decoder.mOutput.RemoveElementAt(0);
|
||||
decoder.mSizeOfQueue -= 1;
|
||||
}
|
||||
@ -2218,8 +2219,7 @@ MediaFormatReader::Update(TrackType aTrack)
|
||||
decoder.mOutput.RemoveElementAt(0);
|
||||
decoder.mSizeOfQueue -= 1;
|
||||
decoder.mLastSampleTime =
|
||||
Some(TimeInterval(TimeUnit::FromMicroseconds(output->mTime),
|
||||
output->GetEndTime()));
|
||||
Some(TimeInterval(output->mTime, output->GetEndTime()));
|
||||
decoder.mNumSamplesOutputTotal++;
|
||||
ReturnOutput(output, aTrack);
|
||||
// We have a decoded sample ready to be returned.
|
||||
@ -2229,17 +2229,17 @@ MediaFormatReader::Update(TrackType aTrack)
|
||||
a.mStats.mDecodedFrames = static_cast<uint32_t>(delta);
|
||||
mLastReportedNumDecodedFrames = decoder.mNumSamplesOutputTotal;
|
||||
if (output->mKeyframe) {
|
||||
if (mPreviousDecodedKeyframeTime_us < output->mTime) {
|
||||
if (mPreviousDecodedKeyframeTime_us < output->mTime.ToMicroseconds()) {
|
||||
// There is a previous keyframe -> Record inter-keyframe stats.
|
||||
uint64_t segment_us =
|
||||
output->mTime - mPreviousDecodedKeyframeTime_us;
|
||||
output->mTime.ToMicroseconds() - mPreviousDecodedKeyframeTime_us;
|
||||
a.mStats.mInterKeyframeSum_us += segment_us;
|
||||
a.mStats.mInterKeyframeCount += 1;
|
||||
if (a.mStats.mInterKeyFrameMax_us < segment_us) {
|
||||
a.mStats.mInterKeyFrameMax_us = segment_us;
|
||||
}
|
||||
}
|
||||
mPreviousDecodedKeyframeTime_us = output->mTime;
|
||||
mPreviousDecodedKeyframeTime_us = output->mTime.ToMicroseconds();
|
||||
}
|
||||
nsCString error;
|
||||
mVideo.mIsHardwareAccelerated =
|
||||
@ -2379,7 +2379,7 @@ MediaFormatReader::ReturnOutput(MediaData* aData, TrackType aTrack)
|
||||
MOZ_ASSERT(GetDecoderData(aTrack).HasPromise());
|
||||
MOZ_DIAGNOSTIC_ASSERT(aData->mType != MediaData::NULL_DATA);
|
||||
LOG("Resolved data promise for %s [%" PRId64 ", %" PRId64 "]", TrackTypeToStr(aTrack),
|
||||
aData->mTime, aData->GetEndTime().ToMicroseconds());
|
||||
aData->mTime.ToMicroseconds(), aData->GetEndTime().ToMicroseconds());
|
||||
|
||||
if (aTrack == TrackInfo::kAudioTrack) {
|
||||
AudioData* audioData = static_cast<AudioData*>(aData);
|
||||
@ -2506,8 +2506,7 @@ MediaFormatReader::DropDecodedSamples(TrackType aTrack)
|
||||
auto& decoder = GetDecoderData(aTrack);
|
||||
size_t lengthDecodedQueue = decoder.mOutput.Length();
|
||||
if (lengthDecodedQueue && decoder.mTimeThreshold.isSome()) {
|
||||
TimeUnit time =
|
||||
TimeUnit::FromMicroseconds(decoder.mOutput.LastElement()->mTime);
|
||||
TimeUnit time = decoder.mOutput.LastElement()->mTime;
|
||||
if (time >= decoder.mTimeThreshold.ref().Time()) {
|
||||
// We would have reached our internal seek target.
|
||||
decoder.mTimeThreshold.reset();
|
||||
@ -3102,8 +3101,7 @@ MediaFormatReader::OnFirstDemuxCompleted(
|
||||
|
||||
auto& decoder = GetDecoderData(aType);
|
||||
MOZ_ASSERT(decoder.mFirstDemuxedSampleTime.isNothing());
|
||||
decoder.mFirstDemuxedSampleTime.emplace(
|
||||
TimeUnit::FromMicroseconds(aSamples->mSamples[0]->mTime));
|
||||
decoder.mFirstDemuxedSampleTime.emplace(aSamples->mSamples[0]->mTime);
|
||||
MaybeResolveMetadataPromise();
|
||||
}
|
||||
|
||||
|
@ -175,7 +175,7 @@ private:
|
||||
DECL_MEDIA_PREF("media.rust.test_mode", RustTestMode, bool, false);
|
||||
#endif
|
||||
|
||||
#if defined(OS_LINUX)
|
||||
#if defined(MOZ_WIDGET_GTK)
|
||||
DECL_MEDIA_PREF("media.rust.mp4parser", EnableRustMP4Parser, bool, true);
|
||||
#else
|
||||
DECL_MEDIA_PREF("media.rust.mp4parser", EnableRustMP4Parser, bool, false);
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
MOZ_ASSERT(!mEndOfStream);
|
||||
MOZ_ASSERT(aItem);
|
||||
NS_ADDREF(aItem);
|
||||
MOZ_ASSERT(aItem->GetEndTime().ToMicroseconds() >= aItem->mTime);
|
||||
MOZ_ASSERT(aItem->GetEndTime() >= aItem->mTime);
|
||||
nsDeque::Push(aItem);
|
||||
mPushEvent.Notify(RefPtr<T>(aItem));
|
||||
}
|
||||
@ -104,7 +104,7 @@ public:
|
||||
}
|
||||
T* last = static_cast<T*>(nsDeque::Peek());
|
||||
T* first = static_cast<T*>(nsDeque::PeekFront());
|
||||
return last->GetEndTime().ToMicroseconds() - first->mTime;
|
||||
return (last->GetEndTime() - first->mTime).ToMicroseconds();
|
||||
}
|
||||
|
||||
void LockedForEach(nsDequeFunctor& aFunctor) const {
|
||||
|
@ -141,7 +141,8 @@ bool AndroidMediaReader::DecodeVideoFrame(bool& aKeyframeSkip,
|
||||
if (mLastVideoFrame) {
|
||||
int64_t durationUs;
|
||||
mPlugin->GetDuration(mPlugin, &durationUs);
|
||||
durationUs = std::max<int64_t>(durationUs - mLastVideoFrame->mTime, 0);
|
||||
durationUs = std::max<int64_t>(
|
||||
durationUs - mLastVideoFrame->mTime.ToMicroseconds(), 0);
|
||||
mLastVideoFrame->UpdateDuration(TimeUnit::FromMicroseconds(durationUs));
|
||||
mVideoQueue.Push(mLastVideoFrame);
|
||||
mLastVideoFrame = nullptr;
|
||||
@ -247,8 +248,8 @@ bool AndroidMediaReader::DecodeVideoFrame(bool& aKeyframeSkip,
|
||||
// Calculate the duration as the timestamp of the current frame minus the
|
||||
// timestamp of the previous frame. We can then return the previously
|
||||
// decoded frame, and it will have a valid timestamp.
|
||||
int64_t duration = v->mTime - mLastVideoFrame->mTime;
|
||||
mLastVideoFrame->UpdateDuration(TimeUnit::FromMicroseconds(duration));
|
||||
auto duration = v->mTime - mLastVideoFrame->mTime;
|
||||
mLastVideoFrame->UpdateDuration(duration);
|
||||
|
||||
// We have the start time of the next frame, so we can push the previous
|
||||
// frame into the queue, except if the end time is below the threshold,
|
||||
@ -320,7 +321,7 @@ AndroidMediaReader::Seek(const SeekTarget& aTarget)
|
||||
RefPtr<AndroidMediaReader> self = this;
|
||||
DecodeToFirstVideoData()->Then(OwnerThread(), __func__, [self] (MediaData* v) {
|
||||
self->mSeekRequest.Complete();
|
||||
self->mAudioSeekTimeUs = v->mTime;
|
||||
self->mAudioSeekTimeUs = v->mTime.ToMicroseconds();
|
||||
self->mSeekPromise.Resolve(media::TimeUnit::FromMicroseconds(self->mAudioSeekTimeUs), __func__);
|
||||
}, [self, aTarget] () {
|
||||
self->mSeekRequest.Complete();
|
||||
|
@ -980,13 +980,13 @@ FlacTrackDemuxer::GetNextFrame(const flac::Frame& aFrame)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
frame->mTime = aFrame.Time().ToMicroseconds();
|
||||
frame->mTime = aFrame.Time();
|
||||
frame->mDuration = aFrame.Duration();
|
||||
frame->mTimecode = frame->mTime;
|
||||
frame->mOffset = aFrame.Offset();
|
||||
frame->mKeyframe = true;
|
||||
|
||||
MOZ_ASSERT(frame->mTime >= 0);
|
||||
MOZ_ASSERT(!frame->mTime.IsNegative());
|
||||
MOZ_ASSERT(!frame->mDuration.IsNegative());
|
||||
|
||||
return frame.forget();
|
||||
|
@ -411,10 +411,10 @@ MP4TrackDemuxer::EnsureUpToDateIndex()
|
||||
RefPtr<MP4TrackDemuxer::SeekPromise>
|
||||
MP4TrackDemuxer::Seek(const media::TimeUnit& aTime)
|
||||
{
|
||||
int64_t seekTime = aTime.ToMicroseconds();
|
||||
auto seekTime = aTime;
|
||||
mQueuedSample = nullptr;
|
||||
|
||||
mIterator->Seek(seekTime);
|
||||
mIterator->Seek(seekTime.ToMicroseconds());
|
||||
|
||||
// Check what time we actually seeked to.
|
||||
RefPtr<MediaRawData> sample;
|
||||
@ -436,8 +436,7 @@ MP4TrackDemuxer::Seek(const media::TimeUnit& aTime)
|
||||
|
||||
SetNextKeyFrameTime();
|
||||
|
||||
return SeekPromise::CreateAndResolve(
|
||||
media::TimeUnit::FromMicroseconds(seekTime), __func__);
|
||||
return SeekPromise::CreateAndResolve(seekTime, __func__);
|
||||
}
|
||||
|
||||
already_AddRefed<MediaRawData>
|
||||
@ -461,9 +460,10 @@ MP4TrackDemuxer::GetNextSample()
|
||||
NS_WARNING(nsPrintfCString("Frame incorrectly marked as %skeyframe "
|
||||
"@ pts:%" PRId64 " dur:%" PRId64
|
||||
" dts:%" PRId64,
|
||||
keyframe ? "" : "non-", sample->mTime,
|
||||
keyframe ? "" : "non-",
|
||||
sample->mTime.ToMicroseconds(),
|
||||
sample->mDuration.ToMicroseconds(),
|
||||
sample->mTimecode)
|
||||
sample->mTimecode.ToMicroseconds())
|
||||
.get());
|
||||
sample->mKeyframe = keyframe;
|
||||
}
|
||||
@ -473,8 +473,9 @@ MP4TrackDemuxer::GetNextSample()
|
||||
NS_WARNING(
|
||||
nsPrintfCString("Invalid H264 frame @ pts:%" PRId64 " dur:%" PRId64
|
||||
" dts:%" PRId64,
|
||||
sample->mTime, sample->mDuration.ToMicroseconds(),
|
||||
sample->mTimecode)
|
||||
sample->mTime.ToMicroseconds(),
|
||||
sample->mDuration.ToMicroseconds(),
|
||||
sample->mTimecode.ToMicroseconds())
|
||||
.get());
|
||||
// We could reject the sample now, however demuxer errors are fatal.
|
||||
// So we keep the invalid frame, relying on the H264 decoder to
|
||||
@ -540,7 +541,7 @@ MP4TrackDemuxer::GetSamples(int32_t aNumSamples)
|
||||
|
||||
if (mNextKeyframeTime.isNothing()
|
||||
|| samples->mSamples.LastElement()->mTime
|
||||
>= mNextKeyframeTime.value().ToMicroseconds()) {
|
||||
>= mNextKeyframeTime.value()) {
|
||||
SetNextKeyFrameTime();
|
||||
}
|
||||
return SamplesPromise::CreateAndResolve(samples, __func__);
|
||||
@ -590,7 +591,7 @@ MP4TrackDemuxer::SkipToNextRandomAccessPoint(
|
||||
RefPtr<MediaRawData> sample;
|
||||
while (!found && (sample = GetNextSample())) {
|
||||
parsed++;
|
||||
if (sample->mKeyframe && sample->mTime >= aTimeThreshold.ToMicroseconds()) {
|
||||
if (sample->mKeyframe && sample->mTime >= aTimeThreshold) {
|
||||
found = true;
|
||||
mQueuedSample = sample;
|
||||
}
|
||||
|
@ -190,7 +190,7 @@ ChromiumCDMParent::InitCDMInputBuffer(gmp::CDMInputBuffer& aBuffer,
|
||||
aBuffer = gmp::CDMInputBuffer(shmem,
|
||||
crypto.mKeyId,
|
||||
crypto.mIV,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration.ToMicroseconds(),
|
||||
crypto.mPlainSizes,
|
||||
crypto.mEncryptedSizes,
|
||||
@ -835,7 +835,7 @@ ChromiumCDMParent::DecryptAndDecodeFrame(MediaRawData* aSample)
|
||||
}
|
||||
|
||||
GMP_LOG("ChromiumCDMParent::DecryptAndDecodeFrame t=%" PRId64,
|
||||
aSample->mTime);
|
||||
aSample->mTime.ToMicroseconds());
|
||||
|
||||
CDMInputBuffer buffer;
|
||||
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
RefPtr<MediaTrackDemuxer> track = aTrackDemuxer;
|
||||
RefPtr<MP4DemuxerBinding> binding = this;
|
||||
|
||||
int64_t time = -1;
|
||||
auto time = media::TimeUnit::Invalid();
|
||||
while (mIndex < mSamples.Length()) {
|
||||
uint32_t i = mIndex++;
|
||||
if (mSamples[i]->mKeyframe) {
|
||||
@ -74,7 +74,7 @@ public:
|
||||
|
||||
RefPtr<GenericPromise> p = mCheckTrackKeyFramePromise.Ensure(__func__);
|
||||
|
||||
if (time == -1) {
|
||||
if (!time.IsValid()) {
|
||||
mCheckTrackKeyFramePromise.Resolve(true, __func__);
|
||||
return p;
|
||||
}
|
||||
@ -82,7 +82,7 @@ public:
|
||||
|
||||
DispatchTask(
|
||||
[track, time, binding] () {
|
||||
track->Seek(media::TimeUnit::FromMicroseconds(time))->Then(binding->mTaskQueue, __func__,
|
||||
track->Seek(time)->Then(binding->mTaskQueue, __func__,
|
||||
[track, time, binding] () {
|
||||
track->GetSamples()->Then(binding->mTaskQueue, __func__,
|
||||
[track, time, binding] (RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
|
||||
@ -125,7 +125,7 @@ public:
|
||||
for (uint32_t i = 0; i < (binding->mSamples.Length() - 1); i++) {
|
||||
EXPECT_LT(binding->mSamples[i]->mTimecode, binding->mSamples[i + 1]->mTimecode);
|
||||
if (binding->mSamples[i]->mKeyframe) {
|
||||
binding->mKeyFrameTimecodes.AppendElement(binding->mSamples[i]->mTimecode);
|
||||
binding->mKeyFrameTimecodes.AppendElement(binding->mSamples[i]->mTimecode.ToMicroseconds());
|
||||
}
|
||||
}
|
||||
binding->mCheckTrackSamples.Resolve(true, __func__);
|
||||
|
@ -230,8 +230,8 @@ VideoDecoderChild::Decode(MediaRawData* aSample)
|
||||
memcpy(buffer.get<uint8_t>(), aSample->Data(), aSample->Size());
|
||||
|
||||
MediaRawDataIPDL sample(MediaDataIPDL(aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTimecode,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mTimecode.ToMicroseconds(),
|
||||
aSample->mDuration.ToMicroseconds(),
|
||||
aSample->mFrames,
|
||||
aSample->mKeyframe),
|
||||
|
@ -137,8 +137,8 @@ VideoDecoderParent::RecvInput(const MediaRawDataIPDL& aData)
|
||||
return IPC_OK();
|
||||
}
|
||||
data->mOffset = aData.base().offset();
|
||||
data->mTime = aData.base().time();
|
||||
data->mTimecode = aData.base().timecode();
|
||||
data->mTime = media::TimeUnit::FromMicroseconds(aData.base().time());
|
||||
data->mTimecode = media::TimeUnit::FromMicroseconds(aData.base().timecode());
|
||||
data->mDuration = media::TimeUnit::FromMicroseconds(aData.base().duration());
|
||||
data->mKeyframe = aData.base().keyframe();
|
||||
|
||||
@ -191,7 +191,8 @@ VideoDecoderParent::ProcessDecodedData(
|
||||
}
|
||||
|
||||
VideoDataIPDL output(
|
||||
MediaDataIPDL(data->mOffset, data->mTime, data->mTimecode,
|
||||
MediaDataIPDL(data->mOffset, data->mTime.ToMicroseconds(),
|
||||
data->mTimecode.ToMicroseconds(),
|
||||
data->mDuration.ToMicroseconds(),
|
||||
data->mFrames, data->mKeyframe),
|
||||
video->mDisplay,
|
||||
|
@ -285,7 +285,8 @@ AudioSink::PopFrames(uint32_t aFrames)
|
||||
auto framesToPop = std::min(aFrames, mCursor->Available());
|
||||
|
||||
SINK_LOG_V("playing audio at time=%" PRId64 " offset=%u length=%u",
|
||||
mCurrentData->mTime, mCurrentData->mFrames - mCursor->Available(), framesToPop);
|
||||
mCurrentData->mTime.ToMicroseconds(),
|
||||
mCurrentData->mFrames - mCursor->Available(), framesToPop);
|
||||
|
||||
UniquePtr<AudioStream::Chunk> chunk =
|
||||
MakeUnique<Chunk>(mCurrentData, framesToPop, mCursor->Ptr());
|
||||
@ -406,8 +407,8 @@ AudioSink::NotifyAudioNeeded()
|
||||
// audio hardware, so we can play across the gap.
|
||||
// Calculate the timestamp of the next chunk of audio in numbers of
|
||||
// samples.
|
||||
CheckedInt64 sampleTime = TimeUnitToFrames(
|
||||
TimeUnit::FromMicroseconds(data->mTime) - mStartTime, data->mRate);
|
||||
CheckedInt64 sampleTime =
|
||||
TimeUnitToFrames(data->mTime - mStartTime, data->mRate);
|
||||
// Calculate the number of frames that have been pushed onto the audio hardware.
|
||||
CheckedInt64 missingFrames = sampleTime - mFramesParsed;
|
||||
|
||||
@ -501,7 +502,7 @@ AudioSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer,
|
||||
}
|
||||
RefPtr<AudioData> data =
|
||||
new AudioData(aReference->mOffset,
|
||||
aReference->mTime,
|
||||
aReference->mTime.ToMicroseconds(),
|
||||
duration.value(),
|
||||
frames,
|
||||
Move(aBuffer),
|
||||
|
@ -461,7 +461,7 @@ SendStreamAudio(DecodedStreamData* aStream, const media::TimeUnit& aStartTime,
|
||||
// the exact same silences
|
||||
CheckedInt64 audioWrittenOffset = aStream->mAudioFramesWritten
|
||||
+ TimeUnitToFrames(aStartTime, aRate);
|
||||
CheckedInt64 frameOffset = UsecsToFrames(audio->mTime, aRate);
|
||||
CheckedInt64 frameOffset = TimeUnitToFrames(audio->mTime, aRate);
|
||||
|
||||
if (!audioWrittenOffset.isValid() ||
|
||||
!frameOffset.isValid() ||
|
||||
@ -595,7 +595,7 @@ DecodedStream::SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHa
|
||||
for (uint32_t i = 0; i < video.Length(); ++i) {
|
||||
VideoData* v = video[i];
|
||||
|
||||
if (mData->mNextVideoTime.ToMicroseconds() < v->mTime) {
|
||||
if (mData->mNextVideoTime < v->mTime) {
|
||||
// Write last video frame to catch up. mLastVideoImage can be null here
|
||||
// which is fine, it just means there's no video.
|
||||
|
||||
@ -605,12 +605,11 @@ DecodedStream::SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHa
|
||||
// video frame). E.g. if we have a video frame that is 30 sec long
|
||||
// and capture happens at 15 sec, we'll have to append a black frame
|
||||
// that is 15 sec long.
|
||||
WriteVideoToMediaStream(sourceStream, mData->mLastVideoImage,
|
||||
FromMicroseconds(v->mTime),
|
||||
WriteVideoToMediaStream(sourceStream, mData->mLastVideoImage, v->mTime,
|
||||
mData->mNextVideoTime, mData->mLastVideoImageDisplaySize,
|
||||
tracksStartTimeStamp + TimeDuration::FromMicroseconds(v->mTime),
|
||||
tracksStartTimeStamp + v->mTime.ToTimeDuration(),
|
||||
&output, aPrincipalHandle);
|
||||
mData->mNextVideoTime = FromMicroseconds(v->mTime);
|
||||
mData->mNextVideoTime = v->mTime;
|
||||
}
|
||||
|
||||
if (mData->mNextVideoTime < v->GetEndTime()) {
|
||||
@ -746,7 +745,7 @@ DecodedStream::NotifyOutput(int64_t aTime)
|
||||
{
|
||||
AssertOwnerThread();
|
||||
mLastOutputTime = FromMicroseconds(aTime);
|
||||
int64_t currentTime = GetPosition().ToMicroseconds();
|
||||
auto currentTime = GetPosition();
|
||||
|
||||
// Remove audio samples that have been played by MSG from the queue.
|
||||
RefPtr<AudioData> a = mAudioQueue.PeekFront();
|
||||
|
@ -365,8 +365,7 @@ VideoSink::RenderVideoFrames(int32_t aMaxFrames,
|
||||
continue;
|
||||
}
|
||||
|
||||
int64_t frameTime = frame->mTime;
|
||||
if (frameTime < 0) {
|
||||
if (frame->mTime.IsNegative()) {
|
||||
// Frame times before the start time are invalid; drop such frames
|
||||
continue;
|
||||
}
|
||||
@ -374,7 +373,7 @@ VideoSink::RenderVideoFrames(int32_t aMaxFrames,
|
||||
TimeStamp t;
|
||||
if (aMaxFrames > 1) {
|
||||
MOZ_ASSERT(!aClockTimeStamp.IsNull());
|
||||
int64_t delta = frame->mTime - aClockTime;
|
||||
int64_t delta = frame->mTime.ToMicroseconds() - aClockTime;
|
||||
t = aClockTimeStamp +
|
||||
TimeDuration::FromMicroseconds(delta / params.mPlaybackRate);
|
||||
if (!lastFrameTime.IsNull() && t <= lastFrameTime) {
|
||||
@ -394,7 +393,8 @@ VideoSink::RenderVideoFrames(int32_t aMaxFrames,
|
||||
img->mProducerID = mProducerID;
|
||||
|
||||
VSINK_LOG_V("playing video frame %" PRId64 " (id=%x) (vq-queued=%" PRIuSIZE ")",
|
||||
frame->mTime, frame->mFrameID, VideoQueue().GetSize());
|
||||
frame->mTime.ToMicroseconds(), frame->mFrameID,
|
||||
VideoQueue().GetSize());
|
||||
}
|
||||
|
||||
if (images.Length() > 0) {
|
||||
@ -424,7 +424,7 @@ VideoSink::UpdateRenderedVideoFrames()
|
||||
} else {
|
||||
mFrameStats.NotifyDecodedFrames({ 0, 0, 1 });
|
||||
VSINK_LOG_V("discarding video frame mTime=%" PRId64 " clock_time=%" PRId64,
|
||||
frame->mTime, clockTime.ToMicroseconds());
|
||||
frame->mTime.ToMicroseconds(), clockTime.ToMicroseconds());
|
||||
}
|
||||
}
|
||||
|
||||
@ -450,7 +450,7 @@ VideoSink::UpdateRenderedVideoFrames()
|
||||
return;
|
||||
}
|
||||
|
||||
int64_t nextFrameTime = frames[1]->mTime;
|
||||
int64_t nextFrameTime = frames[1]->mTime.ToMicroseconds();
|
||||
int64_t delta = std::max(
|
||||
nextFrameTime - clockTime.ToMicroseconds(), MIN_UPDATE_INTERVAL_US);
|
||||
TimeStamp target = nowTime + TimeDuration::FromMicroseconds(
|
||||
|
@ -479,7 +479,7 @@ MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples)
|
||||
}
|
||||
RefPtr<SamplesHolder> samples = new SamplesHolder;
|
||||
samples->mSamples.AppendElement(sample);
|
||||
if (mNextRandomAccessPoint.ToMicroseconds() <= sample->mTime) {
|
||||
if (mNextRandomAccessPoint <= sample->mTime) {
|
||||
MonitorAutoLock mon(mMonitor);
|
||||
mNextRandomAccessPoint =
|
||||
mManager->GetNextRandomAccessPoint(mType, MediaSourceDemuxer::EOS_FUZZ);
|
||||
|
@ -459,8 +459,8 @@ TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime,
|
||||
MSE_DEBUG("Step1. Evicting %" PRId64 " bytes prior currentTime",
|
||||
aSizeToEvict - toEvict);
|
||||
CodedFrameRemoval(
|
||||
TimeInterval(TimeUnit::FromMicroseconds(0),
|
||||
TimeUnit::FromMicroseconds(buffer[lastKeyFrameIndex]->mTime - 1)));
|
||||
TimeInterval(TimeUnit::Zero(),
|
||||
buffer[lastKeyFrameIndex]->mTime - TimeUnit::FromMicroseconds(1)));
|
||||
}
|
||||
|
||||
if (mSizeSourceBuffer <= finalSize) {
|
||||
@ -487,7 +487,7 @@ TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime,
|
||||
uint32_t evictedFramesStartIndex = buffer.Length();
|
||||
for (int32_t i = buffer.Length() - 1; i >= 0; i--) {
|
||||
const auto& frame = buffer[i];
|
||||
if (frame->mTime <= upperLimit.ToMicroseconds() || toEvict < 0) {
|
||||
if (frame->mTime <= upperLimit || toEvict < 0) {
|
||||
// We've reached a frame that shouldn't be evicted -> Evict after it -> i+1.
|
||||
// Or the previous loop reached the eviction threshold -> Evict from it -> i+1.
|
||||
evictedFramesStartIndex = i + 1;
|
||||
@ -499,7 +499,7 @@ TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime,
|
||||
MSE_DEBUG("Step2. Evicting %" PRId64 " bytes from trailing data",
|
||||
mSizeSourceBuffer - finalSize - toEvict);
|
||||
CodedFrameRemoval(
|
||||
TimeInterval(TimeUnit::FromMicroseconds(buffer[evictedFramesStartIndex]->mTime),
|
||||
TimeInterval(buffer[evictedFramesStartIndex]->mTime,
|
||||
TimeUnit::FromInfinity()));
|
||||
}
|
||||
}
|
||||
@ -559,8 +559,8 @@ TrackBuffersManager::CodedFrameRemoval(TimeInterval aInterval)
|
||||
// then update remove end timestamp to that random access point timestamp.
|
||||
if (end < track->mBufferedRanges.GetEnd()) {
|
||||
for (auto& frame : track->GetTrackBuffer()) {
|
||||
if (frame->mKeyframe && frame->mTime >= end.ToMicroseconds()) {
|
||||
removeEndTimestamp = TimeUnit::FromMicroseconds(frame->mTime);
|
||||
if (frame->mKeyframe && frame->mTime >= end) {
|
||||
removeEndTimestamp = frame->mTime;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1420,14 +1420,12 @@ TimeInterval
|
||||
TrackBuffersManager::PresentationInterval(const TrackBuffer& aSamples) const
|
||||
{
|
||||
TimeInterval presentationInterval =
|
||||
TimeInterval(TimeUnit::FromMicroseconds(aSamples[0]->mTime),
|
||||
aSamples[0]->GetEndTime());
|
||||
TimeInterval(aSamples[0]->mTime, aSamples[0]->GetEndTime());
|
||||
|
||||
for (uint32_t i = 1; i < aSamples.Length(); i++) {
|
||||
auto& sample = aSamples[i];
|
||||
presentationInterval = presentationInterval.Span(
|
||||
TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
|
||||
sample->GetEndTime()));
|
||||
TimeInterval(sample->mTime, sample->GetEndTime()));
|
||||
}
|
||||
return presentationInterval;
|
||||
}
|
||||
@ -1445,8 +1443,8 @@ TrackBuffersManager::ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData)
|
||||
// Let presentation timestamp be a double precision floating point representation of the coded frame's presentation timestamp in seconds.
|
||||
TimeUnit presentationTimestamp =
|
||||
mSourceBufferAttributes->mGenerateTimestamps
|
||||
? TimeUnit()
|
||||
: TimeUnit::FromMicroseconds(aSamples[0]->mTime);
|
||||
? TimeUnit::Zero()
|
||||
: aSamples[0]->mTime;
|
||||
|
||||
// 3. If mode equals "sequence" and group start timestamp is set, then run the following steps:
|
||||
CheckSequenceDiscontinuity(presentationTimestamp);
|
||||
@ -1488,9 +1486,9 @@ TrackBuffersManager::ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData)
|
||||
SAMPLE_DEBUG("Processing %s frame(pts:%" PRId64 " end:%" PRId64 ", dts:%" PRId64 ", duration:%" PRId64 ", "
|
||||
"kf:%d)",
|
||||
aTrackData.mInfo->mMimeType.get(),
|
||||
sample->mTime,
|
||||
sample->mTime.ToMicroseconds(),
|
||||
sample->GetEndTime().ToMicroseconds(),
|
||||
sample->mTimecode,
|
||||
sample->mTimecode.ToMicroseconds(),
|
||||
sample->mDuration.ToMicroseconds(),
|
||||
sample->mKeyframe);
|
||||
|
||||
@ -1524,8 +1522,8 @@ TrackBuffersManager::ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData)
|
||||
// Step 3 is performed earlier or when a discontinuity has been detected.
|
||||
// 4. If timestampOffset is not 0, then run the following steps:
|
||||
|
||||
TimeUnit sampleTime = TimeUnit::FromMicroseconds(sample->mTime);
|
||||
TimeUnit sampleTimecode = TimeUnit::FromMicroseconds(sample->mTimecode);
|
||||
TimeUnit sampleTime = sample->mTime;
|
||||
TimeUnit sampleTimecode = sample->mTimecode;
|
||||
TimeUnit sampleDuration = sample->mDuration;
|
||||
TimeUnit timestampOffset = mSourceBufferAttributes->GetTimestampOffset();
|
||||
|
||||
@ -1618,8 +1616,8 @@ TrackBuffersManager::ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData)
|
||||
|
||||
samplesRange += sampleInterval;
|
||||
sizeNewSamples += sample->ComputedSizeOfIncludingThis();
|
||||
sample->mTime = sampleInterval.mStart.ToMicroseconds();
|
||||
sample->mTimecode = decodeTimestamp.ToMicroseconds();
|
||||
sample->mTime = sampleInterval.mStart;
|
||||
sample->mTimecode = decodeTimestamp;
|
||||
sample->mTrackInfo = trackBuffer.mLastInfo;
|
||||
samples.AppendElement(sample);
|
||||
|
||||
@ -1694,7 +1692,7 @@ TrackBuffersManager::CheckNextInsertionIndex(TrackData& aTrackData,
|
||||
// We will insert our new frames right before.
|
||||
for (uint32_t i = 0; i < data.Length(); i++) {
|
||||
const RefPtr<MediaRawData>& sample = data[i];
|
||||
if (sample->mTime >= target.mStart.ToMicroseconds() ||
|
||||
if (sample->mTime >= target.mStart ||
|
||||
sample->GetEndTime() > target.mStart) {
|
||||
aTrackData.mNextInsertionIndex = Some(i);
|
||||
return true;
|
||||
@ -1764,8 +1762,7 @@ TrackBuffersManager::InsertFrames(TrackBuffer& aSamples,
|
||||
}
|
||||
|
||||
// 16. Add the coded frame with the presentation timestamp, decode timestamp, and frame duration to the track buffer.
|
||||
if (!CheckNextInsertionIndex(aTrackData,
|
||||
TimeUnit::FromMicroseconds(aSamples[0]->mTime))) {
|
||||
if (!CheckNextInsertionIndex(aTrackData, aSamples[0]->mTime)) {
|
||||
RejectProcessing(NS_ERROR_FAILURE, __func__);
|
||||
return;
|
||||
}
|
||||
@ -1837,8 +1834,7 @@ TrackBuffersManager::RemoveFrames(const TimeIntervals& aIntervals,
|
||||
for (uint32_t i = aStartIndex; i < data.Length(); i++) {
|
||||
const RefPtr<MediaRawData> sample = data[i];
|
||||
TimeInterval sampleInterval =
|
||||
TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
|
||||
sample->GetEndTime());
|
||||
TimeInterval(sample->mTime, sample->GetEndTime());
|
||||
if (aIntervals.Contains(sampleInterval)) {
|
||||
if (firstRemovedIndex.isNothing()) {
|
||||
firstRemovedIndex = Some(i);
|
||||
@ -1875,8 +1871,7 @@ TrackBuffersManager::RemoveFrames(const TimeIntervals& aIntervals,
|
||||
for (uint32_t i = firstRemovedIndex.ref(); i <= lastRemovedIndex; i++) {
|
||||
const RefPtr<MediaRawData> sample = data[i];
|
||||
TimeInterval sampleInterval =
|
||||
TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
|
||||
sample->GetEndTime());
|
||||
TimeInterval(sample->mTime, sample->GetEndTime());
|
||||
removedIntervals += sampleInterval;
|
||||
if (sample->mDuration > maxSampleDuration) {
|
||||
maxSampleDuration = sample->mDuration;
|
||||
@ -1938,15 +1933,14 @@ TrackBuffersManager::RemoveFrames(const TimeIntervals& aIntervals,
|
||||
if (aIntervals.GetEnd() >= aTrackData.mHighestStartTimestamp) {
|
||||
// The sample with the highest presentation time got removed.
|
||||
// Rescan the trackbuffer to determine the new one.
|
||||
int64_t highestStartTime = 0;
|
||||
TimeUnit highestStartTime;
|
||||
for (const auto& sample : data) {
|
||||
if (sample->mTime > highestStartTime) {
|
||||
highestStartTime = sample->mTime;
|
||||
}
|
||||
}
|
||||
MonitorAutoLock mon(mMonitor);
|
||||
aTrackData.mHighestStartTimestamp =
|
||||
TimeUnit::FromMicroseconds(highestStartTime);
|
||||
aTrackData.mHighestStartTimestamp = highestStartTime;
|
||||
}
|
||||
|
||||
return firstRemovedIndex.ref();
|
||||
@ -2116,7 +2110,7 @@ uint32_t TrackBuffersManager::FindSampleIndex(const TrackBuffer& aTrackBuffer,
|
||||
|
||||
for (uint32_t i = 0; i < aTrackBuffer.Length(); i++) {
|
||||
const RefPtr<MediaRawData>& sample = aTrackBuffer[i];
|
||||
if (sample->mTime >= target.ToMicroseconds() ||
|
||||
if (sample->mTime >= target ||
|
||||
sample->GetEndTime() > target) {
|
||||
return i;
|
||||
}
|
||||
@ -2165,12 +2159,12 @@ TrackBuffersManager::Seek(TrackInfo::TrackType aTrack,
|
||||
uint32_t lastKeyFrameIndex = 0;
|
||||
for (; i < track.Length(); i++) {
|
||||
const RefPtr<MediaRawData>& sample = track[i];
|
||||
TimeUnit sampleTime = TimeUnit::FromMicroseconds(sample->mTime);
|
||||
TimeUnit sampleTime = sample->mTime;
|
||||
if (sampleTime > aTime && lastKeyFrameTime.isSome()) {
|
||||
break;
|
||||
}
|
||||
if (sample->mKeyframe) {
|
||||
lastKeyFrameTimecode = TimeUnit::FromMicroseconds(sample->mTimecode);
|
||||
lastKeyFrameTimecode = sample->mTimecode;
|
||||
lastKeyFrameTime = Some(sampleTime);
|
||||
lastKeyFrameIndex = i;
|
||||
}
|
||||
@ -2238,12 +2232,11 @@ TrackBuffersManager::SkipToNextRandomAccessPoint(TrackInfo::TrackType aTrack,
|
||||
break;
|
||||
}
|
||||
if (sample->mKeyframe &&
|
||||
sample->mTime >= aTimeThreadshold.ToMicroseconds()) {
|
||||
sample->mTime >= aTimeThreadshold) {
|
||||
aFound = true;
|
||||
break;
|
||||
}
|
||||
nextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode) + sample->mDuration;
|
||||
nextSampleTimecode = sample->mTimecode + sample->mDuration;
|
||||
nextSampleTime = sample->GetEndTime();
|
||||
parsed++;
|
||||
}
|
||||
@ -2252,10 +2245,8 @@ TrackBuffersManager::SkipToNextRandomAccessPoint(TrackInfo::TrackType aTrack,
|
||||
// SkipToNextRandomAccessPoint will not count again the parsed sample as
|
||||
// skipped.
|
||||
if (aFound) {
|
||||
trackData.mNextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(track[i]->mTimecode);
|
||||
trackData.mNextSampleTime =
|
||||
TimeUnit::FromMicroseconds(track[i]->mTime);
|
||||
trackData.mNextSampleTimecode = track[i]->mTimecode;
|
||||
trackData.mNextSampleTime = track[i]->mTime;
|
||||
trackData.mNextGetSampleIndex = Some(i);
|
||||
} else if (i > 0) {
|
||||
// Go back to the previous keyframe or the original position so the next
|
||||
@ -2263,9 +2254,8 @@ TrackBuffersManager::SkipToNextRandomAccessPoint(TrackInfo::TrackType aTrack,
|
||||
for (int j = i - 1; j >= originalPos; j--) {
|
||||
const RefPtr<MediaRawData>& sample = track[j];
|
||||
if (sample->mKeyframe) {
|
||||
trackData.mNextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode);
|
||||
trackData.mNextSampleTime = TimeUnit::FromMicroseconds(sample->mTime);
|
||||
trackData.mNextSampleTimecode = sample->mTimecode;
|
||||
trackData.mNextSampleTime = sample->mTime;
|
||||
trackData.mNextGetSampleIndex = Some(uint32_t(j));
|
||||
// We are unable to skip to a keyframe past aTimeThreshold, however
|
||||
// we are speeding up decoding by dropping the unplayable frames.
|
||||
@ -2300,8 +2290,8 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
|
||||
}
|
||||
|
||||
const RefPtr<MediaRawData>& sample = track[aIndex];
|
||||
if (!aIndex || sample->mTimecode <= (aExpectedDts + aFuzz).ToMicroseconds() ||
|
||||
sample->mTime <= (aExpectedPts + aFuzz).ToMicroseconds()) {
|
||||
if (!aIndex || sample->mTimecode <= aExpectedDts + aFuzz ||
|
||||
sample->mTime <= aExpectedPts + aFuzz) {
|
||||
return sample;
|
||||
}
|
||||
|
||||
@ -2358,8 +2348,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
|
||||
}
|
||||
trackData.mNextGetSampleIndex.ref()++;
|
||||
// Estimate decode timestamp and timestamp of the next sample.
|
||||
TimeUnit nextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode) + sample->mDuration;
|
||||
TimeUnit nextSampleTimecode = sample->mTimecode + sample->mDuration;
|
||||
TimeUnit nextSampleTime = sample->GetEndTime();
|
||||
const MediaRawData* nextSample =
|
||||
GetSample(aTrack,
|
||||
@ -2369,10 +2358,8 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
|
||||
aFuzz);
|
||||
if (nextSample) {
|
||||
// We have a valid next sample, can use exact values.
|
||||
trackData.mNextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(nextSample->mTimecode);
|
||||
trackData.mNextSampleTime =
|
||||
TimeUnit::FromMicroseconds(nextSample->mTime);
|
||||
trackData.mNextSampleTimecode = nextSample->mTimecode;
|
||||
trackData.mNextSampleTime = nextSample->mTime;
|
||||
} else {
|
||||
// Next sample isn't available yet. Use estimates.
|
||||
trackData.mNextSampleTimecode = nextSampleTimecode;
|
||||
@ -2383,8 +2370,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
|
||||
}
|
||||
|
||||
if (trackData.mNextSampleTimecode >
|
||||
TimeUnit::FromMicroseconds(track.LastElement()->mTimecode)
|
||||
+ track.LastElement()->mDuration) {
|
||||
track.LastElement()->mTimecode + track.LastElement()->mDuration) {
|
||||
// The next element is past our last sample. We're done.
|
||||
trackData.mNextGetSampleIndex = Some(uint32_t(track.Length()));
|
||||
aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
|
||||
@ -2415,8 +2401,7 @@ TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
|
||||
UpdateEvictionIndex(trackData, i);
|
||||
|
||||
trackData.mNextGetSampleIndex = Some(uint32_t(pos)+1);
|
||||
trackData.mNextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode) + sample->mDuration;
|
||||
trackData.mNextSampleTimecode = sample->mTimecode + sample->mDuration;
|
||||
trackData.mNextSampleTime = sample->GetEndTime();
|
||||
aResult = NS_OK;
|
||||
return p.forget();
|
||||
@ -2434,8 +2419,8 @@ TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack,
|
||||
for (uint32_t i = 0; i < track.Length(); i++) {
|
||||
const RefPtr<MediaRawData>& sample = track[i];
|
||||
TimeInterval sampleInterval{
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode),
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode) + sample->mDuration};
|
||||
sample->mTimecode,
|
||||
sample->mTimecode + sample->mDuration};
|
||||
|
||||
if (sampleInterval.ContainsStrict(trackData.mNextSampleTimecode)) {
|
||||
return i;
|
||||
@ -2450,8 +2435,8 @@ TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack,
|
||||
for (uint32_t i = 0; i < track.Length(); i++) {
|
||||
const RefPtr<MediaRawData>& sample = track[i];
|
||||
TimeInterval sampleInterval{
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode),
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode) + sample->mDuration,
|
||||
sample->mTimecode,
|
||||
sample->mTimecode + sample->mDuration,
|
||||
aFuzz};
|
||||
|
||||
if (sampleInterval.ContainsWithStrictEnd(trackData.mNextSampleTimecode)) {
|
||||
@ -2469,7 +2454,7 @@ TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack,
|
||||
for (uint32_t i = 0; i < track.Length(); i++) {
|
||||
const RefPtr<MediaRawData>& sample = track[i];
|
||||
TimeInterval sampleInterval{
|
||||
TimeUnit::FromMicroseconds(sample->mTime),
|
||||
sample->mTime,
|
||||
sample->GetEndTime(),
|
||||
aFuzz};
|
||||
|
||||
@ -2509,10 +2494,9 @@ TrackBuffersManager::GetNextRandomAccessPoint(TrackInfo::TrackType aTrack,
|
||||
break;
|
||||
}
|
||||
if (sample->mKeyframe) {
|
||||
return TimeUnit::FromMicroseconds(sample->mTime);
|
||||
return sample->mTime;
|
||||
}
|
||||
nextSampleTimecode =
|
||||
TimeUnit::FromMicroseconds(sample->mTimecode) + sample->mDuration;
|
||||
nextSampleTimecode = sample->mTimecode + sample->mDuration;
|
||||
nextSampleTime = sample->GetEndTime();
|
||||
}
|
||||
return TimeUnit::FromInfinity();
|
||||
|
@ -259,8 +259,8 @@ OggCodecState::PacketOutAsMediaRawData()
|
||||
int64_t duration = PacketDuration(packet.get());
|
||||
NS_ASSERTION(duration >= 0, "duration invalid");
|
||||
|
||||
sample->mTimecode = packet->granulepos;
|
||||
sample->mTime = end_tstamp - duration;
|
||||
sample->mTimecode = media::TimeUnit::FromMicroseconds(packet->granulepos);
|
||||
sample->mTime = media::TimeUnit::FromMicroseconds(end_tstamp - duration);
|
||||
sample->mDuration = media::TimeUnit::FromMicroseconds(duration);
|
||||
sample->mKeyframe = IsKeyframe(packet.get());
|
||||
sample->mEOS = packet->e_o_s;
|
||||
|
@ -1317,7 +1317,7 @@ OggTrackDemuxer::Seek(const TimeUnit& aTime)
|
||||
|
||||
// Check what time we actually seeked to.
|
||||
if (sample != nullptr) {
|
||||
seekTime = TimeUnit::FromMicroseconds(sample->mTime);
|
||||
seekTime = sample->mTime;
|
||||
OGG_DEBUG("%p seeked to time %" PRId64, this, seekTime.ToMicroseconds());
|
||||
}
|
||||
mQueuedSample = sample;
|
||||
@ -1403,15 +1403,14 @@ OggTrackDemuxer::SkipToNextRandomAccessPoint(const TimeUnit& aTimeThreshold)
|
||||
OGG_DEBUG("TimeThreshold: %f", aTimeThreshold.ToSeconds());
|
||||
while (!found && (sample = NextSample())) {
|
||||
parsed++;
|
||||
if (sample->mKeyframe && sample->mTime >= aTimeThreshold.ToMicroseconds()) {
|
||||
if (sample->mKeyframe && sample->mTime >= aTimeThreshold) {
|
||||
found = true;
|
||||
mQueuedSample = sample;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
OGG_DEBUG("next sample: %f (parsed: %d)",
|
||||
TimeUnit::FromMicroseconds(sample->mTime).ToSeconds(),
|
||||
parsed);
|
||||
sample->mTime.ToSeconds(), parsed);
|
||||
return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
|
||||
} else {
|
||||
SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
|
||||
|
@ -75,11 +75,11 @@ BlankVideoDataCreator::Create(MediaRawData* aSample)
|
||||
return VideoData::CreateAndCopyData(mInfo,
|
||||
mImageContainer,
|
||||
aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration,
|
||||
buffer,
|
||||
aSample->mKeyframe,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
mPicture);
|
||||
}
|
||||
|
||||
@ -116,7 +116,7 @@ BlankAudioDataCreator::Create(MediaRawData* aSample)
|
||||
mFrameSum++;
|
||||
}
|
||||
RefPtr<AudioData> data(new AudioData(aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration.ToMicroseconds(),
|
||||
uint32_t(frames.value()),
|
||||
Move(samples),
|
||||
|
@ -17,10 +17,10 @@ public:
|
||||
// Create a dummy VideoData with no image. This gives us something to
|
||||
// send to media streams if necessary.
|
||||
RefPtr<VideoData> v(new VideoData(aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration.ToMicroseconds(),
|
||||
aSample->mKeyframe,
|
||||
aSample->mTimecode,
|
||||
aSample->mTimecode.ToMicroseconds(),
|
||||
gfx::IntSize(),
|
||||
0));
|
||||
return v.forget();
|
||||
|
@ -167,10 +167,11 @@ OpusDataDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
__func__);
|
||||
}
|
||||
|
||||
if (!mLastFrameTime || mLastFrameTime.ref() != aSample->mTime) {
|
||||
if (!mLastFrameTime ||
|
||||
mLastFrameTime.ref() != aSample->mTime.ToMicroseconds()) {
|
||||
// We are starting a new block.
|
||||
mFrames = 0;
|
||||
mLastFrameTime = Some(aSample->mTime);
|
||||
mLastFrameTime = Some(aSample->mTime.ToMicroseconds());
|
||||
}
|
||||
|
||||
// Maximum value is 63*2880, so there's no chance of overflow.
|
||||
@ -231,7 +232,7 @@ OpusDataDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
__func__);
|
||||
}
|
||||
NS_ASSERTION(ret == frames, "Opus decoded too few audio samples");
|
||||
CheckedInt64 startTime = aSample->mTime;
|
||||
CheckedInt64 startTime = aSample->mTime.ToMicroseconds();
|
||||
|
||||
// Trim the initial frames while the decoder is settling.
|
||||
if (mSkip > 0) {
|
||||
|
@ -133,7 +133,8 @@ TheoraDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
|
||||
bool bos = mPacketCount == 0;
|
||||
ogg_packet pkt = InitTheoraPacket(
|
||||
aData, aLength, bos, false, aSample->mTimecode, mPacketCount++);
|
||||
aData, aLength, bos, false,
|
||||
aSample->mTimecode.ToMicroseconds(), mPacketCount++);
|
||||
|
||||
int ret = th_decode_packetin(mTheoraDecoderContext, &pkt, nullptr);
|
||||
if (ret == 0 || ret == TH_DUPFRAME) {
|
||||
@ -171,11 +172,11 @@ TheoraDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
VideoData::CreateAndCopyData(info,
|
||||
mImageContainer,
|
||||
aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration,
|
||||
b,
|
||||
aSample->mKeyframe,
|
||||
aSample->mTimecode,
|
||||
aSample->mTimecode.ToMicroseconds(),
|
||||
mInfo.ScaledImageRect(mTheoraInfo.frame_width,
|
||||
mTheoraInfo.frame_height));
|
||||
if (!v) {
|
||||
|
@ -207,11 +207,11 @@ VPXDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
v = VideoData::CreateAndCopyData(mInfo,
|
||||
mImageContainer,
|
||||
aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration,
|
||||
b,
|
||||
aSample->mKeyframe,
|
||||
aSample->mTimecode,
|
||||
aSample->mTimecode.ToMicroseconds(),
|
||||
mInfo.ScaledImageRect(img->d_w,
|
||||
img->d_h));
|
||||
} else {
|
||||
@ -224,12 +224,12 @@ VPXDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
v = VideoData::CreateAndCopyData(mInfo,
|
||||
mImageContainer,
|
||||
aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration,
|
||||
b,
|
||||
alpha_plane,
|
||||
aSample->mKeyframe,
|
||||
aSample->mTimecode,
|
||||
aSample->mTimecode.ToMicroseconds(),
|
||||
mInfo.ScaledImageRect(img->d_w,
|
||||
img->d_h));
|
||||
|
||||
|
@ -141,19 +141,21 @@ VorbisDataDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
const unsigned char* aData = aSample->Data();
|
||||
size_t aLength = aSample->Size();
|
||||
int64_t aOffset = aSample->mOffset;
|
||||
int64_t aTstampUsecs = aSample->mTime;
|
||||
int64_t aTstampUsecs = aSample->mTime.ToMicroseconds();
|
||||
int64_t aTotalFrames = 0;
|
||||
|
||||
MOZ_ASSERT(mPacketCount >= 3);
|
||||
|
||||
if (!mLastFrameTime || mLastFrameTime.ref() != aSample->mTime) {
|
||||
if (!mLastFrameTime ||
|
||||
mLastFrameTime.ref() != aSample->mTime.ToMicroseconds()) {
|
||||
// We are starting a new block.
|
||||
mFrames = 0;
|
||||
mLastFrameTime = Some(aSample->mTime);
|
||||
mLastFrameTime = Some(aSample->mTime.ToMicroseconds());
|
||||
}
|
||||
|
||||
ogg_packet pkt = InitVorbisPacket(aData, aLength, false, aSample->mEOS,
|
||||
aSample->mTimecode, mPacketCount++);
|
||||
ogg_packet pkt = InitVorbisPacket(
|
||||
aData, aLength, false, aSample->mEOS,
|
||||
aSample->mTimecode.ToMicroseconds(), mPacketCount++);
|
||||
|
||||
int err = vorbis_synthesis(&mVorbisBlock, &pkt);
|
||||
if (err) {
|
||||
|
@ -79,7 +79,7 @@ WaveDataDecoder::ProcessDecode(MediaRawData* aSample)
|
||||
size_t aLength = aSample->Size();
|
||||
ByteReader aReader(aSample->Data(), aLength);
|
||||
int64_t aOffset = aSample->mOffset;
|
||||
uint64_t aTstampUsecs = aSample->mTime;
|
||||
uint64_t aTstampUsecs = aSample->mTime.ToMicroseconds();
|
||||
|
||||
int32_t frames = aLength * 8 / mInfo.mBitDepth / mInfo.mChannels;
|
||||
|
||||
|
@ -200,7 +200,7 @@ GMPVideoDecoder::CreateFrame(MediaRawData* aSample)
|
||||
|
||||
frame->SetEncodedWidth(mConfig.mDisplay.width);
|
||||
frame->SetEncodedHeight(mConfig.mDisplay.height);
|
||||
frame->SetTimeStamp(aSample->mTime);
|
||||
frame->SetTimeStamp(aSample->mTime.ToMicroseconds());
|
||||
frame->SetCompleteFrame(true);
|
||||
frame->SetDuration(aSample->mDuration.ToMicroseconds());
|
||||
frame->SetFrameType(aSample->mKeyframe ? kGMPKeyFrame : kGMPDeltaFrame);
|
||||
|
@ -226,7 +226,7 @@ public:
|
||||
|
||||
InputInfo info(
|
||||
aSample->mDuration.ToMicroseconds(), config->mImage, config->mDisplay);
|
||||
mInputInfos.Insert(aSample->mTime, info);
|
||||
mInputInfos.Insert(aSample->mTime.ToMicroseconds(), info);
|
||||
return RemoteDataDecoder::Decode(aSample);
|
||||
}
|
||||
|
||||
@ -537,7 +537,7 @@ RemoteDataDecoder::Decode(MediaRawData* aSample)
|
||||
return DecodePromise::CreateAndReject(
|
||||
MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__), __func__);
|
||||
}
|
||||
bufferInfo->Set(0, sample->Size(), sample->mTime, 0);
|
||||
bufferInfo->Set(0, sample->Size(), sample->mTime.ToMicroseconds(), 0);
|
||||
|
||||
mDrainStatus = DrainStatus::DRAINABLE;
|
||||
return mJavaDecoder->Input(bytes, bufferInfo, GetCryptoInfoFromSample(sample))
|
||||
|
@ -67,7 +67,7 @@ RefPtr<MediaDataDecoder::DecodePromise>
|
||||
AppleATDecoder::Decode(MediaRawData* aSample)
|
||||
{
|
||||
LOG("mp4 input sample %p %lld us %lld pts%s %llu bytes audio", aSample,
|
||||
aSample->mDuration.ToMicroseconds(), aSample->mTime,
|
||||
aSample->mDuration.ToMicroseconds(), aSample->mTime.ToMicroseconds(),
|
||||
aSample->mKeyframe ? " keyframe" : "",
|
||||
(unsigned long long)aSample->Size());
|
||||
RefPtr<AppleATDecoder> self = this;
|
||||
@ -270,7 +270,7 @@ AppleATDecoder::DecodeSample(MediaRawData* aSample)
|
||||
LOG("Error decoding audio sample: %d\n", static_cast<int>(rv));
|
||||
return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
|
||||
RESULT_DETAIL("Error decoding audio sample: %d @ %lld",
|
||||
static_cast<int>(rv), aSample->mTime));
|
||||
static_cast<int>(rv), aSample->mTime.ToMicroseconds()));
|
||||
}
|
||||
|
||||
if (numFrames) {
|
||||
@ -323,7 +323,7 @@ AppleATDecoder::DecodeSample(MediaRawData* aSample)
|
||||
}
|
||||
|
||||
RefPtr<AudioData> audio = new AudioData(aSample->mOffset,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
duration.ToMicroseconds(),
|
||||
numFrames,
|
||||
data.Forget(),
|
||||
|
@ -78,7 +78,7 @@ AppleVTDecoder::Decode(MediaRawData* aSample)
|
||||
{
|
||||
LOG("mp4 input sample %p pts %lld duration %lld us%s %" PRIuSIZE " bytes",
|
||||
aSample,
|
||||
aSample->mTime,
|
||||
aSample->mTime.ToMicroseconds(),
|
||||
aSample->mDuration.ToMicroseconds(),
|
||||
aSample->mKeyframe ? " keyframe" : "",
|
||||
aSample->Size());
|
||||
@ -132,9 +132,9 @@ TimingInfoFromSample(MediaRawData* aSample)
|
||||
timestamp.duration = CMTimeMake(
|
||||
aSample->mDuration.ToMicroseconds(), USECS_PER_S);
|
||||
timestamp.presentationTimeStamp =
|
||||
CMTimeMake(aSample->mTime, USECS_PER_S);
|
||||
CMTimeMake(aSample->mTime.ToMicroseconds(), USECS_PER_S);
|
||||
timestamp.decodeTimeStamp =
|
||||
CMTimeMake(aSample->mTimecode, USECS_PER_S);
|
||||
CMTimeMake(aSample->mTimecode.ToMicroseconds(), USECS_PER_S);
|
||||
|
||||
return timestamp;
|
||||
}
|
||||
|
@ -32,8 +32,8 @@ public:
|
||||
bool is_sync_point;
|
||||
|
||||
explicit AppleFrameRef(const MediaRawData& aSample)
|
||||
: decode_timestamp(media::TimeUnit::FromMicroseconds(aSample.mTimecode))
|
||||
, composition_timestamp(media::TimeUnit::FromMicroseconds(aSample.mTime))
|
||||
: decode_timestamp(aSample.mTimecode)
|
||||
, composition_timestamp(aSample.mTime)
|
||||
, duration(aSample.mDuration)
|
||||
, byte_offset(aSample.mOffset)
|
||||
, is_sync_point(aSample.mKeyframe)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user