diff --git a/accessible/tests/mochitest/actions/a11y.ini b/accessible/tests/mochitest/actions/a11y.ini
index 2553520f28d..9750b29f43f 100644
--- a/accessible/tests/mochitest/actions/a11y.ini
+++ b/accessible/tests/mochitest/actions/a11y.ini
@@ -9,6 +9,7 @@
[test_keys_menu.xul]
[test_link.html]
[test_media.html]
+skip-if = buildapp == 'mulet'
[test_select.html]
[test_tree.xul]
[test_treegrid.xul]
diff --git a/accessible/tests/mochitest/elm/a11y.ini b/accessible/tests/mochitest/elm/a11y.ini
index 06053335597..c0b94f4c3d2 100644
--- a/accessible/tests/mochitest/elm/a11y.ini
+++ b/accessible/tests/mochitest/elm/a11y.ini
@@ -1,9 +1,11 @@
[DEFAULT]
[test_HTMLSpec.html]
+skip-if = buildapp == 'mulet'
[test_figure.html]
[test_listbox.xul]
[test_nsApplicationAcc.html]
[test_plugin.html]
+skip-if = buildapp == 'mulet'
[test_canvas.html]
[test_shadowroot.html]
diff --git a/accessible/tests/mochitest/events/a11y.ini b/accessible/tests/mochitest/events/a11y.ini
index f9bdc8dc4e2..50dd2e8060d 100644
--- a/accessible/tests/mochitest/events/a11y.ini
+++ b/accessible/tests/mochitest/events/a11y.ini
@@ -16,6 +16,7 @@ support-files =
[test_descrchange.html]
[test_docload.html]
[test_docload.xul]
+skip-if = buildapp == 'mulet'
[test_docload_aria.html]
[test_dragndrop.html]
[test_flush.html]
@@ -46,6 +47,7 @@ skip-if = os == 'win' || os == 'linux'
[test_namechange.html]
[test_scroll.xul]
[test_selection.html]
+skip-if = buildapp == 'mulet'
[test_selection.xul]
[test_selection_aria.html]
[test_statechange.html]
diff --git a/accessible/tests/mochitest/focus/a11y.ini b/accessible/tests/mochitest/focus/a11y.ini
index 94966198238..9a9e2c28452 100644
--- a/accessible/tests/mochitest/focus/a11y.ini
+++ b/accessible/tests/mochitest/focus/a11y.ini
@@ -2,4 +2,5 @@
[test_focusedChild.html]
[test_takeFocus.html]
+skip-if = buildapp == 'mulet'
[test_takeFocus.xul]
diff --git a/accessible/tests/mochitest/jsat/a11y.ini b/accessible/tests/mochitest/jsat/a11y.ini
index 65300fc059b..bd12501e94a 100644
--- a/accessible/tests/mochitest/jsat/a11y.ini
+++ b/accessible/tests/mochitest/jsat/a11y.ini
@@ -10,7 +10,9 @@ support-files =
[test_alive.html]
[test_content_integration.html]
+skip-if = buildapp == 'mulet'
[test_content_text.html]
+skip-if = buildapp == 'mulet'
[test_explicit_names.html]
[test_gesture_tracker.html]
[test_landmarks.html]
diff --git a/accessible/tests/mochitest/states/a11y.ini b/accessible/tests/mochitest/states/a11y.ini
index 164bfe4e6fc..631ae38288b 100644
--- a/accessible/tests/mochitest/states/a11y.ini
+++ b/accessible/tests/mochitest/states/a11y.ini
@@ -29,3 +29,4 @@ support-files =
[test_tree.xul]
[test_visibility.html]
[test_visibility.xul]
+skip-if = buildapp == "mulet"
diff --git a/accessible/tests/mochitest/tree/a11y.ini b/accessible/tests/mochitest/tree/a11y.ini
index 282a5b0e967..cafa06dd291 100644
--- a/accessible/tests/mochitest/tree/a11y.ini
+++ b/accessible/tests/mochitest/tree/a11y.ini
@@ -20,6 +20,7 @@ skip-if = true # Bug 561508
[test_dockids.html]
[test_filectrl.html]
[test_formctrl.html]
+skip-if = buildapp == "mulet"
[test_formctrl.xul]
[test_gencontent.html]
[test_groupbox.xul]
@@ -30,6 +31,7 @@ skip-if = true # Bug 561508
[test_list.html]
[test_map.html]
[test_media.html]
+skip-if = buildapp == "mulet"
[test_select.html]
[test_tabbox.xul]
[test_tabbrowser.xul]
diff --git a/accessible/tests/mochitest/treeupdate/a11y.ini b/accessible/tests/mochitest/treeupdate/a11y.ini
index 232537dc0ab..e3852cd9989 100644
--- a/accessible/tests/mochitest/treeupdate/a11y.ini
+++ b/accessible/tests/mochitest/treeupdate/a11y.ini
@@ -14,6 +14,7 @@
[test_gencontent.html]
[test_hidden.html]
[test_imagemap.html]
+skip-if = buildapp == "mulet"
[test_list.html]
[test_list_editabledoc.html]
[test_listbox.xul]
diff --git a/b2g/chrome/content/test/mochitest/mochitest.ini b/b2g/chrome/content/test/mochitest/mochitest.ini
index 0d60bb873d8..d18a20401ab 100644
--- a/b2g/chrome/content/test/mochitest/mochitest.ini
+++ b/b2g/chrome/content/test/mochitest/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #require OOP support for mochitest-b2g-desktop, Bug 957554
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #require OOP support for mochitest-b2g-desktop, Bug 957554
support-files =
RecordingStatusChromeScript.js
RecordingStatusHelper.js
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index f670fd0ce6f..c9ad65a1eb7 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -809,6 +809,33 @@ pref("plugin.state.f5 ssl vpn plugin", 2);
pref("plugin.state.f5 sam inspection host plugin", 2);
#endif
+// Roblox Launcher Plugin, bug 1024073
+#ifdef XP_WIN
+pref("plugin.state.nprobloxproxy", 2);
+#endif
+#ifdef XP_MACOSX
+pref("plugins.state.nproblox", 2);
+#endif
+
+// Box Edit, bug 1029654
+#ifdef XP_WIN
+pref("plugins.state.npboxedit", 2);
+#endif
+#ifdef XP_MACOSX
+pref("plugins.state.box edit", 2);
+#endif
+
+// Nexus Personal, bug 1024965
+#ifdef XP_WIN
+pref("plugins.state.np_prsnl", 2);
+#endif
+#ifdef XP_MACOSX
+pref("plugins.state.personalplugin", 2);
+#endif
+#ifdef UNIX_BUT_NOT_MAC
+pref("plugins.state.libplugins", 2);
+#endif
+
// display door hanger if flash not installed
pref("plugins.notifyMissingFlash", true);
@@ -1356,6 +1383,7 @@ pref("devtools.styleeditor.autocompletion-enabled", true);
pref("devtools.styleeditor.showMediaSidebar", true);
pref("devtools.styleeditor.mediaSidebarWidth", 238);
pref("devtools.styleeditor.navSidebarWidth", 245);
+pref("devtools.styleeditor.transitions", true);
// Enable the Shader Editor.
pref("devtools.shadereditor.enabled", false);
@@ -1479,6 +1507,9 @@ pref("browser.newtab.preload", true);
// Toggles the content of 'about:newtab'. Shows the grid when enabled.
pref("browser.newtabpage.enabled", true);
+// Toggles the enhancement of history content of 'about:newtab'
+pref("browser.newtabpage.enhanced", false);
+
// number of rows of newtab grid
pref("browser.newtabpage.rows", 3);
diff --git a/browser/base/content/newtab/grid.js b/browser/base/content/newtab/grid.js
index 4983a3ba460..5b09d425080 100644
--- a/browser/base/content/newtab/grid.js
+++ b/browser/base/content/newtab/grid.js
@@ -161,6 +161,7 @@ let gGrid = {
site.innerHTML =
'' +
' ' +
+ ' ' +
' ' +
'' +
' {
+ Services.prefs.clearUserPref(PRELOAD_PREF);
+ NewTabUtils.allPages.enhanced = origEnhanced;
+ });
+
+ Services.prefs.setBoolPref(PRELOAD_PREF, false);
+
+ function getData(cellNum) {
+ let siteNode = getCell(cellNum).site.node;
+ return {
+ type: siteNode.getAttribute("type"),
+ enhanced: siteNode.querySelector(".enhanced-content").style.backgroundImage,
+ };
+ }
+
+ // Make the page have a directory link followed by a history link
+ yield setLinks("1");
+
+ // Test with enhanced = false
+ NewTabUtils.allPages.enhanced = false;
+ yield addNewTabPageTab();
+ let {type, enhanced} = getData(0);
+ is(type, "organic", "directory link is organic");
+ isnot(enhanced, "", "directory link has enhanced image");
+
+ let {type, enhanced} = getData(1);
+ is(type, "history", "history link is history");
+ is(enhanced, "", "history link has no enhanced image");
+
+ // Test with enhanced = true
+ NewTabUtils.allPages.enhanced = true;
+ yield addNewTabPageTab();
+ let {type, enhanced} = getData(0);
+ is(type, "organic", "directory link is still organic");
+ isnot(enhanced, "", "directory link still has enhanced image");
+
+ let {type, enhanced} = getData(1);
+ is(type, "enhanced", "history link now is enhanced");
+ isnot(enhanced, "", "history link now has enhanced image");
+}
diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js
index 215e9f04c51..a75a916e6f1 100644
--- a/browser/base/content/test/newtab/head.js
+++ b/browser/base/content/test/newtab/head.js
@@ -608,6 +608,7 @@ function createDragEvent(aEventType, aData) {
*/
function whenPagesUpdated(aCallback, aOnlyIfHidden=false) {
let page = {
+ observe: _ => _,
update: function (onlyIfHidden=false) {
if (onlyIfHidden == aOnlyIfHidden) {
NewTabUtils.allPages.unregister(this);
diff --git a/browser/base/content/test/plugins/browser.ini b/browser/base/content/test/plugins/browser.ini
index cf9bdfcba86..51f6ec9459c 100644
--- a/browser/base/content/test/plugins/browser.ini
+++ b/browser/base/content/test/plugins/browser.ini
@@ -5,7 +5,7 @@
# * Bug XXXXX - no plugins in content processes ("Error: You cannot use the AddonManager in child processes!")
# * Bug 866413 - PageInfo doesn't work in e10s [browser_pageInfo_plugins.js]
# * Bug 921957 - remote webprogress doesn't supply originalURI attribute on the request object [browser_clearplugindata.js]
-skip-if = e10s
+skip-if = buildapp == "mulet" || e10s
support-files =
blockNoPlugins.xml
blockPluginHard.xml
diff --git a/browser/base/content/test/social/browser.ini b/browser/base/content/test/social/browser.ini
index 8176814cb14..f6e2a7d8135 100644
--- a/browser/base/content/test/social/browser.ini
+++ b/browser/base/content/test/social/browser.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = e10s # Bug 915547 (social providers don't install)
+skip-if = buildapp == "mulet" || e10s # Bug 915547 (social providers don't install)
support-files =
blocklist.xml
checked.jpg
diff --git a/browser/components/customizableui/test/browser.ini b/browser/components/customizableui/test/browser.ini
index c1bdf706b3d..f4a7ab0e5d9 100644
--- a/browser/components/customizableui/test/browser.ini
+++ b/browser/components/customizableui/test/browser.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == "mulet"
support-files =
head.js
support/test_967000_charEncoding_page.html
@@ -75,7 +76,7 @@ skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s f
[browser_967000_button_charEncoding.js]
skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s friendly.
[browser_967000_button_feeds.js]
-skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s friendly.
+skip-if = buildapp == 'mulet' || e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s friendly.
[browser_967000_button_sync.js]
skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s friendly.
[browser_967000_button_tabView.js]
diff --git a/browser/components/downloads/test/browser/browser.ini b/browser/components/downloads/test/browser/browser.ini
index 2e1e1f45c60..8b38affb176 100644
--- a/browser/components/downloads/test/browser/browser.ini
+++ b/browser/components/downloads/test/browser/browser.ini
@@ -2,6 +2,7 @@
support-files = head.js
[browser_basic_functionality.js]
+skip-if = buildapp == "mulet"
[browser_first_download_panel.js]
skip-if = os == "linux" # Bug 949434
[browser_overflow_anchor.js]
diff --git a/browser/components/feeds/test/chrome/chrome.ini b/browser/components/feeds/test/chrome/chrome.ini
index f8d015d487b..70789c258de 100644
--- a/browser/components/feeds/test/chrome/chrome.ini
+++ b/browser/components/feeds/test/chrome/chrome.ini
@@ -4,4 +4,5 @@ support-files = sample_feed.atom
[test_423060.xul]
[test_bug368464.html]
[test_bug408328.html]
+skip-if= buildapp == 'mulet'
[test_maxSniffing.html]
diff --git a/browser/components/feeds/test/mochitest.ini b/browser/components/feeds/test/mochitest.ini
index 46725466ec3..5737d31c81c 100644
--- a/browser/components/feeds/test/mochitest.ini
+++ b/browser/components/feeds/test/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = buildapp == 'b2g' || e10s
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || e10s
support-files =
bug368464-data.xml
bug408328-data.xml
diff --git a/browser/components/loop/test/mochitest/browser.ini b/browser/components/loop/test/mochitest/browser.ini
index c50b515d100..c56605806f5 100644
--- a/browser/components/loop/test/mochitest/browser.ini
+++ b/browser/components/loop/test/mochitest/browser.ini
@@ -4,3 +4,4 @@ support-files =
[browser_mozLoop_charPref.js]
[browser_mozLoop_doNotDisturb.js]
+skip-if = buildapp == 'mulet'
diff --git a/browser/components/places/tests/browser/browser.ini b/browser/components/places/tests/browser/browser.ini
index 17497115b87..4cf37b6f96b 100644
--- a/browser/components/places/tests/browser/browser.ini
+++ b/browser/components/places/tests/browser/browser.ini
@@ -3,6 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
[DEFAULT]
+skip-if = buildapp == "mulet"
support-files =
head.js
framedPage.html
diff --git a/browser/components/preferences/in-content/advanced.xul b/browser/components/preferences/in-content/advanced.xul
index b08d0dde1df..8070c89bdeb 100644
--- a/browser/components/preferences/in-content/advanced.xul
+++ b/browser/components/preferences/in-content/advanced.xul
@@ -135,7 +135,6 @@
class="header"
hidden="true"
data-category="paneAdvanced">
-
diff --git a/browser/components/preferences/in-content/applications.xul b/browser/components/preferences/in-content/applications.xul
index 34bb34932db..15ee0e48bb1 100644
--- a/browser/components/preferences/in-content/applications.xul
+++ b/browser/components/preferences/in-content/applications.xul
@@ -61,7 +61,6 @@
class="header"
hidden="true"
data-category="paneApplications">
-
diff --git a/browser/components/preferences/in-content/content.xul b/browser/components/preferences/in-content/content.xul
index bff3928807d..c0396d2ce7d 100644
--- a/browser/components/preferences/in-content/content.xul
+++ b/browser/components/preferences/in-content/content.xul
@@ -32,7 +32,6 @@
class="header"
hidden="true"
data-category="paneContent">
-
diff --git a/browser/components/preferences/in-content/main.xul b/browser/components/preferences/in-content/main.xul
index 6e2d963323a..e7e7d0dee45 100644
--- a/browser/components/preferences/in-content/main.xul
+++ b/browser/components/preferences/in-content/main.xul
@@ -91,7 +91,6 @@
class="header"
hidden="true"
data-category="paneGeneral">
-
diff --git a/browser/components/preferences/in-content/privacy.xul b/browser/components/preferences/in-content/privacy.xul
index f30c1a2500a..83378e922c1 100644
--- a/browser/components/preferences/in-content/privacy.xul
+++ b/browser/components/preferences/in-content/privacy.xul
@@ -71,7 +71,6 @@
class="header"
hidden="true"
data-category="panePrivacy">
-
diff --git a/browser/components/preferences/in-content/security.xul b/browser/components/preferences/in-content/security.xul
index dc8388830f6..9171ad56580 100644
--- a/browser/components/preferences/in-content/security.xul
+++ b/browser/components/preferences/in-content/security.xul
@@ -36,7 +36,6 @@
class="header"
hidden="true"
data-category="paneSecurity">
-
diff --git a/browser/components/preferences/in-content/sync.xul b/browser/components/preferences/in-content/sync.xul
index e99c626561f..63b395a7ed4 100644
--- a/browser/components/preferences/in-content/sync.xul
+++ b/browser/components/preferences/in-content/sync.xul
@@ -34,7 +34,6 @@
class="header"
hidden="true"
data-category="paneSync">
-
diff --git a/browser/components/preferences/in-content/tests/browser.ini b/browser/components/preferences/in-content/tests/browser.ini
index d5806a432b0..85ce7dac54e 100644
--- a/browser/components/preferences/in-content/tests/browser.ini
+++ b/browser/components/preferences/in-content/tests/browser.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == "mulet"
support-files =
head.js
privacypane_tests_perwindow.js
diff --git a/browser/components/preferences/tests/browser.ini b/browser/components/preferences/tests/browser.ini
index 287e625ddfb..87686dcc2a2 100644
--- a/browser/components/preferences/tests/browser.ini
+++ b/browser/components/preferences/tests/browser.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == "mulet"
support-files =
head.js
privacypane_tests_perwindow.js
diff --git a/browser/components/privatebrowsing/test/browser/browser.ini b/browser/components/privatebrowsing/test/browser/browser.ini
index 8f918355005..824344afde7 100644
--- a/browser/components/privatebrowsing/test/browser/browser.ini
+++ b/browser/components/privatebrowsing/test/browser/browser.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == "mulet"
support-files =
browser_privatebrowsing_concurrent_page.html
browser_privatebrowsing_cookieacceptdialog.html
diff --git a/browser/components/search/test/browser.ini b/browser/components/search/test/browser.ini
index 8dc3919f1d9..9bf6850dfd9 100644
--- a/browser/components/search/test/browser.ini
+++ b/browser/components/search/test/browser.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == 'mulet'
support-files =
426329.xml
483086-1.xml
diff --git a/browser/components/sessionstore/test/browser.ini b/browser/components/sessionstore/test/browser.ini
index 55939409c95..868918d8985 100644
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -68,6 +68,7 @@ support-files =
[browser_dynamic_frames.js]
[browser_form_restore_events.js]
[browser_formdata.js]
+skip-if = buildapp == 'mulet'
[browser_formdata_format.js]
[browser_formdata_xpath.js]
[browser_frametree.js]
diff --git a/browser/components/tabview/test/browser.ini b/browser/components/tabview/test/browser.ini
index 60ff5e6c208..d8b11e52fb5 100644
--- a/browser/components/tabview/test/browser.ini
+++ b/browser/components/tabview/test/browser.ini
@@ -16,6 +16,7 @@ support-files =
[browser_tabview_bug586553.js]
[browser_tabview_bug587043.js]
[browser_tabview_bug587231.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug587276.js]
[browser_tabview_bug587351.js]
[browser_tabview_bug587503.js]
@@ -69,6 +70,7 @@ skip-if = os == "win" # Bug 951477
[browser_tabview_bug616967.js]
[browser_tabview_bug618816.js]
[browser_tabview_bug618828.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug619937.js]
[browser_tabview_bug622835.js]
[browser_tabview_bug623768.js]
@@ -76,6 +78,7 @@ skip-if = os == "win" # Bug 951477
skip-if = true # Bug 921984, hopefully fixed by bug 930202
[browser_tabview_bug624692.js]
[browser_tabview_bug624727_perwindowpb.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug624847.js]
[browser_tabview_bug624931.js]
[browser_tabview_bug624953.js]
@@ -87,6 +90,7 @@ skip-if = true # Bug 921984, hopefully fixed by bug 930202
[browser_tabview_bug626455.js]
[browser_tabview_bug626525.js]
[browser_tabview_bug626791.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug627736.js]
[browser_tabview_bug628061.js]
[browser_tabview_bug628165.js]
@@ -107,6 +111,7 @@ skip-if = true # Bug 922422
[browser_tabview_bug634672.js]
[browser_tabview_bug635696.js]
[browser_tabview_bug637840.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug640765.js]
[browser_tabview_bug641802.js]
[browser_tabview_bug642793.js]
@@ -133,6 +138,7 @@ skip-if = os == "mac" || e10s # mac: Bug 939617; e10s - Bug ?????? - "leaked unt
[browser_tabview_bug662266.js]
[browser_tabview_bug663421.js]
[browser_tabview_bug665502.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug669694.js]
[browser_tabview_bug673196.js]
[browser_tabview_bug673729.js]
@@ -149,6 +155,7 @@ skip-if = true # Bug 736425
[browser_tabview_bug705621.js]
[browser_tabview_bug706430.js]
[browser_tabview_bug706736.js]
+skip-if = buildapp == 'mulet'
[browser_tabview_bug707466.js]
[browser_tabview_bug712203.js]
[browser_tabview_bug715454.js]
diff --git a/browser/devtools/commandline/test/browser.ini b/browser/devtools/commandline/test/browser.ini
index c306724bb93..9a42d351524 100644
--- a/browser/devtools/commandline/test/browser.ini
+++ b/browser/devtools/commandline/test/browser.ini
@@ -7,6 +7,7 @@ support-files =
mockCommands.js
[browser_cmd_addon.js]
+skip-if = buildapp == 'mulet'
[browser_cmd_calllog.js]
skip-if = true || e10s # Bug 845831
[browser_cmd_calllog_chrome.js]
diff --git a/browser/devtools/debugger/test/browser.ini b/browser/devtools/debugger/test/browser.ini
index 0420b4b1dfc..77f0e47ee79 100644
--- a/browser/devtools/debugger/test/browser.ini
+++ b/browser/devtools/debugger/test/browser.ini
@@ -288,6 +288,7 @@ skip-if = (os == 'mac' || os == 'win') && (debug == false) # Bug 986166
[browser_dbg_variables-view-frame-parameters-03.js]
[browser_dbg_variables-view-frame-with.js]
[browser_dbg_variables-view-frozen-sealed-nonext.js]
+skip-if = buildapp == 'mulet'
[browser_dbg_variables-view-hide-non-enums.js]
[browser_dbg_variables-view-large-array-buffer.js]
[browser_dbg_variables-view-override-01.js]
diff --git a/browser/devtools/netmonitor/netmonitor-view.js b/browser/devtools/netmonitor/netmonitor-view.js
index dcd4e6e8cac..ea48c9e56e0 100644
--- a/browser/devtools/netmonitor/netmonitor-view.js
+++ b/browser/devtools/netmonitor/netmonitor-view.js
@@ -2287,7 +2287,7 @@ NetworkDetailsView.prototype = {
// information available, then nothing else is to be displayed.
let cookieProps = Object.keys(cookie);
if (cookieProps.length == 2) {
- return;
+ continue;
}
// Display any other information other than the cookie name and value
diff --git a/browser/devtools/netmonitor/test/browser.ini b/browser/devtools/netmonitor/test/browser.ini
index a63cd230d92..c4144a71022 100644
--- a/browser/devtools/netmonitor/test/browser.ini
+++ b/browser/devtools/netmonitor/test/browser.ini
@@ -39,6 +39,7 @@ support-files =
[browser_net_charts-01.js]
[browser_net_charts-02.js]
[browser_net_charts-03.js]
+skip-if= buildapp == 'mulet'
[browser_net_charts-04.js]
[browser_net_charts-05.js]
[browser_net_charts-06.js]
diff --git a/browser/devtools/netmonitor/test/browser_net_simple-request-data.js b/browser/devtools/netmonitor/test/browser_net_simple-request-data.js
index 0a0375996f0..557f9b39617 100644
--- a/browser/devtools/netmonitor/test/browser_net_simple-request-data.js
+++ b/browser/devtools/netmonitor/test/browser_net_simple-request-data.js
@@ -86,7 +86,7 @@ function test() {
ok(requestItem.attachment.requestHeaders,
"There should be a requestHeaders attachment available.");
- is(requestItem.attachment.requestHeaders.headers.length, 8,
+ is(requestItem.attachment.requestHeaders.headers.length, 9,
"The requestHeaders attachment has an incorrect |headers| property.");
isnot(requestItem.attachment.requestHeaders.headersSize, 0,
"The requestHeaders attachment has an incorrect |headersSize| property.");
@@ -101,7 +101,7 @@ function test() {
ok(requestItem.attachment.requestCookies,
"There should be a requestCookies attachment available.");
- is(requestItem.attachment.requestCookies.cookies.length, 0,
+ is(requestItem.attachment.requestCookies.cookies.length, 2,
"The requestCookies attachment has an incorrect |cookies| property.");
verifyRequestItemTarget(requestItem, "GET", SIMPLE_SJS);
@@ -116,9 +116,9 @@ function test() {
ok(requestItem.attachment.responseHeaders,
"There should be a responseHeaders attachment available.");
- is(requestItem.attachment.responseHeaders.headers.length, 9,
+ is(requestItem.attachment.responseHeaders.headers.length, 10,
"The responseHeaders attachment has an incorrect |headers| property.");
- is(requestItem.attachment.responseHeaders.headersSize, 255,
+ is(requestItem.attachment.responseHeaders.headersSize, 330,
"The responseHeaders attachment has an incorrect |headersSize| property.");
verifyRequestItemTarget(requestItem, "GET", SIMPLE_SJS);
@@ -129,7 +129,7 @@ function test() {
ok(requestItem.attachment.responseCookies,
"There should be a responseCookies attachment available.");
- is(requestItem.attachment.responseCookies.cookies.length, 0,
+ is(requestItem.attachment.responseCookies.cookies.length, 2,
"The responseCookies attachment has an incorrect |cookies| property.");
verifyRequestItemTarget(requestItem, "GET", SIMPLE_SJS);
@@ -144,7 +144,7 @@ function test() {
"The status attachment has an incorrect value.");
is(requestItem.attachment.statusText, "Och Aye",
"The statusText attachment has an incorrect value.");
- is(requestItem.attachment.headersSize, 255,
+ is(requestItem.attachment.headersSize, 330,
"The headersSize attachment has an incorrect value.");
verifyRequestItemTarget(requestItem, "GET", SIMPLE_SJS, {
diff --git a/browser/devtools/netmonitor/test/browser_net_simple-request-details.js b/browser/devtools/netmonitor/test/browser_net_simple-request-details.js
index bae5c0e4553..bb2ff3d59dd 100644
--- a/browser/devtools/netmonitor/test/browser_net_simple-request-details.js
+++ b/browser/devtools/netmonitor/test/browser_net_simple-request-details.js
@@ -35,7 +35,7 @@ function test() {
yield waitFor(aMonitor.panelWin, TAB_UPDATED)
testHeadersTab();
- testCookiesTab();
+ yield testCookiesTab();
testParamsTab();
yield testResponseTab();
testTimingsTab();
@@ -63,8 +63,8 @@ function test() {
is(tabpanel.querySelectorAll(".variables-view-scope").length, 2,
"There should be 2 header scopes displayed in this tabpanel.");
- is(tabpanel.querySelectorAll(".variable-or-property").length, 17,
- "There should be 17 header values displayed in this tabpanel.");
+ is(tabpanel.querySelectorAll(".variable-or-property").length, 19,
+ "There should be 19 header values displayed in this tabpanel.");
is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
"The empty notice should not be displayed in this tabpanel.");
@@ -74,7 +74,7 @@ function test() {
is(responseScope.querySelector(".name").getAttribute("value"),
L10N.getStr("responseHeaders") + " (" +
- L10N.getFormatStr("networkMenu.sizeKB", L10N.numberWithDecimals(255/1024, 3)) + ")",
+ L10N.getFormatStr("networkMenu.sizeKB", L10N.numberWithDecimals(330/1024, 3)) + ")",
"The response headers scope doesn't have the correct title.");
ok(requestScope.querySelector(".name").getAttribute("value").contains(
@@ -100,26 +100,26 @@ function test() {
"Content-Type", "The fourth response header name was incorrect.");
is(responseScope.querySelectorAll(".variables-view-variable .value")[3].getAttribute("value"),
"\"text/plain; charset=utf-8\"", "The fourth response header value was incorrect.");
- is(responseScope.querySelectorAll(".variables-view-variable .name")[8].getAttribute("value"),
+ is(responseScope.querySelectorAll(".variables-view-variable .name")[9].getAttribute("value"),
"foo-bar", "The last response header name was incorrect.");
- is(responseScope.querySelectorAll(".variables-view-variable .value")[8].getAttribute("value"),
+ is(responseScope.querySelectorAll(".variables-view-variable .value")[9].getAttribute("value"),
"\"baz\"", "The last response header value was incorrect.");
is(requestScope.querySelectorAll(".variables-view-variable .name")[0].getAttribute("value"),
"Host", "The first request header name was incorrect.");
is(requestScope.querySelectorAll(".variables-view-variable .value")[0].getAttribute("value"),
"\"example.com\"", "The first request header value was incorrect.");
- is(requestScope.querySelectorAll(".variables-view-variable .name")[5].getAttribute("value"),
- "Connection", "The ante-penultimate request header name was incorrect.");
- is(requestScope.querySelectorAll(".variables-view-variable .value")[5].getAttribute("value"),
- "\"keep-alive\"", "The ante-penultimate request header value was incorrect.");
is(requestScope.querySelectorAll(".variables-view-variable .name")[6].getAttribute("value"),
- "Pragma", "The penultimate request header name was incorrect.");
+ "Connection", "The ante-penultimate request header name was incorrect.");
is(requestScope.querySelectorAll(".variables-view-variable .value")[6].getAttribute("value"),
- "\"no-cache\"", "The penultimate request header value was incorrect.");
+ "\"keep-alive\"", "The ante-penultimate request header value was incorrect.");
is(requestScope.querySelectorAll(".variables-view-variable .name")[7].getAttribute("value"),
- "Cache-Control", "The last request header name was incorrect.");
+ "Pragma", "The penultimate request header name was incorrect.");
is(requestScope.querySelectorAll(".variables-view-variable .value")[7].getAttribute("value"),
+ "\"no-cache\"", "The penultimate request header value was incorrect.");
+ is(requestScope.querySelectorAll(".variables-view-variable .name")[8].getAttribute("value"),
+ "Cache-Control", "The last request header name was incorrect.");
+ is(requestScope.querySelectorAll(".variables-view-variable .value")[8].getAttribute("value"),
"\"no-cache\"", "The last request header value was incorrect.");
}
@@ -127,18 +127,20 @@ function test() {
EventUtils.sendMouseEvent({ type: "mousedown" },
document.querySelectorAll("#details-pane tab")[1]);
- let tab = document.querySelectorAll("#details-pane tab")[1];
- let tabpanel = document.querySelectorAll("#details-pane tabpanel")[1];
+ return Task.spawn(function*() {
+ yield waitFor(aMonitor.panelWin, TAB_UPDATED);
- is(tab.getAttribute("selected"), "true",
- "The cookies tab in the network details pane should be selected.");
+ let tab = document.querySelectorAll("#details-pane tab")[1];
+ let tabpanel = document.querySelectorAll("#details-pane tabpanel")[1];
- is(tabpanel.querySelectorAll(".variables-view-scope").length, 0,
- "There should be no cookie scopes displayed in this tabpanel.");
- is(tabpanel.querySelectorAll(".variable-or-property").length, 0,
- "There should be no cookie values displayed in this tabpanel.");
- is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 1,
- "The empty notice should be displayed in this tabpanel.");
+ is(tab.getAttribute("selected"), "true",
+ "The cookies tab in the network details pane should be selected.");
+
+ is(tabpanel.querySelectorAll(".variables-view-scope").length, 2,
+ "There should be 2 cookie scopes displayed in this tabpanel.");
+ is(tabpanel.querySelectorAll(".variable-or-property").length, 6,
+ "There should be 6 cookie values displayed in this tabpanel.");
+ });
}
function testParamsTab() {
diff --git a/browser/devtools/netmonitor/test/sjs_simple-test-server.sjs b/browser/devtools/netmonitor/test/sjs_simple-test-server.sjs
index fbedef3ab23..9a3d44b6d9a 100644
--- a/browser/devtools/netmonitor/test/sjs_simple-test-server.sjs
+++ b/browser/devtools/netmonitor/test/sjs_simple-test-server.sjs
@@ -8,6 +8,9 @@ function handleRequest(request, response) {
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
+ response.setHeader("Set-Cookie", "bob=true; Max-Age=10; HttpOnly", true);
+ response.setHeader("Set-Cookie", "tom=cool; Max-Age=10; HttpOnly", true);
+
response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
response.setHeader("Foo-Bar", "baz", false);
response.write("Hello world!");
diff --git a/browser/devtools/projecteditor/lib/editors.js b/browser/devtools/projecteditor/lib/editors.js
index ad574c5fa20..0732f549550 100644
--- a/browser/devtools/projecteditor/lib/editors.js
+++ b/browser/devtools/projecteditor/lib/editors.js
@@ -168,13 +168,16 @@ var TextEditor = Class({
autocomplete: true
});
- // Trigger editor specific events on `this`
+ // Trigger a few editor specific events on `this`.
this.editor.on("change", (...args) => {
this.emit("change", ...args);
});
this.editor.on("cursorActivity", (...args) => {
this.emit("cursorActivity", ...args);
});
+ this.editor.on("focus", (...args) => {
+ this.emit("focus", ...args);
+ });
this.appended = this.editor.appendTo(this.elt);
},
diff --git a/browser/devtools/projecteditor/lib/projecteditor.js b/browser/devtools/projecteditor/lib/projecteditor.js
index a5c246ca081..2c739d74e7e 100644
--- a/browser/devtools/projecteditor/lib/projecteditor.js
+++ b/browser/devtools/projecteditor/lib/projecteditor.js
@@ -386,8 +386,9 @@ var ProjectEditor = Class({
* The file to be opened.
*/
openResource: function(resource) {
- this.shells.open(resource);
+ let shell = this.shells.open(resource);
this.projectTree.selectResource(resource);
+ shell.editor.focus();
},
/**
@@ -546,6 +547,10 @@ var ProjectEditor = Class({
this._editorListenAndDispatch(editor, "cursorActivity", "onEditorCursorActivity");
this._editorListenAndDispatch(editor, "load", "onEditorLoad");
this._editorListenAndDispatch(editor, "save", "onEditorSave");
+
+ editor.on("focus", () => {
+ this.projectTree.selectResource(this.resourceFor(editor));
+ });
},
/**
@@ -584,8 +589,6 @@ var ProjectEditor = Class({
* All remaining parameters are passed into the handler.
*/
pluginDispatch: function(handler, ...args) {
- // XXX: Memory leak when console.log an Editor here
- // console.log("DISPATCHING EVENT TO PLUGIN", handler, args);
emit(this, handler, ...args);
this.plugins.forEach(plugin => {
try {
@@ -608,8 +611,6 @@ var ProjectEditor = Class({
* Which plugin method to call
*/
_editorListenAndDispatch: function(editor, event, handler) {
- /// XXX: Uncommenting this line also causes memory leak.
- // console.log("Binding listen and dispatch", editor);
editor.on(event, (...args) => {
this.pluginDispatch(handler, editor, this.resourceFor(editor), ...args);
});
diff --git a/browser/devtools/projecteditor/test/browser.ini b/browser/devtools/projecteditor/test/browser.ini
index 2ad99841262..925675d34bf 100644
--- a/browser/devtools/projecteditor/test/browser.ini
+++ b/browser/devtools/projecteditor/test/browser.ini
@@ -6,8 +6,11 @@ support-files =
helper_edits.js
[browser_projecteditor_app_options.js]
+skip-if = buildapp == 'mulet'
[browser_projecteditor_delete_file.js]
+skip-if = buildapp == 'mulet'
[browser_projecteditor_editing_01.js]
+skip-if = buildapp == 'mulet'
[browser_projecteditor_editors_image.js]
[browser_projecteditor_external_change.js]
[browser_projecteditor_immediate_destroy.js]
@@ -16,4 +19,5 @@ support-files =
[browser_projecteditor_menubar_02.js]
[browser_projecteditor_new_file.js]
[browser_projecteditor_stores.js]
-[browser_projecteditor_tree_selection.js]
+[browser_projecteditor_tree_selection_01.js]
+[browser_projecteditor_tree_selection_02.js]
diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection.js b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js
similarity index 85%
rename from browser/devtools/projecteditor/test/browser_projecteditor_tree_selection.js
rename to browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js
index 9d23c979354..be7eea3621e 100644
--- a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection.js
+++ b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_01.js
@@ -59,6 +59,12 @@ function selectFileSubsequentLoad(projecteditor, resource) {
return;
}
+ // Make sure text editors are focused immediately when selected.
+ let focusPromise = promise.resolve();
+ if (projecteditor.currentEditor.editor) {
+ focusPromise = onEditorFocus(projecteditor.currentEditor);
+ }
+
// Only activated should fire the next time
// (may add load() if we begin checking for changes from disk)
let [editorActivated] = yield promise.all([
@@ -66,4 +72,15 @@ function selectFileSubsequentLoad(projecteditor, resource) {
]);
is (editorActivated, projecteditor.currentEditor, "Editor has been activated for " + resource.path);
+
+ yield focusPromise;
+}
+
+function onEditorFocus(editor) {
+ let def = promise.defer();
+ editor.on("focus", function focus() {
+ editor.off("focus", focus);
+ def.resolve();
+ });
+ return def.promise;
}
diff --git a/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js
new file mode 100644
index 00000000000..f6608d6e304
--- /dev/null
+++ b/browser/devtools/projecteditor/test/browser_projecteditor_tree_selection_02.js
@@ -0,0 +1,70 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test that files get reselected in the tree when their editor
+// is focused. https://bugzilla.mozilla.org/show_bug.cgi?id=1011116.
+
+let test = asyncTest(function*() {
+ let projecteditor = yield addProjectEditorTabForTempDirectory();
+ let TEMP_PATH = projecteditor.project.allPaths()[0];
+
+ is (getTempFile("").path, TEMP_PATH, "Temp path is set correctly.");
+
+ ok (projecteditor.currentEditor, "There is an editor for projecteditor");
+ let resources = projecteditor.project.allResources();
+
+ is (
+ resources.map(r=>r.basename).join("|"),
+ "ProjectEditor|css|styles.css|data|img|icons|128x128.png|16x16.png|32x32.png|vector.svg|fake.png|js|script.js|index.html|LICENSE|README.md",
+ "Resources came through in proper order"
+ );
+
+ for (let i = 0; i < resources.length; i++){
+ yield selectAndRefocusFile(projecteditor, resources[i]);
+ }
+});
+
+function selectAndRefocusFile(projecteditor, resource) {
+ ok (resource && resource.path, "A valid resource has been passed in for selection " + (resource && resource.path));
+ projecteditor.projectTree.selectResource(resource);
+
+ if (resource.isDir) {
+ return;
+ }
+
+ let [editorCreated, editorLoaded, editorActivated] = yield promise.all([
+ onceEditorCreated(projecteditor),
+ onceEditorLoad(projecteditor),
+ onceEditorActivated(projecteditor)
+ ]);
+
+ if (projecteditor.currentEditor.editor) {
+ // This is a text editor. Go ahead and select a directory then refocus
+ // the editor to make sure it is reselected in tree.
+ let treeContainer = projecteditor.projectTree.getViewContainer(getDirectoryInStore(resource));
+ treeContainer.line.click();
+ EventUtils.synthesizeMouseAtCenter(treeContainer.elt, {}, treeContainer.elt.ownerDocument.defaultView);
+ let waitForTreeSelect = onTreeSelection(projecteditor);
+ projecteditor.currentEditor.focus();
+ yield waitForTreeSelect;
+
+ is (projecteditor.projectTree.getSelectedResource(), resource, "The resource gets reselected in the tree");
+ }
+}
+
+// Return a directory to select in the tree.
+function getDirectoryInStore(resource) {
+ return resource.store.root.childrenSorted.filter(r=>r.isDir)[0];
+}
+
+function onTreeSelection(projecteditor) {
+ let def = promise.defer();
+ projecteditor.projectTree.on("selection", function selection() {
+ projecteditor.projectTree.off("focus", selection);
+ def.resolve();
+ });
+ return def.promise;
+}
diff --git a/browser/devtools/scratchpad/test/browser.ini b/browser/devtools/scratchpad/test/browser.ini
index 916b42709a7..c5ddab709ca 100644
--- a/browser/devtools/scratchpad/test/browser.ini
+++ b/browser/devtools/scratchpad/test/browser.ini
@@ -8,6 +8,7 @@ support-files = head.js
[browser_scratchpad_reset_undo.js]
[browser_scratchpad_display_outputs_errors.js]
[browser_scratchpad_eval_func.js]
+skip-if = buildapp == 'mulet'
[browser_scratchpad_goto_line_ui.js]
[browser_scratchpad_reload_and_run.js]
[browser_scratchpad_display_non_error_exceptions.js]
diff --git a/browser/devtools/shared/test/browser.ini b/browser/devtools/shared/test/browser.ini
index 16768895b2e..20bd00cda9f 100644
--- a/browser/devtools/shared/test/browser.ini
+++ b/browser/devtools/shared/test/browser.ini
@@ -42,6 +42,7 @@ support-files =
[browser_tableWidget_basic.js]
[browser_tableWidget_keyboard_interaction.js]
[browser_tableWidget_mouse_interaction.js]
+skip-if = buildapp == 'mulet'
[browser_telemetry_button_paintflashing.js]
[browser_telemetry_button_responsive.js]
[browser_telemetry_button_scratchpad.js]
@@ -62,6 +63,7 @@ support-files =
[browser_toolbar_basic.js]
[browser_toolbar_tooltip.js]
[browser_toolbar_webconsole_errors_count.js]
+skip-if = buildapp == 'mulet'
[browser_treeWidget_basic.js]
[browser_treeWidget_keyboard_interaction.js]
[browser_treeWidget_mouse_interaction.js]
diff --git a/browser/devtools/styleeditor/StyleSheetEditor.jsm b/browser/devtools/styleeditor/StyleSheetEditor.jsm
index afee0a20abc..b23859c3857 100644
--- a/browser/devtools/styleeditor/StyleSheetEditor.jsm
+++ b/browser/devtools/styleeditor/StyleSheetEditor.jsm
@@ -33,6 +33,9 @@ const UPDATE_STYLESHEET_THROTTLE_DELAY = 500;
// Pref which decides if CSS autocompletion is enabled in Style Editor or not.
const AUTOCOMPLETION_PREF = "devtools.styleeditor.autocompletion-enabled";
+// Pref which decides whether updates to the stylesheet use transitions
+const TRANSITION_PREF = "devtools.styleeditor.transitions";
+
// How long to wait to update linked CSS file after original source was saved
// to disk. Time in ms.
const CHECK_LINKED_SHEET_DELAY=500;
@@ -461,7 +464,9 @@ StyleSheetEditor.prototype = {
this._state.text = this.sourceEditor.getText();
}
- this.styleSheet.update(this._state.text, true);
+ let transitionsEnabled = Services.prefs.getBoolPref(TRANSITION_PREF);
+
+ this.styleSheet.update(this._state.text, transitionsEnabled);
},
/**
diff --git a/browser/devtools/webconsole/console-output.js b/browser/devtools/webconsole/console-output.js
index cd3bcc25b49..43081aea489 100644
--- a/browser/devtools/webconsole/console-output.js
+++ b/browser/devtools/webconsole/console-output.js
@@ -11,6 +11,7 @@ loader.lazyImporter(this, "VariablesView", "resource:///modules/devtools/Variabl
loader.lazyImporter(this, "escapeHTML", "resource:///modules/devtools/VariablesView.jsm");
loader.lazyImporter(this, "gDevTools", "resource:///modules/devtools/gDevTools.jsm");
loader.lazyImporter(this, "Task","resource://gre/modules/Task.jsm");
+loader.lazyImporter(this, "PluralForm", "resource://gre/modules/PluralForm.jsm");
const Heritage = require("sdk/core/heritage");
const URI = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
@@ -2178,22 +2179,34 @@ Widgets.ObjectRenderers.add({
this._text(" [ ");
- let shown = 0;
- for (let item of items) {
- if (shown > 0) {
- this._text(", ");
- }
+ let isFirst = true;
+ let emptySlots = 0;
+ // A helper that renders a comma between items if isFirst == false.
+ let renderSeparator = () => !isFirst && this._text(", ");
- if (item !== null) {
+ for (let item of items) {
+ if (item === null) {
+ emptySlots++;
+ }
+ else {
+ renderSeparator();
+ isFirst = false;
+
+ if (emptySlots) {
+ this._renderEmptySlots(emptySlots);
+ emptySlots = 0;
+ }
let elem = this.message._renderValueGrip(item, { concise: true });
this.element.appendChild(elem);
- } else if (shown == (items.length - 1)) {
- this._text(", ");
}
-
- shown++;
}
+ if (emptySlots) {
+ renderSeparator();
+ this._renderEmptySlots(emptySlots, false);
+ }
+
+ let shown = items.length;
if (shown < preview.length) {
this._text(", ");
@@ -2204,6 +2217,16 @@ Widgets.ObjectRenderers.add({
this._text(" ]");
},
+
+ _renderEmptySlots: function(aNumSlots, aAppendComma=true) {
+ let slotLabel = l10n.getStr("emptySlotLabel");
+ let slotText = PluralForm.get(aNumSlots, slotLabel);
+ this._text("<" + slotText.replace("#1", aNumSlots) + ">");
+ if (aAppendComma) {
+ this._text(", ");
+ }
+ },
+
}); // Widgets.ObjectRenderers.byKind.ArrayLike
/**
diff --git a/browser/devtools/webconsole/test/browser.ini b/browser/devtools/webconsole/test/browser.ini
index 386b6a75eae..3eb976ae65f 100644
--- a/browser/devtools/webconsole/test/browser.ini
+++ b/browser/devtools/webconsole/test/browser.ini
@@ -122,6 +122,7 @@ support-files =
[browser_bug_869003_inspect_cross_domain_object.js]
[browser_bug_871156_ctrlw_close_tab.js]
[browser_cached_messages.js]
+skip-if = buildapp == 'mulet'
[browser_console.js]
[browser_console_addonsdk_loader_exception.js]
[browser_console_clear_on_reload.js]
@@ -129,18 +130,23 @@ support-files =
[browser_console_consolejsm_output.js]
[browser_console_dead_objects.js]
[browser_console_error_source_click.js]
+skip-if = buildapp == 'mulet'
[browser_console_filters.js]
[browser_console_iframe_messages.js]
+skip-if = buildapp == 'mulet'
[browser_console_keyboard_accessibility.js]
[browser_console_log_inspectable_object.js]
[browser_console_native_getters.js]
[browser_console_navigation_marker.js]
[browser_console_nsiconsolemessage.js]
+skip-if = buildapp == 'mulet'
[browser_console_optimized_out_vars.js]
[browser_console_private_browsing.js]
+skip-if = buildapp == 'mulet'
[browser_console_variables_view.js]
[browser_console_variables_view_dom_nodes.js]
[browser_console_variables_view_dont_sort_non_sortable_classes_properties.js]
+skip-if = buildapp == 'mulet'
[browser_console_variables_view_while_debugging.js]
[browser_console_variables_view_while_debugging_and_inspecting.js]
[browser_eval_in_debugger_stackframe.js]
@@ -150,13 +156,16 @@ support-files =
[browser_output_breaks_after_console_dir_uninspectable.js]
[browser_output_longstring_expand.js]
[browser_repeated_messages_accuracy.js]
+skip-if = buildapp == 'mulet'
[browser_result_format_as_string.js]
[browser_warn_user_about_replaced_api.js]
[browser_webconsole_abbreviate_source_url.js]
[browser_webconsole_allow_mixedcontent_securityerrors.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_assert.js]
[browser_webconsole_basic_net_logging.js]
[browser_webconsole_block_mixedcontent_securityerrors.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_579412_input_focus.js]
[browser_webconsole_bug_580001_closing_after_completion.js]
[browser_webconsole_bug_580030_errors_after_page_reload.js]
@@ -223,16 +232,22 @@ run-if = os == "win"
[browser_webconsole_bug_734061_No_input_change_and_Tab_key_pressed.js]
[browser_webconsole_bug_737873_mixedcontent.js]
[browser_webconsole_bug_762593_insecure_passwords_about_blank_web_console_warning.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_762593_insecure_passwords_web_console_warning.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_764572_output_open_url.js]
[browser_webconsole_bug_766001_JS_Console_in_Debugger.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_770099_violation.js]
[browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_804845_ctrl_key_nav.js]
run-if = os == "mac"
[browser_webconsole_bug_817834_add_edited_input_to_history.js]
[browser_webconsole_bug_837351_securityerrors.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_846918_hsts_invalid-headers.js]
+skip-if = buildapp == 'mulet'
[browser_webconsole_bug_915141_toggle_response_logging_with_keyboard.js]
[browser_webconsole_bug_1006027_message_timestamps_incorrect.js]
[browser_webconsole_bug_1010953_cspro.js]
@@ -279,6 +294,7 @@ run-if = os == "mac"
[browser_webconsole_output_03.js]
[browser_webconsole_output_04.js]
[browser_webconsole_output_05.js]
+[browser_webconsole_output_06.js]
[browser_webconsole_output_dom_elements_01.js]
[browser_webconsole_output_dom_elements_02.js]
[browser_webconsole_output_dom_elements_03.js]
diff --git a/browser/devtools/webconsole/test/browser_webconsole_output_02.js b/browser/devtools/webconsole/test/browser_webconsole_output_02.js
index 1950a561b6d..88c4df24563 100644
--- a/browser/devtools/webconsole/test/browser_webconsole_output_02.js
+++ b/browser/devtools/webconsole/test/browser_webconsole_output_02.js
@@ -86,7 +86,7 @@ let inputTests = [
// 8 - array with holes and a cyclic reference
{
input: "window.array4",
- output: 'Array [ , , , , , "test", Array[7] ]',
+ output: 'Array [ <5 empty slots>, "test", Array[7] ]',
printOutput: '",,,,,test,"',
inspectable: true,
variablesViewLabel: "Array[7]",
diff --git a/browser/devtools/webconsole/test/browser_webconsole_output_06.js b/browser/devtools/webconsole/test/browser_webconsole_output_06.js
new file mode 100644
index 00000000000..ebe9d8760e7
--- /dev/null
+++ b/browser/devtools/webconsole/test/browser_webconsole_output_06.js
@@ -0,0 +1,114 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+ "use strict";
+
+// Test the webconsole output for various arrays.
+
+const TEST_URI = "data:text/html;charset=utf8,test for console output - 06";
+
+let inputTests = [
+ // 1 - array with empty slots only
+ {
+ input: 'Array(5)',
+ output: 'Array [ <5 empty slots> ]',
+ printOutput: ',,,,',
+ inspectable: true,
+ variablesViewLabel: "Array[5]",
+ },
+ // 2 - array with one empty slot at the beginning
+ {
+ input: '[,1,2,3]',
+ output: 'Array [ <1 empty slot>, 1, 2, 3 ]',
+ printOutput: ",1,2,3",
+ inspectable: true,
+ variablesViewLabel: "Array[4]",
+ },
+ // 3 - array with multiple consecutive empty slots at the beginning
+ {
+ input: '[,,,3,4,5]',
+ output: 'Array [ <3 empty slots>, 3, 4, 5 ]',
+ printOutput: ",,,3,4,5",
+ inspectable: true,
+ variablesViewLabel: "Array[6]",
+ },
+ // 4 - array with one empty slot at the middle
+ {
+ input: '[0,1,,3,4,5]',
+ output: 'Array [ 0, 1, <1 empty slot>, 3, 4, 5 ]',
+ printOutput: "0,1,,3,4,5",
+ inspectable: true,
+ variablesViewLabel: "Array[6]",
+ },
+ // 5 - array with multiple successive empty slots at the middle
+ {
+ input: '[0,1,,,,5]',
+ output: 'Array [ 0, 1, <3 empty slots>, 5 ]',
+ printOutput: "0,1,,,,5",
+ inspectable: true,
+ variablesViewLabel: "Array[6]",
+ },
+ // 6 - array with multiple non successive single empty slots
+ {
+ input: '[0,,2,,4,5]',
+ output: 'Array [ 0, <1 empty slot>, 2, <1 empty slot>, 4, 5 ]',
+ printOutput: "0,,2,,4,5",
+ inspectable: true,
+ variablesViewLabel: "Array[6]",
+ },
+ // 7 - array with multiple multi-slot holes
+ {
+ input: '[0,,,3,,,,7,8]',
+ output: 'Array [ 0, <2 empty slots>, 3, <3 empty slots>, 7, 8 ]',
+ printOutput: "0,,,3,,,,7,8",
+ inspectable: true,
+ variablesViewLabel: "Array[9]",
+ },
+ // 8 - array with a single slot hole at the end
+ {
+ input: '[0,1,2,3,4,,]',
+ output: 'Array [ 0, 1, 2, 3, 4, <1 empty slot> ]',
+ printOutput: "0,1,2,3,4,",
+ inspectable: true,
+ variablesViewLabel: "Array[6]",
+ },
+ // 9 - array with multiple consecutive empty slots at the end
+ {
+ input: '[0,1,2,,,,]',
+ output: 'Array [ 0, 1, 2, <3 empty slots> ]',
+ printOutput: "0,1,2,,,",
+ inspectable: true,
+ variablesViewLabel: "Array[6]",
+ },
+
+ // 10 - array with members explicitly set to null
+ {
+ input: '[0,null,null,3,4,5]',
+ output: 'Array [ 0, null, null, 3, 4, 5 ]',
+ printOutput: "0,,,3,4,5",
+ inspectable: true,
+ variablesViewLabel: "Array[6]"
+ },
+
+ // 11 - array with members explicitly set to undefined
+ {
+ input: '[0,undefined,undefined,3,4,5]',
+ output: 'Array [ 0, undefined, undefined, 3, 4, 5 ]',
+ printOutput: "0,,,3,4,5",
+ inspectable: true,
+ variablesViewLabel: "Array[6]"
+ }
+];
+
+function test() {
+ Task.spawn(function*() {
+ let {tab} = yield loadTab(TEST_URI);
+ let hud = yield openConsole(tab);
+ return checkOutputForInputs(hud, inputTests);
+ }).then(finishUp);
+}
+
+function finishUp() {
+ inputTests = null;
+ finishTest();
+}
diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm
index bd2a6c57f25..3f6e5080c87 100644
--- a/browser/experiments/Experiments.jsm
+++ b/browser/experiments/Experiments.jsm
@@ -2181,7 +2181,11 @@ this.Experiments.PreviousExperimentProvider.prototype = Object.freeze({
shutdown: function () {
this._log.trace("shutdown()");
- Services.obs.removeObserver(this, EXPERIMENTS_CHANGED_TOPIC);
+ try {
+ Services.obs.removeObserver(this, EXPERIMENTS_CHANGED_TOPIC);
+ } catch(e) {
+ // Prevent crash in mochitest-browser3 on Mulet
+ }
},
observe: function (subject, topic, data) {
diff --git a/browser/locales/en-US/chrome/browser/devtools/webconsole.properties b/browser/locales/en-US/chrome/browser/devtools/webconsole.properties
index 0e55dfda404..a67eaf6e802 100644
--- a/browser/locales/en-US/chrome/browser/devtools/webconsole.properties
+++ b/browser/locales/en-US/chrome/browser/devtools/webconsole.properties
@@ -241,3 +241,12 @@ selfxss.okstring=allow pasting
# you hover the arrow for expanding/collapsing the message details. For
# console.error() and other messages we show the stacktrace.
messageToggleDetails=Show/hide message details.
+
+# LOCALIZATION NOTE (emptySlotLabel): the text is displayed when an Array
+# with empty slots is printed to the console.
+# This is a semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of empty slots
+# example: 1 empty slot
+# example: 5 empty slots
+emptySlotLabel=#1 empty slot;#1 empty slots
diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn
index fa7559de13f..05687520ebf 100644
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -151,8 +151,6 @@ browser.jar:
skin/classic/browser/preferences/in-content/check@2x.png (../shared/incontentprefs/check@2x.png)
skin/classic/browser/preferences/in-content/icons.png (../shared/incontentprefs/icons.png)
skin/classic/browser/preferences/in-content/icons@2x.png (../shared/incontentprefs/icons@2x.png)
- skin/classic/browser/preferences/in-content/header.png (../shared/incontentprefs/header.png)
- skin/classic/browser/preferences/in-content/header@2x.png (../shared/incontentprefs/header@2x.png)
skin/classic/browser/preferences/in-content/help-glyph.png (../shared/incontentprefs/help-glyph.png)
skin/classic/browser/preferences/in-content/help-glyph@2x.png (../shared/incontentprefs/help-glyph@2x.png)
skin/classic/browser/preferences/in-content/dropdown.png (../shared/incontentprefs/dropdown.png)
diff --git a/browser/themes/linux/preferences/in-content/preferences.css b/browser/themes/linux/preferences/in-content/preferences.css
index bfcf32f6d76..a9be97b404a 100644
--- a/browser/themes/linux/preferences/in-content/preferences.css
+++ b/browser/themes/linux/preferences/in-content/preferences.css
@@ -12,6 +12,12 @@ tab[selected] {
border-bottom-right-radius: 0;
}
+button,
+colorpicker[type="button"],
+menulist {
+ margin: 2px 4px;
+}
+
button > .button-box,
menulist > .menulist-label-box {
-moz-appearance: none;
@@ -25,6 +31,10 @@ button[type="menu"] > .button-box > .button-menu-dropmarker {
-moz-margin-end: 0;
}
+menulist {
+ font-size: inherit;
+}
+
menulist:not([editable="true"]) > .menulist-dropmarker {
display: -moz-box;
margin-top: 6px;
@@ -80,3 +90,17 @@ menulist.actionsMenu > .menulist-dropmarker {
margin-top: 11px;
margin-bottom: 11px;
}
+
+textbox + button,
+filefield + button {
+ -moz-margin-start: -4px;
+}
+
+#dialogTitle {
+ -moz-margin-start: 12px !important;
+}
+
+.actionButtons {
+ margin-right: 8px !important;
+ margin-left: 8px !important;
+}
diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn
index fd2773bc93b..dee8d74f063 100644
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -243,8 +243,6 @@ browser.jar:
skin/classic/browser/preferences/in-content/check@2x.png (../shared/incontentprefs/check@2x.png)
skin/classic/browser/preferences/in-content/icons.png (../shared/incontentprefs/icons.png)
skin/classic/browser/preferences/in-content/icons@2x.png (../shared/incontentprefs/icons@2x.png)
- skin/classic/browser/preferences/in-content/header.png (../shared/incontentprefs/header.png)
- skin/classic/browser/preferences/in-content/header@2x.png (../shared/incontentprefs/header@2x.png)
skin/classic/browser/preferences/in-content/help-glyph.png (../shared/incontentprefs/help-glyph.png)
skin/classic/browser/preferences/in-content/help-glyph@2x.png (../shared/incontentprefs/help-glyph@2x.png)
skin/classic/browser/preferences/in-content/sorter.png (../shared/incontentprefs/sorter.png)
diff --git a/browser/themes/osx/preferences/in-content/preferences.css b/browser/themes/osx/preferences/in-content/preferences.css
index 44bd312af6f..789311fde55 100644
--- a/browser/themes/osx/preferences/in-content/preferences.css
+++ b/browser/themes/osx/preferences/in-content/preferences.css
@@ -18,6 +18,12 @@ tab[selected] {
text-shadow: none;
}
+button,
+colorpicker[type="button"],
+menulist {
+ margin-top: 3px;
+}
+
menulist:not([editable="true"]) > menupopup > menuitem[checked="true"]::before,
menulist:not([editable="true"]) > menupopup > menuitem[selected="true"]::before {
display: none;
@@ -87,6 +93,22 @@ description {
line-height: 22px;
}
+#downloadFolder > .fileFieldContentBox {
+ -moz-padding-start: 3px;
+}
+
+textbox + button {
+ -moz-margin-start: -4px;
+}
+
+filefield + button {
+ -moz-margin-start: -8px;
+}
+
+#dialogTitle {
+ -moz-margin-start: 6px !important;
+}
+
#popupPolicyRow {
/* Override styles from
browser/themes/osx/preferences/preferences.css */
diff --git a/browser/themes/shared/incontentprefs/header.png b/browser/themes/shared/incontentprefs/header.png
deleted file mode 100644
index ce05ed2792b..00000000000
Binary files a/browser/themes/shared/incontentprefs/header.png and /dev/null differ
diff --git a/browser/themes/shared/incontentprefs/header@2x.png b/browser/themes/shared/incontentprefs/header@2x.png
deleted file mode 100644
index 83e8868ace7..00000000000
Binary files a/browser/themes/shared/incontentprefs/header@2x.png and /dev/null differ
diff --git a/browser/themes/shared/incontentprefs/preferences.css b/browser/themes/shared/incontentprefs/preferences.css
index a56d52e09b4..944d988d29d 100644
--- a/browser/themes/shared/incontentprefs/preferences.css
+++ b/browser/themes/shared/incontentprefs/preferences.css
@@ -12,7 +12,7 @@ prefwindow,
.windowDialog,
page {
-moz-appearance: none;
- background-color: white;
+ background-color: #f1f1f1;
color: #424E5A;
}
@@ -61,7 +61,6 @@ groupbox {
border: none;
margin-top: 15px;
margin-bottom: 15px;
- -moz-margin-start: 60px;
-moz-margin-end: 0;
-moz-padding-start: 0;
-moz-padding-end: 0;
@@ -86,7 +85,6 @@ tabpanels {
}
tabs {
- -moz-margin-start: 60px;
margin-bottom: 15px;
border-top: 1px solid #c1c1c1;
border-bottom: 1px solid #c1c1c1;
@@ -583,14 +581,14 @@ radio[disabled="true"] > .radio-check {
/* header */
.header {
+ border-bottom: 1px solid #c8c8c8;
margin-bottom: 15px;
+ padding-bottom: 15px;
}
-.header-icon {
- width: 40px;
- max-height: 40px;
- -moz-margin-end: 20px;
- list-style-image: url("chrome://browser/skin/preferences/in-content/header.png");
+#header-advanced {
+ border-bottom: none;
+ padding-bottom: 0;
}
.header-name {
@@ -600,68 +598,6 @@ radio[disabled="true"] > .radio-check {
margin: 0;
}
-#header-general > .header-icon {
- -moz-image-region: rect(0, 40px, 40px, 0);
-}
-
-#header-content > .header-icon {
- -moz-image-region: rect(0, 80px, 40px, 40px);
-}
-
-#header-application > .header-icon {
- -moz-image-region: rect(0, 120px, 40px, 80px);
-}
-
-#header-privacy > .header-icon {
- -moz-image-region: rect(0, 160px, 40px, 120px);
-}
-
-#header-security > .header-icon {
- -moz-image-region: rect(0, 200px, 40px, 160px);
-}
-
-#header-sync > .header-icon {
- -moz-image-region: rect(0, 240px, 40px, 200px);
-}
-
-#header-advanced > .header-icon {
- -moz-image-region: rect(0, 280px, 40px, 240px);
-}
-
-@media (min-resolution: 2dppx) {
- .header-icon {
- list-style-image: url("chrome://browser/skin/preferences/in-content/header@2x.png");
- }
-
- #header-general > .header-icon {
- -moz-image-region: rect(0, 80px, 80px, 0);
- }
-
- #header-content > .header-icon {
- -moz-image-region: rect(0, 160px, 80px, 80px);
- }
-
- #header-application > .header-icon {
- -moz-image-region: rect(0, 240px, 80px, 160px);
- }
-
- #header-privacy > .header-icon {
- -moz-image-region: rect(0, 320px, 80px, 240px);
- }
-
- #header-security > .header-icon {
- -moz-image-region: rect(0, 400px, 80px, 320px);
- }
-
- #header-sync > .header-icon {
- -moz-image-region: rect(0, 480px, 80px, 400px);
- }
-
- #header-advanced > .header-icon {
- -moz-image-region: rect(0, 560px, 80px, 480px);
- }
-}
-
/* General Pane */
filefield {
@@ -685,10 +621,34 @@ filefield {
-moz-padding-start: 36px;
}
+textbox:-moz-locale-dir(rtl),
+.fileFieldLabel:-moz-locale-dir(rtl),
+textbox + button:-moz-locale-dir(ltr),
+filefield + button:-moz-locale-dir(ltr) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+textbox:-moz-locale-dir(ltr),
+.fileFieldLabel:-moz-locale-dir(ltr),
+textbox + button:-moz-locale-dir(rtl),
+filefield + button:-moz-locale-dir(rtl) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+textbox + button,
+filefield + button {
+ -moz-border-start: none;
+}
+
+#downloadFolder {
+ -moz-margin-start: 0;
+}
+
/* Applications Pane Styles */
#applicationsContent {
- -moz-margin-start: 60px;
padding: 15px 0;
}
@@ -811,10 +771,6 @@ description > html|a {
background-color: #FBFBFB;
}
-#weavePrefsDeck {
- -moz-margin-start: 60px;
-}
-
#noFxaAccount {
/* Overriding the margins from the base preferences.css theme file.
These overrides can be simplified by fixing bug 1027174 */
@@ -837,7 +793,6 @@ description > html|a {
#encryptionPanel {
margin-top: 15px;
- -moz-margin-start: 60px;
}
#telemetryLearnMore,
@@ -876,10 +831,6 @@ description > html|a {
min-width: 66ch;
}
-#dialogTitle {
- -moz-margin-start: 5px !important;
-}
-
.close-icon {
background-color: transparent !important;
border: none;
diff --git a/browser/themes/shared/newtab/newTab.inc.css b/browser/themes/shared/newtab/newTab.inc.css
index bb5477816c2..093ce65bcff 100644
--- a/browser/themes/shared/newtab/newTab.inc.css
+++ b/browser/themes/shared/newtab/newTab.inc.css
@@ -124,7 +124,12 @@
transition: opacity 100ms ease-out;
}
+.newtab-thumbnail.enhanced-content:hover {
+ opacity: 0;
+}
+
.newtab-site[type=affiliate] .newtab-thumbnail,
+.newtab-site[type=enhanced] .newtab-thumbnail,
.newtab-site[type=organic] .newtab-thumbnail,
.newtab-site[type=sponsored] .newtab-thumbnail {
background-position: center center;
diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn
index ebdafd234b4..864faa1d751 100644
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -177,8 +177,6 @@ browser.jar:
skin/classic/browser/preferences/in-content/check@2x.png (../shared/incontentprefs/check@2x.png)
skin/classic/browser/preferences/in-content/icons.png (../shared/incontentprefs/icons.png)
skin/classic/browser/preferences/in-content/icons@2x.png (../shared/incontentprefs/icons@2x.png)
- skin/classic/browser/preferences/in-content/header.png (../shared/incontentprefs/header.png)
- skin/classic/browser/preferences/in-content/header@2x.png (../shared/incontentprefs/header@2x.png)
skin/classic/browser/preferences/in-content/help-glyph.png (../shared/incontentprefs/help-glyph.png)
skin/classic/browser/preferences/in-content/help-glyph@2x.png (../shared/incontentprefs/help-glyph@2x.png)
skin/classic/browser/preferences/in-content/sorter.png (../shared/incontentprefs/sorter.png)
@@ -596,8 +594,6 @@ browser.jar:
skin/classic/aero/browser/preferences/in-content/check@2x.png (../shared/incontentprefs/check@2x.png)
skin/classic/aero/browser/preferences/in-content/icons.png (../shared/incontentprefs/icons.png)
skin/classic/aero/browser/preferences/in-content/icons@2x.png (../shared/incontentprefs/icons@2x.png)
- skin/classic/aero/browser/preferences/in-content/header.png (../shared/incontentprefs/header.png)
- skin/classic/aero/browser/preferences/in-content/header@2x.png (../shared/incontentprefs/header@2x.png)
skin/classic/aero/browser/preferences/in-content/help-glyph.png (../shared/incontentprefs/help-glyph.png)
skin/classic/aero/browser/preferences/in-content/help-glyph@2x.png (../shared/incontentprefs/help-glyph@2x.png)
skin/classic/aero/browser/preferences/in-content/sorter.png (../shared/incontentprefs/sorter.png)
diff --git a/browser/themes/windows/preferences/in-content/preferences.css b/browser/themes/windows/preferences/in-content/preferences.css
index acefd477ed9..8b4835a399c 100644
--- a/browser/themes/windows/preferences/in-content/preferences.css
+++ b/browser/themes/windows/preferences/in-content/preferences.css
@@ -8,6 +8,12 @@ caption {
background-color: transparent;
}
+button,
+colorpicker[type="button"],
+menulist {
+ margin: 2px 4px;
+}
+
menulist:not([editable="true"]) > .menulist-dropmarker {
margin-top: 1px;
margin-bottom: 1px;
@@ -31,3 +37,17 @@ radio {
.actionsMenu > .menulist-label-box > .menulist-icon {
-moz-margin-end: 9px;
}
+
+textbox + button,
+filefield + button {
+ -moz-margin-start: -4px;
+}
+
+#dialogTitle {
+ -moz-margin-start: 13px !important;
+}
+
+.actionButtons {
+ margin-right: 8px !important;
+ margin-left: 8px !important;
+}
diff --git a/config/rules.mk b/config/rules.mk
index 751b33c54a4..39725867b2f 100644
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -797,6 +797,7 @@ endif
ifdef DTRACE_PROBE_OBJ
EXTRA_DEPS += $(DTRACE_PROBE_OBJ)
OBJS += $(DTRACE_PROBE_OBJ)
+EXCLUDED_OBJS += $(DTRACE_PROBE_OBJ)
endif
$(filter %.$(LIB_SUFFIX),$(LIBRARY)): $(OBJS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
diff --git a/content/base/test/chrome.ini b/content/base/test/chrome.ini
index 4432f014e9a..77b0752c590 100644
--- a/content/base/test/chrome.ini
+++ b/content/base/test/chrome.ini
@@ -3,3 +3,4 @@
[test_bug357450.js]
[test_copypaste.xul]
[test_messagemanager_principal.html]
+skip-if = buildapp == 'mulet'
diff --git a/content/base/test/chrome/chrome.ini b/content/base/test/chrome/chrome.ini
index 3159db9858e..78aca03f29b 100644
--- a/content/base/test/chrome/chrome.ini
+++ b/content/base/test/chrome/chrome.ini
@@ -33,6 +33,7 @@ support-files =
[test_bug549682.xul]
[test_bug571390.xul]
[test_bug574596.html]
+skip-if = buildapp == 'mulet'
[test_bug599295.html]
[test_bug616841.xul]
[test_bug635835.xul]
@@ -52,7 +53,7 @@ support-files =
[test_bug914381.html]
[test_bug990812.xul]
[test_cpows.xul]
-skip-if = toolkit == "cocoa"
+skip-if = buildapp == 'mulet' || toolkit == "cocoa"
[test_document_register.xul]
[test_domparsing.xul]
[test_fileconstructor.xul]
diff --git a/content/base/test/mochitest-child-permissions.ini b/content/base/test/mochitest-child-permissions.ini
index 238e3d1ec44..7b798216b48 100644
--- a/content/base/test/mochitest-child-permissions.ini
+++ b/content/base/test/mochitest-child-permissions.ini
@@ -1,4 +1,4 @@
[test_messagemanager_assertpermission.html]
-skip-if = buildapp == 'b2g' #b2g(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-debug(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-desktop(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' #b2g(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-debug(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-desktop(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE)
[test_child_process_shutdown_message.html]
-skip-if = buildapp == 'b2g' #b2g(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-debug(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-desktop(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' #b2g(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-debug(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE) b2g-desktop(specialpowers.wrap issue, NS_ERROR_XPC_GS_RETURNED_FAILURE)
diff --git a/content/base/test/mochitest.ini b/content/base/test/mochitest.ini
index 70a4cc1d768..84b0cc31eab 100644
--- a/content/base/test/mochitest.ini
+++ b/content/base/test/mochitest.ini
@@ -536,7 +536,7 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #bug 901343, specialpowers.wr
[test_bug819051.html]
[test_bug820909.html]
[test_bug827160.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #needs plugin support # b2g(needs plugin support) b2g-debug(debug-only failure) b2g-desktop(needs plugin support)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #needs plugin support # b2g(needs plugin support) b2g-debug(debug-only failure) b2g-desktop(needs plugin support)
[test_bug840098.html]
[test_bug864595.html]
[test_bug868999.html]
@@ -592,20 +592,20 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #bug 775227
[test_meta_viewport5.html]
[test_meta_viewport6.html]
[test_mixed_content_blocker.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT, SSL_REQUIRED
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT, SSL_REQUIRED
[test_mixed_content_blocker_bug803225.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT, SSL_REQUIRED
[test_mixed_content_blocker_frameNavigation.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT, SSL_REQUIRED
[test_mozfiledataurl.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT
[test_mutationobservers.html]
skip-if = buildapp == 'b2g' || e10s # b2g(bug 901385, showmodaldialog) b2g-debug(bug 901385, showmodaldialog) b2g-desktop(bug 901385, showmodaldialog)
[test_nodelist_holes.html]
[test_object.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(needs plugin support) b2g-debug(needs plugin support) b2g-desktop(needs plugin support)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(needs plugin support) b2g-debug(needs plugin support) b2g-desktop(needs plugin support)
[test_plugin_freezing.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #CLICK_TO_PLAY
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #CLICK_TO_PLAY
[test_processing_instruction_update_stylesheet.xhtml]
[test_range_bounds.html]
skip-if = toolkit == 'android' || e10s
diff --git a/content/canvas/test/mochitest.ini b/content/canvas/test/mochitest.ini
index 18bf84d5aa9..6227d5a3173 100644
--- a/content/canvas/test/mochitest.ini
+++ b/content/canvas/test/mochitest.ini
@@ -202,7 +202,7 @@ skip-if = os == "android" || appname == "b2g"
[test_drawImage_edge_cases.html]
[test_drawWindow.html]
support-files = file_drawWindow_source.html file_drawWindow_common.js
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk')
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk')
[test_ImageData_ctor.html]
[test_isPointInStroke.html]
[test_mozDashOffset.html]
diff --git a/content/canvas/test/webgl-conformance/mochitest.ini b/content/canvas/test/webgl-conformance/mochitest.ini
index 7670a805b3b..b2caf9cc2ac 100644
--- a/content/canvas/test/webgl-conformance/mochitest.ini
+++ b/content/canvas/test/webgl-conformance/mochitest.ini
@@ -18,4 +18,4 @@ support-files =
skipped_tests_winxp.txt
[test_webgl_conformance_test_suite.html]
-skip-if = (buildapp == 'b2g') # bug 865443- separate suite - the non_conf* tests pass except for one on armv6 tests
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' # bug 865443- separate suite - the non_conf* tests pass except for one on armv6 tests
diff --git a/content/canvas/test/webgl-mochitest/mochitest.ini b/content/canvas/test/webgl-mochitest/mochitest.ini
index 89cc65ba879..94c74f10020 100644
--- a/content/canvas/test/webgl-mochitest/mochitest.ini
+++ b/content/canvas/test/webgl-mochitest/mochitest.ini
@@ -15,7 +15,7 @@ support-files =
[test_webgl_available.html]
skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
[test_webgl_conformance.html]
-skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
+skip-if = buildapp == 'mulet' || toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
[test_webgl_request_context.html]
skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests
[test_webgl_request_mismatch.html]
diff --git a/content/html/content/test/forms/mochitest.ini b/content/html/content/test/forms/mochitest.ini
index c246692e552..37bcd0dd511 100644
--- a/content/html/content/test/forms/mochitest.ini
+++ b/content/html/content/test/forms/mochitest.ini
@@ -7,7 +7,7 @@ support-files =
[test_button_attributes_reflection.html]
[test_input_radio_radiogroup.html]
[test_change_event.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_datalist_element.html]
[test_experimental_forms_pref.html]
[test_form_attribute-1.html]
@@ -17,42 +17,49 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec
[test_form_attributes_reflection.html]
[test_form_named_getter_dynamic.html]
[test_formaction_attribute.html]
+skip-if = buildapp == 'mulet'
[test_formnovalidate_attribute.html]
+skip-if = buildapp == 'mulet'
[test_input_attributes_reflection.html]
[test_input_autocomplete.html]
[test_input_color_input_change_events.html]
+skip-if = buildapp == 'mulet'
[test_input_color_picker_initial.html]
+skip-if = buildapp == 'mulet'
[test_input_color_picker_popup.html]
+skip-if = buildapp == 'mulet'
[test_input_color_picker_update.html]
+skip-if = buildapp == 'mulet'
[test_input_defaultValue.html]
[test_input_email.html]
[test_input_event.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop and mulet specific, initial triage
[test_input_file_picker.html]
skip-if = buildapp == 'b2g' # b2g(5 failures out of 139 and timing out, bug 901581) b2g-debug(5 failures out of 139 and timing out, bug 901581) b2g-desktop(5 failures out of 139 and timing out, bug 901581)
[test_input_list_attribute.html]
[test_input_number_l10n.html]
# We don't build ICU for Firefox for Android or Firefox OS:
-skip-if = os == "android" || appname == "b2g"
+skip-if = buildapp == 'mulet' || os == "android" || appname == "b2g"
[test_input_number_key_events.html]
[test_input_number_mouse_events.html]
# Not run on Firefox OS and Firefox for Android where the spin buttons are hidden:
-skip-if = os == "android" || appname == "b2g"
+skip-if = os == "android" || appname == "b2g" || buildapp == "mulet"
[test_input_number_rounding.html]
-skip-if = os == "android"
+skip-if = os == "android" || buildapp == "mulet"
[test_input_number_validation.html]
# We don't build ICU for Firefox for Android or Firefox OS:
-skip-if = os == "android" || appname == "b2g"
+skip-if = buildapp == 'mulet' || os == "android" || appname == "b2g"
[test_input_range_attr_order.html]
[test_input_range_key_events.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_input_range_mouse_and_touch_events.html]
skip-if = (toolkit == 'gonk' && debug) #debug-only failure; bug 926546
[test_input_range_rounding.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_input_sanitization.html]
[test_input_textarea_set_value_no_scroll.html]
[test_input_typing_sanitization.html]
+skip-if = buildapp == 'mulet'
[test_input_untrusted_key_events.html]
[test_input_url.html]
[test_label_control_attribute.html]
diff --git a/content/html/content/test/mochitest.ini b/content/html/content/test/mochitest.ini
index 40f4da2c45b..472ad8d9506 100644
--- a/content/html/content/test/mochitest.ini
+++ b/content/html/content/test/mochitest.ini
@@ -324,14 +324,14 @@ skip-if = e10s
[test_bug610687.html]
[test_bug611189.html]
[test_bug612730.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' # b2g(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-debug(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-desktop(form control not selected/checked with synthesizeMouse, also fails on Android)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' # b2g(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-debug(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-desktop(form control not selected/checked with synthesizeMouse, also fails on Android)
[test_bug613113.html]
skip-if = buildapp == 'b2g' || e10s # b2g(bug 587671, need an invalidformsubmit observer) b2g-debug(bug 587671, need an invalidformsubmit observer) b2g-desktop(bug 587671, need an invalidformsubmit observer)
[test_bug613722.html]
[test_bug613979.html]
[test_bug615595.html]
[test_bug615833.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT # b2g(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-debug(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-desktop(form control not selected/checked with synthesizeMouse, also fails on Android)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT # b2g(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-debug(form control not selected/checked with synthesizeMouse, also fails on Android) b2g-desktop(form control not selected/checked with synthesizeMouse, also fails on Android)
[test_bug617528.html]
[test_bug618948.html]
skip-if = buildapp == 'b2g' || e10s # b2g(bug 587671, need an invalidformsubmit observer) b2g-debug(bug 587671, need an invalidformsubmit observer) b2g-desktop(bug 587671, need an invalidformsubmit observer)
@@ -432,7 +432,7 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(NS_
skip-if = toolkit == 'android'
[test_formelements.html]
[test_fullscreen-api.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(time out, some kind of focus issue) b2g-debug(time out, some kind of focus issue) b2g-desktop(time out, some kind of focus issue)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(time out, some kind of focus issue) b2g-debug(time out, some kind of focus issue) b2g-desktop(time out, some kind of focus issue)
[test_hidden.html]
[test_html_attributes_reflection.html]
[test_htmlcollection.html]
@@ -440,13 +440,13 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(tim
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_iframe_sandbox_inheritance.html]
[test_iframe_sandbox_modal.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #modal tests fail on android # b2g(modal tests fail on B2G) b2g-debug(modal tests fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #modal tests fail on android # b2g(modal tests fail on B2G) b2g-debug(modal tests fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
[test_iframe_sandbox_navigation.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #time out on b2g desktop specific
[test_iframe_sandbox_navigation2.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #time out on b2g desktop specific
[test_iframe_sandbox_plugins.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(plugins not supported) b2g-debug(plugins not supported) b2g-desktop(plugins not supported)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(plugins not supported) b2g-debug(plugins not supported) b2g-desktop(plugins not supported)
[test_iframe_sandbox_popups.html]
skip-if = buildapp == 'b2g' # b2g(multiple concurrent window.open()s fail on B2G) b2g-debug(multiple concurrent window.open()s fail on B2G) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
[test_iframe_sandbox_popups_inheritance.html]
@@ -466,12 +466,12 @@ skip-if = buildapp == 'b2g' || e10s # b2g(multiple concurrent window.open()s fai
[test_meta_attributes_reflection.html]
[test_mod_attributes_reflection.html]
[test_mozaudiochannel.html]
-skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug(Perma-orange on debug emulator) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug(Perma-orange on debug emulator) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
[test_named_options.html]
[test_nested_invalid_fieldsets.html]
[test_object_attributes_reflection.html]
[test_object_plugin_nav.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(plugins not supported) b2g-debug(plugins not supported) b2g-desktop(plugins not supported)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(plugins not supported) b2g-debug(plugins not supported) b2g-desktop(plugins not supported)
[test_ol_attributes_reflection.html]
[test_option_defaultSelected.html]
[test_option_selected_state.html]
diff --git a/content/html/document/test/mochitest.ini b/content/html/document/test/mochitest.ini
index ebcaae61372..4c138805be0 100644
--- a/content/html/document/test/mochitest.ini
+++ b/content/html/document/test/mochitest.ini
@@ -38,10 +38,10 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || toolkit == 'android' || e1
[test_bug340017.xhtml]
[test_bug359657.html]
[test_bug369370.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s
[test_bug380383.html]
[test_bug391777.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_bug402680.html]
[test_bug403868.html]
[test_bug403868.xhtml]
diff --git a/content/media/MediaDecoderStateMachine.cpp b/content/media/MediaDecoderStateMachine.cpp
index 797e96e490a..9286ec93bcb 100644
--- a/content/media/MediaDecoderStateMachine.cpp
+++ b/content/media/MediaDecoderStateMachine.cpp
@@ -1405,7 +1405,9 @@ void MediaDecoderStateMachine::Play()
void MediaDecoderStateMachine::ResetPlayback()
{
- MOZ_ASSERT(mState == DECODER_STATE_SEEKING || mState == DECODER_STATE_SHUTDOWN);
+ MOZ_ASSERT(mState == DECODER_STATE_SEEKING ||
+ mState == DECODER_STATE_SHUTDOWN ||
+ mState == DECODER_STATE_DORMANT);
mVideoFrameEndTime = -1;
mAudioStartTime = -1;
mAudioEndTime = -1;
diff --git a/content/media/gmp/GMPVideoDecoderChild.cpp b/content/media/gmp/GMPVideoDecoderChild.cpp
index 29a80f50bac..222b6355446 100644
--- a/content/media/gmp/GMPVideoDecoderChild.cpp
+++ b/content/media/gmp/GMPVideoDecoderChild.cpp
@@ -96,6 +96,14 @@ GMPVideoDecoderChild::ResetComplete()
SendResetComplete();
}
+void
+GMPVideoDecoderChild::Error(GMPErr aError)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendError(aError);
+}
+
void
GMPVideoDecoderChild::CheckThread()
{
diff --git a/content/media/gmp/GMPVideoDecoderChild.h b/content/media/gmp/GMPVideoDecoderChild.h
index a0b546d553d..947368be00b 100644
--- a/content/media/gmp/GMPVideoDecoderChild.h
+++ b/content/media/gmp/GMPVideoDecoderChild.h
@@ -36,6 +36,7 @@ public:
virtual void InputDataExhausted() MOZ_OVERRIDE;
virtual void DrainComplete() MOZ_OVERRIDE;
virtual void ResetComplete() MOZ_OVERRIDE;
+ virtual void Error(GMPErr aError) MOZ_OVERRIDE;
// GMPSharedMemManager
virtual void CheckThread();
diff --git a/content/media/gmp/GMPVideoDecoderParent.cpp b/content/media/gmp/GMPVideoDecoderParent.cpp
index e972aaa77ad..626c99f900e 100644
--- a/content/media/gmp/GMPVideoDecoderParent.cpp
+++ b/content/media/gmp/GMPVideoDecoderParent.cpp
@@ -266,6 +266,19 @@ GMPVideoDecoderParent::RecvResetComplete()
return true;
}
+bool
+GMPVideoDecoderParent::RecvError(const GMPErr& aError)
+{
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->Error(aError);
+
+ return true;
+}
+
bool
GMPVideoDecoderParent::RecvParentShmemForPool(Shmem& aEncodedBuffer)
{
diff --git a/content/media/gmp/GMPVideoDecoderParent.h b/content/media/gmp/GMPVideoDecoderParent.h
index 423568e85a5..a104dba46ee 100644
--- a/content/media/gmp/GMPVideoDecoderParent.h
+++ b/content/media/gmp/GMPVideoDecoderParent.h
@@ -70,6 +70,7 @@ private:
virtual bool RecvInputDataExhausted() MOZ_OVERRIDE;
virtual bool RecvDrainComplete() MOZ_OVERRIDE;
virtual bool RecvResetComplete() MOZ_OVERRIDE;
+ virtual bool RecvError(const GMPErr& aError) MOZ_OVERRIDE;
virtual bool RecvParentShmemForPool(Shmem& aEncodedBuffer) MOZ_OVERRIDE;
virtual bool AnswerNeedShmem(const uint32_t& aFrameBufferSize,
Shmem* aMem) MOZ_OVERRIDE;
diff --git a/content/media/gmp/GMPVideoEncodedFrameImpl.cpp b/content/media/gmp/GMPVideoEncodedFrameImpl.cpp
index 94b97d6713f..8d4a46c4011 100644
--- a/content/media/gmp/GMPVideoEncodedFrameImpl.cpp
+++ b/content/media/gmp/GMPVideoEncodedFrameImpl.cpp
@@ -51,7 +51,7 @@ GMPVideoEncodedFrameImpl::~GMPVideoEncodedFrameImpl()
}
}
-const GMPEncryptedBufferData*
+const GMPEncryptedBufferMetadata*
GMPVideoEncodedFrameImpl::GetDecryptionData() const
{
return nullptr;
diff --git a/content/media/gmp/GMPVideoEncodedFrameImpl.h b/content/media/gmp/GMPVideoEncodedFrameImpl.h
index 7f52a236e12..6e1d38e1d89 100644
--- a/content/media/gmp/GMPVideoEncodedFrameImpl.h
+++ b/content/media/gmp/GMPVideoEncodedFrameImpl.h
@@ -91,7 +91,7 @@ public:
virtual uint8_t* Buffer() MOZ_OVERRIDE;
virtual GMPBufferType BufferType() const MOZ_OVERRIDE;
virtual void SetBufferType(GMPBufferType aBufferType) MOZ_OVERRIDE;
- virtual const GMPEncryptedBufferData* GetDecryptionData() const MOZ_OVERRIDE;
+ virtual const GMPEncryptedBufferMetadata* GetDecryptionData() const MOZ_OVERRIDE;
private:
void DestroyBuffer();
diff --git a/content/media/gmp/GMPVideoEncoderChild.cpp b/content/media/gmp/GMPVideoEncoderChild.cpp
index eb49db5821e..3b1b5b92f27 100644
--- a/content/media/gmp/GMPVideoEncoderChild.cpp
+++ b/content/media/gmp/GMPVideoEncoderChild.cpp
@@ -57,6 +57,14 @@ GMPVideoEncoderChild::Encoded(GMPVideoEncodedFrame* aEncodedFrame,
aEncodedFrame->Destroy();
}
+void
+GMPVideoEncoderChild::Error(GMPErr aError)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendError(aError);
+}
+
void
GMPVideoEncoderChild::CheckThread()
{
diff --git a/content/media/gmp/GMPVideoEncoderChild.h b/content/media/gmp/GMPVideoEncoderChild.h
index 8f09a1f1828..761fe1b2980 100644
--- a/content/media/gmp/GMPVideoEncoderChild.h
+++ b/content/media/gmp/GMPVideoEncoderChild.h
@@ -32,6 +32,7 @@ public:
virtual void Encoded(GMPVideoEncodedFrame* aEncodedFrame,
const uint8_t* aCodecSpecificInfo,
uint32_t aCodecSpecificInfoLength) MOZ_OVERRIDE;
+ virtual void Error(GMPErr aError) MOZ_OVERRIDE;
// GMPSharedMemManager
virtual void CheckThread();
diff --git a/content/media/gmp/GMPVideoEncoderParent.cpp b/content/media/gmp/GMPVideoEncoderParent.cpp
index 925d524feb2..b2e411be58a 100644
--- a/content/media/gmp/GMPVideoEncoderParent.cpp
+++ b/content/media/gmp/GMPVideoEncoderParent.cpp
@@ -219,6 +219,19 @@ GMPVideoEncoderParent::RecvEncoded(const GMPVideoEncodedFrameData& aEncodedFrame
return true;
}
+bool
+GMPVideoEncoderParent::RecvError(const GMPErr& aError)
+{
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->Error(aError);
+
+ return true;
+}
+
bool
GMPVideoEncoderParent::RecvParentShmemForPool(Shmem& aFrameBuffer)
{
diff --git a/content/media/gmp/GMPVideoEncoderParent.h b/content/media/gmp/GMPVideoEncoderParent.h
index 40ae6e592d3..5482e9ac0c5 100644
--- a/content/media/gmp/GMPVideoEncoderParent.h
+++ b/content/media/gmp/GMPVideoEncoderParent.h
@@ -67,6 +67,7 @@ private:
virtual void ActorDestroy(ActorDestroyReason aWhy) MOZ_OVERRIDE;
virtual bool RecvEncoded(const GMPVideoEncodedFrameData& aEncodedFrame,
const nsTArray& aCodecSpecificInfo) MOZ_OVERRIDE;
+ virtual bool RecvError(const GMPErr& aError) MOZ_OVERRIDE;
virtual bool RecvParentShmemForPool(Shmem& aFrameBuffer) MOZ_OVERRIDE;
virtual bool AnswerNeedShmem(const uint32_t& aEncodedBufferSize,
Shmem* aMem) MOZ_OVERRIDE;
diff --git a/content/media/gmp/GMPVideoEncoderProxy.h b/content/media/gmp/GMPVideoEncoderProxy.h
index 6066c19c2aa..40e95155d60 100644
--- a/content/media/gmp/GMPVideoEncoderProxy.h
+++ b/content/media/gmp/GMPVideoEncoderProxy.h
@@ -15,6 +15,7 @@ class GMPVideoEncoderCallbackProxy {
public:
virtual void Encoded(GMPVideoEncodedFrame* aEncodedFrame,
const nsTArray& aCodecSpecificInfo) = 0;
+ virtual void Error(GMPErr aError) = 0;
};
// A proxy to GMPVideoEncoder in the child process.
diff --git a/content/media/gmp/PGMPVideoDecoder.ipdl b/content/media/gmp/PGMPVideoDecoder.ipdl
index b40512a0617..c25a9881b71 100644
--- a/content/media/gmp/PGMPVideoDecoder.ipdl
+++ b/content/media/gmp/PGMPVideoDecoder.ipdl
@@ -7,6 +7,7 @@ include protocol PGMP;
include GMPTypes;
using GMPVideoCodec from "gmp-video-codec.h";
+using GMPErr from "gmp-errors.h";
include "GMPMessageUtils.h";
@@ -37,6 +38,7 @@ parent:
async InputDataExhausted();
async DrainComplete();
async ResetComplete();
+ async Error(GMPErr aErr);
async ParentShmemForPool(Shmem aEncodedBuffer);
// MUST be intr - if sync and we create a new Shmem, when the returned
// Shmem is received in the Child it will fail to Deserialize
diff --git a/content/media/gmp/PGMPVideoEncoder.ipdl b/content/media/gmp/PGMPVideoEncoder.ipdl
index d209b5b57bf..f7b910bac13 100644
--- a/content/media/gmp/PGMPVideoEncoder.ipdl
+++ b/content/media/gmp/PGMPVideoEncoder.ipdl
@@ -8,6 +8,7 @@ include GMPTypes;
using GMPVideoCodec from "gmp-video-codec.h";
using GMPVideoFrameType from "gmp-video-frame-encoded.h";
+using GMPErr from "gmp-errors.h";
include "GMPMessageUtils.h";
@@ -35,6 +36,7 @@ parent:
async __delete__();
async Encoded(GMPVideoEncodedFrameData aEncodedFrame,
uint8_t[] aCodecSpecificInfo);
+ async Error(GMPErr aErr);
async ParentShmemForPool(Shmem aFrameBuffer);
// MUST be intr - if sync and we create a new Shmem, when the returned
// Shmem is received in the Child it will fail to Deserialize
diff --git a/content/media/gmp/gmp-api/gmp-audio-decode.h b/content/media/gmp/gmp-api/gmp-audio-decode.h
index d5b05ac4570..03a5402c6f0 100644
--- a/content/media/gmp/gmp-api/gmp-audio-decode.h
+++ b/content/media/gmp/gmp-api/gmp-audio-decode.h
@@ -35,6 +35,10 @@ public:
virtual void DrainComplete() = 0;
virtual void ResetComplete() = 0;
+
+ // Called when the decoder encounters a catestrophic error and cannot
+ // continue. Gecko will not send any more input for decoding.
+ virtual void Error(GMPErr aError) = 0;
};
// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
@@ -46,24 +50,24 @@ public:
// aCallback: Subclass should retain reference to it until DecodingComplete
// is called. Do not attempt to delete it, host retains ownership.
// TODO: Pass AudioHost so decoder can create GMPAudioEncodedFrame objects?
- virtual GMPErr InitDecode(const GMPAudioCodec& aCodecSettings,
- GMPAudioDecoderCallback* aCallback) = 0;
+ virtual void InitDecode(const GMPAudioCodec& aCodecSettings,
+ GMPAudioDecoderCallback* aCallback) = 0;
// Decode encoded audio frames (as a part of an audio stream). The decoded
// frames must be returned to the user through the decode complete callback.
- virtual GMPErr Decode(GMPAudioSamples* aEncodedSamples) = 0;
+ virtual void Decode(GMPAudioSamples* aEncodedSamples) = 0;
// Reset decoder state and prepare for a new call to Decode(...).
// Flushes the decoder pipeline.
// The decoder should enqueue a task to run ResetComplete() on the main
// thread once the reset has finished.
- virtual GMPErr Reset() = 0;
+ virtual void Reset() = 0;
// Output decoded frames for any data in the pipeline, regardless of ordering.
// All remaining decoded frames should be immediately returned via callback.
// The decoder should enqueue a task to run DrainComplete() on the main
// thread once the reset has finished.
- virtual GMPErr Drain() = 0;
+ virtual void Drain() = 0;
// May free decoder memory.
virtual void DecodingComplete() = 0;
diff --git a/content/media/gmp/gmp-api/gmp-audio-samples.h b/content/media/gmp/gmp-api/gmp-audio-samples.h
index abf574c2d7c..4edbf7d8bc4 100644
--- a/content/media/gmp/gmp-api/gmp-audio-samples.h
+++ b/content/media/gmp/gmp-api/gmp-audio-samples.h
@@ -49,9 +49,9 @@ public:
virtual const uint8_t* Buffer() const = 0;
virtual uint8_t* Buffer() = 0;
- // Get data describing how this frame is encrypted, or nullptr if the
+ // Get metadata describing how this frame is encrypted, or nullptr if the
// buffer is not encrypted.
- virtual const GMPEncryptedBufferData* GetDecryptionData() const = 0;
+ virtual const GMPEncryptedBufferMetadata* GetDecryptionData() const = 0;
};
#endif // GMP_AUDIO_FRAME_h_
diff --git a/content/media/gmp/gmp-api/gmp-decryption.h b/content/media/gmp/gmp-api/gmp-decryption.h
index 141d8b0c6ba..67de939f24e 100644
--- a/content/media/gmp/gmp-api/gmp-decryption.h
+++ b/content/media/gmp/gmp-api/gmp-decryption.h
@@ -19,7 +19,7 @@
#include "gmp-platform.h"
-class GMPEncryptedBufferData {
+class GMPEncryptedBufferMetadata {
public:
// Key ID to identify the decryption key.
virtual const uint8_t* KeyId() const = 0;
@@ -33,14 +33,23 @@ public:
// Size (in bytes) of |IV|.
virtual uint32_t IVSize() const = 0;
- // Number of enties returned by ClearBytes and CipherBytes().
+ // Number of entries returned by ClearBytes() and CipherBytes().
virtual uint32_t NumSubsamples() const = 0;
- virtual const uint32_t* ClearBytes() const = 0;
+ virtual const uint16_t* ClearBytes() const = 0;
virtual const uint32_t* CipherBytes() const = 0;
};
+class GMPBuffer {
+public:
+ virtual uint32_t Id() const = 0;
+ virtual uint8_t* Data() = 0;
+ virtual uint32_t Size() const = 0;
+ virtual void Resize(uint32_t aSize) = 0;
+ virtual ~GMPBuffer() {}
+};
+
// These match to the DOMException codes as per:
// http://www.w3.org/TR/dom/#domexception
enum GMPDOMException {
@@ -60,71 +69,106 @@ enum GMPDOMException {
// Time in milliseconds, as offset from epoch, 1 Jan 1970.
typedef int64_t GMPTimestamp;
+// Capability definitions. The capabilities of the EME GMP are reported
+// to Gecko by calling the GMPDecryptorCallback::SetCapabilities()
+// callback and specifying the logical OR of the GMP_EME_CAP_* flags below.
+//
+// Note the DECRYPT and the DECRYPT_AND_DECODE are mutually exclusive;
+// only one mode should be reported for each stream type, but different
+// modes can be reported for different stream types.
+//
+// Note: Gecko does not currently support the caps changing at runtime.
+// Set them once per plugin initialization, during the startup of
+// the GMPdecryptor.
+
+// Capability; CDM can decrypt encrypted buffers and return still
+// compressed buffers back to Gecko for decompression there.
+#define GMP_EME_CAP_DECRYPT_AUDIO (uint64_t(1) << 0)
+#define GMP_EME_CAP_DECRYPT_VIDEO (uint64_t(1) << 1)
+
+// Capability; CDM can decrypt and then decode encrypted buffers,
+// and return decompressed samples to Gecko for playback.
+#define GMP_EME_CAP_DECRYPT_AND_DECODE_AUDIO (uint64_t(1) << 2)
+#define GMP_EME_CAP_DECRYPT_AND_DECODE_VIDEO (uint64_t(1) << 3)
+
class GMPDecryptorCallback {
public:
// Resolves a promise for a session created or loaded.
// Passes the session id to be exposed to JavaScript.
- // Must be called before OnSessionMessage().
+ // Must be called before SessionMessage().
// aSessionId must be null terminated.
- virtual void OnResolveNewSessionPromise(uint32_t aPromiseId,
- const char* aSessionId,
- uint32_t aSessionIdLength) = 0;
+ virtual void ResolveNewSessionPromise(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
// Called to resolve a specified promise with "undefined".
- virtual void OnResolvePromise(uint32_t aPromiseId) = 0;
+ virtual void ResolvePromise(uint32_t aPromiseId) = 0;
// Called to reject a promise with a DOMException.
// aMessage is logged to the WebConsole.
// aMessage is optional, but if present must be null terminated.
- virtual void OnRejectPromise(uint32_t aPromiseId,
- GMPDOMException aException,
- const char* aMessage,
- uint32_t aMessageLength) = 0;
+ virtual void RejectPromise(uint32_t aPromiseId,
+ GMPDOMException aException,
+ const char* aMessage,
+ uint32_t aMessageLength) = 0;
// Called by the CDM when it has a message for session |session_id|.
// Length parameters should not include null termination.
// aSessionId must be null terminated.
- virtual void OnSessionMessage(const char* aSessionId,
- uint32_t aSessionIdLength,
- const uint8_t* aMessage,
- uint32_t aMessageLength,
- const char* aDestinationURL,
- uint32_t aDestinationURLLength) = 0;
+ virtual void SessionMessage(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aMessage,
+ uint32_t aMessageLength,
+ const char* aDestinationURL,
+ uint32_t aDestinationURLLength) = 0;
// aSessionId must be null terminated.
- virtual void OnExpirationChange(const char* aSessionId,
- uint32_t aSessionIdLength,
- GMPTimestamp aExpiryTime) = 0;
+ virtual void ExpirationChange(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPTimestamp aExpiryTime) = 0;
// Called by the GMP when a session is closed. All file IO
// that a session requires should be complete before calling this.
// aSessionId must be null terminated.
- virtual void OnSessionClosed(const char* aSessionId,
- uint32_t aSessionIdLength) = 0;
+ virtual void SessionClosed(const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
// Called by the GMP when an error occurs in a session.
// aSessionId must be null terminated.
// aMessage is logged to the WebConsole.
// aMessage is optional, but if present must be null terminated.
- virtual void OnSessionError(const char* aSessionId,
- uint32_t aSessionIdLength,
- GMPDOMException aException,
- uint32_t aSystemCode,
- const char* aMessage,
- uint32_t aMessageLength) = 0;
+ virtual void SessionError(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPDOMException aException,
+ uint32_t aSystemCode,
+ const char* aMessage,
+ uint32_t aMessageLength) = 0;
- virtual void OnKeyIdUsable(const char* aSessionId,
- uint32_t aSessionIdLength,
- const uint8_t* aKeyId,
- uint32_t aKeyIdLength) = 0;
+ // Marks a key as usable. Gecko will not call into the CDM to decrypt
+ // or decode content encrypted with a key unless the CDM has marked it
+ // usable first. So a CDM *MUST* mark its usable keys as usable!
+ virtual void KeyIdUsable(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aKeyId,
+ uint32_t aKeyIdLength) = 0;
// Marks a key as no longer usable.
// Note: Keys are assumed to be not usable when a session is closed or removed.
- virtual void OnKeyIdNotUsable(const char* aSessionId,
- uint32_t aSessionIdLength,
- const uint8_t* aKeyId,
- uint32_t aKeyIdLength) = 0;
+ virtual void KeyIdNotUsable(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aKeyId,
+ uint32_t aKeyIdLength) = 0;
+ // The CDM must report its capabilites of this CDM. aCaps should be a
+ // logical OR of the GMP_EME_CAP_* flags. The CDM *MUST* call this
+ // function and report whether it can decrypt and/or decode. Without
+ // this, Gecko does not know how to use the CDM and will not send
+ // samples to the CDM to decrypt or decrypt-and-decode mode. Note a
+ // CDM cannot change modes once playback has begun.
+ virtual void SetCapabilities(uint64_t aCaps) = 0;
+
+ // Returns decrypted buffer to Gecko, or reports failure.
+ virtual void Decrypted(GMPBuffer* aBuffer, GMPErr aResult) = 0;
};
// Host interface, passed to GetAPIFunc(), with "decrypt".
@@ -166,10 +210,14 @@ public:
virtual void Init(GMPDecryptorCallback* aCallback) = 0;
// Requests the creation of a session given |aType| and |aInitData|.
- // Decryptor should callback GMPDecryptorCallback::OnSessionCreated()
- // with the web session ID on success, or OnSessionError() on failure,
- // and then call OnSessionReady() once all keys for that session are
- // available.
+ // Decryptor should callback GMPDecryptorCallback::SessionCreated()
+ // with the web session ID on success, or SessionError() on failure,
+ // and then call KeyIdUsable() as keys for that session become
+ // usable.
+ //
+ // The CDM must also call GMPDecryptorCallback::SetCapabilities()
+ // exactly once during start up, to inform Gecko whether to use the CDM
+ // in decrypt or decrypt-and-decode mode.
virtual void CreateSession(uint32_t aPromiseId,
const char* aInitDataType,
uint32_t aInitDataTypeSize,
@@ -203,6 +251,19 @@ public:
virtual void SetServerCertificate(uint32_t aPromiseId,
const uint8_t* aServerCert,
uint32_t aServerCertSize) = 0;
+
+ // Asynchronously decrypts aBuffer in place. When the decryption is
+ // complete, GMPDecryptor should write the decrypted data back into the
+ // same GMPBuffer object and return it to Gecko by calling Decrypted(),
+ // with the GMPNoErr successcode. If decryption fails, call Decrypted()
+ // with a failure code, and an error event will fire on the media element.
+ virtual void Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata) = 0;
+
+ // Called when the decryption operations are complete.
+ // Do not call the GMPDecryptorCallback's functions after this is called.
+ virtual void DecryptingComplete() = 0;
+
};
#endif // GMP_DECRYPTION_h_
diff --git a/content/media/gmp/gmp-api/gmp-errors.h b/content/media/gmp/gmp-api/gmp-errors.h
index 8165abbe14a..b5d0074d227 100644
--- a/content/media/gmp/gmp-api/gmp-errors.h
+++ b/content/media/gmp/gmp-api/gmp-errors.h
@@ -39,8 +39,12 @@ typedef enum {
GMPClosedErr = 2,
GMPAllocErr = 3,
GMPNotImplementedErr = 4,
- GMPNotClosedErr = 5,
+ GMPRecordInUse = 5,
GMPQuotaExceededErr = 6,
+ GMPDecodeErr = 7,
+ GMPEncodeErr = 8,
+ GMPNoKeyErr = 9,
+ GMPCryptoErr = 10,
GMPLastErr // Placeholder, must be last. This enum's values must remain consecutive!
} GMPErr;
diff --git a/content/media/gmp/gmp-api/gmp-storage.h b/content/media/gmp/gmp-api/gmp-storage.h
index f558096c15a..6ca8872cab9 100644
--- a/content/media/gmp/gmp-api/gmp-storage.h
+++ b/content/media/gmp/gmp-api/gmp-storage.h
@@ -21,30 +21,31 @@
#include
// Provides basic per-origin storage for CDMs. GMPRecord instances can be
-// retrieved by calling GMPPlatformAPI->openstorage. Multiple GMPRecord
-// can be open at once. This interface is asynchronous, with results
-// being returned via callbacks to the GMPRecordClient pointer provided
-// to the GMPPlatformAPI->openstorage call, on the main thread.
+// retrieved by calling GMPPlatformAPI->openstorage. Multiple GMPRecords
+// with different names can be open at once, but a single record can only
+// be opened by one client at a time. This interface is asynchronous, with
+// results being returned via callbacks to the GMPRecordClient pointer
+// provided to the GMPPlatformAPI->openstorage call, on the main thread.
class GMPRecord {
public:
- // Opens the record. Calls OnOpenComplete() once the record is open.
- // Note: OnReadComplete() is only called if this returns GMPNoErr.
+ // Opens the record. Calls OpenComplete() once the record is open.
+ // Note: OpenComplete() is only called if this returns GMPNoErr.
virtual GMPErr Open() = 0;
- // Reads the entire contents of the file, and calls
- // GMPRecordClient::OnReadComplete() once the operation is complete.
- // Note: OnReadComplete() is only called if this returns GMPNoErr.
+ // Reads the entire contents of the record, and calls
+ // GMPRecordClient::ReadComplete() once the operation is complete.
+ // Note: ReadComplete() is only called if this returns GMPNoErr.
virtual GMPErr Read() = 0;
- // Writes aDataSize bytes of aData into the file, overwritting the contents
- // of the file. Overwriting with 0 bytes "deletes" the file.
- // Write 0 bytes to "delete" a file.
- // Note: OnWriteComplete is only called if this returns GMPNoErr.
+ // Writes aDataSize bytes of aData into the record, overwriting the
+ // contents of the record. Overwriting with 0 bytes "deletes" the file.
+ // Note: WriteComplete is only called if this returns GMPNoErr.
virtual GMPErr Write(const uint8_t* aData, uint32_t aDataSize) = 0;
- // Closes a file. File must not be used after this is called. Cancels all
- // callbacks.
+ // Closes a record. GMPRecord object must not be used after this is
+ // called, request a new one with GMPPlatformAPI->openstorage to re-open
+ // this record. Cancels all callbacks.
virtual GMPErr Close() = 0;
virtual ~GMPRecord() {}
@@ -57,32 +58,34 @@ class GMPRecordClient {
// Response to a GMPRecord::Open() call with the open |status|.
// aStatus values:
- // - GMPNoErr - File opened successfully. File may be empty.
- // - GMPFileInUse - There file is in use by another client.
+ // - GMPNoErr - Record opened successfully. Record may be empty.
+ // - GMPRecordInUse - This record is in use by another client.
// - GMPGenericErr - Unspecified error.
// Do not use the GMPRecord if aStatus is not GMPNoErr.
- virtual void OnOpenComplete(GMPErr aStatus) = 0;
+ virtual void OpenComplete(GMPErr aStatus) = 0;
- // Response to a GMPRecord::Read() call, where aData is the file contents,
+ // Response to a GMPRecord::Read() call, where aData is the record contents,
// of length aDataSize.
- // aData is only valid for the duration of the call to OnReadComplete.
+ // aData is only valid for the duration of the call to ReadComplete.
// Copy it if you want to hang onto it!
// aStatus values:
- // - GMPNoErr - File contents read successfully, aDataSize 0 means file
+ // - GMPNoErr - Record contents read successfully, aDataSize 0 means record
// is empty.
- // - GMPFileInUse - There are other operations or clients in use on this file.
+ // - GMPRecordInUse - There are other operations or clients in use on
+ // this record.
// - GMPGenericErr - Unspecified error.
// Do not continue to use the GMPRecord if aStatus is not GMPNoErr.
- virtual void OnReadComplete(GMPErr aStatus,
- const uint8_t* aData,
- uint32_t aDataSize) = 0;
+ virtual void ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize) = 0;
// Response to a GMPRecord::Write() call.
// - GMPNoErr - File contents written successfully.
- // - GMPFileInUse - There are other operations or clients in use on this file.
- // - GMPGenericErr - Unspecified error. File should be regarded as corrupt.
+ // - GMPRecordInUse - There are other operations or clients in use on
+ // this record.
+ // - GMPGenericErr - Unspecified error.
// Do not continue to use the GMPRecord if aStatus is not GMPNoErr.
- virtual void OnWriteComplete(GMPErr aStatus) = 0;
+ virtual void WriteComplete(GMPErr aStatus) = 0;
virtual ~GMPRecordClient() {}
};
diff --git a/content/media/gmp/gmp-api/gmp-video-decode.h b/content/media/gmp/gmp-api/gmp-video-decode.h
index 1873f4b0ac1..40363060b17 100644
--- a/content/media/gmp/gmp-api/gmp-video-decode.h
+++ b/content/media/gmp/gmp-api/gmp-video-decode.h
@@ -57,6 +57,10 @@ public:
virtual void DrainComplete() = 0;
virtual void ResetComplete() = 0;
+
+ // Called when the decoder encounters a catestrophic error and cannot
+ // continue. Gecko will not send any more input for decoding.
+ virtual void Error(GMPErr aError) = 0;
};
// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
@@ -72,11 +76,11 @@ public:
// - aCallback: Subclass should retain reference to it until DecodingComplete
// is called. Do not attempt to delete it, host retains ownership.
// aCoreCount: number of CPU cores.
- virtual GMPErr InitDecode(const GMPVideoCodec& aCodecSettings,
- const uint8_t* aCodecSpecific,
- uint32_t aCodecSpecificLength,
- GMPVideoDecoderCallback* aCallback,
- int32_t aCoreCount) = 0;
+ virtual void InitDecode(const GMPVideoCodec& aCodecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificLength,
+ GMPVideoDecoderCallback* aCallback,
+ int32_t aCoreCount) = 0;
// Decode encoded frame (as a part of a video stream). The decoded frame
// will be returned to the user through the decode complete callback.
@@ -90,23 +94,23 @@ public:
// - aCodecSpecificInfoLength : number of bytes in aCodecSpecificInfo
// - renderTimeMs : System time to render in milliseconds. Only used by
// decoders with internal rendering.
- virtual GMPErr Decode(GMPVideoEncodedFrame* aInputFrame,
- bool aMissingFrames,
- const uint8_t* aCodecSpecificInfo,
- uint32_t aCodecSpecificInfoLength,
- int64_t aRenderTimeMs = -1) = 0;
+ virtual void Decode(GMPVideoEncodedFrame* aInputFrame,
+ bool aMissingFrames,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ int64_t aRenderTimeMs = -1) = 0;
// Reset decoder state and prepare for a new call to Decode(...).
// Flushes the decoder pipeline.
// The decoder should enqueue a task to run ResetComplete() on the main
// thread once the reset has finished.
- virtual GMPErr Reset() = 0;
+ virtual void Reset() = 0;
// Output decoded frames for any data in the pipeline, regardless of ordering.
// All remaining decoded frames should be immediately returned via callback.
// The decoder should enqueue a task to run DrainComplete() on the main
// thread once the reset has finished.
- virtual GMPErr Drain() = 0;
+ virtual void Drain() = 0;
// May free decoder memory.
virtual void DecodingComplete() = 0;
diff --git a/content/media/gmp/gmp-api/gmp-video-encode.h b/content/media/gmp/gmp-api/gmp-video-encode.h
index e91da187ffe..08fc39f130b 100644
--- a/content/media/gmp/gmp-api/gmp-video-encode.h
+++ b/content/media/gmp/gmp-api/gmp-video-encode.h
@@ -51,6 +51,10 @@ public:
virtual void Encoded(GMPVideoEncodedFrame* aEncodedFrame,
const uint8_t* aCodecSpecificInfo,
uint32_t aCodecSpecificInfoLength) = 0;
+
+ // Called when the encoder encounters a catestrophic error and cannot
+ // continue. Gecko will not send any more input for encoding.
+ virtual void Error(GMPErr aError) = 0;
};
// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
@@ -72,12 +76,12 @@ public:
// - aNnumberOfCores : Number of cores available for the encoder
// - aMaxPayloadSize : The maximum size each payload is allowed
// to have. Usually MTU - overhead.
- virtual GMPErr InitEncode(const GMPVideoCodec& aCodecSettings,
- const uint8_t* aCodecSpecific,
- uint32_t aCodecSpecificLength,
- GMPVideoEncoderCallback* aCallback,
- int32_t aNumberOfCores,
- uint32_t aMaxPayloadSize) = 0;
+ virtual void InitEncode(const GMPVideoCodec& aCodecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificLength,
+ GMPVideoEncoderCallback* aCallback,
+ int32_t aNumberOfCores,
+ uint32_t aMaxPayloadSize) = 0;
// Encode an I420 frame (as a part of a video stream). The encoded frame
// will be returned to the user through the encode complete callback.
@@ -90,11 +94,11 @@ public:
// - aCodecSpecificInfoLength : number of bytes in aCodecSpecific
// - aFrameTypes : The frame type to encode
// - aFrameTypesLength : The number of elements in aFrameTypes array.
- virtual GMPErr Encode(GMPVideoi420Frame* aInputFrame,
- const uint8_t* aCodecSpecificInfo,
- uint32_t aCodecSpecificInfoLength,
- const GMPVideoFrameType* aFrameTypes,
- uint32_t aFrameTypesLength) = 0;
+ virtual void Encode(GMPVideoi420Frame* aInputFrame,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ const GMPVideoFrameType* aFrameTypes,
+ uint32_t aFrameTypesLength) = 0;
// Inform the encoder about the packet loss and round trip time on the
// network used to decide the best pattern and signaling.
@@ -102,19 +106,19 @@ public:
// - packetLoss : Fraction lost (loss rate in percent =
// 100 * packetLoss / 255)
// - rtt : Round-trip time in milliseconds
- virtual GMPErr SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT) = 0;
+ virtual void SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT) = 0;
// Inform the encoder about the new target bit rate.
//
// - newBitRate : New target bit rate
// - frameRate : The target frame rate
- virtual GMPErr SetRates(uint32_t aNewBitRate, uint32_t aFrameRate) = 0;
+ virtual void SetRates(uint32_t aNewBitRate, uint32_t aFrameRate) = 0;
// Use this function to enable or disable periodic key frames. Can be useful for codecs
// which have other ways of stopping error propagation.
//
// - enable : Enable or disable periodic key frames
- virtual GMPErr SetPeriodicKeyFrames(bool aEnable) = 0;
+ virtual void SetPeriodicKeyFrames(bool aEnable) = 0;
// May free Encoder memory.
virtual void EncodingComplete() = 0;
diff --git a/content/media/gmp/gmp-api/gmp-video-frame-encoded.h b/content/media/gmp/gmp-api/gmp-video-frame-encoded.h
index bb4475543f9..522d47570c2 100644
--- a/content/media/gmp/gmp-api/gmp-video-frame-encoded.h
+++ b/content/media/gmp/gmp-api/gmp-video-frame-encoded.h
@@ -90,9 +90,9 @@ public:
virtual GMPBufferType BufferType() const = 0;
virtual void SetBufferType(GMPBufferType aBufferType) = 0;
- // Get data describing how this frame is encrypted, or nullptr if the
+ // Get metadata describing how this frame is encrypted, or nullptr if the
// frame is not encrypted.
- virtual const GMPEncryptedBufferData* GetDecryptionData() const = 0;
+ virtual const GMPEncryptedBufferMetadata* GetDecryptionData() const = 0;
};
#endif // GMP_VIDEO_FRAME_ENCODED_h_
diff --git a/content/media/mediasource/MediaSourceDecoder.cpp b/content/media/mediasource/MediaSourceDecoder.cpp
index 14958690cf4..3abd0fb8f95 100644
--- a/content/media/mediasource/MediaSourceDecoder.cpp
+++ b/content/media/mediasource/MediaSourceDecoder.cpp
@@ -24,6 +24,11 @@
#include "SourceBufferList.h"
#include "VideoUtils.h"
+#ifdef MOZ_FMP4
+#include "MP4Decoder.h"
+#include "MP4Reader.h"
+#endif
+
#ifdef PR_LOGGING
extern PRLogModuleInfo* gMediaSourceLog;
#define MSE_DEBUG(...) PR_LOG(gMediaSourceLog, PR_LOG_DEBUG, (__VA_ARGS__))
@@ -418,6 +423,23 @@ MediaSourceReader::InitializePendingDecoders()
mDecoder->NotifyWaitingForResourcesStatusChanged();
}
+MediaDecoderReader*
+CreateReaderForType(const nsACString& aType, AbstractMediaDecoder* aDecoder)
+{
+#ifdef MOZ_FMP4
+ // The MP4Reader that supports fragmented MP4 and uses
+ // PlatformDecoderModules is hidden behind prefs for regular video
+ // elements, but we always want to use it for MSE, so instantiate it
+ // directly here.
+ if ((aType.LowerCaseEqualsLiteral("video/mp4") ||
+ aType.LowerCaseEqualsLiteral("audio/mp4")) &&
+ MP4Decoder::IsEnabled()) {
+ return new MP4Reader(aDecoder);
+ }
+#endif
+ return DecoderTraits::CreateReader(aType, aDecoder);
+}
+
already_AddRefed
MediaSourceReader::CreateSubDecoder(const nsACString& aType,
MediaSourceDecoder* aParentDecoder,
@@ -426,7 +448,7 @@ MediaSourceReader::CreateSubDecoder(const nsACString& aType,
// XXX: Why/when is mDecoder null here, since it should be equal to aParentDecoder?!
nsRefPtr decoder =
new SubBufferDecoder(new SourceBufferResource(nullptr, aType), aParentDecoder);
- nsRefPtr reader(DecoderTraits::CreateReader(aType, decoder));
+ nsRefPtr reader(CreateReaderForType(aType, decoder));
if (!reader) {
return nullptr;
}
diff --git a/content/media/omx/moz.build b/content/media/omx/moz.build
index e1fe5abba56..922f264c719 100644
--- a/content/media/omx/moz.build
+++ b/content/media/omx/moz.build
@@ -48,7 +48,7 @@ if 'rtsp' in CONFIG['NECKO_PROTOCOLS']:
'RtspOmxReader.cpp',
]
-if CONFIG['ANDROID_VERSION'] and int(CONFIG['ANDROID_VERSION']) >= 18:
+if CONFIG['ANDROID_VERSION'] >= '18':
EXPORTS += [
'I420ColorConverterHelper.h',
'MediaCodecDecoder.h',
diff --git a/content/media/test/mochitest.ini b/content/media/test/mochitest.ini
index 0b5ae364a87..b009707c2dd 100644
--- a/content/media/test/mochitest.ini
+++ b/content/media/test/mochitest.ini
@@ -22,7 +22,7 @@
# do ok(true, "Type not supported") and stop the test.
[DEFAULT]
-skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug,b2g-desktop(bug 918299)
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug,b2g-desktop(bug 918299)
support-files =
320x240.ogv
320x240.ogv^headers^
@@ -306,7 +306,7 @@ skip-if = true # bug 475110 - disabled since we don't play Wave files standalone
[test_autoplay_contentEditable.html]
[test_buffered.html]
[test_bug448534.html]
-skip-if = os == 'win' # bug 894922
+skip-if = buildapp == 'mulet' || os == 'win' # bug 894922
[test_bug463162.xhtml]
[test_bug465498.html]
[test_bug493187.html]
diff --git a/content/media/webspeech/recognition/test/mochitest.ini b/content/media/webspeech/recognition/test/mochitest.ini
index 7e4b3143031..fb70608fd2c 100644
--- a/content/media/webspeech/recognition/test/mochitest.ini
+++ b/content/media/webspeech/recognition/test/mochitest.ini
@@ -10,7 +10,7 @@ support-files =
[test_audio_capture_error.html]
[test_call_start_from_end_handler.html]
[test_nested_eventloop.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog)
[test_preference_enable.html]
[test_recognition_service_error.html]
skip-if = buildapp == 'b2g' # b2g(timed out)
diff --git a/content/svg/content/test/mochitest.ini b/content/svg/content/test/mochitest.ini
index 30a668c6a71..4f5a87d0e1e 100644
--- a/content/svg/content/test/mochitest.ini
+++ b/content/svg/content/test/mochitest.ini
@@ -86,7 +86,7 @@ skip-if = true
[test_text_lengthAdjust.html]
[test_text_scaled.html]
[test_text_selection.html]
-skip-if = buildapp == 'b2g' # b2g(Mouse selection not workin on b2g) b2g-debug(Mouse selection not workin on b2g) b2g-desktop(Mouse selection not workin on b2g)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' # b2g(Mouse selection not workin on b2g) b2g-debug(Mouse selection not workin on b2g) b2g-desktop(Mouse selection not workin on b2g)
[test_text_update.html]
[test_transform.xhtml]
[test_transformParsing.html]
diff --git a/content/xul/content/test/mochitest.ini b/content/xul/content/test/mochitest.ini
index c6ae56a8226..2ca10f272b5 100644
--- a/content/xul/content/test/mochitest.ini
+++ b/content/xul/content/test/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = buildapp == 'b2g' #tests that use xul
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' #tests that use xul
[test_bug486990.xul]
skip-if = toolkit == 'android' #TIMED_OUT
diff --git a/content/xul/templates/tests/chrome/chrome.ini b/content/xul/templates/tests/chrome/chrome.ini
index 21db61762b5..2c1da41317b 100644
--- a/content/xul/templates/tests/chrome/chrome.ini
+++ b/content/xul/templates/tests/chrome/chrome.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == 'mulet'
support-files =
animals.rdf
animals.sqlite
diff --git a/docshell/test/browser/browser.ini b/docshell/test/browser/browser.ini
index 682ebd2de13..b6a9b035dc5 100644
--- a/docshell/test/browser/browser.ini
+++ b/docshell/test/browser/browser.ini
@@ -72,8 +72,9 @@ skip-if = e10s # Bug 933103 - mochitest's EventUtils.synthesizeMouse functions n
[browser_bug422543.js]
skip-if = e10s # Bug ?????? - obscure test failures (shistory has a new entry - Got initial, expected newentry)
[browser_bug441169.js]
+skip-if = buildapp == 'mulet'
[browser_bug503832.js]
-skip-if = e10s # Bug 933103 - mochitest's EventUtils.synthesizeMouse functions not e10s friendly
+skip-if = buildapp == 'mulet' || e10s # Bug 933103 - mochitest's EventUtils.synthesizeMouse functions not e10s friendly
[browser_bug554155.js]
[browser_bug655270.js]
skip-if = e10s # Bug ?????? - PlacesUtils.history.addObserver notifications don't seem to fire
diff --git a/docshell/test/chrome/chrome.ini b/docshell/test/chrome/chrome.ini
index 6a756a453c5..585a45aead1 100644
--- a/docshell/test/chrome/chrome.ini
+++ b/docshell/test/chrome/chrome.ini
@@ -56,10 +56,12 @@ support-files =
[test_bug301397.xul]
[test_bug303267.xul]
[test_bug311007.xul]
+skip-if = buildapp == 'mulet'
[test_bug321671.xul]
[test_bug360511.xul]
[test_bug364461.xul]
[test_bug396519.xul]
+skip-if = buildapp == 'mulet'
[test_bug396649.xul]
[test_bug428288.html]
[test_bug449778.xul]
diff --git a/docshell/test/mochitest.ini b/docshell/test/mochitest.ini
index 3a46fc3e35d..385dd0c0f89 100644
--- a/docshell/test/mochitest.ini
+++ b/docshell/test/mochitest.ini
@@ -40,7 +40,7 @@ support-files =
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug123696.html]
[test_bug369814.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug384014.html]
[test_bug385434.html]
[test_bug387979.html]
@@ -57,9 +57,9 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec
skip-if = toolkit != "cocoa" || e10s
support-files = file_bug511449.html
[test_bug529119-1.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug529119-2.html]
-skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug(debug-only failure) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) # b2g-debug(debug-only failure) b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
[test_bug530396.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Timeouts on B2G desktop
support-files = bug530396-noref.sjs bug530396-subframe.html
diff --git a/dom/alarm/test/mochitest.ini b/dom/alarm/test/mochitest.ini
index 0110820eda9..f54189afe01 100644
--- a/dom/alarm/test/mochitest.ini
+++ b/dom/alarm/test/mochitest.ini
@@ -5,16 +5,16 @@ support-files =
file_empty.html
[test_alarm_add_data.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_alarm_add_date.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_alarm_add_respectTimezone.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_alarm_non_permitted_app.html]
[test_alarm_permitted_app.html]
[test_alarm_remove.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug1015540.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug1037079.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
diff --git a/dom/animation/AnimationTimeline.cpp b/dom/animation/AnimationTimeline.cpp
index 7d190e80e9a..15bc3f23a22 100644
--- a/dom/animation/AnimationTimeline.cpp
+++ b/dom/animation/AnimationTimeline.cpp
@@ -5,7 +5,6 @@
#include "AnimationTimeline.h"
#include "mozilla/dom/AnimationTimelineBinding.h"
-#include "mozilla/TimeStamp.h"
#include "nsContentUtils.h"
#include "nsIPresShell.h"
#include "nsPresContext.h"
@@ -36,7 +35,18 @@ TimeStamp
AnimationTimeline::GetCurrentTimeStamp() const
{
// Always return the same object to benefit from return-value optimization.
- TimeStamp result; // Initializes to null timestamp
+ TimeStamp result = mLastCurrentTime;
+
+ // If we've never been sampled, initialize the current time to the timeline's
+ // zero time since that is the time we'll use if we don't have a refresh
+ // driver.
+ if (result.IsNull()) {
+ nsRefPtr timing = mDocument->GetNavigationTiming();
+ if (!timing) {
+ return result;
+ }
+ result = timing->GetNavigationStartTimeStamp();
+ }
nsIPresShell* presShell = mDocument->GetShell();
if (MOZ_UNLIKELY(!presShell)) {
@@ -49,6 +59,11 @@ AnimationTimeline::GetCurrentTimeStamp() const
}
result = presContext->RefreshDriver()->MostRecentRefresh();
+ // FIXME: We would like to assert that:
+ // mLastCurrentTime.IsNull() || result >= mLastCurrentTime
+ // but due to bug 1043078 this will not be the case when the refresh driver
+ // is restored from test control.
+ mLastCurrentTime = result;
return result;
}
diff --git a/dom/animation/AnimationTimeline.h b/dom/animation/AnimationTimeline.h
index 429a48c51e1..fe6c0c1bf57 100644
--- a/dom/animation/AnimationTimeline.h
+++ b/dom/animation/AnimationTimeline.h
@@ -9,15 +9,13 @@
#include "nsWrapperCache.h"
#include "nsCycleCollectionParticipant.h"
#include "mozilla/Attributes.h"
+#include "mozilla/TimeStamp.h"
#include "js/TypeDecls.h"
#include "nsIDocument.h"
struct JSContext;
namespace mozilla {
-
-class TimeStamp;
-
namespace dom {
class AnimationTimeline MOZ_FINAL : public nsWrapperCache
@@ -44,6 +42,11 @@ protected:
virtual ~AnimationTimeline() { }
nsCOMPtr mDocument;
+
+ // Store the most recently returned value of current time. This is used
+ // in cases where we don't have a refresh driver (e.g. because we are in
+ // a display:none iframe).
+ mutable mozilla::TimeStamp mLastCurrentTime;
};
} // namespace dom
diff --git a/dom/animation/test/animation-timeline/test_animation-timeline.html b/dom/animation/test/animation-timeline/test_animation-timeline.html
index 4089a6fb209..9b53e61495b 100644
--- a/dom/animation/test/animation-timeline/test_animation-timeline.html
+++ b/dom/animation/test/animation-timeline/test_animation-timeline.html
@@ -7,6 +7,7 @@
+
diff --git a/dom/animation/test/mochitest.ini b/dom/animation/test/mochitest.ini
index 2f33e470dc1..ddd97fd0395 100644
--- a/dom/animation/test/mochitest.ini
+++ b/dom/animation/test/mochitest.ini
@@ -1,3 +1,5 @@
[animation-timeline/test_animation-timeline.html]
+skip-if = buildapp == 'mulet'
[css-integration/test_element-get-animation-players.html]
+skip-if = buildapp == 'mulet'
[css-integration/test_animations-dynamic-changes.html]
diff --git a/dom/apps/tests/file_packaged_app.sjs b/dom/apps/tests/file_packaged_app.sjs
index 9e0e44842ea..2e138e4a904 100644
--- a/dom/apps/tests/file_packaged_app.sjs
+++ b/dom/apps/tests/file_packaged_app.sjs
@@ -20,12 +20,23 @@ var gDevUrl = "http://dev.url";
function handleRequest(request, response) {
var query = getQuery(request);
- response.setHeader("Access-Control-Allow-Origin", "*", false);
-
var packageSize = ("packageSize" in query) ? query.packageSize : 0;
var appName = ("appName" in query) ? query.appName : gAppName;
var devName = ("devName" in query) ? query.devName : gDevName;
var devUrl = ("devUrl" in query) ? query.devUrl : gDevUrl;
+ // allowCancel just means deliver the file slowly so we have time to cancel it
+ var allowCancel = "allowCancel" in query;
+ var getPackage = "getPackage" in query;
+ var alreadyDeferred = Number(getState("alreadyDeferred"));
+
+ if (allowCancel && getPackage && !alreadyDeferred) {
+ // Only do this for the actual package delivery.
+ response.processAsync();
+ // And to avoid timer problems, only do this once.
+ setState("alreadyDeferred", "1");
+ }
+
+ response.setHeader("Access-Control-Allow-Origin", "*", false);
// If this is a version update, update state, prepare the manifest,
// the application package and return.
@@ -36,7 +47,8 @@ function handleRequest(request, response) {
var packageName = "test_packaged_app_" + packageVersion + ".zip";
setState("packageName", packageName);
- var packagePath = "/" + gBasePath + "file_packaged_app.sjs?getPackage=" +
+ var packagePath = "/" + gBasePath + "file_packaged_app.sjs?" +
+ (allowCancel?"allowCancel&": "") + "getPackage=" +
packageName;
setState("packagePath", packagePath);
@@ -84,11 +96,20 @@ function handleRequest(request, response) {
response.setHeader("Etag", etag, false);
// Serve the application package corresponding to the requested app version.
- if ("getPackage" in query) {
+ if (getPackage) {
var resource = readFile(packageName, true);
response.setHeader("Content-Type",
"Content-Type: application/java-archive", false);
- response.write(resource);
+ if (allowCancel && !alreadyDeferred) {
+ var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback(function (aTimer) {
+ response.write(resource);
+ aTimer.cancel();
+ response.finish();
+ }, 1000, Ci.nsITimer.TYPE_ONE_SHOT);
+ } else {
+ response.write(resource);
+ }
return;
}
diff --git a/dom/apps/tests/test_packaged_app_common.js b/dom/apps/tests/test_packaged_app_common.js
index 7c91021f1f6..449aa513d78 100644
--- a/dom/apps/tests/test_packaged_app_common.js
+++ b/dom/apps/tests/test_packaged_app_common.js
@@ -57,13 +57,17 @@ var PackagedTestHelper = (function PackagedTestHelper() {
finish();
}
- function setAppVersion(aVersion, aCb, aDontUpdatePackage) {
+ function setAppVersion(aVersion, aCb, aDontUpdatePackage, aAllowCancel) {
var xhr = new XMLHttpRequest();
var dontUpdate = "";
+ var allowCancel = "";
if (aDontUpdatePackage) {
dontUpdate = "&dontUpdatePackage=1";
}
- var url = gSJS + "?setVersion=" + aVersion + dontUpdate;
+ if (aAllowCancel) {
+ allowCancel= "&allowCancel=1";
+ }
+ var url = gSJS + "?setVersion=" + aVersion + dontUpdate + allowCancel;
xhr.addEventListener("load", function() {
is(xhr.responseText, "OK", "setAppVersion OK");
aCb();
diff --git a/dom/apps/tests/test_packaged_app_install.html b/dom/apps/tests/test_packaged_app_install.html
index e3f40b7967f..4dc300a35b8 100644
--- a/dom/apps/tests/test_packaged_app_install.html
+++ b/dom/apps/tests/test_packaged_app_install.html
@@ -34,7 +34,7 @@ function checkAppInstallError(aMiniManifestURL, aExpectedError) {
req.onerror = function(evt) {
var error = evt.target.error.name;
if (error == aExpectedError) {
- ok(true, "Got expected " + aExpectedError);
+ info("Got expected " + aExpectedError);
PackagedTestHelper.next();
} else {
ok(false, "Got unexpected " + error);
@@ -46,7 +46,7 @@ function checkAppInstallError(aMiniManifestURL, aExpectedError) {
function checkUninstallApp(aApp) {
var req = navigator.mozApps.mgmt.uninstall(aApp);
req.onsuccess = function() {
- ok(true, "App uninstalled");
+ info("App uninstalled");
aApp.ondownloadsuccess = null;
aApp.ondownloaderror = null;
aApp.onprogress = null;
@@ -83,11 +83,11 @@ var steps = [
// Set up
SpecialPowers.setAllAppsLaunchable(true);
SpecialPowers.addPermission("webapps-manage", true, document);
- ok(true, "Set up");
+ info("Set up");
PackagedTestHelper.next();
},
function() {
- ok(true, "autoConfirmAppInstall");
+ info("autoConfirmAppInstall");
SpecialPowers.autoConfirmAppInstall(PackagedTestHelper.next);
},
function() {
@@ -96,17 +96,17 @@ var steps = [
function() {
// Bug 927699 - navigator.mozApps.install(url) lets NS_ERROR_FAILURE onto
// the web.
- ok(true, "== TEST == INVALID_URL");
+ info("== TEST == INVALID_URL");
checkAppInstallError("", "INVALID_URL");
},
function() {
// Test network error.
- ok(true, "== TEST == Network error");
+ info("== TEST == Network error");
checkAppInstallError("http://notvalidurl", "NETWORK_ERROR");
},
function() {
// Test wrong mini-manifest content type.
- ok(true, "== TEST == Not valid mini-manifest content type");
+ info("== TEST == Not valid mini-manifest content type");
var miniManifestURL = PackagedTestHelper.gSJS +
"?getManifest=true" +
"&noManifestContentType=true";
@@ -114,7 +114,7 @@ var steps = [
},
function() {
// Test mini-manifest 'size' value is not number. Bug 839435.
- ok(true, "== TEST == Size value is not a number");
+ info("== TEST == Size value is not a number");
var miniManifestURL = PackagedTestHelper.gSJS +
"?getManifest=true" +
"&packageSize=\"NotANumber\"";
@@ -122,7 +122,7 @@ var steps = [
},
function() {
// Test mini-manifest negative 'size' value. Bug 839435.
- ok(true, "== TEST == Negative size value");
+ info("== TEST == Negative size value");
var miniManifestURL = PackagedTestHelper.gSJS +
"?getManifest=true" +
"&packageSize=-1";
@@ -130,7 +130,7 @@ var steps = [
},
function() {
// Test wrong package path
- ok(true, "== TEST == Installing app with wrong package path");
+ info("== TEST == Installing app with wrong package path");
var miniManifestURL = PackagedTestHelper.gSJS +
"?getManifest=true" +
"&wrongPackagePath=true";
@@ -138,7 +138,7 @@ var steps = [
},
function() {
// Test no manifest in zip file.
- ok(true, "== TEST == No manifest in the zip file");
+ info("== TEST == No manifest in the zip file");
var miniManifestURL = PackagedTestHelper.gSJS + "?getManifest=true";
PackagedTestHelper.checkAppDownloadError(miniManifestURL,
"MISSING_MANIFEST", 0, true, true,
@@ -150,7 +150,7 @@ var steps = [
function() {
// Test mini-manifest app name is different from the webapp manifest name.
// Bug 844243.
- ok(true, "== TEST == Mini-manifest app name is different from webapp " +
+ info("== TEST == Mini-manifest app name is different from webapp " +
"manifest name");
var miniManifestURL = PackagedTestHelper.gSJS +
"?getManifest=true" +
@@ -187,11 +187,11 @@ var steps = [
PackagedTestHelper.setAppVersion(2, PackagedTestHelper.next);
},
function() {
- ok(true, "== TEST == Install packaged app");
+ info("== TEST == Install packaged app");
var miniManifestURL = PackagedTestHelper.gSJS +
"?getManifest=true";
navigator.mozApps.mgmt.oninstall = function(evt) {
- ok(true, "Got oninstall event");
+ info("Got oninstall event");
PackagedTestHelper.gApp = evt.application;
PackagedTestHelper.gApp.ondownloaderror = function() {
ok(false, "Download error " +
@@ -199,7 +199,7 @@ var steps = [
PackagedTestHelper.finish();
};
PackagedTestHelper.gApp.ondownloadsuccess = function() {
- ok(true, "App downloaded");
+ info("App downloaded");
var expected = {
name: PackagedTestHelper.gAppName,
manifestURL: miniManifestURL,
@@ -220,11 +220,92 @@ var steps = [
var request = navigator.mozApps.installPackage(miniManifestURL);
request.onerror = PackagedTestHelper.mozAppsError;
request.onsuccess = function() {
- ok(true, "Application installed");
+ info("Application installed");
};
},
function() {
- ok(true, "all done!\n");
+ PackagedTestHelper.setAppVersion(3, PackagedTestHelper.next, false, true);
+ },
+ function() {
+ info("== TEST == Install packaged app with a cancel/resume");
+ var miniManifestURL = PackagedTestHelper.gSJS +
+ "?getManifest=true&allowCancel";
+ navigator.mozApps.mgmt.oninstall = function(evt) {
+ info("Got oninstall event");
+ PackagedTestHelper.gApp = evt.application;
+
+ PackagedTestHelper.gApp.onprogress = function() {
+ // The first onprogress event is generated *before* the actual
+ // download is started. And the next one will be generated too late.
+ // So we just try to delay the canceling a bit.
+ setTimeout(function() {
+ // Let's try cancelling and resuming the download later on.
+ info("Cancelling the download");
+ PackagedTestHelper.gApp.cancelDownload();
+ // And only do this once.
+ PackagedTestHelper.gApp.onprogress = null;
+ }, 40);
+ };
+
+ var alreadyCanceled = false;
+ PackagedTestHelper.gApp.ondownloaderror = function() {
+ info("Got a expected download error");
+ ok(!alreadyCanceled, "The download should be cancelled only once!");
+ is(PackagedTestHelper.gApp.downloadError.name, "DOWNLOAD_CANCELED",
+ "Download error " + PackagedTestHelper.gApp.downloadError.name);
+ if (!alreadyCanceled) {
+ PackagedTestHelper.gApp.download();
+ alreadyCanceled = true;
+ }
+ };
+
+ PackagedTestHelper.gApp.ondownloadsuccess = function() {
+ info("App downloaded");
+ // We could try also applying the download we just made.
+ var expected = {
+ name: PackagedTestHelper.gAppName,
+ manifestURL: miniManifestURL,
+ installOrigin: PackagedTestHelper.gInstallOrigin,
+ progress: 0,
+ installState: "pending",
+ downloadAvailable: false,
+ downloading: false,
+ downloadSize: 0,
+ size: 0,
+ readyToApplyDownload: true
+ };
+ PackagedTestHelper.checkAppState(PackagedTestHelper.gApp, 3, expected,
+ true, false, function() {});
+ };
+
+ PackagedTestHelper.gApp.ondownloadapplied = function() {
+ info("App download applied.");
+ var expected = {
+ name: PackagedTestHelper.gAppName,
+ manifestURL: miniManifestURL,
+ installOrigin: PackagedTestHelper.gInstallOrigin,
+ progress: 0,
+ installState: "installed",
+ downloadAvailable: false,
+ downloading: false,
+ downloadSize: 0,
+ size: 0,
+ readyToApplyDownload: false
+ };
+ PackagedTestHelper.checkAppState(PackagedTestHelper.gApp, 3, expected,
+ true, false, PackagedTestHelper.next);
+ }
+
+ };
+
+ var request = navigator.mozApps.installPackage(miniManifestURL);
+ request.onerror = PackagedTestHelper.mozAppsError;
+ request.onsuccess = function() {
+ info("Application installed");
+ };
+ },
+ function() {
+ info("all done!\n");
PackagedTestHelper.finish();
}
];
diff --git a/dom/audiochannel/tests/mochitest.ini b/dom/audiochannel/tests/mochitest.ini
index 9cbe25785b4..9e5de668f74 100644
--- a/dom/audiochannel/tests/mochitest.ini
+++ b/dom/audiochannel/tests/mochitest.ini
@@ -6,6 +6,6 @@ support-files =
AudioChannelChromeScript.js
[test_telephonyPolicy.html]
-skip-if = (toolkit == 'gonk' || e10s)
+skip-if = buildapp == 'mulet' || (toolkit == 'gonk' || e10s)
[test_audioChannelChange.html]
skip-if = (toolkit != 'gonk')
diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp
index ba3eaa10fc5..e53c2171bd6 100644
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -63,6 +63,7 @@
#include "Layers.h"
#include "mozilla/layers/ShadowLayers.h"
+#include "gfxPrefs.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/TabChild.h"
@@ -358,11 +359,13 @@ nsDOMWindowUtils::SetDisplayPortForElement(float aXPx, float aYPx,
new DisplayPortPropertyData(displayport, aPriority),
nsINode::DeleteProperty);
- nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
- if (rootScrollFrame && content == rootScrollFrame->GetContent()) {
- // We are setting a root displayport for a document.
- // The pres shell needs a special flag set.
- presShell->SetIgnoreViewportScrolling(true);
+ if (gfxPrefs::AsyncPanZoomEnabled()) {
+ nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
+ if (rootScrollFrame && content == rootScrollFrame->GetContent()) {
+ // We are setting a root displayport for a document.
+ // The pres shell needs a special flag set.
+ presShell->SetIgnoreViewportScrolling(true);
+ }
}
nsIFrame* rootFrame = presShell->FrameManager()->GetRootFrame();
diff --git a/dom/base/test/mochitest.ini b/dom/base/test/mochitest.ini
index 1789c8689e1..f1e8367f934 100644
--- a/dom/base/test/mochitest.ini
+++ b/dom/base/test/mochitest.ini
@@ -13,6 +13,7 @@ support-files =
[test_appname_override.html]
[test_audioWindowUtils.html]
[test_audioNotification.html]
+skip-if = buildapp == 'mulet'
[test_bug793311.html]
[test_bug913761.html]
[test_bug976673.html]
@@ -25,7 +26,7 @@ support-files =
[test_constructor-assignment.html]
[test_constructor.html]
[test_dialogArguments.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s
[test_document.all_unqualified.html]
[test_domcursor.html]
[test_domrequest.html]
diff --git a/dom/browser-element/mochitest/mochitest-oop.ini b/dom/browser-element/mochitest/mochitest-oop.ini
index db15d8211ed..d912ce52203 100644
--- a/dom/browser-element/mochitest/mochitest-oop.ini
+++ b/dom/browser-element/mochitest/mochitest-oop.ini
@@ -3,7 +3,7 @@
# so we don't run that test on platforms which don't support OOP tests.
# OOP tests don't work on native-fennec (bug 774939).
# Bug 960345 - Disabled on OSX debug for frequent crashes.
-skip-if = os == "android" || (toolkit == "cocoa" && debug) || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) || e10s
+skip-if = os == "android" || (toolkit == "cocoa" && debug) || buildapp == 'mulet' || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) || e10s
support-files =
browserElement_OpenMixedProcess.js
file_browserElement_OpenMixedProcess.html
diff --git a/dom/browser-element/mochitest/mochitest.ini b/dom/browser-element/mochitest/mochitest.ini
index 17472e37ec1..2d96a30e86e 100644
--- a/dom/browser-element/mochitest/mochitest.ini
+++ b/dom/browser-element/mochitest/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) || e10s
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) || e10s
support-files =
../../../browser/base/content/test/general/audio.ogg
../../../content/media/test/short-video.ogv
diff --git a/dom/browser-element/mochitest/priority/mochitest.ini b/dom/browser-element/mochitest/priority/mochitest.ini
index 393f7bba918..a9932314e1a 100644
--- a/dom/browser-element/mochitest/priority/mochitest.ini
+++ b/dom/browser-element/mochitest/priority/mochitest.ini
@@ -1,6 +1,6 @@
[DEFAULT]
# Good luck running these tests on anything but desktop Linux.
-skip-if = toolkit != "gtk2" || (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) || e10s
+skip-if = toolkit != "gtk2" || ((buildapp =='mulet' || buildapp == 'b2g') && (toolkit != 'gonk' || debug)) || e10s
# Note: ../browserElementTestHelpers.js makes all tests in this directory OOP,
# because testing the process-priority manager without OOP frames does not make
diff --git a/dom/devicestorage/ipc/mochitest.ini b/dom/devicestorage/ipc/mochitest.ini
index 37bb5f93bb6..bab5e0b46ff 100644
--- a/dom/devicestorage/ipc/mochitest.ini
+++ b/dom/devicestorage/ipc/mochitest.ini
@@ -3,4 +3,4 @@ skip-if = toolkit == 'android' || e10s #bug 781789 & bug 782275
support-files = ../test/devicestorage_common.js
[test_ipc.html]
-skip-if = buildapp == 'b2g' # b2g(nested ipc not working) b2g-debug(nested ipc not working) b2g-desktop(nested ipc not working)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' # b2g(nested ipc not working) b2g-debug(nested ipc not working) b2g-desktop(nested ipc not working)
diff --git a/dom/devicestorage/test/chrome.ini b/dom/devicestorage/test/chrome.ini
index 568a23ac75b..d7e88eb147d 100644
--- a/dom/devicestorage/test/chrome.ini
+++ b/dom/devicestorage/test/chrome.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == 'mulet'
[test_app_permissions.html]
[test_fs_app_permissions.html]
diff --git a/dom/downloads/tests/mochitest.ini b/dom/downloads/tests/mochitest.ini
index 4b200d829c8..aee62b63943 100644
--- a/dom/downloads/tests/mochitest.ini
+++ b/dom/downloads/tests/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = buildapp == 'b2g' # bug 979446, frequent failures
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' # bug 979446, frequent failures
support-files =
serve_file.sjs
diff --git a/dom/events/test/mochitest.ini b/dom/events/test/mochitest.ini
index 4eeff715106..b7d0f197ac5 100644
--- a/dom/events/test/mochitest.ini
+++ b/dom/events/test/mochitest.ini
@@ -40,30 +40,32 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT
[test_bug422132.html]
skip-if = buildapp == 'b2g' || e10s # b2g(2 failures out of 8, mousewheel test) b2g-debug(2 failures out of 8, mousewheel test) b2g-desktop(2 failures out of 8, mousewheel test)
[test_bug426082.html]
-skip-if = buildapp == 'b2g' || os == "win" || toolkit == 'android' || e10s # Intermittent failures, bug 921693 # b2g(1 failure out of 6, Moving the mouse down from the label should have unpressed the button) b2g-debug(1 failure out of 6, Moving the mouse down from the label should have unpressed the button) b2g-desktop(1 failure out of 6, Moving the mouse down from the label should have unpressed the button)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || os == "win" || toolkit == 'android' || e10s # Intermittent failures, bug 921693 # b2g(1 failure out of 6, Moving the mouse down from the label should have unpressed the button) b2g-debug(1 failure out of 6, Moving the mouse down from the label should have unpressed the button) b2g-desktop(1 failure out of 6, Moving the mouse down from the label should have unpressed the button)
[test_bug427537.html]
[test_bug428988.html]
[test_bug432698.html]
+skip-if = buildapp == 'mulet'
[test_bug443985.html]
[test_bug447736.html]
[test_bug448602.html]
[test_bug450876.html]
+skip-if = buildapp == 'mulet'
[test_bug456273.html]
[test_bug457672.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' #CRASH_DUMP, RANDOM
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug489671.html]
[test_bug493251.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug502818.html]
skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug508479.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #CRASH_DUMP, RANDOM # b2g(drag event, also fails on Android) b2g-debug(drag event, also fails on Android) b2g-desktop(drag event, also fails on Android)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #CRASH_DUMP, RANDOM # b2g(drag event, also fails on Android) b2g-debug(drag event, also fails on Android) b2g-desktop(drag event, also fails on Android)
[test_bug822898.html]
[test_bug517851.html]
[test_bug534833.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' #CRASH_DUMP, RANDOM # b2g(4 failures out of 6, bug 901564,click not fired, also disabled on Android) b2g-debug(4 failures out of 6, bug 901564,click not fired, also disabled on Android) b2g-desktop(4 failures out of 6, bug 901564,click not fired, also disabled on Android)
[test_bug545268.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || toolkit == 'android' #CRASH_DUMP, RANDOM #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') || toolkit == 'android' #CRASH_DUMP, RANDOM #Bug 931116, b2g desktop specific, initial triage
[test_bug547996-1.html]
skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug547996-2.xhtml]
@@ -81,7 +83,7 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' # b2g(1 failure out of 615,
[test_bug605242.html]
skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug607464.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' #CRASH_DUMP, RANDOM
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug613634.html]
skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_bug615597.html]
@@ -143,18 +145,20 @@ skip-if = buildapp == 'b2g' || e10s # b2g(456 failed out of 19873, mousewheel te
[test_draggableprop.html]
skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_dragstart.html]
-skip-if = buildapp == 'b2g' # b2g(drag event, also fails on Android) b2g-debug(drag event, also fails on Android) b2g-desktop(drag event, also fails on Android)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' # b2g(drag event, also fails on Android) b2g-debug(drag event, also fails on Android) b2g-desktop(drag event, also fails on Android)
[test_error_events.html]
skip-if = toolkit == 'android' #TIMED_OUT
[test_eventctors.html]
skip-if = toolkit == 'android' #CRASH_DUMP, RANDOM
[test_eventTimeStamp.html]
[test_focus_disabled.html]
+skip-if = buildapp == 'mulet'
[test_messageEvent.html]
[test_moz_mouse_pixel_scroll_event.html]
+skip-if = buildapp == 'mulet'
[test_onerror_handler_args.html]
[test_wheel_default_action.html]
-skip-if = buildapp == 'b2g' || e10s
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || e10s
[test_bug985988.html]
[test_dom_storage_event.html]
[test_bug998809.html]
diff --git a/dom/filesystem/CreateFileTask.h b/dom/filesystem/CreateFileTask.h
index 0d20726a5f7..bbba9b94022 100644
--- a/dom/filesystem/CreateFileTask.h
+++ b/dom/filesystem/CreateFileTask.h
@@ -71,7 +71,7 @@ private:
InfallibleTArray mArrayData;
bool mReplace;
- // This cannot be a DOMFile bacause this object is created on a different
+ // This cannot be a DOMFile because this object is created on a different
// thread and DOMFile is not thread-safe. Let's use the DOMFileImpl instead.
nsRefPtr mTargetFileImpl;
};
diff --git a/dom/filesystem/DeviceStorageFileSystem.cpp b/dom/filesystem/DeviceStorageFileSystem.cpp
index a9251f04b8a..a6637dfc11a 100644
--- a/dom/filesystem/DeviceStorageFileSystem.cpp
+++ b/dom/filesystem/DeviceStorageFileSystem.cpp
@@ -13,7 +13,7 @@
#include "nsCOMPtr.h"
#include "nsDebug.h"
#include "nsDeviceStorage.h"
-#include "nsIDOMFile.h"
+#include "nsDOMFile.h"
#include "nsIFile.h"
#include "nsPIDOMWindow.h"
@@ -114,7 +114,7 @@ DeviceStorageFileSystem::GetLocalFile(const nsAString& aRealPath) const
}
bool
-DeviceStorageFileSystem::GetRealPath(nsIDOMFile* aFile, nsAString& aRealPath) const
+DeviceStorageFileSystem::GetRealPath(DOMFileImpl* aFile, nsAString& aRealPath) const
{
MOZ_ASSERT(FileSystemUtils::IsParentProcess(),
"Should be on parent process!");
diff --git a/dom/filesystem/DeviceStorageFileSystem.h b/dom/filesystem/DeviceStorageFileSystem.h
index cd4e19431f0..1240e8c30dc 100644
--- a/dom/filesystem/DeviceStorageFileSystem.h
+++ b/dom/filesystem/DeviceStorageFileSystem.h
@@ -37,7 +37,7 @@ public:
GetLocalFile(const nsAString& aRealPath) const MOZ_OVERRIDE;
virtual bool
- GetRealPath(nsIDOMFile* aFile, nsAString& aRealPath) const MOZ_OVERRIDE;
+ GetRealPath(DOMFileImpl* aFile, nsAString& aRealPath) const MOZ_OVERRIDE;
virtual const nsAString&
GetRootName() const MOZ_OVERRIDE;
diff --git a/dom/filesystem/Directory.cpp b/dom/filesystem/Directory.cpp
index 389883fdadb..b3a05c7b69f 100644
--- a/dom/filesystem/Directory.cpp
+++ b/dom/filesystem/Directory.cpp
@@ -195,12 +195,12 @@ Directory::RemoveInternal(const StringOrFileOrDirectory& aPath, bool aRecursive,
{
nsresult error = NS_OK;
nsString realPath;
- nsCOMPtr file;
+ nsRefPtr file;
// Check and get the target path.
if (aPath.IsFile()) {
- file = aPath.GetAsFile();
+ file = static_cast(aPath.GetAsFile())->Impl();
goto parameters_check_done;
}
diff --git a/dom/filesystem/FileSystemBase.h b/dom/filesystem/FileSystemBase.h
index 490e53b4618..dffc48cf748 100644
--- a/dom/filesystem/FileSystemBase.h
+++ b/dom/filesystem/FileSystemBase.h
@@ -10,13 +10,13 @@
#include "nsAutoPtr.h"
#include "nsString.h"
-class nsIDOMFile;
class nsPIDOMWindow;
namespace mozilla {
namespace dom {
class Directory;
+class DOMFileImpl;
class FileSystemBase
{
@@ -73,7 +73,7 @@ public:
* empty string.
*/
virtual bool
- GetRealPath(nsIDOMFile* aFile, nsAString& aRealPath) const = 0;
+ GetRealPath(DOMFileImpl* aFile, nsAString& aRealPath) const = 0;
/*
* Get the permission name required to access this file system.
diff --git a/dom/filesystem/RemoveTask.cpp b/dom/filesystem/RemoveTask.cpp
index ed92044b298..fc0c3cf0e1e 100644
--- a/dom/filesystem/RemoveTask.cpp
+++ b/dom/filesystem/RemoveTask.cpp
@@ -10,7 +10,7 @@
#include "mozilla/dom/FileSystemBase.h"
#include "mozilla/dom/FileSystemUtils.h"
#include "mozilla/dom/Promise.h"
-#include "nsIDOMFile.h"
+#include "nsDOMFile.h"
#include "nsIFile.h"
#include "nsStringGlue.h"
@@ -19,13 +19,13 @@ namespace dom {
RemoveTask::RemoveTask(FileSystemBase* aFileSystem,
const nsAString& aDirPath,
- nsIDOMFile* aTargetFile,
+ DOMFileImpl* aTargetFile,
const nsAString& aTargetPath,
bool aRecursive,
ErrorResult& aRv)
: FileSystemTaskBase(aFileSystem)
, mDirRealPath(aDirPath)
- , mTargetFile(aTargetFile)
+ , mTargetFileImpl(aTargetFile)
, mTargetRealPath(aTargetPath)
, mRecursive(aRecursive)
, mReturnValue(false)
@@ -65,8 +65,8 @@ RemoveTask::RemoveTask(FileSystemBase* aFileSystem,
BlobParent* bp = static_cast(static_cast(target));
nsCOMPtr blob = bp->GetBlob();
- mTargetFile = do_QueryInterface(blob);
- MOZ_ASSERT(mTargetFile, "mTargetFile should not be null.");
+ MOZ_ASSERT(blob);
+ mTargetFileImpl = static_cast(blob.get())->Impl();
}
RemoveTask::~RemoveTask()
@@ -90,9 +90,10 @@ RemoveTask::GetRequestParams(const nsString& aFileSystem) const
param.filesystem() = aFileSystem;
param.directory() = mDirRealPath;
param.recursive() = mRecursive;
- if (mTargetFile) {
+ if (mTargetFileImpl) {
+ nsRefPtr file = new DOMFile(mTargetFileImpl);
BlobChild* actor
- = ContentChild::GetSingleton()->GetOrCreateActorForBlob(mTargetFile);
+ = ContentChild::GetSingleton()->GetOrCreateActorForBlob(file);
if (actor) {
param.target() = actor;
}
@@ -129,8 +130,8 @@ RemoveTask::Work()
}
// Get the DOM path if a DOMFile is passed as the target.
- if (mTargetFile) {
- if (!mFileSystem->GetRealPath(mTargetFile, mTargetRealPath)) {
+ if (mTargetFileImpl) {
+ if (!mFileSystem->GetRealPath(mTargetFileImpl, mTargetRealPath)) {
return NS_ERROR_DOM_SECURITY_ERR;
}
if (!FileSystemUtils::IsDescendantPath(mDirRealPath, mTargetRealPath)) {
diff --git a/dom/filesystem/RemoveTask.h b/dom/filesystem/RemoveTask.h
index 109296762d2..f7aa856c041 100644
--- a/dom/filesystem/RemoveTask.h
+++ b/dom/filesystem/RemoveTask.h
@@ -14,6 +14,7 @@
namespace mozilla {
namespace dom {
+class DOMFileImpl;
class Promise;
class RemoveTask MOZ_FINAL
@@ -22,7 +23,7 @@ class RemoveTask MOZ_FINAL
public:
RemoveTask(FileSystemBase* aFileSystem,
const nsAString& aDirPath,
- nsIDOMFile* aTargetFile,
+ DOMFileImpl* aTargetFile,
const nsAString& aTargetPath,
bool aRecursive,
ErrorResult& aRv);
@@ -58,7 +59,9 @@ protected:
private:
nsRefPtr mPromise;
nsString mDirRealPath;
- nsCOMPtr mTargetFile;
+ // This cannot be a DOMFile because this object will be used on a different
+ // thread and DOMFile is not thread-safe. Let's use the DOMFileImpl instead.
+ nsRefPtr mTargetFileImpl;
nsString mTargetRealPath;
bool mRecursive;
bool mReturnValue;
diff --git a/dom/identity/tests/mochitest/chrome.ini b/dom/identity/tests/mochitest/chrome.ini
index a19d9f30a63..adcf54945fe 100644
--- a/dom/identity/tests/mochitest/chrome.ini
+++ b/dom/identity/tests/mochitest/chrome.ini
@@ -12,5 +12,6 @@ support-files=
[test_declareAudience.html]
[test_rpHasValidCallbacks.html]
+skip-if = buildapp == 'mulet'
[test_syntheticEvents.html]
diff --git a/dom/indexedDB/ipc/mochitest.ini b/dom/indexedDB/ipc/mochitest.ini
index 4a55c62e16d..81b48267ea2 100644
--- a/dom/indexedDB/ipc/mochitest.ini
+++ b/dom/indexedDB/ipc/mochitest.ini
@@ -1,4 +1,4 @@
[DEFAULT]
[test_ipc.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #bug 783513 # b2g(nested ipc not working) b2g-debug(nested ipc not working) b2g-desktop(nested ipc not working)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #bug 783513 # b2g(nested ipc not working) b2g-debug(nested ipc not working) b2g-desktop(nested ipc not working)
diff --git a/dom/indexedDB/test/mochitest.ini b/dom/indexedDB/test/mochitest.ini
index 0da0e834e2e..f8053fc5014 100644
--- a/dom/indexedDB/test/mochitest.ini
+++ b/dom/indexedDB/test/mochitest.ini
@@ -239,10 +239,10 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec
[test_unique_index_update.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_webapp_clearBrowserData_inproc_inproc.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || toolkit == 'android' #No test app installed #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') || toolkit == 'android' #No test app installed #Bug 931116, b2g desktop specific, initial triage
[test_webapp_clearBrowserData_inproc_oop.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || toolkit == 'android' #No test app installed #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') || toolkit == 'android' #No test app installed #Bug 931116, b2g desktop specific, initial triage
[test_webapp_clearBrowserData_oop_inproc.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || toolkit == 'android' #No test app installed #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') || toolkit == 'android' #No test app installed #Bug 931116, b2g desktop specific, initial triage
[test_bug937006.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
diff --git a/dom/indexedDB/test/unit/xpcshell.ini b/dom/indexedDB/test/unit/xpcshell.ini
index be4e7a6f60d..306bd42e58c 100644
--- a/dom/indexedDB/test/unit/xpcshell.ini
+++ b/dom/indexedDB/test/unit/xpcshell.ini
@@ -31,7 +31,7 @@ support-files =
[test_getAll.js]
[test_globalObjects_ipc.js]
# FIXME/bug 575918: out-of-process xpcshell is broken on OS X
-skip-if = os == "mac" || os == "android"
+skip-if = buildapp == 'mulet' || os == "mac" || os == "android"
[test_globalObjects_other.js]
[test_globalObjects_xpc.js]
[test_global_data.js]
diff --git a/dom/ipc/tests/chrome.ini b/dom/ipc/tests/chrome.ini
index 8a05fe088b7..58acba9ffe0 100644
--- a/dom/ipc/tests/chrome.ini
+++ b/dom/ipc/tests/chrome.ini
@@ -4,3 +4,4 @@ support-files =
process_error_contentscript.js
[test_process_error.xul]
+skip-if = buildapp == "mulet"
diff --git a/dom/media/gmp-plugin/gmp-fake.cpp b/dom/media/gmp-plugin/gmp-fake.cpp
index aaa8a4e205a..69082ff6ad6 100644
--- a/dom/media/gmp-plugin/gmp-fake.cpp
+++ b/dom/media/gmp-plugin/gmp-fake.cpp
@@ -121,7 +121,7 @@ class FakeVideoEncoder : public GMPVideoEncoder {
host_ (hostAPI),
callback_ (NULL) {}
- virtual GMPErr InitEncode (const GMPVideoCodec& codecSettings,
+ virtual void InitEncode (const GMPVideoCodec& codecSettings,
const uint8_t* aCodecSpecific,
uint32_t aCodecSpecificSize,
GMPVideoEncoderCallback* callback,
@@ -130,11 +130,9 @@ class FakeVideoEncoder : public GMPVideoEncoder {
callback_ = callback;
GMPLOG (GL_INFO, "Initialized encoder");
-
- return GMPNoErr;
}
- virtual GMPErr Encode (GMPVideoi420Frame* inputImage,
+ virtual void Encode (GMPVideoi420Frame* inputImage,
const uint8_t* aCodecSpecificInfo,
uint32_t aCodecSpecificInfoLength,
const GMPVideoFrameType* aFrameTypes,
@@ -149,8 +147,6 @@ class FakeVideoEncoder : public GMPVideoEncoder {
g_platform_api->runonmainthread(new FakeEncoderTask(this,
inputImage,
aFrameTypes[0]));
-
- return GMPGenericErr;
}
void Encode_m (GMPVideoi420Frame* inputImage,
@@ -223,16 +219,13 @@ class FakeVideoEncoder : public GMPVideoEncoder {
GMPLOG (GL_DEBUG, "Callback called");
}
- virtual GMPErr SetChannelParameters (uint32_t aPacketLoss, uint32_t aRTT) {
- return GMPNoErr;
+ virtual void SetChannelParameters (uint32_t aPacketLoss, uint32_t aRTT) {
}
- virtual GMPErr SetRates (uint32_t aNewBitRate, uint32_t aFrameRate) {
- return GMPNoErr;
+ virtual void SetRates (uint32_t aNewBitRate, uint32_t aFrameRate) {
}
- virtual GMPErr SetPeriodicKeyFrames (bool aEnable) {
- return GMPNoErr;
+ virtual void SetPeriodicKeyFrames (bool aEnable) {
}
virtual void EncodingComplete() {
@@ -283,7 +276,7 @@ class FakeVideoDecoder : public GMPVideoDecoder {
virtual ~FakeVideoDecoder() {
}
- virtual GMPErr InitDecode (const GMPVideoCodec& codecSettings,
+ virtual void InitDecode (const GMPVideoCodec& codecSettings,
const uint8_t* aCodecSpecific,
uint32_t aCodecSpecificSize,
GMPVideoDecoderCallback* callback,
@@ -291,10 +284,9 @@ class FakeVideoDecoder : public GMPVideoDecoder {
GMPLOG (GL_INFO, "InitDecode");
callback_ = callback;
- return GMPNoErr;
}
- virtual GMPErr Decode (GMPVideoEncodedFrame* inputFrame,
+ virtual void Decode (GMPVideoEncodedFrame* inputFrame,
bool missingFrames,
const uint8_t* aCodecSpecificInfo,
uint32_t aCodecSpecificInfoLength,
@@ -303,16 +295,12 @@ class FakeVideoDecoder : public GMPVideoDecoder {
<< "Decoding frame size=" << inputFrame->Size()
<< " timestamp=" << inputFrame->TimeStamp());
g_platform_api->runonmainthread(new FakeDecoderTask(this, inputFrame, renderTimeMs));
-
- return GMPNoErr;
}
- virtual GMPErr Reset() {
- return GMPNoErr;
+ virtual void Reset() {
}
- virtual GMPErr Drain() {
- return GMPNoErr;
+ virtual void Drain() {
}
virtual void DecodingComplete() {
diff --git a/dom/messages/test/mochitest.ini b/dom/messages/test/mochitest.ini
index 7ebc13d88c3..5fc124679d0 100644
--- a/dom/messages/test/mochitest.ini
+++ b/dom/messages/test/mochitest.ini
@@ -2,4 +2,4 @@
skip-if = e10s
[test_bug_993732.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = buildapp == 'mulet' || (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
diff --git a/dom/permission/tests/mochitest.ini b/dom/permission/tests/mochitest.ini
index f6da99653cd..962d3db1774 100644
--- a/dom/permission/tests/mochitest.ini
+++ b/dom/permission/tests/mochitest.ini
@@ -7,7 +7,7 @@ support-files =
[test_alarms.html]
[test_browser.html]
[test_embed-apps.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_idle.html]
skip-if = (toolkit == 'gonk' && debug) #debug-only failure
[test_permission_basics.html]
@@ -24,4 +24,4 @@ skip-if = toolkit == 'android'
[test_input-manage.html]
skip-if = toolkit == 'android'
[test_wifi-manage.html]
-skip-if = (buildapp != 'b2g') || (buildapp == 'b2g' && toolkit != 'gonk') #b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
\ No newline at end of file
+skip-if = (buildapp != 'b2g') || (buildapp == 'b2g' && toolkit != 'gonk') #b2g-desktop(Bug 931116, b2g desktop specific, initial triage)
diff --git a/dom/plugins/test/mochitest/chrome.ini b/dom/plugins/test/mochitest/chrome.ini
index 44b303bc11f..5beb831e370 100644
--- a/dom/plugins/test/mochitest/chrome.ini
+++ b/dom/plugins/test/mochitest/chrome.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == "mulet"
support-files =
hang_test.js
privatemode_perwindowpb.xul
diff --git a/dom/plugins/test/mochitest/mochitest.ini b/dom/plugins/test/mochitest/mochitest.ini
index 9a326927e33..a4aca3191da 100644
--- a/dom/plugins/test/mochitest/mochitest.ini
+++ b/dom/plugins/test/mochitest/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') || e10s #b2g-desktop(tests that use plugins)
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') || e10s #b2g-desktop(tests that use plugins)
support-files =
307-xo-redirect.sjs
crashing_subpage.html
diff --git a/dom/plugins/test/unit/xpcshell.ini b/dom/plugins/test/unit/xpcshell.ini
index eaa0022a144..2e81b4f456e 100644
--- a/dom/plugins/test/unit/xpcshell.ini
+++ b/dom/plugins/test/unit/xpcshell.ini
@@ -1,4 +1,5 @@
[DEFAULT]
+skip-if = buildapp == 'mulet'
head = head_plugins.js
tail =
diff --git a/dom/power/test/mochitest.ini b/dom/power/test/mochitest.ini
index 1d1da9d9df0..3c519d46262 100644
--- a/dom/power/test/mochitest.ini
+++ b/dom/power/test/mochitest.ini
@@ -4,7 +4,7 @@ skip-if = e10s
[test_bug957893.html]
[test_bug957899.html]
[test_wakelock_not_exposed.html]
-run-if = appname != "b2g"
+run-if = appname != "b2g" && buildapp != "mulet"
[test_power_basics.html]
[test_power_set_cpusleepallowed.html]
skip-if = toolkit != "gonk"
diff --git a/dom/settings/tests/chrome.ini b/dom/settings/tests/chrome.ini
index 75dc4064aad..75951481405 100644
--- a/dom/settings/tests/chrome.ini
+++ b/dom/settings/tests/chrome.ini
@@ -2,5 +2,6 @@
[test_settings_service.js]
[test_settings_service.xul]
+skip-if= buildapp == 'mulet'
[test_settings_service_callback.js]
[test_settings_service_callback.xul]
diff --git a/dom/tests/browser/browser.ini b/dom/tests/browser/browser.ini
index 0fa50199837..1be9889af13 100644
--- a/dom/tests/browser/browser.ini
+++ b/dom/tests/browser/browser.ini
@@ -11,11 +11,13 @@ support-files =
worker_bug1004814.js
[browser_bug1008941_dismissGeolocationHanger.js]
+skip-if = buildapp == 'mulet'
[browser_test__content.js]
[browser_ConsoleAPITests.js]
[browser_ConsoleStorageAPITests.js]
[browser_ConsoleStoragePBTest_perwindowpb.js]
[browser_autofocus_background.js]
+skip-if= buildapp == 'mulet'
[browser_autofocus_preference.js]
[browser_bug396843.js]
[browser_focus_steal_from_chrome.js]
@@ -24,7 +26,7 @@ support-files =
[browser_geolocation_privatebrowsing_perwindowpb.js]
[browser_localStorage_privatestorageevent.js]
[browser_test_new_window_from_content.js]
-skip-if = (toolkit == 'android' || buildapp == 'b2g')
+skip-if = (toolkit == 'android' || buildapp == 'b2g' || buildapp == 'mulet')
support-files =
test_new_window_from_content_child.html
test_new_window_from_content_child.js
@@ -39,4 +41,5 @@ support-files =
[browser_webapps_perms_reinstall.js]
disabled = re-enable when bug 794920 is fixed
[browser_xhr_sandbox.js]
+skip-if= buildapp == 'mulet'
[browser_bug1004814.js]
diff --git a/dom/tests/mochitest/ajax/offline/mochitest.ini b/dom/tests/mochitest/ajax/offline/mochitest.ini
index 5125653d943..dba8a3b462b 100644
--- a/dom/tests/mochitest/ajax/offline/mochitest.ini
+++ b/dom/tests/mochitest/ajax/offline/mochitest.ini
@@ -74,7 +74,7 @@ skip-if = buildapp == 'b2g'
[test_bug474696.html]
skip-if = buildapp == 'b2g'
[test_bug544462.html]
-skip-if = buildapp == 'b2g'
+skip-if = buildapp == 'mulet' || buildapp == 'b2g'
[test_bug744719-cancel.html]
skip-if = buildapp == 'b2g'
[test_bug744719.html]
diff --git a/dom/tests/mochitest/bugs/mochitest.ini b/dom/tests/mochitest/bugs/mochitest.ini
index e1a954c5a9e..774177e984f 100644
--- a/dom/tests/mochitest/bugs/mochitest.ini
+++ b/dom/tests/mochitest/bugs/mochitest.ini
@@ -44,7 +44,7 @@ skip-if = buildapp == 'b2g' || e10s # b2g(dom.disable_open_during_load not imple
[test_bug265203.html]
[test_bug291377.html]
[test_bug291653.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #TIMED_OUT # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_bug304459.html]
[test_bug308856.html]
[test_bug327891.html]
@@ -71,16 +71,16 @@ skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug))
[test_bug400204.html]
[test_bug404748.html]
[test_bug406375.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s
[test_bug411103.html]
[test_bug414291.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_bug427744.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s
[test_bug42976.html]
[test_bug430276.html]
[test_bug437361.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(dom.disable_open_during_load not implemented in b2g, showmodaldialog) b2g-debug(dom.disable_open_during_load not implemented in b2g, showmodaldialog) b2g-desktop(dom.disable_open_during_load not implemented in b2g, showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(dom.disable_open_during_load not implemented in b2g, showmodaldialog) b2g-debug(dom.disable_open_during_load not implemented in b2g, showmodaldialog) b2g-desktop(dom.disable_open_during_load not implemented in b2g, showmodaldialog)
[test_bug440572.html]
[test_bug456151.html]
[test_bug458091.html]
@@ -88,14 +88,14 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec
[test_bug459848.html]
[test_bug465263.html]
[test_bug479143.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_bug484775.html]
[test_bug492925.html]
[test_bug49312.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_bug495219.html]
[test_bug504862.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #RANDOM # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #RANDOM # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_bug529328.html]
[test_bug531176.html]
[test_bug531542.html]
@@ -116,7 +116,7 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec
[test_bug597809.html]
skip-if = toolkit == 'android' || e10s
[test_bug61098.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_bug612267.html]
[test_bug617296.html]
[test_bug620947.html]
@@ -158,9 +158,9 @@ skip-if = toolkit == 'android' || e10s #bug 775227
[test_onerror_message.html]
[test_protochains.html]
[test_resize_move_windows.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #Windows can't change size and position on Android # b2g(Windows can't change size and position on B2G) b2g-debug(Windows can't change size and position on B2G) b2g-desktop(Windows can't change size and position on B2G)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #Windows can't change size and position on Android # b2g(Windows can't change size and position on B2G) b2g-debug(Windows can't change size and position on B2G) b2g-desktop(Windows can't change size and position on B2G)
[test_sizetocontent_clamp.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #Windows can't change size on Android # b2g(Windows can't change size on B2G) b2g-debug(Windows can't change size on B2G) b2g-desktop(Windows can't change size on B2G)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #Windows can't change size on Android # b2g(Windows can't change size on B2G) b2g-debug(Windows can't change size on B2G) b2g-desktop(Windows can't change size on B2G)
[test_toJSON.html]
[test_window_bar.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s
diff --git a/dom/tests/mochitest/chrome/chrome.ini b/dom/tests/mochitest/chrome/chrome.ini
index 544110bf3ea..487b059e154 100644
--- a/dom/tests/mochitest/chrome/chrome.ini
+++ b/dom/tests/mochitest/chrome/chrome.ini
@@ -36,6 +36,7 @@ support-files =
[test_cyclecollector.xul]
[test_docshell_swap.xul]
[test_focus.xul]
+skip-if = buildapp == 'mulet'
[test_focus_docnav.xul]
[test_focus_switchbinding.xul]
[test_focused_link_scroll.xul]
diff --git a/dom/tests/mochitest/general/chrome.ini b/dom/tests/mochitest/general/chrome.ini
index 28a04daf573..6a80281ab78 100644
--- a/dom/tests/mochitest/general/chrome.ini
+++ b/dom/tests/mochitest/general/chrome.ini
@@ -4,3 +4,4 @@
[test_offsets.css]
[test_offsets.js]
[test_offsets.xul]
+skip-if = buildapp == 'mulet'
diff --git a/dom/tests/mochitest/general/mochitest.ini b/dom/tests/mochitest/general/mochitest.ini
index b8effe4949a..4c2bea3fa53 100644
--- a/dom/tests/mochitest/general/mochitest.ini
+++ b/dom/tests/mochitest/general/mochitest.ini
@@ -34,33 +34,36 @@ skip-if = buildapp == 'b2g' # b2g(clipboard undefined) b2g-debug(clipboard undef
[test_domWindowUtils_scrollXY.html]
[test_domWindowUtils_scrollbarSize.html]
[test_donottrack.html]
+skip-if = buildapp == 'mulet'
[test_focus_legend_noparent.html]
[test_focusrings.xul]
-skip-if = buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT
[test_for_of.html]
[test_frameElementWrapping.html]
[test_framedhistoryframes.html]
[test_idleapi_permissions.html]
-skip-if = buildapp == 'b2g'
+skip-if = buildapp == 'b2g' || buildapp == 'mulet'
[test_interfaces.html]
-skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
+skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
# [test_network_events.html]
# Disable this test until bug 795711 is fixed.
[test_offsets.html]
[test_offsets.js]
[test_outerHTML.html]
[test_outerHTML.xhtml]
+skip-if = buildapp == 'mulet'
[test_paste_selection.html]
+skip-if = buildapp == 'mulet'
[test_picture_pref.html]
[test_resource_timing.html]
-skip-if = buildapp == 'b2g' # b2g(No clipboard) b2g-debug(No clipboard) b2g-desktop(No clipboard)
+skip-if = buildapp == 'b2g' || buildapp == 'mulet' # b2g(No clipboard) b2g-debug(No clipboard) b2g-desktop(No clipboard)
[test_performance_now.html]
[test_srcset_pref.html]
[test_showModalDialog.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' #Don't run modal tests on Android # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' #Don't run modal tests on Android # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_stylesheetPI.html]
[test_vibrator.html]
-skip-if = toolkit == 'android' #CRASH_SUTAGENT
+skip-if = buildapp == 'mulet' || toolkit == 'android' #CRASH_SUTAGENT
[test_windowProperties.html]
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
[test_windowedhistoryframes.html]
diff --git a/dom/tests/mochitest/geolocation/mochitest.ini b/dom/tests/mochitest/geolocation/mochitest.ini
index fd3d700e392..79b359a018d 100644
--- a/dom/tests/mochitest/geolocation/mochitest.ini
+++ b/dom/tests/mochitest/geolocation/mochitest.ini
@@ -23,7 +23,7 @@ skip-if = buildapp == 'b2g'
skip-if = toolkit=='gonk' || toolkit == 'android' || e10s #TIMED_OUT # b2g-debug(debug-only timeout)
[test_geolocation_is_undefined_when_pref_is_off.html]
[test_handlerSpinsEventLoop.html]
-skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #Don't run modal tests on Android # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
+skip-if = buildapp == 'mulet' || buildapp == 'b2g' || toolkit == 'android' || e10s #Don't run modal tests on Android # b2g(showmodaldialog) b2g-debug(showmodaldialog) b2g-desktop(showmodaldialog)
[test_manyCurrentConcurrent.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT
[test_manyCurrentSerial.html]
@@ -33,7 +33,7 @@ skip-if = buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT
[test_manyWatchSerial.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' #TIMED_OUT
[test_manyWindows.html]
-skip-if = buildapp == 'b2g'
+skip-if = buildapp == 'mulet' || buildapp == 'b2g'
[test_mozsettings.html]
skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s #mozSettings is undefined
[test_mozsettingsWatch.html]
diff --git a/dom/tests/mochitest/notification/mochitest.ini b/dom/tests/mochitest/notification/mochitest.ini
index 89d4e45169c..9972c9c1d05 100644
--- a/dom/tests/mochitest/notification/mochitest.ini
+++ b/dom/tests/mochitest/notification/mochitest.ini
@@ -1,5 +1,5 @@
[DEFAULT]
-skip-if = e10s
+skip-if = e10s || buildapp == 'mulet'
support-files =
MockServices.js
NotificationTest.js
diff --git a/dom/tests/mochitest/storageevent/mochitest.ini b/dom/tests/mochitest/storageevent/mochitest.ini
index f18fb840b1e..e6fcf34b22d 100644
--- a/dom/tests/mochitest/storageevent/mochitest.ini
+++ b/dom/tests/mochitest/storageevent/mochitest.ini
@@ -14,5 +14,6 @@ support-files =
[test_storageLocalStorageEventCheckNoPropagation.html]
[test_storageLocalStorageEventCheckPropagation.html]
[test_storageNotifications.html]
+skip-if = buildapp == 'mulet'
[test_storageSessionStorageEventCheckNoPropagation.html]
[test_storageSessionStorageEventCheckPropagation.html]
diff --git a/dom/webidl/HTMLElement.webidl b/dom/webidl/HTMLElement.webidl
index 034abe3f5db..8399c1e7cba 100644
--- a/dom/webidl/HTMLElement.webidl
+++ b/dom/webidl/HTMLElement.webidl
@@ -76,10 +76,6 @@ interface HTMLElement : Element {
readonly attribute CSSStyleDeclaration style;
// Mozilla specific stuff
- // FIXME Bug 810677 Move className from HTMLElement to Element
- [Pure]
- attribute DOMString className;
-
attribute EventHandler oncopy;
attribute EventHandler oncut;
attribute EventHandler onpaste;
diff --git a/dom/workers/ServiceWorkerManager.cpp b/dom/workers/ServiceWorkerManager.cpp
index 8b01ce2d01c..99afaa87006 100644
--- a/dom/workers/ServiceWorkerManager.cpp
+++ b/dom/workers/ServiceWorkerManager.cpp
@@ -737,6 +737,29 @@ public:
}
};
+class FinishActivationRunnable : public nsRunnable
+{
+ nsMainThreadPtrHandle mRegistration;
+
+public:
+ FinishActivationRunnable(const nsMainThreadPtrHandle& aRegistration)
+ : mRegistration(aRegistration)
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ }
+
+ NS_IMETHODIMP
+ Run()
+ {
+ AssertIsOnMainThread();
+
+ // FinishActivate takes ownership of the passed info.
+ nsRefPtr swm = ServiceWorkerManager::GetInstance();
+ swm->FinishActivate(mRegistration.get());
+ return NS_OK;
+ }
+};
+
class CancelServiceWorkerInstallationRunnable MOZ_FINAL : public nsRunnable
{
nsMainThreadPtrHandle mRegistration;
@@ -798,6 +821,39 @@ public:
}
};
+class FinishActivateHandler : public PromiseNativeHandler
+{
+ nsMainThreadPtrHandle mRegistration;
+
+public:
+ FinishActivateHandler(const nsMainThreadPtrHandle& aRegistration)
+ : mRegistration(aRegistration)
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ }
+
+ virtual
+ ~FinishActivateHandler()
+ { }
+
+ void
+ ResolvedCallback(JSContext* aCx, JS::Handle aValue) MOZ_OVERRIDE
+ {
+ WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
+ MOZ_ASSERT(workerPrivate);
+ workerPrivate->AssertIsOnWorkerThread();
+
+ nsRefPtr r = new FinishActivationRunnable(mRegistration);
+ NS_DispatchToMainThread(r);
+ }
+
+ void
+ RejectedCallback(JSContext* aCx, JS::Handle aValue) MOZ_OVERRIDE
+ {
+ // FIXME(nsm). Spec is undefined.
+ }
+};
+
/*
* Fires 'install' event on the ServiceWorkerGlobalScope. Modifies busy count
* since it fires the event. This is ok since there can't be nested
@@ -873,12 +929,77 @@ private:
}
};
+class ActivateEventRunnable : public WorkerRunnable
+{
+ nsMainThreadPtrHandle mRegistration;
+
+public:
+ ActivateEventRunnable(WorkerPrivate* aWorkerPrivate,
+ const nsMainThreadPtrHandle& aRegistration)
+ : WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount),
+ mRegistration(aRegistration)
+ {
+ MOZ_ASSERT(aWorkerPrivate);
+ }
+
+ bool
+ WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
+ {
+ MOZ_ASSERT(aWorkerPrivate);
+ return DispatchActivateEvent(aCx, aWorkerPrivate);
+ }
+
+private:
+ bool
+ DispatchActivateEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
+ {
+ MOZ_ASSERT(aWorkerPrivate->IsServiceWorker());
+ nsRefPtr target = do_QueryObject(aWorkerPrivate->GlobalScope());
+
+ // FIXME(nsm): Set activeWorker to the correct thing.
+ EventInit init;
+ init.mBubbles = false;
+ init.mCancelable = true;
+ nsRefPtr event =
+ InstallPhaseEvent::Constructor(target, NS_LITERAL_STRING("activate"), init);
+
+ event->SetTrusted(true);
+
+ nsRefPtr waitUntilPromise;
+
+ nsresult rv = target->DispatchDOMEvent(nullptr, event, nullptr, nullptr);
+ if (NS_SUCCEEDED(rv)) {
+ waitUntilPromise = event->GetPromise();
+ if (!waitUntilPromise) {
+ ErrorResult rv;
+ nsCOMPtr global =
+ do_QueryObject(aWorkerPrivate->GlobalScope());
+ waitUntilPromise =
+ Promise::Resolve(global,
+ aCx, JS::UndefinedHandleValue, rv);
+ }
+ } else {
+ ErrorResult rv;
+ nsCOMPtr global =
+ do_QueryObject(aWorkerPrivate->GlobalScope());
+ // Continue with a canceled install.
+ waitUntilPromise = Promise::Reject(global, aCx,
+ JS::UndefinedHandleValue, rv);
+ }
+
+ nsRefPtr handler = new FinishActivateHandler(mRegistration);
+ waitUntilPromise->AppendNativeHandler(handler);
+ return true;
+ }
+};
+
void
ServiceWorkerManager::Install(ServiceWorkerRegistration* aRegistration,
ServiceWorkerInfo* aServiceWorkerInfo)
{
AssertIsOnMainThread();
aRegistration->mInstallingWorker = aServiceWorkerInfo;
+ MOZ_ASSERT(aRegistration->mInstallingWorker);
nsMainThreadPtrHandle handle =
new nsMainThreadPtrHolder(aRegistration);
@@ -920,9 +1041,52 @@ ServiceWorkerManager::Install(ServiceWorkerRegistration* aRegistration,
class ActivationRunnable : public nsRunnable
{
+ nsRefPtr mRegistration;
public:
explicit ActivationRunnable(ServiceWorkerRegistration* aRegistration)
- { }
+ : mRegistration(aRegistration)
+ {
+ }
+
+ NS_IMETHODIMP
+ Run() MOZ_OVERRIDE
+ {
+ if (mRegistration->mCurrentWorker) {
+ // FIXME(nsm). Steps 3.1-3.4 of the algorithm.
+ }
+
+ mRegistration->mCurrentWorker = mRegistration->mWaitingWorker.forget();
+
+ // FIXME(nsm): Steps 7 of the algorithm.
+
+ nsRefPtr swm = ServiceWorkerManager::GetInstance();
+
+ swm->FireEventOnServiceWorkerContainers(mRegistration,
+ NS_LITERAL_STRING("controllerchange"));
+
+ MOZ_ASSERT(mRegistration->mCurrentWorker);
+ nsRefPtr serviceWorker;
+ nsresult rv =
+ swm->CreateServiceWorker(mRegistration->mCurrentWorker->GetScriptSpec(),
+ mRegistration->mScope,
+ getter_AddRefs(serviceWorker));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ nsMainThreadPtrHandle handle =
+ new nsMainThreadPtrHolder(mRegistration);
+
+ nsRefPtr r =
+ new ActivateEventRunnable(serviceWorker->GetWorkerPrivate(), handle);
+
+ AutoSafeJSContext cx;
+ if (!r->Dispatch(cx)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+ }
};
void
@@ -934,7 +1098,17 @@ ServiceWorkerManager::FinishInstall(ServiceWorkerRegistration* aRegistration)
// FIXME(nsm): Actually update the state of active ServiceWorker instances.
}
+ if (!aRegistration->mInstallingWorker) {
+ // It is possible that while this run of [[Install]] was waiting for
+ // the worker to handle the install event, some page called register() with
+ // a different script leading to [[Update]] terminating the
+ // installingWorker and setting it to null. The FinishInstallRunnable may
+ // already have been dispatched, hence the check.
+ return;
+ }
+
aRegistration->mWaitingWorker = aRegistration->mInstallingWorker.forget();
+ MOZ_ASSERT(aRegistration->mWaitingWorker);
// FIXME(nsm): Actually update state of active ServiceWorker instances to
// installed.
@@ -942,17 +1116,25 @@ ServiceWorkerManager::FinishInstall(ServiceWorkerRegistration* aRegistration)
// FIXME(nsm): Handle replace().
- // FIXME(nsm): Check that no document is using the registration!
+ if (!aRegistration->IsControllingDocuments()) {
+ nsRefPtr r =
+ new ActivationRunnable(aRegistration);
- nsRefPtr r =
- new ActivationRunnable(aRegistration);
-
- nsresult rv = NS_DispatchToMainThread(r);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- // FIXME(nsm): Handle error.
+ nsresult rv = NS_DispatchToMainThread(r);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ // FIXME(nsm): Handle error.
+ // How likely is this to happen and can we really do anything about it?
+ }
}
}
+void
+ServiceWorkerManager::FinishActivate(ServiceWorkerRegistration* aRegistration)
+{
+ // FIXME(nsm): Set aRegistration->mCurrentWorker state to activated.
+ // Fire statechange.
+}
+
NS_IMETHODIMP
ServiceWorkerManager::CreateServiceWorkerForWindow(nsPIDOMWindow* aWindow,
const nsACString& aScriptSpec,
@@ -1215,6 +1397,7 @@ ServiceWorkerManager::GetScopeForUrl(const nsAString& aUrl, nsAString& aScope)
aScope = NS_ConvertUTF8toUTF16(r->mScope);
return NS_OK;
}
+
NS_IMETHODIMP
ServiceWorkerManager::AddContainerEventListener(nsIURI* aDocumentURI, nsIDOMEventTarget* aListener)
{
diff --git a/dom/workers/ServiceWorkerManager.h b/dom/workers/ServiceWorkerManager.h
index 872f80c8001..e034dbb7658 100644
--- a/dom/workers/ServiceWorkerManager.h
+++ b/dom/workers/ServiceWorkerManager.h
@@ -186,6 +186,7 @@ public:
*/
class ServiceWorkerManager MOZ_FINAL : public nsIServiceWorkerManager
{
+ friend class ActivationRunnable;
friend class RegisterRunnable;
friend class CallInstallRunnable;
friend class ServiceWorkerUpdateInstance;
@@ -285,6 +286,9 @@ public:
void
FinishInstall(ServiceWorkerRegistration* aRegistration);
+ void
+ FinishActivate(ServiceWorkerRegistration* aRegistration);
+
void
HandleError(JSContext* aCx,
const nsACString& aScope,
diff --git a/dom/workers/test/mochitest.ini b/dom/workers/test/mochitest.ini
index 6b77f6ccaaa..48ee725ad8e 100644
--- a/dom/workers/test/mochitest.ini
+++ b/dom/workers/test/mochitest.ini
@@ -119,6 +119,7 @@ skip-if = (toolkit == 'gonk' && debug) #debug-only failure
[test_multi_sharedWorker.html]
[test_multi_sharedWorker_lifetimes.html]
[test_navigator.html]
+skip-if = buildapp == 'mulet'
[test_newError.html]
[test_onLine.html]
skip-if = (toolkit == 'gonk' && debug) #debug-only failure
diff --git a/dom/workers/test/serviceworkers/install_event_worker.js b/dom/workers/test/serviceworkers/install_event_worker.js
index 02b5174a778..f965d28aa8a 100644
--- a/dom/workers/test/serviceworkers/install_event_worker.js
+++ b/dom/workers/test/serviceworkers/install_event_worker.js
@@ -1,4 +1,3 @@
oninstall = function(e) {
- dump("NSM Got install event\n");
- dump(e.activeWorker);
+ dump("Got install event\n");
}
diff --git a/dom/workers/test/serviceworkers/test_install_event.html b/dom/workers/test/serviceworkers/test_install_event.html
index b84a9604bb5..dcea3d78adc 100644
--- a/dom/workers/test/serviceworkers/test_install_event.html
+++ b/dom/workers/test/serviceworkers/test_install_event.html
@@ -16,14 +16,19 @@