Merge m-c to inbound. a=merge

This commit is contained in:
Ryan VanderMeulen 2016-03-05 19:30:51 -05:00
commit 73462444fb
402 changed files with 4268 additions and 2035 deletions

View File

@ -88,7 +88,6 @@ devtools/client/framework/**
# included in the ignore list.
devtools/client/inspector/computed/**
devtools/client/inspector/fonts/**
devtools/client/inspector/markup/test/**
devtools/client/inspector/shared/test/**
devtools/client/inspector/test/**
devtools/client/inspector/*.js
@ -129,7 +128,7 @@ devtools/client/webaudioeditor/lib/dagre-d3.js
devtools/client/sourceeditor/codemirror/*.js
devtools/client/sourceeditor/codemirror/**/*.js
devtools/client/sourceeditor/test/codemirror/*
devtools/client/markupview/test/lib_*
devtools/client/inspector/markup/test/lib_*
# mobile/android/ exclusions
mobile/android/chrome/content

View File

@ -1593,9 +1593,11 @@ pref("browser.tabs.crashReporting.includeURL", false);
pref("browser.tabs.crashReporting.emailMe", false);
pref("browser.tabs.crashReporting.email", "");
#ifndef RELEASE_BUILD
#ifndef MOZ_MULET
pref("layers.async-pan-zoom.enabled", true);
#endif
#endif
// Enable e10s add-on interposition by default.
pref("extensions.interposition.enabled", true);

View File

@ -110,6 +110,15 @@ var healthReportWrapper = {
},
handleRemoteCommand: function (evt) {
// Do an origin check to harden against the frame content being loaded from unexpected locations.
let allowedPrincipal = Services.scriptSecurityManager.getCodebasePrincipal(this._getReportURI());
let targetPrincipal = evt.target.nodePrincipal;
if (!allowedPrincipal.equals(targetPrincipal)) {
Cu.reportError(`Origin check failed for message "${evt.detail.command}": ` +
`target origin is "${targetPrincipal.origin}", expected "${allowedPrincipal.origin}"`);
return;
}
switch (evt.detail.command) {
case "DisableDataSubmission":
this.setDataSubmission(false);

View File

@ -16,19 +16,19 @@ add_task(function* test_notificationReplace() {
let promiseCloseEvent = ContentTaskUtils.waitForEvent(notification, "close");
let showEvent = yield ContentTaskUtils.waitForEvent(notification, "show");
is(showEvent.target.body, "Test body 1", "Showed tagged notification");
Assert.equal(showEvent.target.body, "Test body 1", "Showed tagged notification");
let newNotification = win.showNotification2();
let newShowEvent = yield ContentTaskUtils.waitForEvent(newNotification, "show");
is(newShowEvent.target.body, "Test body 2", "Showed new notification with same tag");
Assert.equal(newShowEvent.target.body, "Test body 2", "Showed new notification with same tag");
let closeEvent = yield promiseCloseEvent;
is(closeEvent.target.body, "Test body 1", "Closed previous tagged notification");
Assert.equal(closeEvent.target.body, "Test body 1", "Closed previous tagged notification");
let promiseNewCloseEvent = ContentTaskUtils.waitForEvent(newNotification, "close");
newNotification.close();
let newCloseEvent = yield promiseNewCloseEvent;
is(newCloseEvent.target.body, "Test body 2", "Closed new notification");
Assert.equal(newCloseEvent.target.body, "Test body 2", "Closed new notification");
});
});
});

View File

@ -252,7 +252,7 @@ add_chat_task(function* testFocusedElement() {
yield promise;
yield ContentTask.spawn(chat.content, null, function* () {
is(content.document.activeElement.getAttribute("id"), "input2",
Assert.equal(content.document.activeElement.getAttribute("id"), "input2",
"correct input field still has focus");
});
});

View File

@ -66,7 +66,7 @@ add_chat_task(function* testTearoffChat() {
yield ContentTask.spawn(chatbox.content, null, function* () {
let div = content.document.getElementById("testdiv");
is(div.getAttribute("test"), "1", "docshell should have been swapped");
Assert.equal(div.getAttribute("test"), "1", "docshell should have been swapped");
div.setAttribute("test", "2");
});
@ -84,7 +84,7 @@ add_chat_task(function* testTearoffChat() {
yield ContentTask.spawn(chatbox.content, null, function* () {
let div = content.document.getElementById("testdiv");
is(div.getAttribute("test"), "2", "docshell should have been swapped");
Assert.equal(div.getAttribute("test"), "2", "docshell should have been swapped");
});
});

View File

@ -5,28 +5,25 @@
add_task(function* () {
let rooturi = "https://example.com/browser/toolkit/modules/tests/browser/";
yield BrowserTestUtils.openNewForegroundTab(gBrowser, rooturi + "metadata_simple.html");
let result = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return PageMetadata.getData(content.document);
});
// result should have description
is(result.url, rooturi + "metadata_simple.html", "metadata url is correct");
is(result.title, "Test Title", "metadata title is correct");
is(result.description, "A very simple test page", "description is correct");
yield ContentTask.spawn(gBrowser.selectedBrowser, { rooturi }, function* (args) {
let result = PageMetadata.getData(content.document);
// Result should have description.
Assert.equal(result.url, args.rooturi + "metadata_simple.html", "metadata url is correct");
Assert.equal(result.title, "Test Title", "metadata title is correct");
Assert.equal(result.description, "A very simple test page", "description is correct");
result = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
content.history.pushState({}, "2", "2.html");
return PageMetadata.getData(content.document);
});
// result should not have description
is(result.url, rooturi + "2.html", "metadata url is correct");
is(result.title, "Test Title", "metadata title is correct");
ok(!result.description, "description is undefined");
result = PageMetadata.getData(content.document);
// Result should not have description.
Assert.equal(result.url, args.rooturi + "2.html", "metadata url is correct");
Assert.equal(result.title, "Test Title", "metadata title is correct");
Assert.ok(!result.description, "description is undefined");
let documentURI = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return content.document.documentURI;
Assert.equal(content.document.documentURI, args.rooturi + "2.html",
"content.document has correct url");
});
is(gBrowser.currentURI.spec, rooturi + "2.html", "gBrowser has correct url");
is(documentURI, rooturi + "2.html", "content.document has correct url");
gBrowser.removeTab(gBrowser.selectedTab);
});

View File

@ -8,7 +8,7 @@ add_task(function* () {
yield BrowserTestUtils.openNewForegroundTab(newWindow.gBrowser, "about:home");
yield ContentTask.spawn(newWindow.gBrowser.selectedBrowser, {}, function* () {
is(content.document.body.getAttribute("narrow"), "true", "narrow mode");
Assert.equal(content.document.body.getAttribute("narrow"), "true", "narrow mode");
});
resizedPromise = BrowserTestUtils.waitForContentEvent(newWindow.gBrowser.selectedBrowser, "resize");
@ -21,7 +21,7 @@ add_task(function* () {
yield resizedPromise;
yield ContentTask.spawn(newWindow.gBrowser.selectedBrowser, {}, function* () {
is(content.document.body.hasAttribute("narrow"), false, "non-narrow mode");
Assert.equal(content.document.body.hasAttribute("narrow"), false, "non-narrow mode");
});
yield BrowserTestUtils.closeWindow(newWindow);

View File

@ -29,12 +29,12 @@ add_task(function* test_without_dump() {
yield ContentTask.spawn(browser, null, function*() {
let doc = content.document;
ok(!doc.documentElement.classList.contains("crashDumpAvailable"),
Assert.ok(!doc.documentElement.classList.contains("crashDumpAvailable"),
"doesn't have crash dump");
let container = doc.getElementById("crash-reporter-container");
ok(container, "has crash-reporter-container");
ok(container.hidden, "crash-reporter-container is hidden");
Assert.ok(container, "has crash-reporter-container");
Assert.ok(container.hidden, "crash-reporter-container is hidden");
doc.getElementById("closeTab").click();
});

View File

@ -13,28 +13,22 @@ add_task(function* () {
gBrowser.loadURI("https://nocert.example.com/");
yield promise;
let uri = yield remote(() => {
return content.document.documentURI;
yield remote(() => {
// Confirm that we are displaying the contributed error page, not the default
let uri = content.document.documentURI;
Assert.ok(uri.startsWith("about:certerror"), "Broken page should go to about:certerror, not about:neterror");
});
// Confirm that we are displaying the contributed error page, not the default
ok(uri.startsWith("about:certerror"), "Broken page should go to about:certerror, not about:neterror");
let advancedDiv, advancedDivVisibility, technicalDivCollapsed;
[advancedDiv, advancedDivVisibility] = yield remote(() => {
yield remote(() => {
let div = content.document.getElementById("advancedPanel");
if (div) {
return [true, div.ownerDocument.defaultView.getComputedStyle(div, "").visibility];
} else {
return [null, null];
}
// Confirm that the expert section is collapsed
Assert.ok(div, "Advanced content div should exist");
Assert.equal(div.ownerDocument.defaultView.getComputedStyle(div, "").visibility,
"hidden", "Advanced content should not be visible by default");
});
// Confirm that the expert section is collapsed
ok(advancedDiv, "Advanced content div should exist");
is(advancedDivVisibility, "hidden", "Advanced content should not be visible by default");
// Tweak the expert mode pref
gPrefService.setBoolPref("browser.xul.error_pages.expert_bad_cert", true);
@ -44,18 +38,13 @@ add_task(function* () {
gBrowser.reload();
yield promise;
[advancedDiv, advancedDivVisibility] = yield remote(() => {
yield remote(() => {
let div = content.document.getElementById("advancedPanel");
if (div) {
return [true, div.ownerDocument.defaultView.getComputedStyle(div, "").visibility];
} else {
return [null, null];
}
Assert.ok(div, "Advanced content div should exist");
Assert.equal(div.ownerDocument.defaultView.getComputedStyle(div, "").visibility,
"visible", "Advanced content should be visible by default");
});
ok(advancedDiv, "Advanced content div should exist");
is(advancedDivVisibility, "visible", "Advanced content should be visible by default");
// Clean up
gBrowser.removeCurrentTab();
if (gPrefService.prefHasUserValue("browser.xul.error_pages.expert_bad_cert"))

View File

@ -73,20 +73,18 @@ function* blurChildElement(browser)
function* checkChildFocus(browser, message)
{
let [activeElement, validMsg] =
yield ContentTask.spawn(browser, message, function* (msg) {
var focused = content.document.activeElement == content.document.getElementById('i');
yield ContentTask.spawn(browser, [message, testId], function* (args) {
let [msg, testId] = args;
var focused = content.document.activeElement == content.document.getElementById('i');
var validMsg = true;
if (msg) {
validMsg = (msg == content.document.getElementById('i').validationMessage);
}
var validMsg = true;
if (msg) {
validMsg = (msg == content.document.getElementById('i').validationMessage);
}
return [focused, validMsg];
Assert.equal(focused, true, "Test " + testId + " First invalid element should be focused");
Assert.equal(validMsg, true, "Test " + testId + " The panel should show the message from validationMessage");
});
is(activeElement, true, "Test " + testId + " First invalid element should be focused");
is(validMsg, true, "Test " + testId + " The panel should show the message from validationMessage");
}
/**

View File

@ -22,11 +22,11 @@ add_task(function* () {
});
yield popupShownPromise;
let activeElement = yield ContentTask.spawn(browser, {}, function* () {
yield ContentTask.spawn(browser, {}, function* () {
let childdoc = content.document.getElementsByTagName('iframe')[0].contentDocument;
return childdoc.activeElement == childdoc.getElementById('i');
Assert.equal(childdoc.activeElement, childdoc.getElementById("i"),
"First invalid element should be focused");
});
is(activeElement, true, "First invalid element should be focused");
ok(gInvalidFormPopup.state == 'showing' || gInvalidFormPopup.state == 'open',
"The invalid form popup should be shown");

View File

@ -20,9 +20,9 @@ function test () {
function testLink(link, name, next) {
addWindowListener("chrome://mozapps/content/downloads/unknownContentType.xul", function (win) {
ContentTask.spawn(gBrowser.selectedBrowser, null, () => {
return content.document.getElementById("unload-flag").textContent;
}).then(unloadFlag => {
is(unloadFlag, "Okay", "beforeunload shouldn't have fired");
Assert.equal(content.document.getElementById("unload-flag").textContent,
"Okay", "beforeunload shouldn't have fired");
}).then(() => {
is(win.document.getElementById("location").value, name, "file name should match");
win.close();
next();

View File

@ -24,8 +24,9 @@ add_task(function* ()
});
},
verify: function () {
return ContentTask.spawn(gBrowser.selectedBrowser, { }, function* (arg) {
return [content.document.body.textContent, "no domain was inherited for view background image"];
return ContentTask.spawn(gBrowser.selectedBrowser, null, function* (arg) {
Assert.ok(!content.document.body.textContent,
"no domain was inherited for view background image");
});
}
},
@ -44,8 +45,9 @@ add_task(function* ()
});
},
verify: function () {
return ContentTask.spawn(gBrowser.selectedBrowser, { }, function* (arg) {
return [content.document.body.textContent, "no domain was inherited for view image"];
return ContentTask.spawn(gBrowser.selectedBrowser, null, function* (arg) {
Assert.ok(!content.document.body.textContent,
"no domain was inherited for view image");
});
}
},
@ -70,8 +72,9 @@ add_task(function* ()
});
},
verify: function () {
return ContentTask.spawn(gBrowser.selectedBrowser, { writeDomainURL: writeDomainURL }, function* (arg) {
return [content.document.body.textContent, "no domain was inherited for 'show only this frame'"];
return ContentTask.spawn(gBrowser.selectedBrowser, null, function* (arg) {
Assert.ok(!content.document.body.textContent,
"no domain was inherited for 'show only this frame'");
});
}
}
@ -96,8 +99,7 @@ add_task(function* ()
document.getElementById(commandToRun).click();
yield loadedAfterCommandPromise;
let result = yield test.verify();
ok(!result[0], result[1]);
yield test.verify();
let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
contentAreaContextMenu.hidePopup();

View File

@ -1,7 +1,8 @@
// This test is used to check copy and paste in editable areas to ensure that non-text
// types (html and images) are copied to and pasted from the clipboard properly.
var testPage = "<body style='margin: 0'><img id='img' tabindex='1' src='http://example.org/browser/browser/base/content/test/general/moz.png'>" +
var testPage = "<body style='margin: 0'>" +
" <img id='img' tabindex='1' src='http://example.org/browser/browser/base/content/test/general/moz.png'>" +
" <div id='main' contenteditable='true'>Test <b>Bold</b> After Text</div>" +
"</body>";
@ -23,8 +24,7 @@ add_task(function*() {
const htmlPrefix = (navigator.platform.indexOf("Win") >= 0) ? "<html><body>\n<!--StartFragment-->" : "";
const htmlPostfix = (navigator.platform.indexOf("Win") >= 0) ? "<!--EndFragment-->\n</body>\n</html>" : "";
let results = yield ContentTask.spawn(browser, { modifier: modifier, htmlPrefix: htmlPrefix, htmlPostfix: htmlPostfix },
function* (arg) {
yield ContentTask.spawn(browser, { modifier, htmlPrefix, htmlPostfix }, function* (arg) {
var doc = content.document;
var main = doc.getElementById("main");
main.focus();
@ -33,17 +33,11 @@ add_task(function*() {
.getInterface(Components.interfaces.nsIDOMWindowUtils);
const modifier = arg.modifier;
function sendKey(key)
{
if (utils.sendKeyEvent("keydown", key, 0, modifier)) {
utils.sendKeyEvent("keypress", key, key.charCodeAt(0), modifier);
}
utils.sendKeyEvent("keyup", key, 0, modifier);
}
let results = [];
function is(l, r, v) {
results.push(((l === r) ? "PASSED" : "FAILED") + " got: " + l + " expected: " + r + " - " + v);
function sendKey(key) {
if (utils.sendKeyEvent("keydown", key, 0, modifier)) {
utils.sendKeyEvent("keypress", key, key.charCodeAt(0), modifier);
}
utils.sendKeyEvent("keyup", key, 0, modifier);
}
// Select an area of the text.
@ -59,7 +53,7 @@ add_task(function*() {
addEventListener("copy", function copyEvent(event) {
removeEventListener("copy", copyEvent, true);
// The data is empty as the selection is copied during the event default phase.
is(event.clipboardData.mozItemCount, 0, "Zero items on clipboard");
Assert.equal(event.clipboardData.mozItemCount, 0, "Zero items on clipboard");
resolve();
}, true)
@ -72,18 +66,19 @@ add_task(function*() {
addEventListener("paste", function copyEvent(event) {
removeEventListener("paste", copyEvent, true);
let clipboardData = event.clipboardData;
is(clipboardData.mozItemCount, 1, "One item on clipboard");
is(clipboardData.types.length, 2, "Two types on clipboard");
is(clipboardData.types[0], "text/html", "text/html on clipboard");
is(clipboardData.types[1], "text/plain", "text/plain on clipboard");
is(clipboardData.getData("text/html"), arg.htmlPrefix + "t <b>Bold</b>" + arg.htmlPostfix, "text/html value");
is(clipboardData.getData("text/plain"), "t Bold", "text/plain value");
Assert.equal(clipboardData.mozItemCount, 1, "One item on clipboard");
Assert.equal(clipboardData.types.length, 2, "Two types on clipboard");
Assert.equal(clipboardData.types[0], "text/html", "text/html on clipboard");
Assert.equal(clipboardData.types[1], "text/plain", "text/plain on clipboard");
Assert.equal(clipboardData.getData("text/html"), arg.htmlPrefix +
"t <b>Bold</b>" + arg.htmlPostfix, "text/html value");
Assert.equal(clipboardData.getData("text/plain"), "t Bold", "text/plain value");
resolve();
}, true)
sendKey("v");
});
is(main.innerHTML, "Test <b>Bold</b> After Textt <b>Bold</b>", "Copy and paste html");
Assert.equal(main.innerHTML, "Test <b>Bold</b> After Textt <b>Bold</b>", "Copy and paste html");
selection.modify("extend", "left", "word");
selection.modify("extend", "left", "word");
@ -107,27 +102,22 @@ add_task(function*() {
addEventListener("paste", function copyEvent(event) {
removeEventListener("paste", copyEvent, true);
let clipboardData = event.clipboardData;
is(clipboardData.mozItemCount, 1, "One item on clipboard 2");
is(clipboardData.types.length, 2, "Two types on clipboard 2");
is(clipboardData.types[0], "text/html", "text/html on clipboard 2");
is(clipboardData.types[1], "text/plain", "text/plain on clipboard 2");
is(clipboardData.getData("text/html"), arg.htmlPrefix + "<i>Italic</i> " + arg.htmlPostfix, "text/html value 2");
is(clipboardData.getData("text/plain"), "Some text", "text/plain value 2");
Assert.equal(clipboardData.mozItemCount, 1, "One item on clipboard 2");
Assert.equal(clipboardData.types.length, 2, "Two types on clipboard 2");
Assert.equal(clipboardData.types[0], "text/html", "text/html on clipboard 2");
Assert.equal(clipboardData.types[1], "text/plain", "text/plain on clipboard 2");
Assert.equal(clipboardData.getData("text/html"), arg.htmlPrefix +
"<i>Italic</i> " + arg.htmlPostfix, "text/html value 2");
Assert.equal(clipboardData.getData("text/plain"), "Some text", "text/plain value 2");
resolve();
}, true)
sendKey("v");
});
is(main.innerHTML, "<i>Italic</i> Test <b>Bold</b> After<b></b>", "Copy and paste html 2");
return results;
Assert.equal(main.innerHTML, "<i>Italic</i> Test <b>Bold</b> After<b></b>",
"Copy and paste html 2");
});
is(results.length, 15, "Correct number of results");
for (var t = 0; t < results.length; t++) {
ok(results[t].startsWith("PASSED"), results[t]);
}
// Next, check that the Copy Image command works.
// The context menu needs to be opened to properly initialize for the copy
@ -145,8 +135,7 @@ add_task(function*() {
// Focus the content again
yield SimpleTest.promiseFocus(browser.contentWindowAsCPOW);
let expectedContent = yield ContentTask.spawn(browser, { modifier: modifier, htmlPrefix: htmlPrefix, htmlPostfix: htmlPostfix },
function* (arg) {
yield ContentTask.spawn(browser, { modifier, htmlPrefix, htmlPostfix }, function* (arg) {
var doc = content.document;
var main = doc.getElementById("main");
main.focus();
@ -176,14 +165,12 @@ add_task(function*() {
utils.sendKeyEvent("keyup", "v", 0, modifier);
});
// Return the new content which should now include an image.
return main.innerHTML;
// The new content should now include an image.
Assert.equal(main.innerHTML, '<i>Italic</i> <img id="img" tabindex="1" ' +
'src="http://example.org/browser/browser/base/content/test/general/moz.png">' +
'Test <b>Bold</b> After<b></b>', "Paste after copy image");
});
is(expectedContent, '<i>Italic</i> <img id="img" tabindex="1" ' +
'src="http://example.org/browser/browser/base/content/test/general/moz.png">' +
'Test <b>Bold</b> After<b></b>', "Paste after copy image");
gBrowser.removeCurrentTab();
});

View File

@ -425,7 +425,7 @@ add_task(function* test_copylinkcommand() {
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
let doc = content.document;
let input = doc.getElementById("test-input");
is(input.value, "http://mozilla.com/", "paste for command cmd_paste");
Assert.equal(input.value, "http://mozilla.com/", "paste for command cmd_paste");
});
}
});
@ -473,7 +473,7 @@ add_task(function* test_pagemenu() {
item.doCommand();
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
let pagemenu = content.document.getElementById("test-pagemenu");
ok(!pagemenu.hasAttribute("hopeless"), "attribute got removed");
Assert.ok(!pagemenu.hasAttribute("hopeless"), "attribute got removed");
});
}
});
@ -900,7 +900,7 @@ function* selectText(selector) {
win.getSelection().removeAllRanges();
let div = doc.createRange();
let element = doc.querySelector(selector);
ok(element, "Found element to select text from");
Assert.ok(element, "Found element to select text from");
div.setStartBefore(element);
div.setEndAfter(element);
win.getSelection().addRange(div);

View File

@ -117,10 +117,10 @@ add_task(function* ()
true, "basic focus again content page with button focused");
// Check to ensure that the root element is focused
let match = yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () {
return content.document.activeElement == content.document.documentElement;
yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () {
Assert.ok(content.document.activeElement == content.document.documentElement,
"basic focus again content page with button focused child root is focused");
});
ok(match, "basic focus again content page with button focused child root is focused");
});
// Open a second tab. Document focus should skip the background tab.

View File

@ -45,8 +45,7 @@ add_task(function* shift_left_click_test() {
info("URL should be loaded in a new window");
is(gURLBar.value, "", "Urlbar reverted to original value");
let childFocus = yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
ok(childFocus, "There should be no focused element");
yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
is(document.activeElement, gBrowser.selectedBrowser, "Content window should be focused");
is(win.gURLBar.textValue, TEST_VALUE, "New URL is loaded in new window");
@ -115,8 +114,7 @@ add_task(function* load_in_current_tab_test() {
info("URL should be loaded in the current tab");
is(gURLBar.value, TEST_VALUE, "Urlbar still has the value we entered");
let childFocus = yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
ok(childFocus, "There should be no focused element");
yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
is(document.activeElement, gBrowser.selectedBrowser, "Content window should be focused");
is(gBrowser.selectedTab, tab, "New URL was loaded in the current tab");
@ -145,8 +143,7 @@ add_task(function* load_in_new_tab_test() {
// Check the load occurred in a new tab.
info("URL should be loaded in a new focused tab");
is(gURLBar.inputField.value, TEST_VALUE, "Urlbar still has the value we entered");
let childFocus = yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
ok(childFocus, "There should be no focused element");
yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
is(document.activeElement, gBrowser.selectedBrowser, "Content window should be focused");
isnot(gBrowser.selectedTab, tab, "New URL was loaded in a new tab");
@ -224,12 +221,13 @@ function promiseWaitForNewWindow() {
function promiseCheckChildNoFocusedElement(browser)
{
if (!gMultiProcessBrowser) {
return Services.focus.focusedElement == null;
Assert.equal(Services.focus.focusedElement, null, "There should be no focused element");
return;
}
return ContentTask.spawn(browser, { }, function* () {
const fm = Components.classes["@mozilla.org/focus-manager;1"].
getService(Components.interfaces.nsIFocusManager);
return fm.focusedElement == null;
Assert.equal(fm.focusedElement, null, "There should be no focused element");
});
}

View File

@ -45,23 +45,17 @@ function testURL(url, loadFunc, endFunc) {
yield promiseWaitForEvent(browser, "pageshow");
let focused = yield ContentTask.spawn(browser, { isRemote: gMultiProcessBrowser },
yield ContentTask.spawn(browser, { isRemote: gMultiProcessBrowser },
function* (arg) {
const fm = Components.classes["@mozilla.org/focus-manager;1"].
getService(Components.interfaces.nsIFocusManager);
if (fm.focusedElement != null) {
return "FAIL - focusedElement not null";
}
Assert.equal(fm.focusedElement, null, "focusedElement not null");
if (arg.isRemote) {
return fm.activeWindow == content ? "PASS" :
"FAIL - activeWindow not correct";
Assert.equal(fm.activeWindow, content, "activeWindow not correct");
}
return "PASS";
});
is(focused, "PASS", "should be no focused element");
is(document.activeElement, browser, "content window should be focused");
ok(!gBrowser.contentPrincipal.equals(pagePrincipal),

View File

@ -18,20 +18,16 @@ add_task(function* purgeHistoryTest() {
ok(backButton.hasAttribute("disabled"), "Back button is disabled");
ok(forwardButton.hasAttribute("disabled"), "Forward button is disabled");
let pushState = ContentTask.spawn(browser, null, function*() {
yield ContentTask.spawn(browser, null, function*() {
let startHistory = content.history.length;
content.history.pushState({}, "");
content.history.pushState({}, "");
content.history.back();
let newHistory = content.history.length;
return [startHistory, newHistory];
Assert.equal(startHistory, 1, "Initial SHistory size");
Assert.equal(newHistory, 3, "New SHistory size");
});
let [startHistory, newHistory] = yield pushState;
is(startHistory, 1, "Initial SHistory size");
is(newHistory, 3, "New SHistory size");
ok(browser.webNavigation.canGoBack, true,
"New value for webNavigation.canGoBack");
ok(browser.webNavigation.canGoForward, true,
@ -50,12 +46,10 @@ add_task(function* purgeHistoryTest() {
yield sanitizer.sanitize(["history"]);
let historyAfterPurge = yield ContentTask.spawn(browser, null, function*() {
return content.history.length;
yield ContentTask.spawn(browser, null, function*() {
Assert.equal(content.history.length, 1, "SHistory correctly cleared");
});
is(historyAfterPurge, 1, "SHistory correctly cleared");
ok(!browser.webNavigation.canGoBack,
"webNavigation.canGoBack correctly cleared");
ok(!browser.webNavigation.canGoForward,

View File

@ -22,8 +22,8 @@ function* attemptFakeRefresh(browser, expectRefresh) {
let refresher = docShell.QueryInterface(Ci.nsIRefreshURI);
refresher.refreshURI(URI, 0, false, true);
is(refresher.refreshPending, expectRefresh,
"Got the right refreshPending state");
Assert.equal(refresher.refreshPending, expectRefresh,
"Got the right refreshPending state");
if (refresher.refreshPending) {
// Cancel the pending refresh

View File

@ -109,10 +109,10 @@ function doSelectTests(contentType, dtd)
is((yield getChangeEvents()), 0, "Before closed - number of change events");
EventUtils.synthesizeKey("a", { accelKey: true });
let selection = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
return String(content.getSelection());
yield ContentTask.spawn(gBrowser.selectedBrowser, { isWindows }, function(args) {
Assert.equal(String(content.getSelection()), args.isWindows ? "Text" : "",
"Select all while popup is open");
});
is(selection, isWindows ? "Text" : "", "Select all while popup is open");
yield hideSelectPopup(selectPopup);

View File

@ -137,11 +137,11 @@ function* testSendReportDisabled(testURL, errorURISuffix) {
yield checkErrorPage(browser, errorURISuffix);
// Check that the error reporting section is hidden.
let hidden = yield ContentTask.spawn(browser, null, function* () {
yield ContentTask.spawn(browser, null, function* () {
let section = content.document.getElementById("certificateErrorReporting");
return content.getComputedStyle(section).display == "none";
Assert.equal(content.getComputedStyle(section).display, "none",
"error reporting section should be hidden");
});
ok(hidden, "error reporting section should be hidden");
// Cleanup.
gBrowser.removeTab(tab);
@ -167,9 +167,8 @@ function createReportResponseStatusPromise(expectedURI) {
}
function checkErrorPage(browser, suffix) {
return ContentTask.spawn(browser, null, function* () {
return content.document.documentURI;
}).then(uri => {
ok(uri.startsWith(`about:${suffix}`), "correct error page loaded");
return ContentTask.spawn(browser, { suffix }, function* (args) {
let uri = content.document.documentURI;
Assert.ok(uri.startsWith(`about:${args.suffix}`), "correct error page loaded");
});
}

View File

@ -27,8 +27,8 @@ add_task(function* test_fetch() {
let securityChange = waitForSecurityChange();
yield ContentTask.spawn(newTabBrowser, null, function* () {
yield content.wrappedJSObject.test_fetch()
.then((response) => { ok(false, "should have denied the request"); })
.catch((e) => { ok(true, `Caught exception: ${e}`); });
.then(response => Assert.ok(false, "should have denied the request"))
.catch(e => Assert.ok(true, `Caught exception: ${e}`));
});
yield securityChange;

View File

@ -26,12 +26,11 @@ add_task(function*() {
EventUtils.synthesizeKey("g", { accelKey: true });
yield scrollPromise;
let scrollLeftPos = yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* (arg) {
return content.document.getElementById("s").getBoundingClientRect().left;
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
Assert.ok(content.document.getElementById("s").getBoundingClientRect().left >= 0,
"scroll should include find result");
});
ok(scrollLeftPos >= 0, "scroll should include find result");
// clear the find bar
EventUtils.synthesizeKey("a", { accelKey: true });
EventUtils.synthesizeKey("VK_DELETE", { });

View File

@ -17,7 +17,7 @@ add_task(function* () {
let cell = content.gGrid.cells[aIndex];
let link = cell.node.querySelector(".newtab-link");
is(link.getAttribute("title"), aExpected, aMessage);
Assert.equal(link.getAttribute("title"), aExpected, aMessage);
}
checkTooltip(0, "http://example7.com/", "1st tooltip is correct");

View File

@ -15,10 +15,9 @@ add_task(function* () {
ok(NewTabUtils.allPages.enabled, "page is enabled");
NewTabUtils.allPages.enabled = false;
let disabled = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return content.gGrid.node.hasAttribute("page-disabled");
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
Assert.ok(content.gGrid.node.hasAttribute("page-disabled"), "page is disabled");
});
ok(disabled, "page is disabled");
NewTabUtils.allPages.enabled = true;
});

View File

@ -14,7 +14,7 @@ add_task(function* () {
let link = site.querySelector(".newtab-link");
function checkGridLocked(aLocked, aMessage) {
is(grid.node.hasAttribute("locked"), aLocked, aMessage);
Assert.equal(grid.node.hasAttribute("locked"), aLocked, aMessage);
}
function sendDragEvent(aEventType, aTarget) {

View File

@ -21,13 +21,13 @@ add_task(function* () {
yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
let {_cellMargin, _cellHeight, _cellWidth, node} = content.gGrid;
isnot(_cellMargin, null, "grid has a computed cell margin");
isnot(_cellHeight, null, "grid has a computed cell height");
isnot(_cellWidth, null, "grid has a computed cell width");
Assert.notEqual(_cellMargin, null, "grid has a computed cell margin");
Assert.notEqual(_cellHeight, null, "grid has a computed cell height");
Assert.notEqual(_cellWidth, null, "grid has a computed cell width");
let {height, maxHeight, maxWidth} = node.style;
isnot(height, "", "grid has a computed grid height");
isnot(maxHeight, "", "grid has a computed grid max-height");
isnot(maxWidth, "", "grid has a computed grid max-width");
Assert.notEqual(height, "", "grid has a computed grid height");
Assert.notEqual(maxHeight, "", "grid has a computed grid max-height");
Assert.notEqual(maxWidth, "", "grid has a computed grid max-width");
});
// restore original state

View File

@ -34,10 +34,10 @@ add_task(function* () {
ok(isDisabled, "page is disabled");
// check that no sites have been rendered
let sitesLength = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function*() {
return content.document.querySelectorAll(".site").length;
yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function*() {
Assert.equal(content.document.querySelectorAll(".site").length, 0,
"no sites have been rendered");
});
is(0, sitesLength, "no sites have been rendered");
NewTabUtils.allPages.enabled = true;

View File

@ -28,7 +28,7 @@ add_task(function* () {
let pinned = aSite.isPinned();
if (pinned != aSite.node.hasAttribute("pinned")) {
ok(false, "invalid state (site.isPinned() != site[pinned])");
Assert.ok(false, "invalid state (site.isPinned() != site[pinned])");
}
return aSite.url.replace(/^http:\/\/example(\d+)\.com\/$/, "$1") + (pinned ? "p" : "");

View File

@ -150,7 +150,7 @@ add_task(function* () {
let observer = new content.MutationObserver(() => {
if (input.getAttribute("aria-expanded") == "true") {
observer.disconnect();
ok(!table.hidden, "Search suggestion table unhidden");
Assert.ok(!table.hidden, "Search suggestion table unhidden");
sendAsyncMessage("test:newtab-suggestions-open", {});
}
});
@ -173,10 +173,10 @@ add_task(function* () {
EventUtils.synthesizeKey("a", { accelKey: true });
EventUtils.synthesizeKey("VK_DELETE", {});
let tableHidden = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return content.document.getElementById("searchSuggestionTable").hidden;
yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
Assert.ok(content.document.getElementById("searchSuggestionTable").hidden,
"Search suggestion table hidden");
});
ok(tableHidden, "Search suggestion table hidden");
// Remove the search bar from toolbar
CustomizableUI.removeWidgetFromArea("search-container");
@ -185,7 +185,7 @@ add_task(function* () {
yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () {
let input = content.document.getElementById("newtab-search-text");
isnot(input, content.document.activeElement, "Search input should not be focused");
Assert.notEqual(input, content.document.activeElement, "Search input should not be focused");
});
// Test that Ctrl/Cmd + K will focus the input field from the page.
@ -195,7 +195,7 @@ add_task(function* () {
yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () {
let input = content.document.getElementById("newtab-search-text");
is(input, content.document.activeElement, "Search input should be focused");
Assert.equal(input, content.document.activeElement, "Search input should be focused");
});
// Reset changes made to toolbar
@ -226,9 +226,11 @@ add_task(function* () {
yield aboutHomeLoaded;
yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* () {
is(content.document.documentURI.toLowerCase(), "about:home", "New tab's uri should be about:home");
Assert.equal(content.document.documentURI.toLowerCase(), "about:home",
"New tab's uri should be about:home");
let searchInput = content.document.getElementById("searchText");
is(searchInput, content.document.activeElement, "Search input must be the selected element");
Assert.equal(searchInput, content.document.activeElement,
"Search input must be the selected element");
});
NewTabUtils.allPages.enabled = true;
@ -297,8 +299,8 @@ function* checkCurrentEngine(engineInfo)
"Sanity check: current engine: engine.name=" + engine.name +
" basename=" + engineInfo.name);
let engineName = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
return content.gSearch._contentSearchController.defaultEngine.name;
yield ContentTask.spawn(gBrowser.selectedBrowser, { name: engine.name }, function* (args) {
Assert.equal(content.gSearch._contentSearchController.defaultEngine.name,
args.name, "currentEngineName: " + args.name);
});
is(engineName, engine.name, "currentEngineName: " + engine.name);
}

View File

@ -22,26 +22,32 @@ add_task(function* () {
let sponsoredButton = site.querySelector(".newtab-sponsored");
EventUtils.synthesizeMouseAtCenter(sponsoredButton, {}, content);
let explain = site.querySelector(".sponsored-explain");
isnot(explain, null, "Sponsored explanation shown");
ok(explain.querySelector("input").classList.contains("newtab-control-block"), "sponsored tiles show blocked image");
ok(sponsoredButton.hasAttribute("active"), "Sponsored button has active attribute");
Assert.notEqual(explain, null, "Sponsored explanation shown");
Assert.ok(explain.querySelector("input").classList.contains("newtab-control-block"),
"sponsored tiles show blocked image");
Assert.ok(sponsoredButton.hasAttribute("active"), "Sponsored button has active attribute");
// test dismissing sponsored explain
EventUtils.synthesizeMouseAtCenter(sponsoredButton, {}, content);
is(site.querySelector(".sponsored-explain"), null, "Sponsored explanation no longer shown");
ok(!sponsoredButton.hasAttribute("active"), "Sponsored button does not have active attribute");
Assert.equal(site.querySelector(".sponsored-explain"), null,
"Sponsored explanation no longer shown");
Assert.ok(!sponsoredButton.hasAttribute("active"),
"Sponsored button does not have active attribute");
// test with enhanced tile
site.setAttribute("type", "enhanced");
EventUtils.synthesizeMouseAtCenter(sponsoredButton, {}, content);
explain = site.querySelector(".sponsored-explain");
isnot(explain, null, "Sponsored explanation shown");
ok(explain.querySelector("input").classList.contains("newtab-customize"), "enhanced tiles show customize image");
ok(sponsoredButton.hasAttribute("active"), "Sponsored button has active attribute");
Assert.notEqual(explain, null, "Sponsored explanation shown");
Assert.ok(explain.querySelector("input").classList.contains("newtab-customize"),
"enhanced tiles show customize image");
Assert.ok(sponsoredButton.hasAttribute("active"), "Sponsored button has active attribute");
// test dismissing enhanced explain
EventUtils.synthesizeMouseAtCenter(sponsoredButton, {}, content);
is(site.querySelector(".sponsored-explain"), null, "Sponsored explanation no longer shown");
ok(!sponsoredButton.hasAttribute("active"), "Sponsored button does not have active attribute");
Assert.equal(site.querySelector(".sponsored-explain"), null,
"Sponsored explanation no longer shown");
Assert.ok(!sponsoredButton.hasAttribute("active"),
"Sponsored button does not have active attribute");
});
});

View File

@ -333,30 +333,29 @@ function* addNewTabPageTab() {
* The second cell contains 'http://example2.com/'. The third cell is empty.
* The fourth cell contains the pinned site 'http://example4.com/'.
*/
function* checkGrid(aSitesPattern) {
let length = aSitesPattern.split(",").length;
function* checkGrid(pattern) {
let length = pattern.split(",").length;
let foundPattern =
yield ContentTask.spawn(gWindow.gBrowser.selectedBrowser,
{ length: length }, function* (args) {
let grid = content.wrappedJSObject.gGrid;
yield ContentTask.spawn(gWindow.gBrowser.selectedBrowser,
{ length, pattern }, function* (args) {
let grid = content.wrappedJSObject.gGrid;
let sites = grid.sites.slice(0, args.length);
return sites.map(function (aSite) {
if (!aSite)
return "";
let sites = grid.sites.slice(0, args.length);
let foundPattern = sites.map(function (aSite) {
if (!aSite)
return "";
let pinned = aSite.isPinned();
let hasPinnedAttr = aSite.node.hasAttribute("pinned");
let pinned = aSite.isPinned();
let hasPinnedAttr = aSite.node.hasAttribute("pinned");
if (pinned != hasPinnedAttr)
ok(false, "invalid state (site.isPinned() != site[pinned])");
if (pinned != hasPinnedAttr)
ok(false, "invalid state (site.isPinned() != site[pinned])");
return aSite.url.replace(/^http:\/\/example(\d+)\.com\/$/, "$1") + (pinned ? "p" : "");
});
return aSite.url.replace(/^http:\/\/example(\d+)\.com\/$/, "$1") + (pinned ? "p" : "");
});
Assert.equal(foundPattern, args.pattern, "grid status = " + args.pattern);
});
is(foundPattern, aSitesPattern, "grid status = " + aSitesPattern);
}
/**

View File

@ -30,7 +30,7 @@ add_task(function* () {
yield promiseUpdatePluginBindings(gBrowser.selectedBrowser);
// Tests that the overlay can be hidden for plugins using the close icon.
let overlayIsVisible = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
@ -43,10 +43,8 @@ add_task(function* () {
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
return overlay.classList.contains("visible");
Assert.ok(!overlay.classList.contains("visible"), "overlay should be hidden.");
});
ok(!overlayIsVisible, "overlay should be hidden.");
});
// Test that the overlay cannot be interacted with after the user closes the overlay
@ -59,7 +57,7 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gBrowser.selectedBrowser);
let overlayHidden = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
@ -80,11 +78,11 @@ add_task(function* () {
utils.sendMouseEvent("mousedown", overlayLeft, overlayTop, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", overlayLeft, overlayTop, 0, 1, 0, false, 0, 0);
return overlay.hasAttribute("dismissed") && !overlay.classList.contains("visible");
Assert.ok(overlay.hasAttribute("dismissed") && !overlay.classList.contains("visible"),
"Overlay should be hidden");
});
let notification = PopupNotifications.getNotification("click-to-play-plugins");
ok(notification.dismissed, "No notification should be shown");
ok(overlayHidden, "Overlay should be hidden");
});

View File

@ -25,20 +25,14 @@ add_task(function* () {
// Tests that the overlays are visible and actionable if the plugin is in an iframe.
let result = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
yield ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
let frame = content.document.getElementById("frame");
let doc = frame.contentDocument;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return plugin && overlay.classList.contains("visible");
});
ok(result, "Test 1, Plugin overlay should exist, not be hidden");
Assert.ok(plugin && overlay.classList.contains("visible"),
"Test 1, Plugin overlay should exist, not be hidden");
result = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
let frame = content.document.getElementById("frame");
let doc = frame.contentDocument;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
let closeIcon = doc.getAnonymousElementByAttribute(plugin, "anonid", "closeIcon");
let bounds = closeIcon.getBoundingClientRect();
let left = (bounds.left + bounds.right) / 2;
@ -47,8 +41,8 @@ add_task(function* () {
.getInterface(Components.interfaces.nsIDOMWindowUtils);
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
return overlay.classList.contains("visible");
Assert.ok(!overlay.classList.contains("visible"),
"Test 1, Plugin overlay should exist, be hidden");
});
ok(!result, "Test 1, Plugin overlay should exist, be hidden");
});

View File

@ -66,25 +66,24 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return plugin.pluginFallbackType;
Assert.equal(plugin.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 3b, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
});
is(result, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 3b, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
let pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 1a, plugin should not be activated");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(!(overlay && overlay.classList.contains("visible")),
"Test 3b, overlay should be hidden.");
});
ok(!result, "Test 3b, overlay should be hidden.");
});
add_task(function* () {
@ -97,22 +96,21 @@ add_task(function* () {
yield promisePopupNotification("click-to-play-plugins");
yield promiseForNotificationBar("plugin-hidden", gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return plugin.pluginFallbackType;
Assert.equal(plugin.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 4b, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
});
is(result, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 4b, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(!(overlay && overlay.classList.contains("visible")),
"Test 4b, overlay should be hidden.");
});
ok(!result, "Test 4b, overlay should be hidden.");
});
// Test that the notification bar is getting dismissed when directly activating plugins
@ -127,14 +125,13 @@ add_task(function* () {
// Expecting a plugin notification bar when plugins are overlaid offscreen.
yield promisePopupNotification("click-to-play-plugins");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return plugin.pluginFallbackType;
Assert.equal(plugin.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 6, Plugin should be click-to-play");
});
is(result, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 6, Plugin should be click-to-play");
yield promisePopupNotification("click-to-play-plugins");

View File

@ -53,13 +53,13 @@ add_task(function* () {
yield promisePopupNotification("click-to-play-plugins");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementById("test");
let doc = content.document;
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 2, overlay should be visible.");
});
ok(result, "Test 2, overlay should be visible.");
});
add_task(function* () {
@ -82,13 +82,13 @@ add_task(function* () {
yield promisePopupNotification("click-to-play-plugins");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let plugin = content.document.getElementById("test");
let doc = content.document;
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 3, overlay should be visible.");
});
ok(result, "Test 3, overlay should be visible.");
});
add_task(function* () {
@ -110,11 +110,11 @@ add_task(function* () {
yield promiseUpdatePluginBindings(gTestBrowser);
yield promisePopupNotification("click-to-play-plugins");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let plugin = content.document.getElementById("test");
let doc = content.document;
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(!(overlay && overlay.classList.contains("visible")),
"Test 4, overlay should be hidden.");
});
ok(!result, "Test 4, overlay should be hidden.");
});

View File

@ -42,13 +42,13 @@ add_task(function* () {
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(popupNotification, "Test 2, Should have a click-to-play notification");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(!(overlay && overlay.classList.contains("visible")),
"Test 2, overlay should be hidden.");
});
ok(!result, "Test 2, overlay should be hidden.");
});
add_task(function* () {
@ -60,13 +60,13 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(!(overlay && overlay.classList.contains("visible")),
"Test 3, overlay should be hidden.");
});
ok(!result, "Test 3, overlay should be hidden.");
});
@ -80,13 +80,13 @@ add_task(function* () {
content.document.getElementById("test").clientTop;
});
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 4, overlay should be visible.");
});
ok(result, "Test 4, overlay should be visible.");
});
add_task(function* () {
@ -100,13 +100,13 @@ add_task(function* () {
content.document.getElementById("test").clientTop;
});
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(!(overlay && overlay.classList.contains("visible")),
"Test 5, overlay should be hidden.");
});
ok(!result, "Test 5, overlay should be hidden.");
});
add_task(function* () {
@ -120,11 +120,11 @@ add_task(function* () {
content.document.getElementById("test").clientTop;
});
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 6, overlay should be visible.");
});
ok(result, "Test 6, overlay should be visible.");
});

View File

@ -49,13 +49,13 @@ add_task(function* () {
// Reload the page
yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_zoom.html");
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, { count }, function* (args) {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Overlay should be visible for zoom change count " + args.count);
});
ok(result, "Overlay should be visible for zoom change count " + count);
}
});

View File

@ -83,21 +83,17 @@ add_task(function* () {
"Test 18a, plugin fallback type should be PLUGIN_VULNERABLE_UPDATABLE");
ok(!pluginInfo.activated, "Test 18a, Plugin should not be activated");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementById("test");
let doc = content.document;
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
});
ok(result, "Test 18a, Plugin overlay should exist, not be hidden");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 18a, Plugin overlay should exist, not be hidden");
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
return updateLink.style.visibility != "hidden";
Assert.ok(updateLink.style.visibility != "hidden",
"Test 18a, Plugin should have an update link");
});
ok(result, "Test 18a, Plugin should have an update link");
let promise = waitForEvent(gBrowser.tabContainer, "TabOpen", null, true);
let pluginUpdateURL = Services.urlFormatter.formatURLPref("plugins.update.url");
@ -129,13 +125,13 @@ add_task(function* () {
"Test 18a, plugin fallback type should be PLUGIN_VULNERABLE_UPDATABLE");
ok(!pluginInfo.activated, "Test 18b, Plugin should not be activated");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 18b, Plugin overlay should exist, not be hidden");
});
ok(result, "Test 18b, Plugin overlay should exist, not be hidden");
});
// Tests a vulnerable plugin with no update
@ -157,21 +153,17 @@ add_task(function* () {
"Test 18c, plugin fallback type should be PLUGIN_VULNERABLE_NO_UPDATE");
ok(!pluginInfo.activated, "Test 18c, Plugin should not be activated");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return overlay && overlay.classList.contains("visible");
});
ok(result, "Test 18c, Plugin overlay should exist, not be hidden");
Assert.ok(overlay && overlay.classList.contains("visible"),
"Test 18c, Plugin overlay should exist, not be hidden");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
return updateLink && updateLink.style.display != "block";
Assert.ok(updateLink && updateLink.style.display != "block",
"Test 18c, Plugin should not have an update link");
});
ok(result, "Test 18c, Plugin should not have an update link");
// check that click "Always allow" works with blocked plugins
yield promiseForNotificationShown(notification);
@ -342,12 +334,11 @@ add_task(function* () {
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_BLOCKLISTED,
"Test 26, plugin fallback type should be PLUGIN_BLOCKLISTED");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let plugin = content.document.getElementById("test");
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
Assert.ok(!objLoadingContent.activated, "Plugin should not be activated.");
});
ok(!result, "Plugin should not be activated.");
const testUrl = "http://test.url.com/";

View File

@ -41,11 +41,10 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let test = content.document.getElementById("test");
return test.activated;
Assert.ok(test.activated, "task 1a: test plugin should be activated!");
});
ok(result, "task 1a: test plugin should be activated!");
});
// Load a fresh page, load a new plugin blocklist, then load the same page again.
@ -57,11 +56,10 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let test = content.document.getElementById("test");
return test.activated;
ok(!test.activated, "task 2a: test plugin shouldn't activate!");
});
ok(!result, "task 2a: test plugin shouldn't activate!");
});
// Unload the block list and lets do this again, only this time lets
@ -82,11 +80,10 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let test = content.document.getElementById("test");
return test.activated;
Assert.ok(test.activated, "task 3a: test plugin should be activated!");
});
ok(result, "task 3a: test plugin should be activated!");
});
// Load a fresh page, load a new plugin blocklist, then load the same page again.
@ -98,11 +95,10 @@ add_task(function* () {
// Work around for delayed PluginBindingAttached
yield promiseUpdatePluginBindings(gTestBrowser);
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let test = content.document.getElementById("test");
return test.activated;
Assert.ok(!test.activated, "task 4a: test plugin shouldn't activate!");
});
ok(!result, "task 4a: test plugin shouldn't activate!");
yield asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
});

View File

@ -50,12 +50,11 @@ add_task(function* () {
});
add_task(function* () {
let isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementsByTagName("embed")[0];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
Assert.ok(!objLoadingContent.activated, "Test 1b, Plugin should not be activated");
});
ok(!isActivated, "Test 1b, Plugin should not be activated");
// Click the activate button on doorhanger to make sure it works
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
@ -64,34 +63,32 @@ add_task(function* () {
PopupNotifications.panel.firstChild._primaryButton.click();
isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementsByTagName("embed")[0];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
Assert.ok(objLoadingContent.activated, "Test 1b, Plugin should be activated");
});
ok(isActivated, "Test 1b, Plugin should be activated");
});
add_task(function* () {
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(notification, "Test 1c, Should still have a click-to-play notification");
let isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
let plugin = content.document.getElementsByTagName("embed")[1];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
Assert.ok(objLoadingContent.activated,
"Test 1c, Newly inserted plugin in activated page should be activated");
});
ok(isActivated, "Test 1c, Newly inserted plugin in activated page should be activated");
});
add_task(function* () {
let isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementsByTagName("embed")[1];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
Assert.ok(objLoadingContent.activated, "Test 1d, Plugin should be activated");
});
ok(isActivated, "Test 1d, Plugin should be activated");
let promise = waitForEvent(gTestBrowser.contentWindow, "hashchange", null);
gTestBrowser.contentWindow.location += "#anchorNavigation";
@ -99,29 +96,24 @@ add_task(function* () {
});
add_task(function* () {
let isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
let plugin = content.document.getElementsByTagName("embed")[2];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
Assert.ok(objLoadingContent.activated, "Test 1e, Plugin should be activated");
});
ok(isActivated, "Test 1e, Plugin should be activated");
});
add_task(function* () {
let isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementsByTagName("embed")[2];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
});
ok(isActivated, "Test 1f, Plugin should be activated");
Assert.ok(objLoadingContent.activated, "Test 1f, Plugin should be activated");
isActivated = yield ContentTask.spawn(gTestBrowser, {}, function* () {
content.history.replaceState({}, "", "replacedState");
new XPCNativeWrapper(XPCNativeWrapper.unwrap(content).addPlugin());
let plugin = content.document.getElementsByTagName("embed")[3];
let objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
return objLoadingContent.activated;
plugin = content.document.getElementsByTagName("embed")[3];
objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
Assert.ok(objLoadingContent.activated, "Test 1g, Plugin should be activated");
});
ok(isActivated, "Test 1f, Plugin should not be activated");
});

View File

@ -37,15 +37,14 @@ add_task(function* () {
yield promiseForCondition(function () { return gNumPluginBindingsAttached == 1; });
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, {}, function* () {
let plugin = content.document.getElementById("test");
if (!plugin) {
Assert.ok(false, "plugin element not available.");
return false;
}
// We can't use MochiKit's routine
let style = content.getComputedStyle(plugin);
return 'opacity' in style && style.opacity == 1;
Assert.ok(("opacity" in style) && style.opacity == 1, "plugin style properly configured.");
});
ok(result, true, "plugin style properly configured.");
});

View File

@ -41,10 +41,10 @@ add_task(function* () {
let pluginInfo = yield promiseForPluginInfo("test");
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE, "plugin should be marked as VULNERABLE");
let found = yield ContentTask.spawn(gTestBrowser, {}, function* () {
return !!content.document.getElementById("test");
yield ContentTask.spawn(gTestBrowser, null, function* () {
Assert.ok(!!content.document.getElementById("test"),
"test part 1: plugin should not be activated");
});
ok(found, "test part 1: plugin should not be activated");
yield promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html></html>");
});
@ -52,10 +52,10 @@ add_task(function* () {
add_task(function* () {
let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(!popupNotification, "test part 2: Should not have a click-to-play notification");
let found = yield ContentTask.spawn(gTestBrowser, {}, function* () {
return !!content.document.getElementById("test");
yield ContentTask.spawn(gTestBrowser, null, function* () {
Assert.ok(!content.document.getElementById("test"),
"test part 2: plugin should not be activated");
});
ok(!found, "test part 2: plugin should not be activated");
let obsPromise = TestUtils.topicObserved("PopupNotifications-updateNotShowing");
let overlayPromise = promisePopupNotification("click-to-play-plugins");
@ -73,8 +73,8 @@ add_task(function* () {
let pluginInfo = yield promiseForPluginInfo("test");
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE, "plugin should be marked as VULNERABLE");
let found = yield ContentTask.spawn(gTestBrowser, {}, function* () {
return !!content.document.getElementById("test");
yield ContentTask.spawn(gTestBrowser, null, function* () {
Assert.ok(!!content.document.getElementById("test"),
"test part 3: plugin should not be activated");
});
ok(found, "test part 3: plugin should not be activated");
});

View File

@ -59,7 +59,7 @@ add_task(function* () {
let crashReportStatus = TestUtils.topicObserved("crash-report-status", onSubmitStatus);
// Test that the crash submission UI is actually visible and submit the crash report.
let crashUiVisible = yield ContentTask.spawn(gTestBrowser, config, function* (aConfig) {
yield ContentTask.spawn(gTestBrowser, config, function* (aConfig) {
let doc = content.document;
let plugin = doc.getElementById("plugin");
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
@ -67,12 +67,11 @@ add_task(function* () {
// Test that we don't send the URL when urlOptIn is false.
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitURLOptIn").checked = aConfig.urlOptIn;
submitButton.click();
return content.getComputedStyle(pleaseSubmit).display == "block";
Assert.equal(content.getComputedStyle(pleaseSubmit).display == "block",
aConfig.shouldSubmissionUIBeVisible, "The crash UI should be visible");
});
yield crashReportStatus;
is(crashUiVisible, config.shouldSubmissionUIBeVisible, "The crash UI should be visible");
});
add_task(function* () {
@ -97,7 +96,7 @@ add_task(function* () {
let crashReportStatus = TestUtils.topicObserved("crash-report-status", onSubmitStatus);
// Test that the crash submission UI is actually visible and submit the crash report.
let crashUiVisible = yield ContentTask.spawn(gTestBrowser, config, function* (aConfig) {
yield ContentTask.spawn(gTestBrowser, config, function* (aConfig) {
let doc = content.document;
let plugin = doc.getElementById("plugin");
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
@ -106,12 +105,11 @@ add_task(function* () {
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitURLOptIn").checked = aConfig.urlOptIn;
doc.getAnonymousElementByAttribute(plugin, "anonid", "submitComment").value = aConfig.comment;
submitButton.click();
return content.getComputedStyle(pleaseSubmit).display == "block";
Assert.equal(content.getComputedStyle(pleaseSubmit).display == "block",
aConfig.shouldSubmissionUIBeVisible, "The crash UI should be visible");
});
yield crashReportStatus;
is(crashUiVisible, config.shouldSubmissionUIBeVisible, "The crash UI should be visible");
});
add_task(function* () {
@ -136,14 +134,13 @@ add_task(function* () {
yield pluginCrashed;
// Test that the crash submission UI is not visible and do not submit a crash report.
let crashUiVisible = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, config, function* (aConfig) {
let doc = content.document;
let plugin = doc.getElementById("plugin");
let pleaseSubmit = doc.getAnonymousElementByAttribute(plugin, "anonid", "pleaseSubmit");
return !!pleaseSubmit && content.getComputedStyle(pleaseSubmit).display == "block";
Assert.equal(!!pleaseSubmit && content.getComputedStyle(pleaseSubmit).display == "block",
aConfig.shouldSubmissionUIBeVisible, "Plugin crash UI should not be visible");
});
is(crashUiVisible, config.shouldSubmissionUIBeVisible, "Plugin crash UI should not be visible");
});
function promisePluginCrashed() {

View File

@ -143,7 +143,7 @@ add_task(function* testChromeHearsPluginCrashFirst() {
mm.sendAsyncMessage(CRASHED_MESSAGE,
{ pluginName: "", runID, state: "please" });
let [gotExpected, msg] = yield ContentTask.spawn(browser, {}, function* () {
yield ContentTask.spawn(browser, null, function* () {
// At this point, the content process should have heard the
// plugin crash message from the parent, and we are OK to emit
// the PluginCrashed event.
@ -154,7 +154,8 @@ add_task(function* testChromeHearsPluginCrashFirst() {
"submitStatus");
if (statusDiv.getAttribute("status") == "please") {
return [false, "Did not expect plugin to be in crash report mode yet."];
Assert.ok(false, "Did not expect plugin to be in crash report mode yet.");
return;
}
// Now we need the plugin to seem crashed to PluginContent.jsm, without
@ -176,11 +177,9 @@ add_task(function* testChromeHearsPluginCrashFirst() {
});
plugin.dispatchEvent(event);
return [statusDiv.getAttribute("status") == "please",
"Should have been showing crash report UI"];
Assert.equal(statusDiv.getAttribute("status"), "please",
"Should have been showing crash report UI");
});
ok(gotExpected, msg);
yield BrowserTestUtils.closeWindow(win);
});
@ -202,7 +201,7 @@ add_task(function* testContentHearsCrashFirst() {
let runID = yield preparePlugin(browser,
Ci.nsIObjectLoadingContent.PLUGIN_CRASHED);
let [gotExpected, msg] = yield ContentTask.spawn(browser, null, function* () {
yield ContentTask.spawn(browser, null, function* () {
// At this point, the content process has not yet heard from the
// parent about the crash report. Let's ensure that by making sure
// we're not showing the plugin crash report UI.
@ -213,7 +212,7 @@ add_task(function* testContentHearsCrashFirst() {
"submitStatus");
if (statusDiv.getAttribute("status") == "please") {
return [false, "Did not expect plugin to be in crash report mode yet."];
Assert.ok(false, "Did not expect plugin to be in crash report mode yet.");
}
let event = new content.PluginCrashedEvent("PluginCrashed", {
@ -227,19 +226,17 @@ add_task(function* testContentHearsCrashFirst() {
plugin.dispatchEvent(event);
return [statusDiv.getAttribute("status") != "please",
"Should not yet be showing crash report UI"];
Assert.notEqual(statusDiv.getAttribute("status"), "please",
"Should not yet be showing crash report UI");
});
ok(gotExpected, msg);
// Now send the message down to PluginContent.jsm that the plugin has
// crashed...
let mm = browser.messageManager;
mm.sendAsyncMessage(CRASHED_MESSAGE,
{ pluginName: "", runID, state: "please"});
[gotExpected, msg] = yield ContentTask.spawn(browser, null, function* () {
yield ContentTask.spawn(browser, null, function* () {
// At this point, the content process will have heard the message
// from the parent and reacted to it. We should be showing the plugin
// crash report UI now.
@ -249,11 +246,9 @@ add_task(function* testContentHearsCrashFirst() {
.getAnonymousElementByAttribute(plugin, "anonid",
"submitStatus");
return [statusDiv.getAttribute("status") == "please",
"Should have been showing crash report UI"];
Assert.equal(statusDiv.getAttribute("status"), "please",
"Should have been showing crash report UI");
});
ok(gotExpected, msg);
yield BrowserTestUtils.closeWindow(win);
});

View File

@ -41,7 +41,7 @@ add_task(function* () {
// This test opens a new tab to about:addons
let promise = waitForEvent(gBrowser.tabContainer, "TabOpen", null, true);
let success = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let pluginNode = content.document.getElementById("test");
let manageLink = content.document.getAnonymousElementByAttribute(pluginNode, "anonid", "managePluginsLink");
let bounds = manageLink.getBoundingClientRect();
@ -51,9 +51,9 @@ add_task(function* () {
.getInterface(Components.interfaces.nsIDOMWindowUtils);
utils.sendMouseEvent("mousedown", left, top, 0, 1, 0, false, 0, 0);
utils.sendMouseEvent("mouseup", left, top, 0, 1, 0, false, 0, 0);
return true;
Assert.ok(true, "click on manage link");
});
ok(success, "click on manage link");
yield promise;
promise = waitForEvent(gBrowser.tabContainer, "TabClose", null, true);

View File

@ -65,19 +65,19 @@ add_task(function* () {
is(pluginInfo.displayedType, Ci.nsIObjectLoadingContent.TYPE_PLUGIN, "Test 3, plugin should have started");
ok(pluginInfo.activated, "Test 4, plugin node should not be activated");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let plugin = content.document.getElementById("test");
let npobj1 = Components.utils.waiveXrays(plugin).getObjectValue();
plugin.src = plugin.src;
let pluginsDiffer = false;
try {
Components.utils.waiveXrays(plugin).checkObjectValue(npobj1);
} catch (e) {
pluginsDiffer = true;
}
return pluginsDiffer;
try {
Components.utils.waiveXrays(plugin).checkObjectValue(npobj1);
} catch (e) {
pluginsDiffer = true;
}
Assert.ok(pluginsDiffer, "Test 5, plugins differ.");
});
ok(result, "Test 5, plugins differ.");
pluginInfo = yield promiseForPluginInfo("test");
ok(pluginInfo.activated, "Test 6, Plugin should have retained activated state.");

View File

@ -84,7 +84,7 @@ add_task(function* () {
ok(!pluginInfo.activated, "Plugin should not be activated");
// Simulate clicking the overlay
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let bounds = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
@ -158,13 +158,13 @@ add_task(function* () {
yield promisePopupNotification("click-to-play-plugins");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let test = content.document.getElementById("test");
let secondtestA = content.document.getElementById("secondtestA");
let secondtestB = content.document.getElementById("secondtestB");
return test.activated && !secondtestA.activated && !secondtestB.activated;
Assert.ok(test.activated && !secondtestA.activated && !secondtestB.activated,
"Content plugins are set up");
});
ok(result, "Content plugins are set up");
clearAllPluginPermissions();
});
@ -190,13 +190,12 @@ add_task(function* () {
yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_alternate_content.html");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return !!mainBox;
Assert.ok(!!mainBox, "Test 15, Plugin overlay should exist");
});
ok(result, "Test 15, Plugin overlay should exist");
});
// Tests that mContentType is used for click-to-play plugins, and not the
@ -226,7 +225,7 @@ add_task(function* () {
ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed,
"Test 19a, Doorhanger should start out dismissed");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let icon = doc.getAnonymousElementByAttribute(plugin, "class", "icon");
@ -256,7 +255,7 @@ add_task(function* () {
ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed,
"Test 19c, Doorhanger should start out dismissed");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let text = doc.getAnonymousElementByAttribute(plugin, "class", "msg msgClickToPlay");
@ -287,7 +286,7 @@ add_task(function* () {
ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser).dismissed,
"Test 19e, Doorhanger should start out dismissed");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let utils = content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
@ -320,54 +319,53 @@ add_task(function* () {
let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
ok(notification, "Test 20a, Should have a click-to-play notification");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
return !!overlay;
Assert.ok(!!overlay, "Test 20a, Plugin overlay should exist");
});
ok(result, "Test 20a, Plugin overlay should exist");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
let overlayRect = mainBox.getBoundingClientRect();
return overlayRect.width == 0 && overlayRect.height == 0;
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
"Test 20a, plugin should have an overlay with 0px width and height");
});
ok(result, "Test 20a, plugin should have an overlay with 0px width and height");
let pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 20b, plugin should not be activated");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let div = doc.getElementById("container");
return div.style.display == "none";
Assert.equal(div.style.display, "none",
"Test 20b, container div should be display: none");
});
ok(result, "Test 20b, container div should be display: none");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let div = doc.getElementById("container");
div.style.display = "block";
});
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let mainBox = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
let overlayRect = mainBox.getBoundingClientRect();
return overlayRect.width == 200 && overlayRect.height == 200;
Assert.ok(overlayRect.width == 200 && overlayRect.height == 200,
"Test 20c, plugin should have overlay dims of 200px");
});
ok(result, "Test 20c, plugin should have overlay dims of 200px");
pluginInfo = yield promiseForPluginInfo("test");
ok(!pluginInfo.activated, "Test 20b, plugin should not be activated");
ok(notification.dismissed, "Test 20c, Doorhanger should start out dismissed");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let bounds = plugin.getBoundingClientRect();
@ -386,13 +384,13 @@ add_task(function* () {
pluginInfo = yield promiseForPluginInfo("test");
ok(pluginInfo.activated, "Test 20c, plugin should be activated");
result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
return overlayRect.width == 0 && overlayRect.height == 0;
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
"Test 20c, plugin should have overlay dims of 0px");
});
ok(result, "Test 20c, plugin should have overlay dims of 0px");
clearAllPluginPermissions();
});
@ -411,13 +409,13 @@ add_task(function* () {
// confirm all three are blocked by ctp at this point
let ids = ["test", "secondtestA", "secondtestB"];
for (let id of ids) {
let result = yield ContentTask.spawn(gTestBrowser, {aId: id}, function* () {
yield ContentTask.spawn(gTestBrowser, { id }, function* (args) {
let doc = content.document;
let plugin = doc.getElementById(arguments[0].aId);
let plugin = doc.getElementById(args.id);
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
return overlayRect.width == 200 && overlayRect.height == 200;
Assert.ok(overlayRect.width == 200 && overlayRect.height == 200,
"Test 21a, plugin " + args.id + " should have click-to-play overlay with dims");
});
ok(result, "Test 21a, plugin " + id + " should have click-to-play overlay with dims");
let pluginInfo = yield promiseForPluginInfo(id);
ok(!pluginInfo.activated, "Test 21a, Plugin with id=" + id + " should not be activated");
@ -466,23 +464,24 @@ add_task(function* () {
ok(notification.options.pluginData.size == 2, "Test 21c, Should have one type of plugin in the notification");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
return overlayRect.width == 0 && overlayRect.height == 0;
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
"Test 21c, plugin should have overlay dims of 0px");
});
ok(result, "Test 21c, plugin should have overlay dims of 0px");
ids = ["secondtestA", "secondtestB"];
for (let id of ids) {
let result = yield ContentTask.spawn(gTestBrowser, {aId: id}, function* () {
yield ContentTask.spawn(gTestBrowser, { id }, function* (args) {
let doc = content.document;
let plugin = doc.getElementById(arguments[0].aId);
let plugin = doc.getElementById(args.id);
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
return overlayRect.width == 200 && overlayRect.height == 200;
Assert.ok(overlayRect.width == 200 && overlayRect.height == 200,
"Test 21c, plugin " + args.id + " should have click-to-play overlay with zero dims");
});
ok(result, "Test 21c, plugin " + id + " should have click-to-play overlay with zero dims");
let pluginInfo = yield promiseForPluginInfo(id);
ok(!pluginInfo.activated, "Test 21c, Plugin with id=" + id + " should not be activated");
@ -521,13 +520,13 @@ add_task(function* () {
ids = ["test", "secondtestA", "secondtestB"];
for (let id of ids) {
let result = yield ContentTask.spawn(gTestBrowser, {aId: id}, function* () {
yield ContentTask.spawn(gTestBrowser, { id }, function* (args) {
let doc = content.document;
let plugin = doc.getElementById(arguments[0].aId);
let plugin = doc.getElementById(args.id);
let overlayRect = doc.getAnonymousElementByAttribute(plugin, "anonid", "main").getBoundingClientRect();
return overlayRect.width == 0 && overlayRect.height == 0;
Assert.ok(overlayRect.width == 0 && overlayRect.height == 0,
"Test 21d, plugin " + args.id + " should have click-to-play overlay with zero dims");
});
ok(result, "Test 21d, plugin " + id + " should have click-to-play overlay with zero dims");
let pluginInfo = yield promiseForPluginInfo(id);
ok(pluginInfo.activated, "Test 21d, Plugin with id=" + id + " should not be activated");
@ -553,7 +552,7 @@ add_task(function* () {
is(pluginInfo.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY,
"Test 23, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
plugin.type = null;
@ -565,7 +564,7 @@ add_task(function* () {
pluginInfo = yield promiseForPluginInfo("test");
is(pluginInfo.displayedType, Ci.nsIObjectLoadingContent.TYPE_NULL, "Test 23, plugin should be TYPE_NULL");
let result = yield ContentTask.spawn(gTestBrowser, {}, function* () {
yield ContentTask.spawn(gTestBrowser, null, function* () {
let doc = content.document;
let plugin = doc.getElementById("test");
plugin.type = "application/x-test";

View File

@ -445,7 +445,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
}
let window = createProperties.windowId !== null ?
WindowManager.getWindow(createProperties.windowId) :
WindowManager.getWindow(createProperties.windowId, context) :
WindowManager.topWindow;
if (!window.gBrowser) {
let obs = (finishedWindow, topic, data) => {
@ -629,7 +629,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
let window = windowId == null ?
WindowManager.topWindow :
WindowManager.getWindow(windowId);
WindowManager.getWindow(windowId, context);
let browser = window.gBrowser.selectedBrowser;
let recipient = {
@ -774,7 +774,7 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
let destinationWindow = null;
if (moveProperties.windowId !== null) {
destinationWindow = WindowManager.getWindow(moveProperties.windowId);
destinationWindow = WindowManager.getWindow(moveProperties.windowId, context);
// Ignore invalid window.
if (!destinationWindow) {
return;

View File

@ -625,6 +625,16 @@ global.WindowManager = {
windowType(window) {
// TODO: Make this work.
let {chromeFlags} = window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
.treeOwner.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIXULWindow);
if (chromeFlags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_DIALOG) {
return "popup";
}
return "normal";
},
@ -637,7 +647,11 @@ global.WindowManager = {
return id;
},
getWindow(id) {
getWindow(id, context) {
if (id == this.WINDOW_ID_CURRENT) {
return currentWindow(context);
}
for (let window of WindowListManager.browserWindows(true)) {
if (this.getId(window) == id) {
return window;
@ -646,7 +660,56 @@ global.WindowManager = {
return null;
},
setState(window, state) {
if (state != "fullscreen" && window.fullScreen) {
window.fullScreen = false;
}
switch (state) {
case "maximized":
window.maximize();
break;
case "minimized":
case "docked":
window.minimize();
break;
case "normal":
// Restore sometimes returns the window to its previous state, rather
// than to the "normal" state, so it may need to be called anywhere from
// zero to two times.
window.restore();
if (window.windowState != window.STATE_NORMAL) {
window.restore();
}
if (window.windowState != window.STATE_NORMAL) {
// And on OS-X, where normal vs. maximized is basically a heuristic,
// we need to cheat.
window.sizeToContent();
}
break;
case "fullscreen":
window.fullScreen = true;
break;
default:
throw new Error(`Unexpected window state: ${state}`);
}
},
convert(extension, window, getInfo) {
const STATES = {
[window.STATE_MAXIMIZED]: "maximized",
[window.STATE_MINIMIZED]: "minimized",
[window.STATE_NORMAL]: "normal",
};
let state = STATES[window.windowState];
if (window.fullScreen) {
state = "fullscreen";
}
let result = {
id: this.getId(window),
focused: window.document.hasFocus(),
@ -655,10 +718,8 @@ global.WindowManager = {
width: window.outerWidth,
height: window.outerHeight,
incognito: PrivateBrowsingUtils.isWindowPrivate(window),
// We fudge on these next two.
type: this.windowType(window),
state: window.fullScreen ? "fullscreen" : "normal",
state,
};
if (getInfo && getInfo.populate) {

View File

@ -5,6 +5,8 @@
XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
"@mozilla.org/browser/aboutnewtab-service;1",
"nsIAboutNewTabService");
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
@ -42,7 +44,7 @@ extensions.registerSchemaAPI("windows", null, (extension, context) => {
}).api(),
get: function(windowId, getInfo) {
let window = WindowManager.getWindow(windowId);
let window = WindowManager.getWindow(windowId, context);
return Promise.resolve(WindowManager.convert(extension, window, getInfo));
},
@ -63,6 +65,13 @@ extensions.registerSchemaAPI("windows", null, (extension, context) => {
},
create: function(createData) {
if (createData.state !== null && createData.state != "normal") {
if (createData.left !== null || createData.top !== null ||
createData.width !== null || createData.height !== null) {
return Promise.reject({message: `"state": "${createData.state}" may not be combined with "left", "top", "width", or "height"`});
}
}
function mkstr(s) {
let result = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
result.data = s;
@ -104,17 +113,25 @@ extensions.registerSchemaAPI("windows", null, (extension, context) => {
args.AppendElement(mkstr(aboutNewTabService.newTabURL));
}
let extraFeatures = "";
let features = ["chrome"];
if (createData.type === null || createData.type == "normal") {
features.push("dialog=no", "all");
} else {
// All other types create "popup"-type windows by default.
features.push("dialog", "resizable", "minimizable", "centerscreen", "titlebar", "close");
}
if (createData.incognito !== null) {
if (createData.incognito) {
extraFeatures += ",private";
features.push("private");
} else {
extraFeatures += ",non-private";
features.push("non-private");
}
}
let window = Services.ww.openWindow(null, "chrome://browser/content/browser.xul", "_blank",
"chrome,dialog=no,all" + extraFeatures, args);
features.join(","), args);
if (createData.left !== null || createData.top !== null) {
let left = createData.left !== null ? createData.left : window.screenX;
@ -127,28 +144,62 @@ extensions.registerSchemaAPI("windows", null, (extension, context) => {
window.resizeTo(width, height);
}
// TODO: focused, type, state
// TODO: focused, type
return new Promise(resolve => {
window.addEventListener("load", function listener() {
window.removeEventListener("load", listener);
resolve(WindowManager.convert(extension, window));
if (createData.state == "maximized" || createData.state == "normal" ||
(createData.state == "fullscreen" && AppConstants.platform != "macosx")) {
window.document.documentElement.setAttribute("sizemode", createData.state);
} else if (createData.state !== null) {
// window.minimize() has no useful effect until the window has
// been shown.
let obs = doc => {
if (doc === window.document) {
Services.obs.removeObserver(obs, "document-shown");
WindowManager.setState(window, createData.state);
resolve();
}
};
Services.obs.addObserver(obs, "document-shown", false);
return;
}
resolve();
});
}).then(() => {
return WindowManager.convert(extension, window);
});
},
update: function(windowId, updateInfo) {
let window = WindowManager.getWindow(windowId);
// TODO: When we support size/position updates:
// if (updateInfo.state !== null && updateInfo.state != "normal") {
// if (updateInfo.left !== null || updateInfo.top !== null ||
// updateInfo.width !== null || updateInfo.height !== null) {
// return Promise.reject({message: `"state": "${updateInfo.state}" may not be combined with "left", "top", "width", or "height"`});
// }
// }
let window = WindowManager.getWindow(windowId, context);
if (updateInfo.focused) {
Services.focus.activeWindow = window;
}
// TODO: All the other properties...
if (updateInfo.state !== null) {
WindowManager.setState(window, updateInfo.state);
}
// TODO: All the other properties, focused=false...
return Promise.resolve(WindowManager.convert(extension, window));
},
remove: function(windowId) {
let window = WindowManager.getWindow(windowId);
let window = WindowManager.getWindow(windowId, context);
window.close();
return new Promise(resolve => {

View File

@ -335,13 +335,11 @@
"description": "Whether the new window should be an incognito window."
},
"type": {
"unsupported": true,
"$ref": "CreateType",
"optional": true,
"description": "Specifies what type of browser window to create. The 'panel' and 'detached_panel' types create a popup unless the '--enable-panels' flag is set."
},
"state": {
"unsupported": true,
"$ref": "WindowState",
"optional": true,
"description": "The initial state of the window. The 'minimized', 'maximized' and 'fullscreen' states cannot be combined with 'left', 'top', 'width' or 'height'."
@ -417,7 +415,6 @@
"description": "If true, causes the window to be displayed in a manner that draws the user's attention to the window, without changing the focused window. The effect lasts until the user changes focus to the window. This option has no effect if the window already has focus. Set to false to cancel a previous draw attention request."
},
"state": {
"unsupported": true,
"$ref": "WindowState",
"optional": true,
"description": "The new state of the window. The 'minimized', 'maximized' and 'fullscreen' states cannot be combined with 'left', 'top', 'width' or 'height'."

View File

@ -49,6 +49,7 @@ support-files =
[browser_ext_tabs_move.js]
[browser_ext_tabs_move_window.js]
[browser_ext_tabs_onHighlighted.js]
[browser_ext_windows_create.js]
[browser_ext_windows_create_tabId.js]
[browser_ext_windows_update.js]
[browser_ext_contentscript_connect.js]

View File

@ -0,0 +1,167 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* testWindowCreate() {
let extension = ExtensionTestUtils.loadExtension({
background() {
let _checkWindowPromise;
browser.test.onMessage.addListener(msg => {
if (msg == "checked-window") {
_checkWindowPromise.resolve();
_checkWindowPromise = null;
}
});
let os;
function checkWindow(expected) {
return new Promise(resolve => {
_checkWindowPromise = {resolve};
browser.test.sendMessage("check-window", expected);
});
}
function createWindow(params, expected, keep = false) {
return browser.windows.create(params).then(window => {
for (let key of Object.keys(params)) {
if (key == "state" && os == "mac" && params.state == "normal") {
// OS-X doesn't have a hard distinction between "normal" and
// "maximized" states.
browser.test.assertTrue(window.state == "normal" || window.state == "maximized",
`Expected window.state (currently ${window.state}) to be "normal" but will accept "maximized"`);
} else {
browser.test.assertEq(params[key], window[key], `Got expected value for window.${key}`);
}
}
return checkWindow(expected).then(() => {
if (keep) {
return window;
}
if (params.state == "fullscreen" && os == "win") {
// FIXME: Closing a fullscreen window causes a window leak in
// Windows tests.
return browser.windows.update(window.id, {state: "normal"}).then(() => {
return browser.windows.remove(window.id);
});
}
return browser.windows.remove(window.id);
});
});
}
browser.runtime.getPlatformInfo().then(info => { os = info.os; })
.then(() => createWindow({state: "maximized"}, {state: "STATE_MAXIMIZED"}))
.then(() => createWindow({state: "minimized"}, {state: "STATE_MINIMIZED"}))
.then(() => createWindow({state: "normal"}, {state: "STATE_NORMAL", hiddenChrome: []}))
.then(() => createWindow({state: "fullscreen"}, {state: "STATE_FULLSCREEN"}))
.then(() => {
return createWindow({type: "popup"},
{hiddenChrome: ["menubar", "toolbar", "location", "directories", "status", "extrachrome"],
chromeFlags: ["CHROME_OPENAS_DIALOG"]},
true);
}).then(window => {
return browser.tabs.query({windowType: "popup", active: true}).then(tabs => {
browser.test.assertEq(1, tabs.length, "Expected only one popup");
browser.test.assertEq(window.id, tabs[0].windowId, "Expected new window to be returned in query");
return browser.windows.remove(window.id);
});
}).then(() => {
browser.test.notifyPass("window-create");
}).catch(e => {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("window-create");
});
},
});
let latestWindow;
let windowListener = (window, topic) => {
if (topic == "domwindowopened") {
latestWindow = window;
}
};
Services.ww.registerNotification(windowListener);
extension.onMessage("check-window", expected => {
if (expected.state != null) {
let {windowState} = latestWindow;
if (latestWindow.fullScreen) {
windowState = latestWindow.STATE_FULLSCREEN;
}
if (expected.state == "STATE_NORMAL" && AppConstants.platform == "macosx") {
ok(windowState == window.STATE_NORMAL || windowState == window.STATE_MAXIMIZED,
`Expected windowState (currently ${windowState}) to be STATE_NORMAL but will accept STATE_MAXIMIZED`);
} else {
is(windowState, window[expected.state],
`Expected window state to be ${expected.state}`);
}
}
if (expected.hiddenChrome) {
let chromeHidden = latestWindow.document.documentElement.getAttribute("chromehidden");
is(chromeHidden.trim().split(/\s+/).sort().join(" "),
expected.hiddenChrome.sort().join(" "),
"Got expected hidden chrome");
}
if (expected.chromeFlags) {
let {chromeFlags} = latestWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
.treeOwner.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIXULWindow);
for (let flag of expected.chromeFlags) {
ok(chromeFlags & Ci.nsIWebBrowserChrome[flag],
`Expected window to have the ${flag} flag`);
}
}
extension.sendMessage("checked-window");
});
yield extension.startup();
yield extension.awaitFinish("window-create");
yield extension.unload();
Services.ww.unregisterNotification(windowListener);
latestWindow = null;
});
// Tests that incompatible parameters can't be used together.
add_task(function* testWindowCreateParams() {
let extension = ExtensionTestUtils.loadExtension({
background() {
function* getCalls() {
for (let state of ["minimized", "maximized", "fullscreen"]) {
for (let param of ["left", "top", "width", "height"]) {
let expected = `"state": "${state}" may not be combined with "left", "top", "width", or "height"`;
yield browser.windows.create({state, [param]: 100}).then(
val => {
browser.test.fail(`Expected error but got "${val}" instead`);
},
error => {
browser.test.assertTrue(
error.message.includes(expected),
`Got expected error (got: '${error.message}', expected: '${expected}'`);
});
}
}
}
Promise.all(getCalls()).then(() => {
browser.test.notifyPass("window-create-params");
}).catch(e => {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("window-create-params");
});
},
});
yield extension.startup();
yield extension.awaitFinish("window-create-params");
yield extension.unload();
});

View File

@ -19,10 +19,6 @@ add_task(function* () {
yield promiseWaitForFocus(window2);
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["windows"],
},
background: function() {
browser.windows.getAll(undefined, function(wins) {
browser.test.assertEq(wins.length, 2, "should have two windows");
@ -51,3 +47,81 @@ add_task(function* () {
yield BrowserTestUtils.closeWindow(window2);
});
add_task(function* testWindowUpdate() {
let extension = ExtensionTestUtils.loadExtension({
background() {
let _checkWindowPromise;
browser.test.onMessage.addListener(msg => {
if (msg == "checked-window") {
_checkWindowPromise.resolve();
_checkWindowPromise = null;
}
});
let os;
function checkWindow(expected) {
return new Promise(resolve => {
_checkWindowPromise = {resolve};
browser.test.sendMessage("check-window", expected);
});
}
function updateWindow(windowId, params, expected) {
return browser.windows.update(windowId, params).then(window => {
for (let key of Object.keys(params)) {
if (key == "state" && os == "mac" && params.state == "normal") {
// OS-X doesn't have a hard distinction between "normal" and
// "maximized" states.
browser.test.assertTrue(window.state == "normal" || window.state == "maximized",
`Expected window.state (currently ${window.state}) to be "normal" but will accept "maximized"`);
} else {
browser.test.assertEq(params[key], window[key], `Got expected value for window.${key}`);
}
}
return checkWindow(expected);
});
}
let windowId = browser.windows.WINDOW_ID_CURRENT;
browser.runtime.getPlatformInfo().then(info => { os = info.os; })
.then(() => updateWindow(windowId, {state: "maximized"}, {state: "STATE_MAXIMIZED"}))
.then(() => updateWindow(windowId, {state: "minimized"}, {state: "STATE_MINIMIZED"}))
.then(() => updateWindow(windowId, {state: "normal"}, {state: "STATE_NORMAL"}))
.then(() => updateWindow(windowId, {state: "fullscreen"}, {state: "STATE_FULLSCREEN"}))
.then(() => updateWindow(windowId, {state: "normal"}, {state: "STATE_NORMAL"}))
.then(() => {
browser.test.notifyPass("window-update");
}).catch(e => {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("window-update");
});
},
});
extension.onMessage("check-window", expected => {
if (expected.state != null) {
let {windowState} = window;
if (window.fullScreen) {
windowState = window.STATE_FULLSCREEN;
}
if (expected.state == "STATE_NORMAL" && AppConstants.platform == "macosx") {
ok(windowState == window.STATE_NORMAL || windowState == window.STATE_MAXIMIZED,
`Expected windowState (currently ${windowState}) to be STATE_NORMAL but will accept STATE_MAXIMIZED`);
} else {
is(windowState, window[expected.state],
`Expected window state to be ${expected.state}`);
}
}
extension.sendMessage("checked-window");
});
yield extension.startup();
yield extension.awaitFinish("window-update");
yield extension.unload();
});

View File

@ -58,11 +58,11 @@ add_task(function* redirector_ignores_override() {
*/
yield BrowserTestUtils.withNewTab(tabOptions, function*(browser) {
yield ContentTask.spawn(browser, {}, function*() {
is(content.location.href, "about:newtab", "Got right URL");
is(content.document.location.href, "about:newtab", "Got right URL");
is(content.document.nodePrincipal,
Services.scriptSecurityManager.getSystemPrincipal(),
"nodePrincipal should match systemPrincipal");
Assert.equal(content.location.href, "about:newtab", "Got right URL");
Assert.equal(content.document.location.href, "about:newtab", "Got right URL");
Assert.equal(content.document.nodePrincipal,
Services.scriptSecurityManager.getSystemPrincipal(),
"nodePrincipal should match systemPrincipal");
});
}); // jshint ignore:line
}
@ -92,8 +92,8 @@ add_task(function* override_loads_in_browser() {
yield BrowserTestUtils.browserLoaded(browser);
yield ContentTask.spawn(browser, {url: overrideURL}, function*(args) {
is(content.location.href, args.url.trim(), "Got right URL");
is(content.document.location.href, args.url.trim(), "Got right URL");
Assert.equal(content.location.href, args.url.trim(), "Got right URL");
Assert.equal(content.document.location.href, args.url.trim(), "Got right URL");
}); // jshint ignore:line
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
}
@ -124,8 +124,8 @@ add_task(function* override_blank_loads_in_browser() {
yield BrowserTestUtils.browserLoaded(browser);
yield ContentTask.spawn(browser, {}, function*() {
is(content.location.href, "about:blank", "Got right URL");
is(content.document.location.href, "about:blank", "Got right URL");
Assert.equal(content.location.href, "about:blank", "Got right URL");
Assert.equal(content.document.location.href, "about:blank", "Got right URL");
}); // jshint ignore:line
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
}

View File

@ -34,9 +34,12 @@ add_task(function* open_newtab() {
yield BrowserTestUtils.browserLoaded(browser);
yield ContentTask.spawn(browser, {url: TEST_URL}, function*(args) {
is(content.document.location.href, args.url, "document.location should match the external resource");
is(content.document.documentURI, args.url, "document.documentURI should match the external resource");
is(content.document.nodePrincipal.URI.spec, args.url, "nodePrincipal should match the external resource");
Assert.equal(content.document.location.href, args.url,
"document.location should match the external resource");
Assert.equal(content.document.documentURI, args.url,
"document.documentURI should match the external resource");
Assert.equal(content.document.nodePrincipal.URI.spec, args.url,
"nodePrincipal should match the external resource");
});
yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
});

View File

@ -30,7 +30,6 @@ support-files =
[browser_bookmarkProperties_readOnlyRoot.js]
[browser_bookmarksProperties.js]
[browser_drag_bookmarks_on_toolbar.js]
skip-if = e10s # Bug ?????? - test fails - "Number of dragged items should be the same. - Got 0, expected 1"
[browser_forgetthissite_single.js]
[browser_history_sidebar_search.js]
[browser_library_batch_delete.js]

View File

@ -7,12 +7,12 @@ add_task(function* clicking_make_default_checks_alwaysCheck_checkbox() {
yield test_with_mock_shellservice({isDefault: false}, function*() {
let setDefaultPane = content.document.getElementById("setDefaultPane");
is(setDefaultPane.selectedIndex, "0",
"The 'make default' pane should be visible when not default");
Assert.equal(setDefaultPane.selectedIndex, "0",
"The 'make default' pane should be visible when not default");
let alwaysCheck = content.document.getElementById("alwaysCheckDefault");
is(alwaysCheck.checked, false, "Always Check is unchecked by default");
is(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"), false,
"alwaysCheck pref should be false by default in test runs");
Assert.ok(!alwaysCheck.checked, "Always Check is unchecked by default");
Assert.ok(!Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"),
"alwaysCheck pref should be false by default in test runs");
let setDefaultButton = content.document.getElementById("setDefaultButton");
setDefaultButton.click();
@ -21,16 +21,16 @@ add_task(function* clicking_make_default_checks_alwaysCheck_checkbox() {
yield ContentTaskUtils.waitForCondition(() => alwaysCheck.checked,
"'Always Check' checkbox should get checked after clicking the 'Set Default' button");
is(alwaysCheck.checked, true,
"Clicking 'Make Default' checks the 'Always Check' checkbox");
is(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"), true,
"Checking the checkbox should set the pref to true");
is(alwaysCheck.disabled, true,
"'Always Check' checkbox is locked with default browser and alwaysCheck=true");
is(setDefaultPane.selectedIndex, "1",
"The 'make default' pane should not be visible when default");
is(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"), true,
"checkDefaultBrowser pref is now enabled");
Assert.ok(alwaysCheck.checked,
"Clicking 'Make Default' checks the 'Always Check' checkbox");
Assert.ok(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"),
"Checking the checkbox should set the pref to true");
Assert.ok(alwaysCheck.disabled,
"'Always Check' checkbox is locked with default browser and alwaysCheck=true");
Assert.equal(setDefaultPane.selectedIndex, "1",
"The 'make default' pane should not be visible when default");
Assert.ok(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"),
"checkDefaultBrowser pref is now enabled");
});
gBrowser.removeCurrentTab();
@ -43,14 +43,14 @@ add_task(function* clicking_make_default_checks_alwaysCheck_checkbox() {
yield test_with_mock_shellservice({isDefault: false}, function*() {
let setDefaultPane = content.document.getElementById("setDefaultPane");
is(setDefaultPane.selectedIndex, "0",
"The 'make default' pane should be visible when not default");
Assert.equal(setDefaultPane.selectedIndex, "0",
"The 'make default' pane should be visible when not default");
let alwaysCheck = content.document.getElementById("alwaysCheckDefault");
is(alwaysCheck.disabled, true, "Always Check is disabled when locked");
is(alwaysCheck.checked, true,
"Always Check is checked because defaultPref is true and pref is locked");
is(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"), true,
"alwaysCheck pref should ship with 'true' by default");
Assert.ok(alwaysCheck.disabled, "Always Check is disabled when locked");
Assert.ok(alwaysCheck.checked,
"Always Check is checked because defaultPref is true and pref is locked");
Assert.ok(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"),
"alwaysCheck pref should ship with 'true' by default");
let setDefaultButton = content.document.getElementById("setDefaultButton");
setDefaultButton.click();
@ -59,12 +59,12 @@ add_task(function* clicking_make_default_checks_alwaysCheck_checkbox() {
yield ContentTaskUtils.waitForCondition(() => setDefaultPane.selectedIndex == "1",
"Browser is now default");
is(alwaysCheck.checked, true,
"'Always Check' is still checked because it's locked");
is(alwaysCheck.disabled, true,
"'Always Check is disabled because it's locked");
is(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"), true,
"The pref is locked and so doesn't get changed");
Assert.ok(alwaysCheck.checked,
"'Always Check' is still checked because it's locked");
Assert.ok(alwaysCheck.disabled,
"'Always Check is disabled because it's locked");
Assert.ok(Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser"),
"The pref is locked and so doesn't get changed");
});
Services.prefs.unlockPref("browser.shell.checkDefaultBrowser");

View File

@ -39,12 +39,12 @@ function* open_subdialog_and_test_generic_start_state(browser, domcontentloadedF
}
}
ok(!!subdialog._frame.contentWindow, "The dialog should be non-null");
isnot(subdialog._frame.contentWindow.location.toString(), "about:blank",
Assert.ok(!!subdialog._frame.contentWindow, "The dialog should be non-null");
Assert.notEqual(subdialog._frame.contentWindow.location.toString(), "about:blank",
"Subdialog URL should not be about:blank");
is(win.getComputedStyle(subdialog._overlay, "").visibility, "visible",
Assert.equal(win.getComputedStyle(subdialog._overlay, "").visibility, "visible",
"Overlay should be visible");
is(expectedStyleSheetURLs.length, 0,
Assert.equal(expectedStyleSheetURLs.length, 0,
"No stylesheets that were expected are missing");
return result;
});
@ -64,14 +64,14 @@ function* close_subdialog_and_test_generic_end_state(browser, closingFn, closing
info("waiting for about:blank load");
yield ContentTaskUtils.waitForEvent(frame, "load");
isnot(win.getComputedStyle(subdialog._overlay, "").visibility, "visible",
Assert.notEqual(win.getComputedStyle(subdialog._overlay, "").visibility, "visible",
"overlay is not visible");
is(frame.getAttribute("style"), "", "inline styles should be cleared");
is(frame.contentWindow.location.href.toString(), "about:blank",
Assert.equal(frame.getAttribute("style"), "", "inline styles should be cleared");
Assert.equal(frame.contentWindow.location.href.toString(), "about:blank",
"sub-dialog should be unloaded");
is(closingEvent.detail.button, expectations.closingButton,
Assert.equal(closingEvent.detail.button, expectations.closingButton,
"closing event should indicate button was '" + expectations.closingButton + "'");
is(actualAcceptCount, expectations.acceptCount,
Assert.equal(actualAcceptCount, expectations.acceptCount,
"should be 1 if accepted, 0 if canceled, undefined if closed w/out button");
});
@ -97,9 +97,9 @@ add_task(function* check_titlebar_focus_returnval_titlechanges_accepting() {
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
let dialog = content.window.gSubDialog._frame.contentWindow;
let dialogTitleElement = content.document.getElementById("dialogTitle");
is(dialogTitleElement.textContent, "Sample sub-dialog",
Assert.equal(dialogTitleElement.textContent, "Sample sub-dialog",
"Title should be correct initially");
is(dialog.document.activeElement.value, "Default text",
Assert.equal(dialog.document.activeElement.value, "Default text",
"Textbox with correct text is focused");
dialog.document.title = "Updated title";
});
@ -109,7 +109,8 @@ add_task(function* check_titlebar_focus_returnval_titlechanges_accepting() {
ContentTask.spawn(tab.linkedBrowser, null, function*() {
let dialogTitleElement = content.document.getElementById("dialogTitle");
is(dialogTitleElement.textContent, "Updated title", "subdialog should have updated title");
Assert.equal(dialogTitleElement.textContent, "Updated title",
"subdialog should have updated title");
});
// Accept the dialog
@ -182,8 +183,10 @@ add_task(function* correct_width_and_height_should_be_used_for_dialog() {
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
let frameStyle = content.window.gSubDialog._frame.style;
is(frameStyle.width, "32em", "Width should be set on the frame from the dialog");
is(frameStyle.height, "5em", "Height should be set on the frame from the dialog");
Assert.equal(frameStyle.width, "32em",
"Width should be set on the frame from the dialog");
Assert.equal(frameStyle.height, "5em",
"Height should be set on the frame from the dialog");
});
yield close_subdialog_and_test_generic_end_state(tab.linkedBrowser,
@ -215,11 +218,11 @@ add_task(function* wrapped_text_in_dialog_should_have_expected_scrollHeight() {
yield ContentTask.spawn(tab.linkedBrowser, oldHeight, function*(oldHeight) {
let frame = content.window.gSubDialog._frame;
let docEl = frame.contentDocument.documentElement;
is(frame.style.width, "32em",
Assert.equal(frame.style.width, "32em",
"Width should be set on the frame from the dialog");
ok(docEl.scrollHeight > oldHeight,
Assert.ok(docEl.scrollHeight > oldHeight,
"Content height increased (from " + oldHeight + " to " + docEl.scrollHeight + ").");
is(frame.style.height, docEl.scrollHeight + "px",
Assert.equal(frame.style.height, docEl.scrollHeight + "px",
"Height on the frame should be higher now");
});
@ -236,8 +239,8 @@ add_task(function* dialog_too_tall_should_get_reduced_in_height() {
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
let frame = content.window.gSubDialog._frame;
is(frame.style.width, "32em", "Width should be set on the frame from the dialog");
ok(parseInt(frame.style.height) < content.window.innerHeight,
Assert.equal(frame.style.width, "32em", "Width should be set on the frame from the dialog");
Assert.ok(parseInt(frame.style.height, 10) < content.window.innerHeight,
"Height on the frame should be smaller than window's innerHeight");
});
@ -255,9 +258,9 @@ add_task(function* scrollWidth_and_scrollHeight_from_subdialog_should_size_the_b
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
let frame = content.window.gSubDialog._frame;
ok(frame.style.width.endsWith("px"),
Assert.ok(frame.style.width.endsWith("px"),
"Width (" + frame.style.width + ") should be set to a px value of the scrollWidth from the dialog");
ok(frame.style.height.endsWith("px"),
Assert.ok(frame.style.height.endsWith("px"),
"Height (" + frame.style.height + ") should be set to a px value of the scrollHeight from the dialog");
});

View File

@ -14,13 +14,11 @@ add_task(function* test_no_sessionrestore_button() {
yield BrowserTestUtils.browserLoaded(browser);
let display = yield ContentTask.spawn(browser, {}, function* (){
yield ContentTask.spawn(browser, null, function* () {
let button = content.document.getElementById("restorePreviousSession");
return content.getComputedStyle(button).display;
Assert.equal(content.getComputedStyle(button).display, "none",
"The Session Restore about:home button should be disabled");
});
is(display, "none",
"The Session Restore about:home button should be disabled");
win.close();
});

View File

@ -14,11 +14,10 @@ add_task(function* testNoSessionRestoreButton() {
yield BrowserTestUtils.browserLoaded(browser);
let disabled = yield ContentTask.spawn(browser, {}, function* (){
return content.document.getElementById("errorTryAgain").disabled;
yield ContentTask.spawn(browser, null, function* () {
Assert.ok(content.document.getElementById("errorTryAgain").disabled,
"The Restore about:sessionrestore button should be disabled");
});
ok(disabled, "The Restore about:sessionrestore button should be disabled");
win.close();
});

View File

@ -32,25 +32,21 @@ add_task(function* () {
yield promiseTabRestored(tab2);
// Query a few values from the top and its child frames.
let query = ContentTask.spawn(tab2.linkedBrowser, null, function* () {
return [
content.document.getElementById("out1").value,
yield ContentTask.spawn(tab2.linkedBrowser, null, function* () {
Assert.notEqual(content.document.getElementById("out1").value,
content.frames[1].document.getElementById("out1").value,
content.document.getElementsByName("1|#out2")[0].value,
content.frames[1].document.getElementById("out2").value,
content.frames[0].frames[1].document.getElementById("in1").value,
content.frames[1].frames[0].document.getElementById("in1").value
];
"text isn't reused for frames");
Assert.notEqual(content.document.getElementsByName("1|#out2")[0].value,
"", "text containing | and # is correctly restored");
Assert.equal(content.frames[1].document.getElementById("out2").value,
"", "id prefixes can't be faked");
// Disabled for now, Bug 588077
//Assert.equal(content.frames[0].frames[1].document.getElementById("in1").value,
// "", "id prefixes aren't mixed up");
Assert.equal(content.frames[1].frames[0].document.getElementById("in1").value,
"", "id prefixes aren't mixed up");
});
let [v1, v2, v3, v4, v5, v6] = yield query;
isnot(v1, v2, "text isn't reused for frames");
isnot(v3, "", "text containing | and # is correctly restored");
is(v4, "", "id prefixes can't be faked");
// Disabled for now, Bug 588077
//is(v5, "", "id prefixes aren't mixed up");
is(v6, "", "id prefixes aren't mixed up");
// Cleanup.
gBrowser.removeTab(tab2);
gBrowser.removeTab(tab);

View File

@ -4,6 +4,12 @@ const REFERRER1 = "http://example.org/?" + Date.now();
const REFERRER2 = "http://example.org/?" + Math.random();
add_task(function* () {
function* checkDocumentReferrer(referrer, msg) {
yield ContentTask.spawn(gBrowser.selectedBrowser, { referrer, msg }, function* (args) {
Assert.equal(content.document.referrer, args.referrer, args.msg);
});
}
// Add a new tab.
let tab = gBrowser.selectedTab = gBrowser.addTab("about:blank");
let browser = tab.linkedBrowser;
@ -22,21 +28,15 @@ add_task(function* () {
tabState.entries[0].referrer = REFERRER2;
yield promiseTabState(tab, tabState);
is((yield promiseDocumentReferrer()), REFERRER2,
"document.referrer matches referrer set via setTabState.");
yield checkDocumentReferrer(REFERRER2,
"document.referrer matches referrer set via setTabState.");
gBrowser.removeCurrentTab();
// Restore the closed tab.
tab = ss.undoCloseTab(window, 0);
yield promiseTabRestored(tab);
is((yield promiseDocumentReferrer()), REFERRER2,
"document.referrer is still correct after closing and reopening the tab.");
yield checkDocumentReferrer(REFERRER2,
"document.referrer is still correct after closing and reopening the tab.");
gBrowser.removeCurrentTab();
});
function promiseDocumentReferrer() {
return ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
return content.document.referrer;
});
}

View File

@ -43,10 +43,9 @@ function checkState(tab) {
// not currently Xrayable (see bug 1014991), trying to pull |obj3| (a RegExp)
// off of an Xrayed Object won't work. So we need to waive.
ContentTask.spawn(tab.linkedBrowser, aEvent.state, function(state) {
return Cu.waiveXrays(state).obj3.toString();
}).then(function(stateStr) {
is(stateStr, '/^a$/', "second popstate object.");
Assert.equal(Cu.waiveXrays(state).obj3.toString(),
"/^a$/", "second popstate object.");
}).then(function() {
// Make sure that the new-elem node is present in the document. If it's
// not, then this history entry has a different doc identifier than the
// previous entry, which is bad.

View File

@ -28,7 +28,7 @@ add_task(function*() {
yield ContentTask.spawn(browser, PAGE_2, function*(PAGE_2) {
docShell.QueryInterface(Ci.nsIWebNavigation);
is(docShell.currentURI.spec, PAGE_2,
Assert.equal(docShell.currentURI.spec, PAGE_2,
"Content should have PAGE_2 as the browser currentURI");
});

View File

@ -16,7 +16,8 @@ function checkTabContents(browser) {
let Ci = Components.interfaces;
let webNavigation = docShell.QueryInterface(Ci.nsIWebNavigation);
let history = webNavigation.sessionHistory.QueryInterface(Ci.nsISHistoryInternal);
return history && history.count == 1 && content.document.documentURI == "about:mozilla";
Assert.ok(history && history.count == 1 && content.document.documentURI == "about:mozilla",
"expected tab contents found");
});
}
@ -43,13 +44,13 @@ add_task(function* () {
// Purge session history.
Services.obs.notifyObservers(null, "browser:purge-session-history", "");
ok((yield checkTabContents(browser)), "expected tab contents found");
yield checkTabContents(browser);
ok(tab2.hasAttribute("pending"), "tab is still pending");
// Kick off tab restoration.
gBrowser.selectedTab = tab2;
yield promiseTabRestored(tab2);
ok((yield checkTabContents(browser2)), "expected tab contents found");
yield checkTabContents(browser2);
ok(!tab2.hasAttribute("pending"), "tab is not pending anymore");
// Cleanup.

View File

@ -40,13 +40,12 @@ var testSwitchToTab = Task.async(function* (url, options) {
is(browser.currentURI.spec, url, "correct URL loaded");
// Check that we didn't lose any history entries.
let count = yield ContentTask.spawn(browser, null, function* () {
yield ContentTask.spawn(browser, null, function* () {
let Ci = Components.interfaces;
let webNavigation = docShell.QueryInterface(Ci.nsIWebNavigation);
let history = webNavigation.sessionHistory.QueryInterface(Ci.nsISHistoryInternal);
return history && history.count;
Assert.equal(history && history.count, 3, "three history entries");
});
is(count, 3, "three history entries");
// Cleanup.
gBrowser.removeTab(tab);

View File

@ -2,14 +2,7 @@
* 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/. */
function retrieveUserContextId(browser) {
return ContentTask.spawn(browser, null, function* () {
let loadContext = docShell.QueryInterface(Ci.nsILoadContext);
return loadContext.originAttributes.userContextId;
});
}
add_task(function() {
add_task(function* () {
for (let i = 0; i < 3; ++i) {
let tab = gBrowser.addTab("http://example.com/", {userContextId: i});
let browser = tab.linkedBrowser;
@ -20,8 +13,11 @@ add_task(function() {
let browser2 = tab2.linkedBrowser;
yield promiseTabRestored(tab2)
let userContextId = yield retrieveUserContextId(browser2);
is(userContextId, i, "The docShell has the correct userContextId");
yield ContentTask.spawn(browser2, { expectedId: i }, function* (args) {
let loadContext = docShell.QueryInterface(Ci.nsILoadContext);
Assert.equal(loadContext.originAttributes.userContextId,
args.expectedId, "The docShell has the correct userContextId");
});
yield promiseRemoveTab(tab);
yield promiseRemoveTab(tab2);

View File

@ -2,12 +2,13 @@
const URL = "http://example.com/browser_switch_remoteness_";
function countHistoryEntries(browser) {
return ContentTask.spawn(browser, null, function* () {
function countHistoryEntries(browser, expected) {
return ContentTask.spawn(browser, { expected }, function* (args) {
let Ci = Components.interfaces;
let webNavigation = docShell.QueryInterface(Ci.nsIWebNavigation);
let history = webNavigation.sessionHistory.QueryInterface(Ci.nsISHistoryInternal);
return history && history.count;
Assert.equal(history && history.count, args.expected,
"correct number of shistory entries");
});
}
@ -30,8 +31,7 @@ add_task(function* () {
}
// Check we have the right number of shistory entries.
let count = yield countHistoryEntries(browser);
is(count, MAX_BACK + 2, "correct number of shistory entries");
yield countHistoryEntries(browser, MAX_BACK + 2);
// Load a non-remote page.
browser.loadURI("about:robots");
@ -39,8 +39,7 @@ add_task(function* () {
ok(!browser.isRemoteBrowser, "browser is not remote anymore");
// Check that we didn't lose any shistory entries.
count = yield countHistoryEntries(browser);
is(count, MAX_BACK + 3, "correct number of shistory entries");
yield countHistoryEntries(browser, MAX_BACK + 3);
// Cleanup.
gBrowser.removeTab(tab);

View File

@ -48,7 +48,7 @@ add_task(function* test_bing_translation() {
let result = yield client.translate();
// XXXmikedeboer; here you would continue the test/ content inspection.
ok(result, "There should be a result");
Assert.ok(result, "There should be a result");
});
gBrowser.removeTab(tab);
@ -89,7 +89,7 @@ add_task(function* test_handling_out_of_valid_key_error() {
client._resetToken();
// Checking if the client detected service and unavailable.
ok(client._serviceUnavailable, "Service should be detected unavailable.");
Assert.ok(client._serviceUnavailable, "Service should be detected unavailable.");
});
// Cleaning up.

View File

@ -47,7 +47,7 @@ add_task(function* test_yandex_translation() {
new TranslationDocument(content.document), "fr", "en");
let result = yield client.translate();
ok(result, "There should be a result.");
Assert.ok(result, "There should be a result.");
});
gBrowser.removeTab(tab);

View File

@ -240,10 +240,9 @@ if (typeof Mozilla == 'undefined') {
* @param {Object} extraURLCampaignParams - An object containing additional
* paramaters for the URL opened by the browser for reasons of promotional
* campaign tracking. Each attribute of the object must have a name that
* begins with "utm_" and a value that is a string. Both the name and value
* must contain only alphanumeric characters, dashes or underscores (meaning
* that you are limited to values that don't need encoding, as any such
* characters in the name or value will be rejected.)
* begins with "utm_" and a value that is a string that contains only only
* alphanumeric characters, dashes or underscores. The values may be any
* string and will automatically be encoded.
*/
Mozilla.UITour.showFirefoxAccounts = function(extraURLCampaignParams) {
_sendEvent('showFirefoxAccounts', {

View File

@ -39,7 +39,7 @@ skip-if = e10s # Bug 1240747 - UITour.jsm not e10s friendly.
skip-if = true # Bug 1225832 - New Loop architecture is not compatible with test.
[browser_UITour_loop_panel.js]
[browser_UITour_modalDialog.js]
skip-if = os != "mac" || e10s # modal dialog disabling only working on OS X. Bug 1240747 - UITour.jsm not e10s friendly
skip-if = os != "mac" # modal dialog disabling only working on OS X.
[browser_UITour_observe.js]
skip-if = e10s # Bug 1240747 - UITour.jsm not e10s friendly.
[browser_UITour_panel_close_annotation.js]

View File

@ -601,18 +601,25 @@ var WindowListener = {
let cursor = document.getElementById("loop-remote-cursor");
if (!cursor) {
cursor = document.createElement("image");
// Create a container to keep the pointer inside.
// This allows us to hide the overflow when out of bounds.
let cursorContainer = document.createElement("div");
cursorContainer.setAttribute("id", "loop-remote-cursor-container");
cursor = document.createElement("img");
cursor.setAttribute("id", "loop-remote-cursor");
cursorContainer.appendChild(cursor);
// Note that browser.parent is a xul:stack so container will use
// 100% of space if no other constrains added.
browser.parentNode.appendChild(cursorContainer);
}
// Update the cursor's position.
cursor.setAttribute("left",
cursorData.ratioX * browser.boxObject.width);
cursor.setAttribute("top",
cursorData.ratioY * browser.boxObject.height);
// browser's parent is a xul:stack, so positioning with left/top works.
browser.parentNode.appendChild(cursor);
// Update the cursor's position with CSS.
cursor.style.left =
Math.abs(cursorData.ratioX * browser.boxObject.width) + "px";
cursor.style.top =
Math.abs(cursorData.ratioY * browser.boxObject.height) + "px";
},
/**

View File

@ -144,6 +144,14 @@ const kMauPrefMap = new Map(
return [LOOP_MAU_TYPE[name], parts[0] + parts[1].charAt(0).toUpperCase() + parts[1].substr(1)];
})
);
/**
* WARNING: Every function in kMessageHandlers must call the reply() function,
* as otherwise the content requesters can be left hanging.
*
* Ideally, we should rewrite them to handle failure/long times better, at which
* point this could be relaxed slightly.
*/
const kMessageHandlers = {
/**
* Start browser sharing, which basically means to start listening for tab

View File

@ -99,10 +99,8 @@ loop.SimpleSlideshow = function () {
var slidesNodes = this.props.data.map(function (slideNode, index) {
var isActive = state.currentSlide === index;
return React.createElement(Slide, { active: isActive,
imageAlt: slideNode.imageAlt,
imageClass: slideNode.imageClass,
indexClass: slideNode.id,
key: slideNode.id,
text: slideNode.text,
title: slideNode.title });
});

View File

@ -376,6 +376,44 @@ html[dir="rtl"] .settings-menu.dropdown-menu {
}
}
/* Stream paused */
.focus-stream > .room-inner-info-area > .remote-stream-paused {
background-color: #fff;
border: solid 1px #a6a6a6;
box-shadow: 0 2px 4px rgba(0,0,0,.25);
display: inline-block;
margin: auto;
padding: 10px 15px;
}
.focus-stream > .room-inner-info-area > .remote-stream-paused > h1 {
font-size: 1.6rem;
line-height: 3rem;
padding-left: 42px;
position: relative;
text-align: left;
}
.focus-stream > .room-inner-info-area > .remote-stream-paused > h1:before {
background: url("../img/paused-hello.svg") center center no-repeat;
content: "";
display: block;
height: 30px;
left: 0;
position: absolute;
width: 32px;
}
html[dir="rtl"] .focus-stream > .room-inner-info-area > .remote-stream-paused > h1 {
padding-left: 0;
padding-right: 42px;
}
html[dir="rtl"] .focus-stream > .room-inner-info-area > .remote-stream-paused > h1:before {
right: 0;
transform: scaleX(-1);
}
.remote > .avatar {
/* make visually distinct from local avatar */
opacity: 0.25;
@ -595,6 +633,10 @@ body[platform="win"] .share-service-dropdown.overflow > .dropdown-menu-item {
background-color: #d8d8d8;
}
.media-wrapper > .focus-stream.screen-sharing-paused > .remote-video-box {
display: none;
}
.media-wrapper > .local {
flex: 0 1 auto;
width: 200px;

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 225 50"><path fill="#1E92CE" d="M146.3,20.2c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2,0-0.3,0-0.5,0.1 c-0.2,0.1-0.3,0.2-0.4,0.3c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.2-0.1,0.3-0.1,0.5c0,0.2,0,0.4,0.1,0.5c0.1,0.2,0.2,0.3,0.3,0.4 c0.1,0.1,0.2,0.2,0.4,0.3c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.3,0,0.5-0.1c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.4 c0.1-0.2,0.1-0.3,0.1-0.5c0-0.2,0-0.3-0.1-0.5C146.5,20.4,146.4,20.3,146.3,20.2z M146.3,21.5c-0.1,0.1-0.1,0.2-0.2,0.3 c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0.1-0.3,0.1-0.4,0.1c-0.1,0-0.3,0-0.4-0.1c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1-0.1-0.2-0.2-0.2-0.3 c-0.1-0.1-0.1-0.3-0.1-0.4c0-0.2,0-0.3,0.1-0.4c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.2c0.1-0.1,0.3-0.1,0.4-0.1 c0.1,0,0.3,0,0.4,0.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.2,0.2,0.2,0.3c0.1,0.1,0.1,0.3,0.1,0.4C146.4,21.2,146.4,21.4,146.3,21.5 z M145.7,21.4C145.7,21.3,145.6,21.3,145.7,21.4c-0.1-0.1-0.1-0.1-0.1-0.2c0,0,0,0,0,0c0.1,0,0.2,0,0.3-0.1 c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.1,0-0.2c0,0,0-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c-0.1,0-0.1,0-0.2,0H145v1.4h0.2v-0.6 c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0.1,0.1,0.1c0,0.1,0.1,0.1,0.1,0.2l0.1,0.2h0.3L145.7,21.4C145.7,21.4,145.7,21.4,145.7,21.4z M145.3,21h-0.1v-0.5h0.1c0.1,0,0.2,0,0.2,0.1c0,0,0.1,0.1,0.1,0.2c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0-0.1,0.1 C145.4,21,145.4,21,145.3,21z M54.4,37.8h4.1V26.5h6.8v-3.3h-6.8v-6.7h8.4l0.5-3.3h-13V37.8z M71.6,11.9c-1.5,0-2.6,1.2-2.6,2.6 c0,1.4,1.1,2.6,2.5,2.6c1.5,0,2.6-1.2,2.6-2.6C74.1,13.1,73,11.9,71.6,11.9z M69.5,37.8h3.9V19.4l-3.9,0.7V37.8z M85.4,19.3 c-1.7,0-3.2,0.9-4.6,2.9c0-1-0.2-2-0.7-2.8l-3.6,0.9c0.4,1.1,0.6,2.6,0.6,4.8v12.7h3.9V25.6c0.4-1.5,1.7-2.7,3.4-2.7 c0.4,0,0.7,0.1,1.1,0.2l1.2-3.6C86.3,19.4,86,19.3,85.4,19.3z M94,19.4c-2.3,0-4,0.7-5.5,2.4c-1.6,1.8-2.2,3.9-2.2,7 c0,5.7,3.2,9.4,8.3,9.4c2.4,0,4.6-0.8,6.4-2.4l-1.5-2.4c-1.3,1.2-2.8,1.8-4.5,1.8c-3.5,0-4.4-2.6-4.4-5.1v-0.3h10.7V29 c0-4.2-0.8-6.4-2.3-7.8C97.4,19.9,95.7,19.4,94,19.4z M90.6,27c0-2.9,1.2-4.6,3.4-4.6c1.9,0,3.2,1.7,3.2,4.6H90.6z M108,19.8v-2.7 c0-1.6,0.9-2.5,2.2-2.5c0.7,0,1.3,0.2,2.2,0.6l1.3-2.5c-1.2-0.7-2.5-1-4-1c-3.2,0-5.5,1.7-5.5,5.5c0,1.7,0.1,2.7,0.1,2.7h-1.7v2.7 h1.7v15.3h3.9V22.5h3.7l1-2.7H108z M119.9,19.4c-4.7,0-7.8,3.7-7.8,9.4c0,5.7,3,9.4,7.9,9.4c4.9,0,7.9-3.6,7.9-9.4 C127.9,23.2,125,19.4,119.9,19.4z M120.1,35.3c-2.3,0-3.6-1.5-3.6-6.7c0-4.4,1.1-6.2,3.5-6.2c2.3,0,3.7,1.5,3.7,6.6 C123.6,33.4,122.4,35.3,120.1,35.3z M143.2,19.8h-4.5c-0.5,0.7-2.3,4.3-2.8,5.5c-0.9-1.7-2.4-4.5-3.3-5.8l-4.2,0.9l5.2,7.7 l-6.7,9.7h4.9c0.7-1,3.2-5.4,3.9-6.7c0.4,0.6,3.3,5.7,3.9,6.7h4.9L138,28L143.2,19.8z M165.8,23.6h-10.3V13.3h-2.9v24.6h2.9V26 h10.3v11.9h2.9V13.3h-2.9V23.6z M179,19.5c-2.1,0-3.9,0.8-5.3,2.5c-1.5,1.8-2.1,3.7-2.1,6.7c0,5.9,3,9.5,7.9,9.5 c2.3,0,4.4-0.8,6-2.2l-1.1-1.8c-1.3,1.1-2.6,1.7-4.4,1.7c-1.8,0-3.4-0.6-4.4-2.2c-0.6-0.9-0.8-2.2-0.8-3.9v-0.4h11.1V29 c-0.1-4.3-0.5-5.9-2-7.5C182.6,20.2,181,19.5,179,19.5z M174.8,27.3c0.1-3.7,1.6-5.6,4.1-5.6c1.4,0,2.6,0.6,3.2,1.6 c0.5,0.9,0.8,2,0.8,4H174.8z M193.1,36.1c-0.8,0-1-0.4-1-1.8V16c0-2.7-0.5-4.2-0.5-4.2l-2.8,0.5c0,0,0.4,1.3,0.4,3.7v18.9 c0,1.3,0.3,2,0.9,2.5c0.5,0.5,1.3,0.8,2.1,0.8c0.8,0,1.1-0.1,1.8-0.4l-0.6-1.8C193.4,36,193.2,36.1,193.1,36.1z M200.3,36.1 c-0.8,0-1-0.4-1-1.8V16c0-2.7-0.5-4.2-0.5-4.2l-2.8,0.5c0,0,0.4,1.3,0.4,3.7v18.9c0,1.3,0.3,2,0.9,2.5c0.5,0.5,1.2,0.8,2.1,0.8 c0.7,0,1.1-0.1,1.8-0.4l-0.6-1.8C200.6,36,200.4,36.1,200.3,36.1z M216.3,22.6c-1.2-1.8-3.1-3.1-6.1-3.1c-4.7,0-7.6,3.5-7.6,9.4 c0,5.9,2.8,9.5,7.7,9.5c4.5,0,7.7-3.2,7.7-9.1C218,26.3,217.5,24.2,216.3,22.6z M214.3,33.3c-0.6,1.7-2,2.7-3.9,2.7 c-1.5,0-3-0.7-3.6-1.8c-0.7-1.1-1.1-3.3-1.1-5.8c0-2.1,0.3-3.5,0.9-4.7c0.6-1.2,2.1-1.9,3.6-1.9c1.5,0,3,0.7,3.8,2.3 c0.6,1.2,0.8,2.9,0.8,5.4C214.8,31.2,214.7,32.2,214.3,33.3z M26.1,7.7C16.1,7.7,8,14.9,8,23.6c0,4.4,2,8.3,5.2,11.2 c-0.6,2-1.7,4.7-3.9,7.3c0.4,0.7,6.6-1.7,11-3.4c1.8,0.5,3.7,0.8,5.7,0.8c10,0,18.1-7.1,18.1-15.9C44.1,14.9,36,7.7,26.1,7.7z M31.5,17.3c1.3,0,2.4,1.1,2.4,2.4c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4C29.1,18.3,30.2,17.3,31.5,17.3z M20.6,17.3 c1.3,0,2.4,1.1,2.4,2.4c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4C18.2,18.3,19.3,17.3,20.6,17.3z M26.1,34.7 C26.1,34.7,26,34.7,26.1,34.7c-0.1,0-0.1,0-0.1,0c-4.8,0-10.2-3.1-11.5-8.4c3.3,1.5,7.8,2.2,11.5,2.2c3.7,0,8.3-0.7,11.5-2.2 C36.3,31.6,30.9,34.7,26.1,34.7z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 225 50"><path fill="#06A6E0" d="M146.3,20.2c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2,0-0.3,0-0.5,0.1 c-0.2,0.1-0.3,0.2-0.4,0.3c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.2-0.1,0.3-0.1,0.5c0,0.2,0,0.4,0.1,0.5c0.1,0.2,0.2,0.3,0.3,0.4 c0.1,0.1,0.2,0.2,0.4,0.3c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.3,0,0.5-0.1c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.2-0.3,0.3-0.4 c0.1-0.2,0.1-0.3,0.1-0.5c0-0.2,0-0.3-0.1-0.5C146.5,20.4,146.4,20.3,146.3,20.2z M146.3,21.5c-0.1,0.1-0.1,0.2-0.2,0.3 c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0.1-0.3,0.1-0.4,0.1c-0.1,0-0.3,0-0.4-0.1c-0.1-0.1-0.2-0.1-0.3-0.2c-0.1-0.1-0.2-0.2-0.2-0.3 c-0.1-0.1-0.1-0.3-0.1-0.4c0-0.2,0-0.3,0.1-0.4c0.1-0.1,0.1-0.2,0.2-0.3c0.1-0.1,0.2-0.2,0.3-0.2c0.1-0.1,0.3-0.1,0.4-0.1 c0.1,0,0.3,0,0.4,0.1c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0.1,0.2,0.2,0.2,0.3c0.1,0.1,0.1,0.3,0.1,0.4C146.4,21.2,146.4,21.4,146.3,21.5 z M145.7,21.4C145.7,21.3,145.6,21.3,145.7,21.4c-0.1-0.1-0.1-0.1-0.1-0.2c0,0,0,0,0,0c0.1,0,0.2,0,0.3-0.1 c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.1,0-0.2c0,0,0-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c-0.1,0-0.1,0-0.2,0H145v1.4h0.2v-0.6 c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0.1,0.1,0.1c0,0.1,0.1,0.1,0.1,0.2l0.1,0.2h0.3L145.7,21.4C145.7,21.4,145.7,21.4,145.7,21.4z M145.3,21h-0.1v-0.5h0.1c0.1,0,0.2,0,0.2,0.1c0,0,0.1,0.1,0.1,0.2c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0-0.1,0.1 C145.4,21,145.4,21,145.3,21z M54.4,37.8h4.1V26.5h6.8v-3.3h-6.8v-6.7h8.4l0.5-3.3h-13V37.8z M71.6,11.9c-1.5,0-2.6,1.2-2.6,2.6 c0,1.4,1.1,2.6,2.5,2.6c1.5,0,2.6-1.2,2.6-2.6C74.1,13.1,73,11.9,71.6,11.9z M69.5,37.8h3.9V19.4l-3.9,0.7V37.8z M85.4,19.3 c-1.7,0-3.2,0.9-4.6,2.9c0-1-0.2-2-0.7-2.8l-3.6,0.9c0.4,1.1,0.6,2.6,0.6,4.8v12.7h3.9V25.6c0.4-1.5,1.7-2.7,3.4-2.7 c0.4,0,0.7,0.1,1.1,0.2l1.2-3.6C86.3,19.4,86,19.3,85.4,19.3z M94,19.4c-2.3,0-4,0.7-5.5,2.4c-1.6,1.8-2.2,3.9-2.2,7 c0,5.7,3.2,9.4,8.3,9.4c2.4,0,4.6-0.8,6.4-2.4l-1.5-2.4c-1.3,1.2-2.8,1.8-4.5,1.8c-3.5,0-4.4-2.6-4.4-5.1v-0.3h10.7V29 c0-4.2-0.8-6.4-2.3-7.8C97.4,19.9,95.7,19.4,94,19.4z M90.6,27c0-2.9,1.2-4.6,3.4-4.6c1.9,0,3.2,1.7,3.2,4.6H90.6z M108,19.8v-2.7 c0-1.6,0.9-2.5,2.2-2.5c0.7,0,1.3,0.2,2.2,0.6l1.3-2.5c-1.2-0.7-2.5-1-4-1c-3.2,0-5.5,1.7-5.5,5.5c0,1.7,0.1,2.7,0.1,2.7h-1.7v2.7 h1.7v15.3h3.9V22.5h3.7l1-2.7H108z M119.9,19.4c-4.7,0-7.8,3.7-7.8,9.4c0,5.7,3,9.4,7.9,9.4c4.9,0,7.9-3.6,7.9-9.4 C127.9,23.2,125,19.4,119.9,19.4z M120.1,35.3c-2.3,0-3.6-1.5-3.6-6.7c0-4.4,1.1-6.2,3.5-6.2c2.3,0,3.7,1.5,3.7,6.6 C123.6,33.4,122.4,35.3,120.1,35.3z M143.2,19.8h-4.5c-0.5,0.7-2.3,4.3-2.8,5.5c-0.9-1.7-2.4-4.5-3.3-5.8l-4.2,0.9l5.2,7.7 l-6.7,9.7h4.9c0.7-1,3.2-5.4,3.9-6.7c0.4,0.6,3.3,5.7,3.9,6.7h4.9L138,28L143.2,19.8z M165.8,23.6h-10.3V13.3h-2.9v24.6h2.9V26 h10.3v11.9h2.9V13.3h-2.9V23.6z M179,19.5c-2.1,0-3.9,0.8-5.3,2.5c-1.5,1.8-2.1,3.7-2.1,6.7c0,5.9,3,9.5,7.9,9.5 c2.3,0,4.4-0.8,6-2.2l-1.1-1.8c-1.3,1.1-2.6,1.7-4.4,1.7c-1.8,0-3.4-0.6-4.4-2.2c-0.6-0.9-0.8-2.2-0.8-3.9v-0.4h11.1V29 c-0.1-4.3-0.5-5.9-2-7.5C182.6,20.2,181,19.5,179,19.5z M174.8,27.3c0.1-3.7,1.6-5.6,4.1-5.6c1.4,0,2.6,0.6,3.2,1.6 c0.5,0.9,0.8,2,0.8,4H174.8z M193.1,36.1c-0.8,0-1-0.4-1-1.8V16c0-2.7-0.5-4.2-0.5-4.2l-2.8,0.5c0,0,0.4,1.3,0.4,3.7v18.9 c0,1.3,0.3,2,0.9,2.5c0.5,0.5,1.3,0.8,2.1,0.8c0.8,0,1.1-0.1,1.8-0.4l-0.6-1.8C193.4,36,193.2,36.1,193.1,36.1z M200.3,36.1 c-0.8,0-1-0.4-1-1.8V16c0-2.7-0.5-4.2-0.5-4.2l-2.8,0.5c0,0,0.4,1.3,0.4,3.7v18.9c0,1.3,0.3,2,0.9,2.5c0.5,0.5,1.2,0.8,2.1,0.8 c0.7,0,1.1-0.1,1.8-0.4l-0.6-1.8C200.6,36,200.4,36.1,200.3,36.1z M216.3,22.6c-1.2-1.8-3.1-3.1-6.1-3.1c-4.7,0-7.6,3.5-7.6,9.4 c0,5.9,2.8,9.5,7.7,9.5c4.5,0,7.7-3.2,7.7-9.1C218,26.3,217.5,24.2,216.3,22.6z M214.3,33.3c-0.6,1.7-2,2.7-3.9,2.7 c-1.5,0-3-0.7-3.6-1.8c-0.7-1.1-1.1-3.3-1.1-5.8c0-2.1,0.3-3.5,0.9-4.7c0.6-1.2,2.1-1.9,3.6-1.9c1.5,0,3,0.7,3.8,2.3 c0.6,1.2,0.8,2.9,0.8,5.4C214.8,31.2,214.7,32.2,214.3,33.3z M26.1,7.7C16.1,7.7,8,14.9,8,23.6c0,4.4,2,8.3,5.2,11.2 c-0.6,2-1.7,4.7-3.9,7.3c0.4,0.7,6.6-1.7,11-3.4c1.8,0.5,3.7,0.8,5.7,0.8c10,0,18.1-7.1,18.1-15.9C44.1,14.9,36,7.7,26.1,7.7z M31.5,17.3c1.3,0,2.4,1.1,2.4,2.4c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4C29.1,18.3,30.2,17.3,31.5,17.3z M20.6,17.3 c1.3,0,2.4,1.1,2.4,2.4c0,1.3-1.1,2.4-2.4,2.4c-1.3,0-2.4-1.1-2.4-2.4C18.2,18.3,19.3,17.3,20.6,17.3z M26.1,34.7 C26.1,34.7,26,34.7,26.1,34.7c-0.1,0-0.1,0-0.1,0c-4.8,0-10.2-3.1-11.5-8.4c3.3,1.5,7.8,2.2,11.5,2.2c3.7,0,8.3-0.7,11.5-2.2 C36.3,31.6,30.9,34.7,26.1,34.7z"/></svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1 @@
<svg width="32" height="30" viewBox="0 0 32 30" xmlns="http://www.w3.org/2000/svg"><path d="M15.999 0c-8.834 0-15.999 6.135-15.999 13.7 0 3.767 1.776 7.179 4.648 9.656-.499 1.714-1.487 4.04-3.438 6.311.334.575 5.83-1.454 9.704-2.973 1.599.456 3.306.706 5.084.706 8.837 0 16.001-6.134 16.001-13.701 0-7.565-7.164-13.7-16.001-13.7zm4.742 8.186v9.823c0 .121-.035.226-.106.314-.07.088-.154.133-.25.133h-2.844c-.096 0-.18-.044-.25-.133-.07-.088-.106-.193-.106-.314v-9.823c0-.121.035-.226.106-.314.07-.088.154-.133.25-.133h2.844c.096 0 .18.044.25.133.07.088.106.193.106.314zm-5.333 0v9.823c0 .121-.035.226-.106.314-.07.088-.154.133-.25.133h-2.844c-.096 0-.18-.044-.25-.133-.07-.088-.106-.193-.106-.314v-9.823c0-.121.035-.226.106-.314.07-.088.154-.133.25-.133h2.844c.096 0 .18.044.25.133.07.088.106.193.106.314z" fill="#757575"/></svg>

After

Width:  |  Height:  |  Size: 829 B

View File

@ -112,6 +112,7 @@ loop.store.ActiveRoomStore = (function(mozL10n) {
"remoteSrcMediaElement",
"remoteVideoDimensions",
"remoteVideoEnabled",
"streamPaused",
"screenSharingState",
"screenShareMediaElement",
"videoMuted"
@ -151,6 +152,8 @@ loop.store.ActiveRoomStore = (function(mozL10n) {
roomInfoFailure: null,
// The name of the room.
roomName: null,
// True when sharing screen has been paused.
streamPaused: false,
// Social API state.
socialShareProviders: null,
// True if media has been connected both-ways.
@ -268,7 +271,8 @@ loop.store.ActiveRoomStore = (function(mozL10n) {
"toggleBrowserSharing",
"updateSocialShareInfo",
"connectionStatus",
"mediaConnected"
"mediaConnected",
"videoScreenStreamChanged"
];
// Register actions that are only used on Desktop.
if (this._isDesktop) {
@ -1207,6 +1211,18 @@ loop.store.ActiveRoomStore = (function(mozL10n) {
this.setStoreState(nextState);
},
/**
* Listen to screen stream changes in order to check if sharing screen
* has been paused.
*
* @param {sharedActions.VideoScreenStreamChanged} actionData
*/
videoScreenStreamChanged: function(actionData) {
this.setStoreState({
streamPaused: !actionData.hasVideo
});
},
/**
* Handles chat messages received and/ or about to send. If this is the first
* chat message for the current session, register a count with telemetry.

View File

@ -11,7 +11,6 @@ var loop = loop || {};
var kMessageName = "Loop:Message";
var kPushMessageName = "Loop:Message:Push";
var kBatchMessage = "Batch";
var kReplyTimeoutMs = 5000;
var gListeningForMessages = false;
var gListenersMap = {};
var gListeningForPushMessages = false;
@ -75,20 +74,10 @@ var loop = loop || {};
gListenersMap[seq] = resolve;
gRootObj.sendAsyncMessage(kMessageName, payload);
gRootObj.setTimeout(function() {
// Check if the promise was already resolved before by the message handler.
if (!gListenersMap[seq]) {
return;
}
resolve();
delete gListenersMap[seq];
}, kReplyTimeoutMs);
});
};
// These functions should only be used in unit tests.
loop.request.getReplyTimeoutMs = function() { return kReplyTimeoutMs; };
loop.request.inspect = function() { return _.extend({}, gListenersMap); };
loop.request.reset = function() {
gListeningForMessages = false;

View File

@ -396,7 +396,8 @@ if (inChrome) {
*
* @param {String} url The url to format.
* @param {String} suppressConsoleError For testing, call with a boolean which is true to squash the default console error.
* @return {Object} An object containing the hostname and full location.
* @return {Object} An object containing the hostname,
* full location and protocol.
*/
function formatURL(url, suppressConsoleError) {
// We're using new URL to pass this through the browser's ACE/punycode
@ -412,7 +413,8 @@ if (inChrome) {
// Finally, ensure we look good.
return {
hostname: urlObject.hostname,
location: decodeURI(urlObject.href)
location: decodeURI(urlObject.href),
protocol: urlObject.protocol
};
} catch (ex) {
if (suppressConsoleError ? !suppressConsoleError : true) {

View File

@ -606,11 +606,16 @@ loop.shared.views = function (_, mozL10n) {
// Bug 1196143 - formatURL sanitizes(decodes) the URL from IDN homographic attacks.
// Try catch to not produce output if invalid url
try {
var sanitizeURL = loop.shared.utils.formatURL(this.props.url, true).hostname;
var sanitizedURL = loop.shared.utils.formatURL(this.props.url, true);
} catch (ex) {
return null;
}
// Only allow specific types of URLs.
if (!sanitizedURL || sanitizedURL.protocol !== "http:" && sanitizedURL.protocol !== "https:" && sanitizedURL.protocol !== "ftp:") {
return null;
}
var thumbnail = this.props.thumbnail;
if (!thumbnail) {
@ -640,7 +645,7 @@ loop.shared.views = function (_, mozL10n) {
React.createElement(
"span",
{ className: "context-url" },
sanitizeURL
sanitizedURL.hostname
)
)
)
@ -666,6 +671,7 @@ loop.shared.views = function (_, mozL10n) {
isLoading: React.PropTypes.bool.isRequired,
mediaType: React.PropTypes.string.isRequired,
posterUrl: React.PropTypes.string,
screenSharingPaused: React.PropTypes.bool,
shareCursor: React.PropTypes.bool,
// Expecting "local" or "remote".
srcMediaElement: React.PropTypes.object
@ -781,7 +787,7 @@ loop.shared.views = function (_, mozL10n) {
return;
}
if (this.props.shareCursor) {
if (this.props.shareCursor && !this.props.screenSharingPaused) {
videoElement.addEventListener("loadeddata", this.handleVideoDimensions);
videoElement.addEventListener("mousemove", this.handleMouseMove);
}
@ -872,6 +878,7 @@ loop.shared.views = function (_, mozL10n) {
renderRemoteVideo: React.PropTypes.bool.isRequired,
screenShareMediaElement: React.PropTypes.object,
screenSharePosterUrl: React.PropTypes.string,
screenSharingPaused: React.PropTypes.bool,
showInitialContext: React.PropTypes.bool.isRequired,
useDesktopPaths: React.PropTypes.bool.isRequired
},
@ -938,7 +945,8 @@ loop.shared.views = function (_, mozL10n) {
var screenShareStreamClasses = classNames({
"screen": true,
"focus-stream": this.props.displayScreenShare
"focus-stream": this.props.displayScreenShare,
"screen-sharing-paused": this.props.screenSharingPaused
});
var mediaWrapperClasses = classNames({
@ -981,6 +989,7 @@ loop.shared.views = function (_, mozL10n) {
isLoading: this.props.isScreenShareLoading,
mediaType: "screen-share",
posterUrl: this.props.screenSharePosterUrl,
screenSharingPaused: this.props.screenSharingPaused,
shareCursor: true,
srcMediaElement: this.props.screenShareMediaElement }),
this.props.displayScreenShare ? this.props.children : null

View File

@ -748,6 +748,17 @@ describe("loop.store.ActiveRoomStore", function() {
});
});
describe("#videoScreenStreamChanged", function() {
it("should set streamPaused if screen stream has no video", function() {
var actionData = {
hasVideo: false
};
store.videoScreenStreamChanged(new sharedActions.VideoScreenStreamChanged(actionData));
expect(store.getStoreState().streamPaused).eql(true);
});
});
describe("#updateRoomInfo", function() {
var fakeRoomInfo;

View File

@ -5,15 +5,13 @@ describe("loopapi-client", function() {
"use strict";
var expect = chai.expect;
var sandbox, clock, replyTimeoutMs;
var sandbox;
beforeEach(function() {
sandbox = sinon.sandbox.create();
window.addMessageListener = sinon.stub();
window.removeMessageListener = sinon.stub();
window.sendAsyncMessage = sinon.stub();
clock = sandbox.useFakeTimers();
replyTimeoutMs = loop.request.getReplyTimeoutMs();
});
afterEach(function() {
@ -36,7 +34,12 @@ describe("loopapi-client", function() {
[loop._lastMessageID, "GetLoopPref", "enabled"]);
sinon.assert.calledOnce(window.addMessageListener);
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
return promise;
});
@ -46,7 +49,12 @@ describe("loopapi-client", function() {
sinon.assert.calledWithExactly(window.sendAsyncMessage, "Loop:Message",
[loop._lastMessageID, "GetLoopPref", "enabled"]);
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
return promise;
});
@ -56,7 +64,12 @@ describe("loopapi-client", function() {
sinon.assert.calledWithExactly(window.sendAsyncMessage, "Loop:Message",
[loop._lastMessageID, "SetLoopPref", "enabled", false, 1, 2, 3]);
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
return promise;
});
@ -77,17 +90,6 @@ describe("loopapi-client", function() {
return promise;
});
it("should cancel the message listener when no reply is received in time", function() {
var promise = loop.request("GetLoopPref", "enabled");
promise.then(function(result) {
expect(result).to.eql(undefined);
});
clock.tick(replyTimeoutMs);
return promise;
});
it("should not start listening for messages more than once", function() {
return new Promise(function(resolve) {
loop.request("GetLoopPref", "enabled").then(function() {
@ -99,10 +101,18 @@ describe("loopapi-client", function() {
resolve();
});
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
});
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
});
});
});
@ -166,7 +176,12 @@ describe("loopapi-client", function() {
[loop._lastMessageID - 1, "GetLoopPref", "e10s.enabled"]]
]);
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
return promise;
});
@ -183,7 +198,12 @@ describe("loopapi-client", function() {
[loop._lastMessageID - 1, "GetLoopPref", "e10s.enabled"]]
]);
clock.tick(replyTimeoutMs);
// Call the added listener, so that the promise resolves.
window.addMessageListener.args[0][1]({
name: "Loop:Message",
data: [loop._lastMessageID, "true"]
});
return promise;
});

View File

@ -303,7 +303,8 @@ describe("loop.shared.utils", function() {
expect(sharedUtils.formatURL("http://invalid.com/?a=Foo%20Bar"))
.eql({
location: "http://invalid.com/?a=Foo Bar",
hostname: "invalid.com"
hostname: "invalid.com",
protocol: "http:"
});
});
@ -314,7 +315,8 @@ describe("loop.shared.utils", function() {
expect(sharedUtils.formatURL("http://\u0261oogle.com/"))
.eql({
location: "http://xn--oogle-qmc.com/",
hostname: "xn--oogle-qmc.com"
hostname: "xn--oogle-qmc.com",
protocol: "http:"
});
});

View File

@ -832,6 +832,16 @@ describe("VideoMuteButton", function() {
expect(node.querySelector(".screen").classList.contains("focus-stream")).eql(true);
});
it("should mark the screen share stream as paused when screen shared has been paused", function() {
view = mountTestComponent({
screenSharingPaused: true
});
var node = view.getDOMNode();
expect(node.querySelector(".screen").classList.contains("screen-sharing-paused")).eql(true);
});
it("should not mark the wrapper as receiving screen share when not displaying a screen share", function() {
view = mountTestComponent({
displayScreenShare: false

View File

@ -161,3 +161,7 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -161,3 +161,7 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -161,3 +161,7 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -161,3 +161,7 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -4,7 +4,7 @@
# Panel Strings
clientSuperShortname=Hello
## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
@ -257,8 +257,15 @@ rooms_room_joined_owner_not_connected_label=Yoldaşınız {{roomURLHostname}} ü
self_view_hidden_message=Özünü göstərmə gizlədilib amma hələ də göndərilir. göstərmək üçün pəncərə ölçülərini dəyişin
peer_left_session=Yoldaşınız çıxdı.
peer_unexpected_quit=Yoldaşınız gözlənilmədən ayrıldı.
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} sizin ölkədə icazə verilmir.
display_name_guest=Qonaq
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -161,3 +161,7 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -4,7 +4,7 @@
# Panel Strings
clientSuperShortname=Hello
## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
@ -161,3 +161,7 @@ self_view_hidden_message=Какво виждат другите е скрито,
tos_failure_message={{clientShortname}} е недостъпен във вашата държава.
display_name_guest=Гост
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -4,7 +4,7 @@
# Panel Strings
clientSuperShortname=Hello
## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
@ -262,3 +262,7 @@ self_view_hidden_message=সেলফ-ভিউ লুকানো কিন্
tos_failure_message={{clientShortname}} আপনার দেশের বিদ্যমান নয়।
display_name_guest=অতিথি
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -147,3 +147,7 @@ self_view_hidden_message=স্বয়ং-ভিউ লোকানো কিন
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

View File

@ -161,3 +161,7 @@ self_view_hidden_message=Self-view hidden but still being sent; resize window to
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
## LOCALIZATION NOTE(clientSuperShortname): This should not be localized and
## should remain "Hello" for all locales.
clientSuperShortname=Hello

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