Backed out changesets 34a66a625618, 32db3daa20fe, and ac15ba8568c5 (bug 1102219) for Gaia unit test failures.
authorRyan VanderMeulen <ryanvm@gmail.com>
Thu, 11 Dec 2014 11:28:30 -0500
changeset 219204 57725f8e7aa1
parent 219203 445905b4d3c3
child 219205 5b53df2993fa
push id52784
push userryanvm@gmail.com
push dateThu, 11 Dec 2014 16:29:18 +0000
treeherdermozilla-inbound@57725f8e7aa1 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1102219
milestone37.0a1
backs out34a66a625618
32db3daa20fe
ac15ba8568c5
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changesets 34a66a625618, 32db3daa20fe, and ac15ba8568c5 (bug 1102219) for Gaia unit test failures.
addon-sdk/source/lib/sdk/self.js
addon-sdk/source/test/fixtures.js
addon-sdk/source/test/test-content-events.js
addon-sdk/source/test/test-page-worker.js
addon-sdk/source/test/test-system-input-output.js
browser/base/content/aboutaccounts/aboutaccounts.js
browser/base/content/browser-social.js
browser/base/content/browser.js
browser/base/content/sync/aboutSyncTabs.js
browser/base/content/tabbrowser.xml
browser/base/content/test/general/browser_bug839103.js
browser/base/content/test/general/browser_bug970746.js
browser/base/content/test/general/browser_devices_get_user_media.js
browser/base/content/test/general/browser_homeDrop.js
browser/base/content/test/general/browser_parsable_css.js
browser/base/content/test/general/browser_parsable_script.js
browser/base/content/test/general/browser_save_private_link_perwindowpb.js
browser/base/content/test/general/test_offline_gzip.html
browser/base/content/test/newtab/browser_newtab_search.js
browser/base/content/test/plugins/browser_CTP_remove_navigate.js
browser/base/content/test/plugins/browser_bug797677.js
browser/base/content/test/popupNotifications/head.js
browser/base/content/urlbarBindings.xml
browser/components/customizableui/content/panelUI.js
browser/components/downloads/content/allDownloadsViewOverlay.js
browser/components/loop/LoopCalls.jsm
browser/components/loop/content/js/contacts.js
browser/components/loop/content/js/contacts.jsx
browser/components/loop/test/xpcshell/test_loopservice_token_send.js
browser/components/nsBrowserGlue.js
browser/components/places/content/menu.xml
browser/components/sessionstore/test/browser_454908.js
browser/components/tabview/test/browser_tabview_bug626455.js
browser/components/test/browser_polaris_prefs.js
browser/components/translation/BingTranslator.jsm
browser/components/translation/test/bing.sjs
browser/components/translation/test/browser_translation_exceptions.js
browser/devtools/canvasdebugger/canvasdebugger.js
browser/devtools/canvasdebugger/test/browser_canvas-actor-test-03.js
browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js
browser/devtools/canvasdebugger/test/browser_canvas-frontend-img-screenshots.js
browser/devtools/commandline/test/browser_cmd_appcache_valid.js
browser/devtools/commandline/test/browser_cmd_cookie.js
browser/devtools/debugger/debugger-panes.js
browser/devtools/debugger/test/browser_dbg_addonactor.js
browser/devtools/debugger/test/browser_dbg_auto-pretty-print-01.js
browser/devtools/debugger/test/browser_dbg_auto-pretty-print-02.js
browser/devtools/debugger/test/browser_dbg_break-on-dom-03.js
browser/devtools/debugger/test/browser_dbg_chrome-debugging.js
browser/devtools/debugger/test/browser_dbg_file-reload.js
browser/devtools/debugger/test/browser_dbg_globalactor.js
browser/devtools/debugger/test/browser_dbg_pretty-print-01.js
browser/devtools/debugger/test/browser_dbg_pretty-print-02.js
browser/devtools/debugger/test/browser_dbg_pretty-print-05.js
browser/devtools/debugger/test/browser_dbg_pretty-print-06.js
browser/devtools/debugger/test/browser_dbg_pretty-print-07.js
browser/devtools/debugger/test/browser_dbg_pretty-print-08.js
browser/devtools/debugger/test/browser_dbg_pretty-print-09.js
browser/devtools/debugger/test/browser_dbg_pretty-print-10.js
browser/devtools/debugger/test/browser_dbg_pretty-print-11.js
browser/devtools/debugger/test/browser_dbg_pretty-print-13.js
browser/devtools/debugger/test/browser_dbg_scripts-switching-03.js
browser/devtools/debugger/test/browser_dbg_search-basic-02.js
browser/devtools/debugger/test/browser_dbg_search-basic-03.js
browser/devtools/debugger/test/browser_dbg_search-global-01.js
browser/devtools/debugger/test/browser_dbg_search-global-02.js
browser/devtools/debugger/test/browser_dbg_search-global-03.js
browser/devtools/debugger/test/browser_dbg_search-global-04.js
browser/devtools/debugger/test/browser_dbg_search-global-05.js
browser/devtools/debugger/test/browser_dbg_search-global-06.js
browser/devtools/debugger/test/browser_dbg_search-symbols.js
browser/devtools/debugger/test/browser_dbg_sources-cache.js
browser/devtools/debugger/test/browser_dbg_tabactor-01.js
browser/devtools/debugger/test/browser_dbg_tabactor-02.js
browser/devtools/debugger/test/browser_dbg_tracing-01.js
browser/devtools/debugger/test/browser_dbg_variables-view-01.js
browser/devtools/debugger/test/browser_dbg_variables-view-02.js
browser/devtools/debugger/test/browser_dbg_variables-view-frame-parameters-01.js
browser/devtools/debugger/test/browser_dbg_variables-view-frame-parameters-02.js
browser/devtools/debugger/test/browser_dbg_variables-view-frame-with.js
browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js
browser/devtools/debugger/test/browser_dbg_variables-view-popup-01.js
browser/devtools/debugger/test/browser_dbg_variables-view-popup-02.js
browser/devtools/debugger/test/browser_dbg_variables-view-popup-07.js
browser/devtools/debugger/test/browser_dbg_variables-view-popup-08.js
browser/devtools/debugger/test/browser_dbg_variables-view-webidl.js
browser/devtools/debugger/test/head.js
browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js
browser/devtools/framework/test/browser_toolbox_window_shortcuts.js
browser/devtools/inspector/test/browser_inspector_menu-02.js
browser/devtools/markupview/markup-view.js
browser/devtools/netmonitor/netmonitor-view.js
browser/devtools/netmonitor/test/browser_net_post-data-01.js
browser/devtools/netmonitor/test/browser_net_simple-request-details.js
browser/devtools/netmonitor/test/sjs_content-type-test-server.sjs
browser/devtools/netmonitor/test/sjs_sorting-test-server.sjs
browser/devtools/netmonitor/test/sjs_status-codes-test-server.sjs
browser/devtools/profiler/test/browser_profiler_tree-view-02.js
browser/devtools/profiler/utils/tree-model.js
browser/devtools/projecteditor/lib/editors.js
browser/devtools/scratchpad/test/browser_scratchpad_eval_func.js
browser/devtools/scratchpad/test/browser_scratchpad_pprint-02.js
browser/devtools/scratchpad/test/browser_scratchpad_pprint.js
browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js
browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js
browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js
browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js
browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js
browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js
browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js
browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js
browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js
browser/devtools/shared/Curl.jsm
browser/devtools/shared/Parser.jsm
browser/devtools/shared/autocomplete-popup.js
browser/devtools/shared/test/browser_telemetry_button_paintflashing.js
browser/devtools/shared/test/browser_telemetry_button_responsive.js
browser/devtools/shared/test/browser_telemetry_button_scratchpad.js
browser/devtools/shared/test/browser_telemetry_button_tilt.js
browser/devtools/shared/widgets/SideMenuWidget.jsm
browser/devtools/shared/widgets/VariablesView.jsm
browser/devtools/sourceeditor/editor.js
browser/devtools/storage/ui.js
browser/devtools/styleeditor/test/head.js
browser/devtools/styleinspector/css-parsing-utils.js
browser/devtools/webconsole/test/browser_bug_865871_variables_view_close_on_esc_key.js
browser/devtools/webconsole/test/browser_bug_869003_inspect_cross_domain_object.js
browser/devtools/webconsole/test/browser_console_log_inspectable_object.js
browser/devtools/webconsole/test/browser_console_variables_view.js
browser/devtools/webconsole/test/browser_console_variables_view_while_debugging.js
browser/devtools/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js
browser/devtools/webconsole/test/browser_webconsole_column_numbers.js
browser/metro/base/content/bindings/urlbar.xml
browser/modules/Chat.jsm
browser/modules/UITour.jsm
dom/base/test/csp/test_CSP_frameancestors.html
dom/base/test/csp/test_connect-src.html
dom/base/test/csp/test_form-action.html
dom/base/test/csp/test_leading_wildcard.html
dom/base/test/test_getFeature_with_perm.html
dom/base/test/test_hasFeature.html
dom/bindings/test/test_sequence_detection.html
dom/canvas/test/test_drawWindow.html
dom/canvas/test/webgl-mochitest/driver-info.js
dom/manifest/ManifestProcessor.jsm
dom/media/tests/mochitest/identity/test_setIdentityProvider.html
dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html
dom/media/tests/mochitest/nonTrickleIce.js
dom/media/tests/mochitest/pc.js
dom/media/tests/mochitest/templates.js
dom/media/tests/mochitest/test_dataChannel_noOffer.html
dom/media/tests/mochitest/test_peerConnection_bug1042791.html
dom/tests/browser/browser_bug1008941_dismissGeolocationHanger.js
dom/tests/mochitest/general/test_donottrack.html
dom/tests/mochitest/general/test_interfaces.html
dom/workers/test/navigator_worker.js
dom/workers/test/test_worker_interfaces.js
dom/xul/test/test_import_xul_to_content.xul
js/src/jit-test/tests/baseline/bug842431-2.js
js/src/jit-test/tests/baseline/bug842431-3.js
js/src/jit-test/tests/baseline/bug892787-1.js
js/src/jit-test/tests/baseline/bug892787-2.js
js/src/jit-test/tests/basic/bug1091757.js
js/src/jit-test/tests/basic/bug839420.js
js/src/jit-test/tests/basic/string-contains.js
js/src/jit-test/tests/basic/string-includes.js
js/src/jit-test/tests/debug/Debugger-findScripts-18.js
js/src/jit-test/tests/debug/Frame-eval-stack.js
js/src/jit-test/tests/generators/wrappers.js
js/src/jit-test/tests/ion/bug1060398.js
js/src/jit-test/tests/ion/bug870328.js
js/src/jit-test/tests/ion/bug906284.js
js/src/jit-test/tests/ion/bug909997.js
js/src/jit-test/tests/ion/bug945294.js
js/src/jit-test/tests/latin1/decompiler.js
js/src/jit-test/tests/latin1/function.js
js/src/jit-test/tests/latin1/indexOf.js
js/src/jit-test/tests/latin1/json.js
js/src/jit-test/tests/saved-stacks/evals.js
js/src/jit-test/tests/saved-stacks/stringify-with-self-hosted.js
js/src/jit-test/tests/xdr/asm.js
js/src/js.msg
js/src/jsstr.cpp
js/src/tests/ecma_5/extensions/strict-function-toSource.js
js/src/vm/GlobalObject.h
js/src/vm/Xdr.h
js/xpconnect/tests/chrome/test_xrayToJS.xul
layout/reftests/invalidation/nudge-to-integer-invalidation.html
layout/reftests/invalidation/transform-floating-point-invalidation.html
memory/replace/dmd/test/test_dmd.js
mobile/android/chrome/content/browser.js
modules/libpref/test/unit/test_warnings.js
services/common/modules-testing/bagheeraserver.js
services/healthreport/healthreporter.jsm
services/healthreport/providers.jsm
services/healthreport/tests/xpcshell/test_healthreporter.js
services/metrics/tests/xpcshell/test_metrics_provider_manager.js
services/metrics/tests/xpcshell/test_metrics_storage.js
services/sync/Weave.js
services/sync/modules/service.js
services/sync/tests/unit/test_browserid_identity.js
testing/modules/Assert.jsm
testing/xpcshell/head.js
toolkit/components/aboutmemory/tests/test_memoryReporters.xul
toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown.js
toolkit/components/osfile/tests/xpcshell/test_osfile_async_largefiles.js
toolkit/components/places/PlacesUtils.jsm
toolkit/components/places/UnifiedComplete.js
toolkit/components/places/nsPlacesAutoComplete.js
toolkit/components/search/tests/xpcshell/test_multipleIcons.js
toolkit/components/telemetry/tests/unit/test_TelemetryPing.js
toolkit/content/tests/widgets/test_videocontrols_standalone.html
toolkit/content/widgets/autocomplete.xml
toolkit/devtools/event-emitter.js
toolkit/devtools/event-parsers.js
toolkit/devtools/server/actors/script.js
toolkit/devtools/server/tests/unit/test_source-01.js
toolkit/devtools/tests/unit/test_safeErrorString.js
toolkit/devtools/webconsole/utils.js
toolkit/modules/GMPInstallManager.jsm
toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
toolkit/modules/tests/xpcshell/test_Log.js
toolkit/modules/tests/xpcshell/test_task.js
toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js
toolkit/webapps/tests/test_hosted_uninstall.xul
toolkit/webapps/tests/test_packaged_uninstall.xul
webapprt/content/downloads/downloads.js
--- a/addon-sdk/source/lib/sdk/self.js
+++ b/addon-sdk/source/lib/sdk/self.js
@@ -23,17 +23,17 @@ const loadReason = readPref("load.reason
 const rootURI = readPref("rootURI") || options.rootURI || "";
 const baseURI = readPref("baseURI") || options.prefixURI + name + "/";
 const addonDataURI = baseURI + "data/";
 const metadata = options.metadata || {};
 const permissions = metadata.permissions || {};
 const isPacked = rootURI && rootURI.indexOf("jar:") === 0;
 
 const uri = (path="") =>
-  path.includes(":") ? path : addonDataURI + path.replace(/^\.\//, "");
+  path.contains(":") ? path : addonDataURI + path.replace(/^\.\//, "");
 
 let { preferencesBranch } = options;
 if (/[^\w{@}.-]/.test(preferencesBranch)) {
   preferencesBranch = id;
   console.warn("Ignoring preferences-branch (not a valid branch name)");
 }
 
 // Some XPCOM APIs require valid URIs as an argument for certain operations
--- a/addon-sdk/source/test/fixtures.js
+++ b/addon-sdk/source/test/fixtures.js
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 const { uri } = module;
 const prefix = uri.substr(0, uri.lastIndexOf("/") + 1) + "fixtures/";
 
-exports.url = (path="") => path && path.includes(":")
+exports.url = (path="") => path && path.contains(":")
   ? path 
   : prefix + path.replace(/^\.\//, "");
--- a/addon-sdk/source/test/test-content-events.js
+++ b/addon-sdk/source/test/test-content-events.js
@@ -129,17 +129,17 @@ exports["test dead object errors"] = fun
 
   // The dead object error is properly reported on console but
   // doesn't raise any test's exception
   function onMessage({ subject }) {
     let message = subject.wrappedJSObject;
     let { level } = message;
     let text = String(message.arguments[0]);
 
-    if (level === "error" && text.includes("can't access dead object"))
+    if (level === "error" && text.contains("can't access dead object"))
       fail(text);
   }
 
   let cleanup = () => system.off("console-api-log-event", onMessage);
   let fail = (reason) => {
     cleanup();
     assert.fail(reason);
   }
--- a/addon-sdk/source/test/test-page-worker.js
+++ b/addon-sdk/source/test/test-page-worker.js
@@ -480,17 +480,17 @@ exports.testMessageQueue = function (ass
 };
 
 exports.testWindowStopDontBreak = function (assert, done) {
   const { Ci, Cc } = require('chrome');
   const consoleService = Cc['@mozilla.org/consoleservice;1'].
                             getService(Ci.nsIConsoleService);
   const listener = {
     observe: ({message}) => {
-      if (message.includes('contentWorker is null'))
+      if (message.contains('contentWorker is null'))
         assert.fail('contentWorker is null');
     }
   };
   consoleService.registerListener(listener)
 
   let page = new Page({
     contentURL: 'data:text/html;charset=utf-8,testWindowStopDontBreak',
     contentScriptWhen: 'ready',
--- a/addon-sdk/source/test/test-system-input-output.js
+++ b/addon-sdk/source/test/test-system-input-output.js
@@ -21,17 +21,17 @@ const isConsoleEvent = topic =>
    "console-storage-cache-event"].indexOf(topic) >= 0;
 
 const message = x => ({wrappedJSObject: {data: x}});
 
 exports["test start / stop ports"] = assert => {
   const input = new InputPort({ id: Date.now().toString(32), initial: {data:0} });
   const topic = input.topic;
 
-  assert.ok(topic.includes(addonID), "topics are namespaced to add-on");
+  assert.ok(topic.contains(addonID), "topics are namespaced to add-on");
 
   const xs = lift(({data}) => "x:" + data, input);
   const ys = lift(({data}) => "y:" + data, input);
 
   assert.deepEqual(input.value, {data:0}, "initila value is set");
   assert.deepEqual(xs.value, "x:0", "initial value is mapped");
   assert.deepEqual(ys.value, "y:0", "initial value is mapped");
 
@@ -211,17 +211,17 @@ exports["test explicit input topic"] = (
 };
 
 
 exports["test receive what was send"] = assert => {
   const id = Date.now().toString(32);
   const input = new InputPort({ id: id, initial: 0});
   const output = new OutputPort({ id: id, sync: true });
 
-  assert.ok(input.topic.includes(addonID),
+  assert.ok(input.topic.contains(addonID),
             "input topic is namespaced to addon");
   assert.equal(input.topic, output.topic,
               "input & output get same topics from id.");
 
   start(input);
 
   assert.equal(input.value, 0, "initial value is set");
 
--- a/browser/base/content/aboutaccounts/aboutaccounts.js
+++ b/browser/base/content/aboutaccounts/aboutaccounts.js
@@ -108,17 +108,17 @@ let wrapper = {
     let iframe = document.getElementById("remote");
     this.iframe = iframe;
     iframe.addEventListener("load", this);
 
     // Ideally we'd just merge urlParams with new URL(url).searchParams, but our
     // URLSearchParams implementation doesn't support iteration (bug 1085284).
     let urlParamStr = urlParams.toString();
     if (urlParamStr) {
-      url += (url.includes("?") ? "&" : "?") + urlParamStr;
+      url += (url.contains("?") ? "&" : "?") + urlParamStr;
     }
     iframe.src = url;
   },
 
   handleEvent: function (evt) {
     switch (evt.type) {
       case "load":
         this.iframe.contentWindow.addEventListener("FirefoxAccountsCommand", this);
--- a/browser/base/content/browser-social.js
+++ b/browser/base/content/browser-social.js
@@ -199,18 +199,18 @@ SocialUI = {
     }
   },
 
   get _chromeless() {
     // Is this a popup window that doesn't want chrome shown?
     let docElem = document.documentElement;
     // extrachrome is not restored during session restore, so we need
     // to check for the toolbar as well.
-    let chromeless = docElem.getAttribute("chromehidden").includes("extrachrome") ||
-                     docElem.getAttribute('chromehidden').includes("toolbar");
+    let chromeless = docElem.getAttribute("chromehidden").contains("extrachrome") ||
+                     docElem.getAttribute('chromehidden').contains("toolbar");
     // This property is "fixed" for a window, so avoid doing the check above
     // multiple times...
     delete this._chromeless;
     this._chromeless = chromeless;
     return chromeless;
   },
 
   get enabled() {
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -2959,17 +2959,17 @@ let BrowserOnClick = {
 function getMeOutOfHere() {
   // Get the start page from the *default* pref branch, not the user's
   var prefs = Services.prefs.getDefaultBranch(null);
   var url = BROWSER_NEW_TAB_URL;
   try {
     url = prefs.getComplexValue("browser.startup.homepage",
                                 Ci.nsIPrefLocalizedString).data;
     // If url is a pipe-delimited set of pages, just take the first one.
-    if (url.includes("|"))
+    if (url.contains("|"))
       url = url.split("|")[0];
   } catch(e) {
     Components.utils.reportError("Couldn't get homepage pref: " + e);
   }
   gBrowser.loadURI(url);
 }
 
 function BrowserFullScreen()
@@ -3768,17 +3768,17 @@ function FillHistoryMenu(aParent) {
     aParent.appendChild(item);
   }
   return true;
 }
 
 function addToUrlbarHistory(aUrlToAdd) {
   if (!PrivateBrowsingUtils.isWindowPrivate(window) &&
       aUrlToAdd &&
-      !aUrlToAdd.includes(" ") &&
+      !aUrlToAdd.contains(" ") &&
       !/[\x00-\x1F]/.test(aUrlToAdd))
     PlacesUIUtils.markPageAsTyped(aUrlToAdd);
 }
 
 function toJavaScriptConsole()
 {
   toOpenWindowByType("global:console", "chrome://global/content/console.xul");
 }
@@ -6641,17 +6641,17 @@ function GetSearchFieldBookmarkData(node
     }
   }
 
   var postData;
 
   if (isURLEncoded)
     postData = formData.join("&");
   else {
-    let separator = spec.includes("?") ? "&" : "?";
+    let separator = spec.contains("?") ? "&" : "?";
     spec += separator + formData.join("&");
   }
 
   return {
     spec: spec,
     title: title,
     description: description,
     postData: postData,
--- a/browser/base/content/sync/aboutSyncTabs.js
+++ b/browser/base/content/sync/aboutSyncTabs.js
@@ -62,18 +62,18 @@ let RemoteTabViewer = {
     let numTabs = this._tabsList.getRowCount();
     let clientTabs = 0;
     let currentClient = null;
 
     for (let i = 0; i < numTabs; i++) {
       let item = this._tabsList.getItemAtIndex(i);
       let hide = false;
       if (item.getAttribute("type") == "tab") {
-        if (!item.getAttribute("url").toLowerCase().includes(val) &&
-            !item.getAttribute("title").toLowerCase().includes(val)) {
+        if (!item.getAttribute("url").toLowerCase().contains(val) &&
+            !item.getAttribute("title").toLowerCase().contains(val)) {
           hide = true;
         } else {
           clientTabs++;
         }
       }
       else if (item.getAttribute("type") == "client") {
         if (currentClient) {
           if (clientTabs == 0) {
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -980,17 +980,17 @@
                 newTitle += sep;
             }
             newTitle += modifier;
 
             // If location bar is hidden and the URL type supports a host,
             // add the scheme and host to the title to prevent spoofing.
             // XXX https://bugzilla.mozilla.org/show_bug.cgi?id=22183#c239
             try {
-              if (docElement.getAttribute("chromehidden").includes("location")) {
+              if (docElement.getAttribute("chromehidden").contains("location")) {
                 var uri = this.mURIFixup.createExposableURI(
                             aBrowser.currentURI);
                 if (uri.scheme == "about")
                   newTitle = uri.spec + sep + newTitle;
                 else
                   newTitle = uri.prePath + sep + newTitle;
               }
             } catch (e) {}
--- a/browser/base/content/test/general/browser_bug839103.js
+++ b/browser/base/content/test/general/browser_bug839103.js
@@ -13,17 +13,17 @@ function test() {
 }
 
 function initialStylesheetAdded(evt) {
   gBrowser.removeEventListener("StyleSheetAdded", initialStylesheetAdded, true);
   ok(true, "received initial style sheet event");
   is(evt.type, "StyleSheetAdded", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
   ok(evt.stylesheet, "evt.stylesheet is defined");
-  ok(evt.stylesheet.toString().includes("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
+  ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
   ok(evt.documentSheet, "style sheet is a document sheet");
 }
 
 function tabLoad(evt) {
   gTab.linkedBrowser.removeEventListener(evt.type, tabLoad, true);
   executeSoon(continueTest);
 }
 
@@ -58,17 +58,17 @@ function continueTest() {
 }
 
 function dynamicStylesheetAdded(evt) {
   gBrowser.removeEventListener("StyleSheetAdded", dynamicStylesheetAdded, true);
   ok(true, "received dynamic style sheet event");
   is(evt.type, "StyleSheetAdded", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
   ok(evt.stylesheet, "evt.stylesheet is defined");
-  ok(evt.stylesheet.toString().includes("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
+  ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
   ok(evt.documentSheet, "style sheet is a document sheet");
 }
 
 function dynamicStylesheetApplicableStateChanged(evt) {
   gBrowser.removeEventListener("StyleSheetApplicableStateChanged", dynamicStylesheetApplicableStateChanged, true);
   ok(true, "received dynamic style sheet applicable state change event");
   is(evt.type, "StyleSheetApplicableStateChanged", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
@@ -92,58 +92,58 @@ function dynamicStylesheetApplicableStat
 }
 
 function dynamicStylesheetRemoved(evt) {
   gBrowser.removeEventListener("StyleSheetRemoved", dynamicStylesheetRemoved, true);
   ok(true, "received dynamic style sheet removal");
   is(evt.type, "StyleSheetRemoved", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
   ok(evt.stylesheet, "evt.stylesheet is defined");
-  ok(evt.stylesheet.toString().includes("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
-  ok(evt.stylesheet.href.includes(gStyleSheet), "evt.stylesheet is the removed stylesheet");
+  ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
+  ok(evt.stylesheet.href.contains(gStyleSheet), "evt.stylesheet is the removed stylesheet");
 
   gBrowser.addEventListener("StyleRuleAdded", styleRuleAdded, true);
   gBrowser.contentDocument.querySelector("style").sheet.insertRule("*{color:black}", 0);
 }
 
 function styleRuleAdded(evt) {
   gBrowser.removeEventListener("StyleRuleAdded", styleRuleAdded, true);
   ok(true, "received style rule added event");
   is(evt.type, "StyleRuleAdded", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
   ok(evt.stylesheet, "evt.stylesheet is defined");
-  ok(evt.stylesheet.toString().includes("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
+  ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
   ok(evt.rule, "evt.rule is defined");
   is(evt.rule.cssText, "* { color: black; }", "evt.rule.cssText has expected value");
 
   gBrowser.addEventListener("StyleRuleChanged", styleRuleChanged, true);
   evt.rule.style.cssText = "color:green";
 }
 
 function styleRuleChanged(evt) {
   gBrowser.removeEventListener("StyleRuleChanged", styleRuleChanged, true);
   ok(true, "received style rule changed event");
   is(evt.type, "StyleRuleChanged", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
   ok(evt.stylesheet, "evt.stylesheet is defined");
-  ok(evt.stylesheet.toString().includes("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
+  ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
   ok(evt.rule, "evt.rule is defined");
   is(evt.rule.cssText, "* { color: green; }", "evt.rule.cssText has expected value");
 
   gBrowser.addEventListener("StyleRuleRemoved", styleRuleRemoved, true);
   evt.stylesheet.deleteRule(0);
 }
 
 function styleRuleRemoved(evt) {
   gBrowser.removeEventListener("StyleRuleRemoved", styleRuleRemoved, true);
   ok(true, "received style rule removed event");
   is(evt.type, "StyleRuleRemoved", "evt.type has expected value");
   is(evt.target, gBrowser.contentDocument, "event targets correct document");
   ok(evt.stylesheet, "evt.stylesheet is defined");
-  ok(evt.stylesheet.toString().includes("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
+  ok(evt.stylesheet.toString().contains("CSSStyleSheet"), "evt.stylesheet is a stylesheet");
   ok(evt.rule, "evt.rule is defined");
 
   executeSoon(concludeTest);
 }
 
 function concludeTest() {
   let doc = gBrowser.contentDocument;
   doc.removeEventListener("StyleSheetAdded", unexpectedContentEvent, false);
--- a/browser/base/content/test/general/browser_bug970746.js
+++ b/browser/base/content/test/general/browser_bug970746.js
@@ -35,17 +35,17 @@ function test() {
       }
 
       let contextMenu = new nsContextMenu(contentAreaContextMenu);
       let menuItem = document.getElementById("context-searchselect");
 
       is(document.getElementById("context-searchselect").hidden, !opts.shouldBeShown, "search context menu item is shown for  '#" + opts.id + "' and selected is '" + opts.isSelected + "'");
 
       if(opts.shouldBeShown) {
-        ok(menuItem.label.includes(opts.expectedLabelContents), "Menu item text '" + menuItem.label  + "' contains the correct search terms '" + opts.expectedLabelContents  + "'");
+        ok(menuItem.label.contains(opts.expectedLabelContents), "Menu item text '" + menuItem.label  + "' contains the correct search terms '" + opts.expectedLabelContents  + "'");
       }
     }
 
     testElement({
       id: "link",
       isSelected: true,
       shouldBeShown: true,
       expectedLabelContents: "I'm a link!",
--- a/browser/base/content/test/general/browser_devices_get_user_media.js
+++ b/browser/base/content/test/general/browser_devices_get_user_media.js
@@ -149,17 +149,17 @@ function activateSecondaryAction(aAction
       EventUtils.synthesizeKey("VK_DOWN", {});
 
     // Activate
     EventUtils.synthesizeKey("VK_RETURN", {});
   }, false);
 
   // One down event to open the popup
   EventUtils.synthesizeKey("VK_DOWN",
-                           { altKey: !navigator.platform.includes("Mac") });
+                           { altKey: !navigator.platform.contains("Mac") });
 }
 
 registerCleanupFunction(function() {
   gBrowser.removeCurrentTab();
   kObservedTopics.forEach(topic => {
     Services.obs.removeObserver(observer, topic);
   });
   Services.prefs.clearUserPref(PREF_PERMISSION_FAKE);
--- a/browser/base/content/test/general/browser_homeDrop.js
+++ b/browser/base/content/test/general/browser_homeDrop.js
@@ -32,17 +32,17 @@ function test() {
     ok(true, "dialog appeared in response to home button drop");
     domwindow.document.documentElement.cancelDialog();
     Services.wm.removeListener(dialogListener);
 
     // Now trigger the invalid URI test
     executeSoon(function () {
       let consoleListener = {
         observe: function (m) {
-          if (m.message.includes("NS_ERROR_DOM_BAD_URI")) {
+          if (m.message.contains("NS_ERROR_DOM_BAD_URI")) {
             ok(true, "drop was blocked");
             executeSoon(finish);
           }
         }
       }
       Services.console.registerListener(consoleListener);
       registerCleanupFunction(function () {
         Services.console.unregisterListener(consoleListener);
--- a/browser/base/content/test/general/browser_parsable_css.js
+++ b/browser/base/content/test/general/browser_parsable_css.js
@@ -68,17 +68,17 @@ add_task(function checkAllTheCSS() {
 
   // Listen for errors caused by the CSS:
   let errorListener = {
     observe: function(aMessage) {
       if (!aMessage || !(aMessage instanceof Ci.nsIScriptError)) {
         return;
       }
       // Only care about CSS errors generated by our iframe:
-      if (aMessage.category.includes("CSS") && aMessage.innerWindowID === 0 && aMessage.outerWindowID === 0) {
+      if (aMessage.category.contains("CSS") && aMessage.innerWindowID === 0 && aMessage.outerWindowID === 0) {
         // Check if this error is whitelisted in kWhitelist
         if (!ignoredError(aMessage)) {
           ok(false, "Got error message for " + aMessage.sourceName + ": " + aMessage.errorMessage);
           errors++;
         } else {
           info("Ignored error for " + aMessage.sourceName + " because of filter.");
         }
       }
--- a/browser/base/content/test/general/browser_parsable_script.js
+++ b/browser/base/content/test/general/browser_parsable_script.js
@@ -78,32 +78,32 @@ add_task(function* checkAllTheJS() {
       return;
     }
     // Request a 10 minutes timeout (30 seconds * 20) for debug builds.
     requestLongerTimeout(20);
   }
 
   let uris;
   // If an absolute URI is specified on the command line, use it immediately.
-  if (parseValue && parseValue.includes(":")) {
+  if (parseValue && parseValue.contains(":")) {
     uris = [NetUtil.newURI(parseValue)];
   } else {
     let appDir = Services.dirsvc.get("XCurProcD", Ci.nsIFile);
     // This asynchronously produces a list of URLs (sadly, mostly sync on our
     // test infrastructure because it runs against jarfiles there, and
     // our zipreader APIs are all sync)
     let startTimeMs = Date.now();
     info("Collecting URIs");
     uris = yield generateURIsFromDirTree(appDir, [".js", ".jsm"]);
     info("Collected URIs in " + (Date.now() - startTimeMs) + "ms");
 
     // Apply the filter specified on the command line, if any.
     if (parseValue) {
       uris = uris.filter(uri => {
-        if (uri.spec.includes(parseValue)) {
+        if (uri.spec.contains(parseValue)) {
           return true;
         }
         info("Not checking filtered out " + uri.spec);
         return false;
       });
     }
   }
 
--- a/browser/base/content/test/general/browser_save_private_link_perwindowpb.js
+++ b/browser/base/content/test/general/browser_save_private_link_perwindowpb.js
@@ -19,17 +19,17 @@ function test() {
       onCacheStorageInfo: function(num, consumption)
       {
         info("disk storage contains " + num + " entries");
       },
       onCacheEntryInfo: function(uri)
       {
         var urispec = uri.asciiSpec;
         info(urispec);
-        is(urispec.includes(filename), false, "web content present in disk cache");
+        is(urispec.contains(filename), false, "web content present in disk cache");
       },
       onCacheEntryVisitCompleted: function()
       {
         goon();
       }
     };
     function Visitor() {}
 
--- a/browser/base/content/test/general/test_offline_gzip.html
+++ b/browser/base/content/test/general/test_offline_gzip.html
@@ -73,17 +73,17 @@ function handleMessageEvents(event) {
         // Sometimes document.body may not exist, and trying to access
         // it will throw an exception, so handle this case.
         try {
           var bodyInnerHTML = frames.testFrame.document.body.innerHTML;
         }
         catch (e) {
           var bodyInnerHTML = "";
         }
-        if (cacheCount == 2 || bodyInnerHTML.includes("error")) {
+        if (cacheCount == 2 || bodyInnerHTML.contains("error")) {
           clearInterval(intervalID);
           is(cacheCount, 2, "frame not reloaded successfully");
           if (cacheCount != 2) {
             finishTest();
           }
         }
       }, 100);
       break;
--- a/browser/base/content/test/newtab/browser_newtab_search.js
+++ b/browser/base/content/test/newtab/browser_newtab_search.js
@@ -299,17 +299,17 @@ function blobToBase64(blob) {
     }
     reader.onerror = reject;
     reader.readAsDataURL(blob);
   });
 }
 
 let checkCurrentEngine = Task.async(function* ({name: basename, logoPrefix1x, logoPrefix2x}) {
   let engine = Services.search.currentEngine;
-  ok(engine.name.includes(basename),
+  ok(engine.name.contains(basename),
      "Sanity check: current engine: engine.name=" + engine.name +
      " basename=" + basename);
 
   // gSearch.currentEngineName
   is(gSearch().currentEngineName, engine.name,
      "currentEngineName: " + engine.name);
 });
 
--- a/browser/base/content/test/plugins/browser_CTP_remove_navigate.js
+++ b/browser/base/content/test/plugins/browser_CTP_remove_navigate.js
@@ -70,13 +70,13 @@ add_task(function* () {
   let plugin = browser.contentDocument.getElementById("test");
   plugin.remove();
   yield loadPage(browser, gTestRoot + "plugin_small_2.html");
   let notification = yield waitForNotificationBar("plugin-hidden", browser);
   ok(notification, "There should be a notification shown for the new page.");
 
   // Ensure that the notification is showing information about
   // the x-second-test plugin.
-  ok(notification.label.includes("Second Test"), "Should mention the second plugin");
-  ok(!notification.label.includes("127.0.0.1"), "Should not refer to old principal");
-  ok(notification.label.includes("null"), "Should refer to the new principal");
+  ok(notification.label.contains("Second Test"), "Should mention the second plugin");
+  ok(!notification.label.contains("127.0.0.1"), "Should not refer to old principal");
+  ok(notification.label.contains("null"), "Should refer to the new principal");
   gBrowser.removeTab(newTab);
 });
--- a/browser/base/content/test/plugins/browser_bug797677.js
+++ b/browser/base/content/test/plugins/browser_bug797677.js
@@ -14,17 +14,17 @@ function test() {
   var newTab = gBrowser.addTab();
   gBrowser.selectedTab = newTab;
   gTestBrowser = gBrowser.selectedBrowser;
   gTestBrowser.addEventListener("PluginBindingAttached", pluginBindingAttached, true, true);
   var consoleService = Cc["@mozilla.org/consoleservice;1"]
                          .getService(Ci.nsIConsoleService);
   var errorListener = {
     observe: function(aMessage) {
-      if (aMessage.message.includes("NS_ERROR"))
+      if (aMessage.message.contains("NS_ERROR"))
         gConsoleErrors++;
     }
   };
   consoleService.registerListener(errorListener);
   registerCleanupFunction(function() {
     gTestBrowser.removeEventListener("PluginBindingAttached", pluginBindingAttached, true);
     consoleService.unregisterListener(errorListener);
     gBrowser.removeCurrentTab();
--- a/browser/base/content/test/popupNotifications/head.js
+++ b/browser/base/content/test/popupNotifications/head.js
@@ -304,10 +304,10 @@ function triggerSecondaryCommand(popup, 
       EventUtils.synthesizeKey("VK_DOWN", {});
     }
     // Activate
     EventUtils.synthesizeKey("VK_RETURN", {});
   }, false);
 
   // One down event to open the popup
   info("Open the popup to trigger secondary command for notification " + notification.id);
-  EventUtils.synthesizeKey("VK_DOWN", { altKey: !navigator.platform.includes("Mac") });
+  EventUtils.synthesizeKey("VK_DOWN", { altKey: !navigator.platform.contains("Mac") });
 }
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -514,17 +514,17 @@
           var selectedVal = inputVal.substring(this.selectionStart, this.selectionEnd);
 
           // If the selection doesn't start at the beginning or doesn't span the full domain or
           // the URL bar is modified, nothing else to do here.
           if (this.selectionStart > 0 || this.valueIsTyped)
             return selectedVal;
           // The selection doesn't span the full domain if it doesn't contain a slash and is
           // followed by some character other than a slash.
-          if (!selectedVal.includes("/")) {
+          if (!selectedVal.contains("/")) {
             let remainder = inputVal.replace(selectedVal, "");
             if (remainder != "" && remainder[0] != "/")
               return selectedVal;
           }
 
           let uriFixup = Cc["@mozilla.org/docshell/urifixup;1"].getService(Ci.nsIURIFixup);
 
           let uri;
--- a/browser/components/customizableui/content/panelUI.js
+++ b/browser/components/customizableui/content/panelUI.js
@@ -426,17 +426,17 @@ const PanelUI = {
   _adjustLabelsForAutoHyphens: function(aNode) {
     let toolbarButtons = aNode ? [aNode] :
                                  this.contents.querySelectorAll(".toolbarbutton-1");
     for (let node of toolbarButtons) {
       let label = node.getAttribute("label");
       if (!label) {
         continue;
       }
-      if (label.includes("\u00ad")) {
+      if (label.contains("\u00ad")) {
         node.setAttribute("auto-hyphens", "off");
       } else {
         node.removeAttribute("auto-hyphens");
       }
     }
   },
 
   /**
--- a/browser/components/downloads/content/allDownloadsViewOverlay.js
+++ b/browser/components/downloads/content/allDownloadsViewOverlay.js
@@ -687,18 +687,18 @@ DownloadElementShell.prototype = {
 
   // Returns whether or not the download handled by this shell should
   // show up in the search results for the given term.  Both the display
   // name for the download and the url are searched.
   matchesSearchTerm: function DES_matchesSearchTerm(aTerm) {
     if (!aTerm)
       return true;
     aTerm = aTerm.toLowerCase();
-    return this.getDownloadMetaData().displayName.toLowerCase().includes(aTerm) ||
-           this.downloadURI.toLowerCase().includes(aTerm);
+    return this.getDownloadMetaData().displayName.toLowerCase().contains(aTerm) ||
+           this.downloadURI.toLowerCase().contains(aTerm);
   },
 
   // Handles return keypress on the element (the keypress listener is
   // set in the DownloadsPlacesView object).
   doDefaultCommand: function DES_doDefaultCommand() {
     function getDefaultCommandForState(aState) {
       switch (aState) {
         case nsIDM.DOWNLOAD_FINISHED:
--- a/browser/components/loop/LoopCalls.jsm
+++ b/browser/components/loop/LoopCalls.jsm
@@ -279,17 +279,17 @@ let LoopCallsInternal = {
     const openChat = () => {
       this.conversationInProgress.id = MozLoopService.openChatWindow(callData);
     };
 
     if (callData.type == "incoming" && ("callerId" in callData) &&
         EMAIL_OR_PHONE_RE.test(callData.callerId)) {
       LoopContacts.search({
         q: callData.callerId,
-        field: callData.callerId.includes("@") ? "email" : "tel"
+        field: callData.callerId.contains("@") ? "email" : "tel"
       }, (err, contacts) => {
         if (err) {
           // Database error, helas!
           openChat();
           return;
         }
 
         for (let contact of contacts) {
--- a/browser/components/loop/content/js/contacts.js
+++ b/browser/components/loop/content/js/contacts.js
@@ -476,18 +476,18 @@ loop.contacts = (function(_, mozL10n) {
       });
 
       let showFilter = Object.getOwnPropertyNames(this.contacts).length >=
                        MIN_CONTACTS_FOR_FILTERING;
       if (showFilter) {
         let filter = this.state.filter.trim().toLocaleLowerCase();
         if (filter) {
           let filterFn = contact => {
-            return contact.name[0].toLocaleLowerCase().includes(filter) ||
-                   getPreferred(contact, "email").value.toLocaleLowerCase().includes(filter);
+            return contact.name[0].toLocaleLowerCase().contains(filter) ||
+                   getPreferred(contact, "email").value.toLocaleLowerCase().contains(filter);
           };
           if (shownContacts.available) {
             shownContacts.available = shownContacts.available.filter(filterFn);
           }
           if (shownContacts.blocked) {
             shownContacts.blocked = shownContacts.blocked.filter(filterFn);
           }
         }
--- a/browser/components/loop/content/js/contacts.jsx
+++ b/browser/components/loop/content/js/contacts.jsx
@@ -476,18 +476,18 @@ loop.contacts = (function(_, mozL10n) {
       });
 
       let showFilter = Object.getOwnPropertyNames(this.contacts).length >=
                        MIN_CONTACTS_FOR_FILTERING;
       if (showFilter) {
         let filter = this.state.filter.trim().toLocaleLowerCase();
         if (filter) {
           let filterFn = contact => {
-            return contact.name[0].toLocaleLowerCase().includes(filter) ||
-                   getPreferred(contact, "email").value.toLocaleLowerCase().includes(filter);
+            return contact.name[0].toLocaleLowerCase().contains(filter) ||
+                   getPreferred(contact, "email").value.toLocaleLowerCase().contains(filter);
           };
           if (shownContacts.available) {
             shownContacts.available = shownContacts.available.filter(filterFn);
           }
           if (shownContacts.blocked) {
             shownContacts.blocked = shownContacts.blocked.filter(filterFn);
           }
         }
--- a/browser/components/loop/test/xpcshell/test_loopservice_token_send.js
+++ b/browser/components/loop/test/xpcshell/test_loopservice_token_send.js
@@ -8,21 +8,21 @@ add_test(function test_registration_uses
   loopServer.registerPathHandler("/registration", (request, response) => {
     // Check that we have an Authorization header with the correct bits. The
     // translation of values are tested in different modules, for the components
     // that we use.
     // XXX In future, we should reconsider our stubbing model, and possibly stub
     // components/interfaces at a higher level.
     let header = request.getHeader("Authorization");
 
-    Assert.notEqual(header.includes("Hawk id="), -1, "Should contain a hawk id");
-    Assert.notEqual(header.includes("ts="), -1, "Should contain a timestamp");
-    Assert.notEqual(header.includes("nonce="), -1, "Should contain a nonce");
-    Assert.notEqual(header.includes("hash="), -1, "Should contain a hash");
-    Assert.notEqual(header.includes("mac="), -1, "Should contain a mac");
+    Assert.notEqual(header.contains("Hawk id="), -1, "Should contain a hawk id");
+    Assert.notEqual(header.contains("ts="), -1, "Should contain a timestamp");
+    Assert.notEqual(header.contains("nonce="), -1, "Should contain a nonce");
+    Assert.notEqual(header.contains("hash="), -1, "Should contain a hash");
+    Assert.notEqual(header.contains("mac="), -1, "Should contain a mac");
 
     response.setStatusLine(null, 200, "OK");
     response.processAsync();
     response.finish();
   });
 
   MozLoopService.promiseRegisteredWithServers().then(() => {
     run_next_test();
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1588,17 +1588,17 @@ BrowserGlue.prototype = {
     }
 
     if (currentUIVersion < 12) {
       // Remove bookmarks-menu-button-container, then place
       // bookmarks-menu-button into its position.
       let currentset = xulStore.getValue(BROWSER_DOCURL, "nav-bar", "currentset");
       // Need to migrate only if toolbar is customized.
       if (currentset) {
-        if (currentset.includes("bookmarks-menu-button-container")) {
+        if (currentset.contains("bookmarks-menu-button-container")) {
           currentset = currentset.replace(/(^|,)bookmarks-menu-button-container($|,)/,
                                           "$1bookmarks-menu-button$2");
           xulStore.setValue(BROWSER_DOCURL, "nav-bar", "currentset", currentset);
         }
       }
     }
 
     if (currentUIVersion < 14) {
@@ -1616,23 +1616,23 @@ BrowserGlue.prototype = {
     }
 
     // Insert the bookmarks-menu-button into the nav-bar if it isn't already
     // there.
     if (currentUIVersion < 17) {
       let currentset = xulStore.getValue(BROWSER_DOCURL, "nav-bar", "currentset");
       // Need to migrate only if toolbar is customized.
       if (currentset) {
-        if (!currentset.includes("bookmarks-menu-button")) {
+        if (!currentset.contains("bookmarks-menu-button")) {
           // The button isn't in the nav-bar, so let's look for an appropriate
           // place to put it.
-          if (currentset.includes("downloads-button")) {
+          if (currentset.contains("downloads-button")) {
             currentset = currentset.replace(/(^|,)downloads-button($|,)/,
                                             "$1bookmarks-menu-button,downloads-button$2");
-          } else if (currentset.includes("home-button")) {
+          } else if (currentset.contains("home-button")) {
             currentset = currentset.replace(/(^|,)home-button($|,)/,
                                             "$1bookmarks-menu-button,home-button$2");
           } else {
             // Just append.
             currentset = currentset.replace(/(^|,)window-controls($|,)/,
                                             "$1bookmarks-menu-button,window-controls$2")
           }
           xulStore.setValue(BROWSER_DOCURL, "nav-bar", "currentset", currentset);
--- a/browser/components/places/content/menu.xml
+++ b/browser/components/places/content/menu.xml
@@ -590,17 +590,17 @@
       <handler event="popupshown" phase="target"><![CDATA[
         this.setAttribute("panelopen", "true");
         let disablePointerEvents;
         if (!this.hasAttribute("disablepointereventsfortransition")) {
           let container = document.getAnonymousElementByAttribute(this, "anonid", "container");
           let cs = getComputedStyle(container);
           let transitionProp = cs.transitionProperty;
           let transitionTime = parseFloat(cs.transitionDuration);
-          disablePointerEvents = (transitionProp.includes("transform") ||
+          disablePointerEvents = (transitionProp.contains("transform") ||
                                   transitionProp == "all") &&
                                  transitionTime > 0;
           this.setAttribute("disablepointereventsfortransition", disablePointerEvents);
         } else {
           disablePointerEvents = this.getAttribute("disablepointereventsfortransition") == "true";
         }
         if (!disablePointerEvents) {
           this.style.removeProperty("pointer-events");
--- a/browser/components/sessionstore/test/browser_454908.js
+++ b/browser/components/sessionstore/test/browser_454908.js
@@ -38,15 +38,15 @@ add_task(function* test_dont_save_passwo
   is(username, usernameValue, "username was saved/restored");
   let passwd = yield getInputValue(browser, {id: "passwd"});
   is(passwd, "", "password wasn't saved/restored");
 
   // Write to disk and read our file.
   yield forceSaveState();
   yield promiseForEachSessionRestoreFile((state, key) =>
     // Ensure that we have not saved our password.
-    ok(!state.includes(PASS), "password has not been written to file " + key)
+    ok(!state.contains(PASS), "password has not been written to file " + key)
   );
 
 
   // Cleanup.
   gBrowser.removeTab(tab);
 });
--- a/browser/components/tabview/test/browser_tabview_bug626455.js
+++ b/browser/components/tabview/test/browser_tabview_bug626455.js
@@ -40,17 +40,17 @@ function testStayOnPage(win, blockingTab
     executeSoon(function () {
       showTabView(function () {
         is(win.gBrowser.tabs.length, 1,
            "The total number of tab is 1 when staying on the page");
 
         // The other initial tab has been closed when trying to close the tab
         // group. The only tab left is the one with the onbeforeunload dialog.
         let url = win.gBrowser.browsers[0].currentURI.spec;
-        ok(url.includes("onbeforeunload"), "The open tab is the expected one");
+        ok(url.contains("onbeforeunload"), "The open tab is the expected one");
 
         is(contentWindow.GroupItems.getActiveGroupItem(), activeGroup,
            "Active group is still the same");
 
         is(contentWindow.GroupItems.groupItems.length, 1,
            "Only one group is open");
 
         // start the next test
--- a/browser/components/test/browser_polaris_prefs.js
+++ b/browser/components/test/browser_polaris_prefs.js
@@ -19,17 +19,17 @@ function* assertPref(pref, enabled) {
 
 function* testPrefs(test) {
   for (let pref of prefs) {
     yield test(pref);
   }
 }
 
 function isNightly() {
-  return Services.appinfo.version.includes("a1");
+  return Services.appinfo.version.contains("a1");
 }
 
 add_task(function* test_default_values() {
   if (!isNightly()) {
     ok(true, "Skipping test, not Nightly")
     return;
   }
   Assert.ok(!Services.prefs.getBoolPref(POLARIS_ENABLED), POLARIS_ENABLED + " is disabled by default.");
--- a/browser/components/translation/BingTranslator.jsm
+++ b/browser/components/translation/BingTranslator.jsm
@@ -130,18 +130,18 @@ this.BingTranslator.prototype = {
    * request left.
    *
    * @param   aError   [optional] The RESTRequest that failed.
    */
   _chunkFailed: function(aError) {
     if (aError instanceof RESTRequest &&
         [400, 401].indexOf(aError.response.status) != -1) {
       let body = aError.response.body;
-      if (body.includes("TranslateApiException") &&
-          (body.includes("balance") || body.includes("active state")))
+      if (body.contains("TranslateApiException") &&
+          (body.contains("balance") || body.contains("active state")))
         this._serviceUnavailable = true;
     }
 
     this._checkIfFinished();
   },
 
   /**
    * Function called when a request sent to the server has completed.
--- a/browser/components/translation/test/bing.sjs
+++ b/browser/components/translation/test/bing.sjs
@@ -125,17 +125,17 @@ function checkAuth(req) {
   if (!req.hasHeader("Authorization"))
     throw new HTTPError(401, "No Authorization header provided.");
 
   let auth = req.getHeader("Authorization");
   if (!auth.startsWith("Bearer "))
     throw new HTTPError(401, "Invalid Authorization header content: '" + auth + "'");
 
   // Rejecting inactive subscriptions.
-  if (auth.includes("inactive")) {
+  if (auth.contains("inactive")) {
     const INACTIVE_STATE_RESPONSE = "<html><body><h1>TranslateApiException</h1><p>Method: TranslateArray()</p><p>Message: The Azure Market Place Translator Subscription associated with the request credentials is not in an active state.</p><code></code><p>message id=5641.V2_Rest.TranslateArray.48CC6470</p></body></html>";
     throw new HTTPError(401, INACTIVE_STATE_RESPONSE);
   }
 
 }
 
 function reallyHandleRequest(req, res) {
   log("method: " + req.method);
--- a/browser/components/translation/test/browser_translation_exceptions.js
+++ b/browser/components/translation/test/browser_translation_exceptions.js
@@ -67,17 +67,17 @@ function openPopup(aPopup) {
   aPopup.addEventListener("popupshown", function popupShown() {
     aPopup.removeEventListener("popupshown", popupShown);
     deferred.resolve();
   });
 
   aPopup.focus();
   // One down event to open the popup.
   EventUtils.synthesizeKey("VK_DOWN",
-                           { altKey: !navigator.platform.includes("Mac") });
+                           { altKey: !navigator.platform.contains("Mac") });
 
   return deferred.promise;
 }
 
 function waitForWindowLoad(aWin) {
   let deferred = Promise.defer();
 
   aWin.addEventListener("load", function onload() {
--- a/browser/devtools/canvasdebugger/canvasdebugger.js
+++ b/browser/devtools/canvasdebugger/canvasdebugger.js
@@ -882,20 +882,20 @@ let CallsListView = Heritage.extend(Widg
 
     this.filterContents(e => {
       let call = e.attachment.actor;
       let name = call.name.toLowerCase();
       let file = call.file.toLowerCase();
       let line = call.line.toString().toLowerCase();
       let args = call.argsPreview.toLowerCase();
 
-      return name.includes(lowerCaseSearchToken) ||
-             file.includes(lowerCaseSearchToken) ||
-             line.includes(lowerCaseSearchToken) ||
-             args.includes(lowerCaseSearchToken);
+      return name.contains(lowerCaseSearchToken) ||
+             file.contains(lowerCaseSearchToken) ||
+             line.contains(lowerCaseSearchToken) ||
+             args.contains(lowerCaseSearchToken);
     });
   },
 
   /**
    * The wheel listener for the filmstrip that contains all the thumbnails.
    */
   _onScroll: function(e) {
     this._filmstrip.scrollLeft += e.deltaX;
--- a/browser/devtools/canvasdebugger/test/browser_canvas-actor-test-03.js
+++ b/browser/devtools/canvasdebugger/test/browser_canvas-actor-test-03.js
@@ -60,16 +60,16 @@ function ifTestingSupported() {
   is(functionCalls[7].type, CallWatcherFront.METHOD_FUNCTION,
     "The last called function is correctly identified as a method.");
   is(functionCalls[7].name, "requestAnimationFrame",
     "The last called function's name is correct.");
   is(functionCalls[7].file, SIMPLE_CANVAS_URL,
     "The last called function's file is correct.");
   is(functionCalls[7].line, 30,
     "The last called function's line is correct.");
-  ok(functionCalls[7].argsPreview.includes("Function"),
+  ok(functionCalls[7].argsPreview.contains("Function"),
     "The last called function's args preview is correct.");
   is(functionCalls[7].callerPreview, "",
     "The last called function's caller preview is correct.");
 
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js
+++ b/browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js
@@ -27,26 +27,26 @@ function ifTestingSupported() {
   yield callStackDisplayed;
 
   isnot($(".call-item-stack", callItem.target), null,
     "There should be a stack container available now for the draw call.");
   is($all(".call-item-stack-fn", callItem.target).length, 4,
     "There should be 4 functions on the stack for the draw call.");
 
   ok($all(".call-item-stack-fn-name", callItem.target)[0].getAttribute("value")
-    .includes("C()"),
+    .contains("C()"),
     "The first function on the stack has the correct name.");
   ok($all(".call-item-stack-fn-name", callItem.target)[1].getAttribute("value")
-    .includes("B()"),
+    .contains("B()"),
     "The second function on the stack has the correct name.");
   ok($all(".call-item-stack-fn-name", callItem.target)[2].getAttribute("value")
-    .includes("A()"),
+    .contains("A()"),
     "The third function on the stack has the correct name.");
   ok($all(".call-item-stack-fn-name", callItem.target)[3].getAttribute("value")
-    .includes("drawRect()"),
+    .contains("drawRect()"),
     "The fourth function on the stack has the correct name.");
 
   is($all(".call-item-stack-fn-location", callItem.target)[0].getAttribute("value"),
     "doc_simple-canvas-deep-stack.html:26",
     "The first function on the stack has the correct location.");
   is($all(".call-item-stack-fn-location", callItem.target)[1].getAttribute("value"),
     "doc_simple-canvas-deep-stack.html:28",
     "The second function on the stack has the correct location.");
--- a/browser/devtools/canvasdebugger/test/browser_canvas-frontend-img-screenshots.js
+++ b/browser/devtools/canvasdebugger/test/browser_canvas-frontend-img-screenshots.js
@@ -21,14 +21,14 @@ function ifTestingSupported() {
     "The screenshot container should now be visible.");
 
   is($("#screenshot-dimensions").getAttribute("value"), "128 x 128",
     "The screenshot dimensions label has the expected value.");
 
   is($("#screenshot-image").getAttribute("flipped"), "false",
     "The screenshot element should not be flipped vertically.");
 
-  ok(window.getComputedStyle($("#screenshot-image")).backgroundImage.includes("#screenshot-rendering"),
+  ok(window.getComputedStyle($("#screenshot-image")).backgroundImage.contains("#screenshot-rendering"),
     "The screenshot element should have an offscreen canvas element as a background.");
 
   yield teardown(panel);
   finish();
 }
--- a/browser/devtools/commandline/test/browser_cmd_appcache_valid.js
+++ b/browser/devtools/commandline/test/browser_cmd_appcache_valid.js
@@ -84,17 +84,17 @@ function spawnTest() {
         args: {
           search: { value: 'page' },
         }
       },
       exec: {
         output: [ /page1/, /page2/, /page3/ ]
       },
       post: function(output, text) {
-        ok(!text.includes("index"), "index is not contained in output");
+        ok(!text.contains("index"), "index is not contained in output");
       }
     },
 
     {
       setup: 'appcache validate',
       check: {
         input:  'appcache validate',
         markup: 'VVVVVVVVVVVVVVVVV',
@@ -144,20 +144,20 @@ function spawnTest() {
         markup: 'VVVVVVVVVVVVV',
         status: 'VALID',
         args: {},
       },
       exec: {
         output: [ /no results/ ]
       },
       post: function(output, text) {
-        ok(!text.includes("index"), "index is not contained in output");
-        ok(!text.includes("page1"), "page1 is not contained in output");
-        ok(!text.includes("page2"), "page1 is not contained in output");
-        ok(!text.includes("page3"), "page1 is not contained in output");
+        ok(!text.contains("index"), "index is not contained in output");
+        ok(!text.contains("page1"), "page1 is not contained in output");
+        ok(!text.contains("page2"), "page1 is not contained in output");
+        ok(!text.contains("page3"), "page1 is not contained in output");
       }
     },
 
     {
       setup: 'appcache viewentry --key ' + TEST_URI,
       check: {
         input:  'appcache viewentry --key ' + TEST_URI,
               // appcache viewentry --key http://sub1.test2.example.com/browser/browser/devtools/commandline/test/browser_cmd_appcache_valid_index.html
--- a/browser/devtools/commandline/test/browser_cmd_cookie.js
+++ b/browser/devtools/commandline/test/browser_cmd_cookie.js
@@ -121,50 +121,50 @@ function test() {
         exec: { },
       },
       {
         setup: "cookie list",
         exec: {
           output: [ /zap=zep/, /zup=banana/, /Edit/ ]
         },
         post: function(output, text) {
-          ok(!text.includes("zip"), "");
-          ok(!text.includes("zop"), "");
+          ok(!text.contains("zip"), "");
+          ok(!text.contains("zop"), "");
         }
       },
       {
         setup: "cookie remove zap",
         exec: { },
       },
       {
         setup: "cookie list",
         exec: {
           output: [ /zup=banana/, /Edit/ ]
         },
         post: function(output, text) {
-          ok(!text.includes("zap"), "");
-          ok(!text.includes("zep"), "");
-          ok(!text.includes("zip"), "");
-          ok(!text.includes("zop"), "");
+          ok(!text.contains("zap"), "");
+          ok(!text.contains("zep"), "");
+          ok(!text.contains("zip"), "");
+          ok(!text.contains("zop"), "");
         }
       },
       {
         setup: "cookie remove zup",
         exec: { }
       },
       {
         setup: "cookie list",
         exec: {
           output: 'No cookies found for host example.com'
         },
         post: function(output, text) {
-          ok(!text.includes("zap"), "");
-          ok(!text.includes("zep"), "");
-          ok(!text.includes("zip"), "");
-          ok(!text.includes("zop"), "");
-          ok(!text.includes("zup"), "");
-          ok(!text.includes("banana"), "");
-          ok(!text.includes("Edit"), "");
+          ok(!text.contains("zap"), "");
+          ok(!text.contains("zep"), "");
+          ok(!text.contains("zip"), "");
+          ok(!text.contains("zop"), "");
+          ok(!text.contains("zup"), "");
+          ok(!text.contains("banana"), "");
+          ok(!text.contains("Edit"), "");
         }
       },
     ]);
   }).then(finish, helpers.handleError);
 }
--- a/browser/devtools/debugger/debugger-panes.js
+++ b/browser/devtools/debugger/debugger-panes.js
@@ -1448,17 +1448,17 @@ TracerView.prototype = Heritage.extend(W
     }
   },
 
   /**
    * Listener for typing in the search box.
    */
   _onSearch: function() {
     const query = this._search.value.trim().toLowerCase();
-    const predicate = name => name.toLowerCase().includes(query);
+    const predicate = name => name.toLowerCase().contains(query);
     this.filterContents(item => predicate(item.attachment.trace.name));
   },
 
   /**
    * Select the traces tab in the sidebar.
    */
   selectTab: function() {
     const tabs = this._tracerTab.parentElement;
@@ -1581,17 +1581,17 @@ let SourceUtils = {
    * Returns true if the specified url and/or content type are specific to
    * javascript files.
    *
    * @return boolean
    *         True if the source is likely javascript.
    */
   isJavaScript: function(aUrl, aContentType = "") {
     return (aUrl && /\.jsm?$/.test(this.trimUrlQuery(aUrl))) ||
-           aContentType.includes("javascript");
+           aContentType.contains("javascript");
   },
 
   /**
    * Determines if the source text is minified by using
    * the percentage indented of a subset of lines
    *
    * @return object
    *         A promise that resolves to true if source text is minified.
@@ -2493,17 +2493,17 @@ EventListenersView.prototype = Heritage.
         targets.setAttribute("value", L10N.getFormatStr("eventNodes", selectors.length));
       }
       return;
     }
 
     // There's no easy way of grouping event types into higher-level groups,
     // so we need to do this by hand.
     let is = (...args) => args.indexOf(type) != -1;
-    let has = str => type.includes(str);
+    let has = str => type.contains(str);
     let starts = str => type.startsWith(str);
     let group;
 
     if (starts("animation")) {
       group = L10N.getStr("animationEvents");
     } else if (starts("audio")) {
       group = L10N.getStr("audioEvents");
     } else if (is("levelchange")) {
@@ -2824,29 +2824,29 @@ GlobalSearchView.prototype = Heritage.ex
     for (let [actor, text] of aSources) {
       let item = DebuggerView.Sources.getItemByValue(actor);
       let url = item.attachment.source.url;
       if (!url) {
         continue;
       }
 
       // Verify that the search token is found anywhere in the source.
-      if (!text.toLowerCase().includes(lowerCaseToken)) {
+      if (!text.toLowerCase().contains(lowerCaseToken)) {
         continue;
       }
       // ...and if so, create a Map containing search details for each line.
       let sourceResults = new SourceResults(actor, globalResults);
 
       // Search for the specified token in each line's text.
       text.split("\n").forEach((aString, aLine) => {
         // Search is not case sensitive, prepare the actual searched line.
         let lowerCaseLine = aString.toLowerCase();
 
         // Verify that the search token is found anywhere in this line.
-        if (!lowerCaseLine.includes(lowerCaseToken)) {
+        if (!lowerCaseLine.contains(lowerCaseToken)) {
           return;
         }
         // ...and if so, create a Map containing search details for each word.
         let lineResults = new LineResults(aLine, sourceResults);
 
         // Search for the specified token this line's text.
         lowerCaseLine.split(lowerCaseToken).reduce((aPrev, aCurr, aIndex, aArray) => {
           let prevLength = aPrev.length;
--- a/browser/devtools/debugger/test/browser_dbg_addonactor.js
+++ b/browser/devtools/debugger/test/browser_dbg_addonactor.js
@@ -67,17 +67,17 @@ function testDebugger() {
 }
 
 function testSources() {
   let deferred = promise.defer();
 
   gThreadClient.getSources(aResponse => {
     // source URLs contain launch-specific temporary directory path,
     // hence the ".contains" call.
-    const matches = aResponse.sources.filter(s => s.url.includes(ADDON_MODULE_URL));
+    const matches = aResponse.sources.filter(s => s.url.contains(ADDON_MODULE_URL));
     ok(matches.length > 0,
        "the main script of the addon is present in the source list");
     deferred.resolve();
   });
 
   return deferred.promise;
 }
 
--- a/browser/devtools/debugger/test/browser_dbg_auto-pretty-print-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_auto-pretty-print-01.js
@@ -46,17 +46,17 @@ function test(){
       .then(() => closeDebuggerAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + DevToolsUtils.safeErrorString(aError));
       })
   });
 }
 
 function testSourceIsUgly() {
-  ok(!gEditor.getText().includes("\n  "),
+  ok(!gEditor.getText().contains("\n  "),
     "The source shouldn't be pretty printed yet.");
 }
 
 function testSecondSourceLabel(){
   let source = gSources.selectedItem.attachment.source;
   ok(source.url === EXAMPLE_URL + gSecondSourceLabel,
     "Second source url is correct.");
 }
@@ -88,17 +88,17 @@ function enableAutoPrettyPrint(){
 function testAutoPrettyPrintOff(){
   is(gPrefs.autoPrettyPrint, false,
     "The auto-pretty-print pref should be off.");
   isnot(gOptions._autoPrettyPrint.getAttribute("checked"), "true",
        "The Auto pretty print menu item should not be checked.");
 }
 
 function testSourceIsPretty() {
-  ok(gEditor.getText().includes("\n  "),
+  ok(gEditor.getText().contains("\n  "),
     "The source should be pretty printed.")
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
   gDebugger = null;
   gEditor = null;
--- a/browser/devtools/debugger/test/browser_dbg_auto-pretty-print-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_auto-pretty-print-02.js
@@ -58,17 +58,17 @@ function test(){
       .then(() => closeDebuggerAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + DevToolsUtils.safeErrorString(aError));
       })
   });
 }
 
 function testSourceIsUgly() {
-  ok(!gEditor.getText().includes("\n  "),
+  ok(!gEditor.getText().contains("\n  "),
     "The source shouldn't be pretty printed yet.");
 }
 
 function testFirstSourceLabel(){
   let source = gSources.selectedItem.attachment.source;
   ok(source.url === EXAMPLE_URL + gFirstSourceLabel,
     "First source url is correct.");
 }
@@ -96,17 +96,17 @@ function disableAutoPrettyPrint(){
   gOptions._toggleAutoPrettyPrint();
   gOptions._onPopupHidden();
   info("Disabled auto pretty printing.");
   // Wait for the pref update to be communicated to the server.
   return waitForDebuggerEvents(gPanel, gDebugger.EVENTS.SOURCE_SHOWN);
 }
 
 function testSourceIsPretty() {
-  ok(gEditor.getText().includes("\n  "),
+  ok(gEditor.getText().contains("\n  "),
     "The source should be pretty printed.")
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gDebuggee = null;
   gPanel = null;
   gDebugger = null;
--- a/browser/devtools/debugger/test/browser_dbg_break-on-dom-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_break-on-dom-03.js
@@ -47,17 +47,17 @@ function test() {
       yield ensureThreadClientState(aPanel, "resumed");
       yield closeDebuggerAndFinish(aPanel);
     });
 
     function testEventItem(index, label, type, selectors, checked) {
       let item = gEvents.items[index];
       let node = item.target;
 
-      ok(item.attachment.url.includes(label),
+      ok(item.attachment.url.contains(label),
         "The event at index " + index + " has the correct url.");
       is(item.attachment.type, type,
         "The event at index " + index + " has the correct type.");
       is(item.attachment.selectors.toString(), selectors,
         "The event at index " + index + " has the correct selectors.");
       is(item.attachment.checkboxState, checked,
         "The event at index " + index + " has the correct checkbox state.");
 
--- a/browser/devtools/debugger/test/browser_dbg_chrome-debugging.js
+++ b/browser/devtools/debugger/test/browser_dbg_chrome-debugging.js
@@ -38,17 +38,17 @@ function test() {
       });
 
     testChromeActor();
   });
 }
 
 function testChromeActor() {
   gClient.listTabs(aResponse => {
-    ok(aResponse.chromeDebugger.includes("chromeDebugger"),
+    ok(aResponse.chromeDebugger.contains("chromeDebugger"),
       "Chrome debugger actor should identify itself accordingly.");
 
     gClient.addListener("newGlobal", onNewGlobal);
     gClient.addListener("newSource", onNewSource);
 
     gClient.attachThread(aResponse.chromeDebugger, (aResponse, aThreadClient) => {
       gThreadClient = aThreadClient;
 
--- a/browser/devtools/debugger/test/browser_dbg_file-reload.js
+++ b/browser/devtools/debugger/test/browser_dbg_file-reload.js
@@ -17,17 +17,17 @@ function test() {
 
     Task.spawn(function() {
       yield waitForSourceShown(aPanel, JS_URL);
 
       is(gSources.itemCount, 1,
         "There should be one source displayed in the view.")
       is(getSelectedSourceURL(gSources), JS_URL,
         "The correct source is currently selected in the view.");
-      ok(gEditor.getText().includes("bacon"),
+      ok(gEditor.getText().contains("bacon"),
         "The currently shown source contains bacon. Mmm, delicious!");
 
       let { source } = gSources.selectedItem.attachment;
       let [, firstText] = yield gControllerSources.getText(source);
       let firstNumber = parseFloat(firstText.match(/\d\.\d+/)[0]);
 
       is(firstText, gEditor.getText(),
         "gControllerSources.getText() returned the expected contents.");
@@ -35,17 +35,17 @@ function test() {
         "The generated number seems to be created correctly.");
 
       yield reloadActiveTab(aPanel, gDebugger.EVENTS.SOURCE_SHOWN);
 
       is(gSources.itemCount, 1,
         "There should be one source displayed in the view after reloading.")
       is(getSelectedSourceURL(gSources), JS_URL,
         "The correct source is currently selected in the view after reloading.");
-      ok(gEditor.getText().includes("bacon"),
+      ok(gEditor.getText().contains("bacon"),
         "The newly shown source contains bacon. Mmm, delicious!");
 
       ({ source } = gSources.selectedItem.attachment);
       let [, secondText] = yield gControllerSources.getText(source);
       let secondNumber = parseFloat(secondText.match(/\d\.\d+/)[0]);
 
       is(secondText, gEditor.getText(),
         "gControllerSources.getText() returned the expected contents.");
--- a/browser/devtools/debugger/test/browser_dbg_globalactor.js
+++ b/browser/devtools/debugger/test/browser_dbg_globalactor.js
@@ -22,17 +22,17 @@ function test() {
   gClient = new DebuggerClient(transport);
   gClient.connect((aType, aTraits) => {
     is(aType, "browser",
       "Root actor should identify itself as a browser.");
 
     gClient.listTabs(aResponse => {
       let globalActor = aResponse.testGlobalActor1;
       ok(globalActor, "Found the test tab actor.")
-      ok(globalActor.includes("test_one"),
+      ok(globalActor.contains("test_one"),
         "testGlobalActor1's actorPrefix should be used.");
 
       gClient.request({ to: globalActor, type: "ping" }, aResponse => {
         is(aResponse.pong, "pong", "Actor should respond to requests.");
 
         // Send another ping to see if the same actor is used.
         gClient.request({ to: globalActor, type: "ping" }, aResponse => {
           is(aResponse.pong, "pong", "Actor should respond to requests.");
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-01.js
@@ -32,45 +32,45 @@ function test() {
       .then(() => closeDebuggerAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + DevToolsUtils.safeErrorString(aError));
       });
   });
 }
 
 function testSourceIsUgly() {
-  ok(!gEditor.getText().includes("\n  "),
+  ok(!gEditor.getText().contains("\n  "),
      "The source shouldn't be pretty printed yet.");
 }
 
 function clickPrettyPrintButton() {
   gDebugger.document.getElementById("pretty-print").click();
 }
 
 function testProgressBarShown() {
   const deck = gDebugger.document.getElementById("editor-deck");
   is(deck.selectedIndex, 2, "The progress bar should be shown");
 }
 
 function testSourceIsPretty() {
-  ok(gEditor.getText().includes("\n  "),
+  ok(gEditor.getText().contains("\n  "),
      "The source should be pretty printed.")
 }
 
 function testEditorShown() {
   const deck = gDebugger.document.getElementById("editor-deck");
   is(deck.selectedIndex, 0, "The editor should be shown");
 }
 
 function testSourceIsStillPretty() {
   const deferred = promise.defer();
 
   const { source } = gSources.selectedItem.attachment;
   gDebugger.DebuggerController.SourceScripts.getText(source).then(([, text]) => {
-    ok(text.includes("\n  "),
+    ok(text.contains("\n  "),
        "Subsequent calls to getText return the pretty printed source.");
     deferred.resolve();
   });
 
   return deferred.promise;
 }
 
 registerCleanupFunction(function() {
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-02.js
@@ -37,17 +37,17 @@ function selectContextMenuItem() {
   once(gContextMenu, "popupshown").then(() => {
     const menuItem = gDebugger.document.getElementById("se-dbg-cMenu-prettyPrint");
     menuItem.click();
   });
   gContextMenu.openPopup(gEditor.container, "overlap", 0, 0, true, false);
 }
 
 function testSourceIsPretty() {
-  ok(gEditor.getText().includes("\n  "),
+  ok(gEditor.getText().contains("\n  "),
      "The source should be pretty printed.")
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
   gDebugger = null;
   gEditor = null;
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-05.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-05.js
@@ -24,17 +24,17 @@ function test() {
 
       // From this point onward, the source editor's text should never change.
       gEditor.once("change", () => {
         ok(false, "The source editor text shouldn't have changed.");
       });
 
       is(getSelectedSourceURL(gSources), TAB_URL,
         "The correct source is currently selected.");
-      ok(gEditor.getText().includes("myFunction"),
+      ok(gEditor.getText().contains("myFunction"),
         "The source shouldn't be pretty printed yet.");
 
       clickPrettyPrintButton();
 
       let { source } = gSources.selectedItem.attachment;
       try {
         yield gControllerSources.togglePrettyPrint(source);
         ok(false, "The promise for a prettified source should be rejected!");
@@ -42,19 +42,19 @@ function test() {
         is(error, "Can't prettify non-javascript files.",
           "The promise was correctly rejected with a meaningful message.");
       }
 
       let text;
       [source, text] = yield gControllerSources.getText(source);
       is(getSelectedSourceURL(gSources), TAB_URL,
         "The correct source is still selected.");
-      ok(gEditor.getText().includes("myFunction"),
+      ok(gEditor.getText().contains("myFunction"),
         "The displayed source hasn't changed.");
-      ok(text.includes("myFunction"),
+      ok(text.contains("myFunction"),
         "The cached source text wasn't altered in any way.");
 
       yield closeDebuggerAndFinish(gPanel);
     });
   });
 }
 
 function clickPrettyPrintButton() {
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-06.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-06.js
@@ -40,37 +40,37 @@ function test() {
 
       // From this point onward, the source editor's text should never change.
       gEditor.once("change", () => {
         ok(false, "The source editor text shouldn't have changed.");
       });
 
       is(getSelectedSourceURL(gSources), JS_URL,
         "The correct source is currently selected.");
-      ok(gEditor.getText().includes("myFunction"),
+      ok(gEditor.getText().contains("myFunction"),
         "The source shouldn't be pretty printed yet.");
 
       clickPrettyPrintButton();
 
       let { source } = gSources.selectedItem.attachment;
       try {
         yield gControllerSources.togglePrettyPrint(source);
         ok(false, "The promise for a prettified source should be rejected!");
       } catch ([source, error]) {
-        ok(error.includes("prettyPrintError"),
+        ok(error.contains("prettyPrintError"),
           "The promise was correctly rejected with a meaningful message.");
       }
 
       let text;
       [source, text] = yield gControllerSources.getText(source);
       is(getSelectedSourceURL(gSources), JS_URL,
         "The correct source is still selected.");
-      ok(gEditor.getText().includes("myFunction"),
+      ok(gEditor.getText().contains("myFunction"),
         "The displayed source hasn't changed.");
-      ok(text.includes("myFunction"),
+      ok(text.contains("myFunction"),
         "The cached source text wasn't altered in any way.");
 
       is(gPrettyPrinted, true,
         "The hijacked pretty print method was executed.");
 
       yield closeDebuggerAndFinish(gPanel);
     });
   });
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-07.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-07.js
@@ -18,38 +18,38 @@ function test() {
 
     findSource();
   });
 }
 
 function findSource() {
   gThreadClient.getSources(({ error, sources }) => {
     ok(!error);
-    sources = sources.filter(s => s.url.includes('code_ugly-2.js'));
+    sources = sources.filter(s => s.url.contains('code_ugly-2.js'));
     is(sources.length, 1);
     gSource = sources[0];
     prettyPrintSource();
   });
 }
 
 function prettyPrintSource() {
   gThreadClient.source(gSource).prettyPrint(4, testPrettyPrinted);
 }
 
 function testPrettyPrinted({ error, source }) {
   ok(!error);
-  ok(source.includes("\n    "));
+  ok(source.contains("\n    "));
   disablePrettyPrint();
 }
 
 function disablePrettyPrint() {
   gThreadClient.source(gSource).disablePrettyPrint(testUgly);
 }
 
 function testUgly({ error, source }) {
   ok(!error);
-  ok(!source.includes("\n    "));
+  ok(!source.contains("\n    "));
   closeDebuggerAndFinish(gPanel);
 }
 
 registerCleanupFunction(function() {
   gTab = gPanel = gClient = gThreadClient = gSource = null;
 });
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-08.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-08.js
@@ -22,17 +22,17 @@ function test() {
 const BP_LOCATION = {
   line: 5,
   column: 11
 };
 
 function findSource() {
   gThreadClient.getSources(({ error, sources }) => {
     ok(!error, "error should exist");
-    sources = sources.filter(s => s.url.includes("code_ugly-3.js"));
+    sources = sources.filter(s => s.url.contains("code_ugly-3.js"));
     is(sources.length, 1, "sources.length should be 1");
     [gSource] = sources;
     BP_LOCATION.actor = gSource.actor;
 
     prettyPrintSource(sources[0]);
   });
 }
 
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-09.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-09.js
@@ -61,17 +61,17 @@ function testDbgStatement(event, { frame
 }
 
 function disablePrettyPrint() {
   gThreadClient.source(gSource).disablePrettyPrint(testUgly);
 }
 
 function testUgly({ error, source }) {
   ok(!error);
-  ok(!source.includes("\n  "));
+  ok(!source.contains("\n  "));
   getFrame();
 }
 
 function getFrame() {
   gThreadClient.getFrames(0, 1, testFrame);
 }
 
 function testFrame({ frames: [frame] }) {
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-10.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-10.js
@@ -27,33 +27,33 @@ function test() {
       .then(() => closeDebuggerAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + DevToolsUtils.safeErrorString(aError));
       });
   });
 }
 
 function testSourceIsUgly() {
-  ok(!gEditor.getText().includes("\n    "),
+  ok(!gEditor.getText().contains("\n    "),
      "The source shouldn't be pretty printed yet.");
 }
 
 function clickPrettyPrintButton() {
   // Wait a tick before clicking to make sure the frontend's blackboxchange
   // handlers have finished.
   return new Promise(resolve => {
     gDebugger.document.getElementById("pretty-print").click();
     resolve();
   });
 }
 
 function testSourceIsStillUgly() {
   const { source } = gSources.selectedItem.attachment;
   return gDebugger.DebuggerController.SourceScripts.getText(source).then(([, text]) => {
-    ok(!text.includes("\n    "));
+    ok(!text.contains("\n    "));
   });
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
   gDebugger = null;
   gEditor = null;
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-11.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-11.js
@@ -31,26 +31,26 @@ function test() {
       .then(() => resumeDebuggerThenCloseAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + DevToolsUtils.safeErrorString(aError));
       });
   });
 }
 
 function testSourceIsUgly() {
-  ok(!gEditor.getText().includes("\n  "),
+  ok(!gEditor.getText().contains("\n  "),
      "The source shouldn't be pretty printed yet.");
 }
 
 function clickPrettyPrintButton() {
   gDebugger.document.getElementById("pretty-print").click();
 }
 
 function testSourceIsPretty() {
-  ok(gEditor.getText().includes("\n  "),
+  ok(gEditor.getText().contains("\n  "),
      "The source should be pretty printed.")
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
   gDebugger = null;
   gEditor = null;
--- a/browser/devtools/debugger/test/browser_dbg_pretty-print-13.js
+++ b/browser/devtools/debugger/test/browser_dbg_pretty-print-13.js
@@ -35,45 +35,45 @@ function test() {
       .then(() => closeDebuggerAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + DevToolsUtils.safeErrorString(aError));
       });
   });
 }
 
 function testSourceIsUgly() {
-  ok(!gEditor.getText().includes("\n  "),
+  ok(!gEditor.getText().contains("\n  "),
      "The source shouldn't be pretty printed yet.");
 }
 
 function clickPrettyPrintButton() {
   gDebugger.document.getElementById("pretty-print").click();
 }
 
 function testProgressBarShown() {
   const deck = gDebugger.document.getElementById("editor-deck");
   is(deck.selectedIndex, 2, "The progress bar should be shown");
 }
 
 function testSourceIsPretty() {
-  ok(gEditor.getText().includes("\n  "),
+  ok(gEditor.getText().contains("\n  "),
      "The source should be pretty printed.")
 }
 
 function testEditorShown() {
   const deck = gDebugger.document.getElementById("editor-deck");
   is(deck.selectedIndex, 0, "The editor should be shown");
 }
 
 function testSourceIsStillPretty() {
   const deferred = promise.defer();
 
   const { source } = gSources.selectedItem.attachment;
   gDebugger.DebuggerController.SourceScripts.getText(source).then(([, text]) => {
-    ok(text.includes("\n  "),
+    ok(text.contains("\n  "),
        "Subsequent calls to getText return the pretty printed source.");
     deferred.resolve();
   });
 
   return deferred.promise;
 }
 
 registerCleanupFunction(function() {
--- a/browser/devtools/debugger/test/browser_dbg_scripts-switching-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_scripts-switching-03.js
@@ -31,17 +31,17 @@ function test() {
 
 function showBogusSource() {
   let finished = waitForDebuggerEvents(gPanel, gDebugger.EVENTS.SOURCE_ERROR_SHOWN);
   gView._setEditorSource({ url: "http://example.com/fake.js", actor: "fake.actor" });
   return finished;
 }
 
 function testDebuggerLoadingError() {
-  ok(gEditor.getText().includes(gL10N.getStr("errorLoadingText")),
+  ok(gEditor.getText().contains(gL10N.getStr("errorLoadingText")),
     "The valid error loading message is displayed.");
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
   gDebugger = null;
   gView = null;
--- a/browser/devtools/debugger/test/browser_dbg_search-basic-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-basic-02.js
@@ -98,19 +98,19 @@ function combineWithTokenColonSearch() {
 
   return finished.then(() => promise.all([
     ensureSourceIs(gPanel, "-01.js"),
     ensureCaretAt(gPanel, 2, 11)
   ]));
 }
 
 function verifySourceAndCaret(aUrl, aLine, aColumn, aSelection) {
-  ok(gSources.selectedItem.attachment.label.includes(aUrl),
+  ok(gSources.selectedItem.attachment.label.contains(aUrl),
     "The selected item's label appears to be correct.");
-  ok(gSources.selectedItem.attachment.source.url.includes(aUrl),
+  ok(gSources.selectedItem.attachment.source.url.contains(aUrl),
     "The selected item's value appears to be correct.");
   ok(isCaretPos(gPanel, aLine, aColumn),
     "The current caret position appears to be correct.");
   ok(isEditorSel(gPanel, aSelection),
     "The current editor selection appears to be correct.");
 }
 
 registerCleanupFunction(function() {
--- a/browser/devtools/debugger/test/browser_dbg_search-basic-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-basic-03.js
@@ -96,19 +96,19 @@ function escapeAndHide() {
 
 function escapeAndClear() {
   EventUtils.sendKey("ESCAPE", gDebugger);
   is(gSearchBox.getAttribute("value"), "",
     "The searchbox has properly emptied after pressing escape.");
 }
 
 function verifySourceAndCaret(aUrl, aLine, aColumn) {
-  ok(gSources.selectedItem.attachment.label.includes(aUrl),
+  ok(gSources.selectedItem.attachment.label.contains(aUrl),
     "The selected item's label appears to be correct.");
-  ok(gSources.selectedItem.attachment.source.url.includes(aUrl),
+  ok(gSources.selectedItem.attachment.source.url.contains(aUrl),
     "The selected item's value appears to be correct.");
   ok(isCaretPos(gPanel, aLine, aColumn),
     "The current caret position appears to be correct.");
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
--- a/browser/devtools/debugger/test/browser_dbg_search-global-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-global-01.js
@@ -48,17 +48,17 @@ function firstSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       let sourceResults = gDebugger.document.querySelectorAll(".dbg-source-results");
       is(sourceResults.length, 2,
         "There should be matches found in two sources.");
 
@@ -162,17 +162,17 @@ function secondSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       let sourceResults = gDebugger.document.querySelectorAll(".dbg-source-results");
       is(sourceResults.length, 2,
         "There should be matches found in two sources.");
 
--- a/browser/devtools/debugger/test/browser_dbg_search-global-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-global-02.js
@@ -51,17 +51,17 @@ function firstSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       deferred.resolve();
     });
   });
 
@@ -72,17 +72,17 @@ function firstSearch() {
 
 function doFirstJump() {
   let deferred = promise.defer();
 
   waitForSourceAndCaret(gPanel, "-01.js", 4).then(() => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
-    ok(getSelectedSourceURL(gSources).includes("-01.js"),
+    ok(getSelectedSourceURL(gSources).contains("-01.js"),
       "The currently shown source is incorrect (1).");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search (1).");
 
     // The editor's selected text takes a tick to update.
     executeSoon(() => {
       ok(isCaretPos(gPanel, 4, 9),
         "The editor didn't jump to the correct line (1).");
@@ -100,17 +100,17 @@ function doFirstJump() {
 
 function doSecondJump() {
   let deferred = promise.defer();
 
   waitForSourceAndCaret(gPanel, "-02.js", 4).then(() => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
-    ok(getSelectedSourceURL(gSources).includes("-02.js"),
+    ok(getSelectedSourceURL(gSources).contains("-02.js"),
       "The currently shown source is incorrect (2).");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search (2).");
 
     // The editor's selected text takes a tick to update.
     executeSoon(() => {
       ok(isCaretPos(gPanel, 4, 9),
         "The editor didn't jump to the correct line (2).");
@@ -128,17 +128,17 @@ function doSecondJump() {
 
 function doWrapAroundJump() {
   let deferred = promise.defer();
 
   waitForSourceAndCaret(gPanel, "-01.js", 4).then(() => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
-    ok(getSelectedSourceURL(gSources).includes("-01.js"),
+    ok(getSelectedSourceURL(gSources).contains("-01.js"),
       "The currently shown source is incorrect (3).");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search (3).");
 
     // The editor's selected text takes a tick to update.
     executeSoon(() => {
       ok(isCaretPos(gPanel, 4, 9),
         "The editor didn't jump to the correct line (3).");
@@ -157,17 +157,17 @@ function doWrapAroundJump() {
 
 function doBackwardsWrapAroundJump() {
   let deferred = promise.defer();
 
   waitForSourceAndCaret(gPanel, "-02.js", 7).then(() => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
-    ok(getSelectedSourceURL(gSources).includes("-02.js"),
+    ok(getSelectedSourceURL(gSources).contains("-02.js"),
       "The currently shown source is incorrect (4).");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search (4).");
 
     // The editor's selected text takes a tick to update.
     executeSoon(() => {
       ok(isCaretPos(gPanel, 7, 11),
         "The editor didn't jump to the correct line (4).");
@@ -184,17 +184,17 @@ function doBackwardsWrapAroundJump() {
 }
 
 function testSearchTokenEmpty() {
   backspaceText(gSearchBox, 4);
 
   info("Current source url:\n" + getSelectedSourceURL(gSources));
   info("Debugger editor text:\n" + gEditor.getText());
 
-  ok(getSelectedSourceURL(gSources).includes("-02.js"),
+  ok(getSelectedSourceURL(gSources).contains("-02.js"),
     "The currently shown source is incorrect (4).");
   is(gSources.visibleItems.length, 2,
     "Not all the sources are shown after the global search (4).");
   ok(isCaretPos(gPanel, 7, 11),
     "The editor didn't remain at the correct line (4).");
   is(gEditor.getSelection(), "",
     "The editor shouldn't keep the previous text selected (4).");
 
--- a/browser/devtools/debugger/test/browser_dbg_search-global-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-global-03.js
@@ -47,17 +47,17 @@ function firstSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       deferred.resolve();
     });
   });
 
--- a/browser/devtools/debugger/test/browser_dbg_search-global-04.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-global-04.js
@@ -40,17 +40,17 @@ function firstSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       deferred.resolve();
     });
   });
 
@@ -63,17 +63,17 @@ function secondSearch() {
   let deferred = promise.defer();
 
   gDebugger.once(gDebugger.EVENTS.GLOBAL_SEARCH_MATCH_NOT_FOUND, () => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
     ok(isCaretPos(gPanel, 6),
       "The editor shouldn't have jumped to a matching line yet.");
-    ok(getSelectedSourceURL(gSources).includes("-02.js"),
+    ok(getSelectedSourceURL(gSources).contains("-02.js"),
       "The current source shouldn't have changed after a global search.");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search.");
 
     deferred.resolve();
   });
 
   typeText(gSearchBox, "/");
--- a/browser/devtools/debugger/test/browser_dbg_search-global-05.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-global-05.js
@@ -43,17 +43,17 @@ function doSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       deferred.resolve();
     });
   });
 
@@ -96,17 +96,17 @@ function testClickLineToJump() {
   waitForSourceAndCaret(gPanel, "-01.js", 1, 1).then(() => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
     ok(isCaretPos(gPanel, 1, 1),
       "The editor didn't jump to the correct line (1).");
     is(gEditor.getSelection(), "",
       "The editor didn't select the correct text (1).");
-    ok(getSelectedSourceURL(gSources).includes("-01.js"),
+    ok(getSelectedSourceURL(gSources).contains("-01.js"),
       "The currently shown source is incorrect (1).");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search (1).");
 
     deferred.resolve();
   });
 
   EventUtils.sendMouseEvent({ type: "click" }, firstLine);
@@ -125,17 +125,17 @@ function testClickMatchToJump() {
   waitForSourceAndCaret(gPanel, "-02.js", 1, 1).then(() => {
     info("Current source url:\n" + getSelectedSourceURL(gSources));
     info("Debugger editor text:\n" + gEditor.getText());
 
     ok(isCaretPos(gPanel, 1, 1),
       "The editor didn't jump to the correct line (2).");
     is(gEditor.getSelection(), "",
       "The editor didn't select the correct text (2).");
-    ok(getSelectedSourceURL(gSources).includes("-02.js"),
+    ok(getSelectedSourceURL(gSources).contains("-02.js"),
       "The currently shown source is incorrect (2).");
     is(gSources.visibleItems.length, 2,
       "Not all the sources are shown after the global search (2).");
 
     deferred.resolve();
   });
 
   EventUtils.sendMouseEvent({ type: "click" }, lastMatch);
--- a/browser/devtools/debugger/test/browser_dbg_search-global-06.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-global-06.js
@@ -49,17 +49,17 @@ function doSearch() {
     // Some operations are synchronously dispatched on the main thread,
     // to avoid blocking UI, thus giving the impression of faster searching.
     executeSoon(() => {
       info("Current source url:\n" + getSelectedSourceURL(gSources));
       info("Debugger editor text:\n" + gEditor.getText());
 
       ok(isCaretPos(gPanel, 6),
         "The editor shouldn't have jumped to a matching line yet.");
-      ok(getSelectedSourceURL(gSources).includes("-02.js"),
+      ok(getSelectedSourceURL(gSources).contains("-02.js"),
         "The current source shouldn't have changed after a global search.");
       is(gSources.visibleItems.length, 2,
         "Not all the sources are shown after the global search.");
 
       deferred.resolve();
     });
   });
 
--- a/browser/devtools/debugger/test/browser_dbg_search-symbols.js
+++ b/browser/devtools/debugger/test/browser_dbg_search-symbols.js
@@ -68,17 +68,17 @@ function htmlSearch() {
           is(target.querySelector(".results-panel-item-label").getAttribute("value"),
             gDebugger.SourceUtils.trimUrlLength(label + "()"),
             "The corect label (" + label + ") is currently selected.");
         } else {
           ok(!target.querySelector(".results-panel-item-label"),
             "Shouldn't create empty label nodes.");
         }
         if (value) {
-          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").includes(value),
+          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value),
             "The corect value (" + value + ") is attached.");
         } else {
           ok(!target.querySelector(".results-panel-item-label-below"),
             "Shouldn't create empty label nodes.");
         }
         if (description) {
           is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description,
             "The corect description (" + description + ") is currently shown.");
@@ -139,17 +139,17 @@ function firstJsSearch() {
           is(target.querySelector(".results-panel-item-label").getAttribute("value"),
             gDebugger.SourceUtils.trimUrlLength(label + "()"),
             "The corect label (" + label + ") is currently selected.");
         } else {
           ok(!target.querySelector(".results-panel-item-label"),
             "Shouldn't create empty label nodes.");
         }
         if (value) {
-          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").includes(value),
+          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value),
             "The corect value (" + value + ") is attached.");
         } else {
           ok(!target.querySelector(".results-panel-item-label-below"),
             "Shouldn't create empty label nodes.");
         }
         if (description) {
           is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description,
             "The corect description (" + description + ") is currently shown.");
@@ -210,17 +210,17 @@ function secondJsSearch() {
           is(target.querySelector(".results-panel-item-label").getAttribute("value"),
             gDebugger.SourceUtils.trimUrlLength(label + "()"),
             "The corect label (" + label + ") is currently selected.");
         } else {
           ok(!target.querySelector(".results-panel-item-label"),
             "Shouldn't create empty label nodes.");
         }
         if (value) {
-          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").includes(value),
+          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value),
             "The corect value (" + value + ") is attached.");
         } else {
           ok(!target.querySelector(".results-panel-item-label-below"),
             "Shouldn't create empty label nodes.");
         }
         if (description) {
           is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description,
             "The corect description (" + description + ") is currently shown.");
@@ -281,17 +281,17 @@ function thirdJsSearch() {
           is(target.querySelector(".results-panel-item-label").getAttribute("value"),
             gDebugger.SourceUtils.trimUrlLength(label + "()"),
             "The corect label (" + label + ") is currently selected.");
         } else {
           ok(!target.querySelector(".results-panel-item-label"),
             "Shouldn't create empty label nodes.");
         }
         if (value) {
-          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").includes(value),
+          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value),
             "The corect value (" + value + ") is attached.");
         } else {
           ok(!target.querySelector(".results-panel-item-label-below"),
             "Shouldn't create empty label nodes.");
         }
         if (description) {
           is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description,
             "The corect description (" + description + ") is currently shown.");
@@ -349,17 +349,17 @@ function filterSearch() {
           is(target.querySelector(".results-panel-item-label").getAttribute("value"),
             gDebugger.SourceUtils.trimUrlLength(label + "()"),
             "The corect label (" + label + ") is currently selected.");
         } else {
           ok(!target.querySelector(".results-panel-item-label"),
             "Shouldn't create empty label nodes.");
         }
         if (value) {
-          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").includes(value),
+          ok(target.querySelector(".results-panel-item-label-below").getAttribute("value").contains(value),
             "The corect value (" + value + ") is attached.");
         } else {
           ok(!target.querySelector(".results-panel-item-label-below"),
             "Shouldn't create empty label nodes.");
         }
         if (description) {
           is(target.querySelector(".results-panel-item-label-before").getAttribute("value"), description,
             "The corect description (" + description + ") is currently shown.");
--- a/browser/devtools/debugger/test/browser_dbg_sources-cache.js
+++ b/browser/devtools/debugger/test/browser_dbg_sources-cache.js
@@ -31,53 +31,53 @@ function test() {
       .then(() => closeDebuggerAndFinish(gPanel))
       .then(null, aError => {
         ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
       });
   });
 }
 
 function initialChecks() {
-  ok(gEditor.getText().includes("First source!"),
+  ok(gEditor.getText().contains("First source!"),
     "Editor text contents appears to be correct.");
   is(gSources.selectedItem.attachment.label, "code_function-search-01.js",
     "The currently selected label in the sources container is correct.");
-  ok(getSelectedSourceURL(gSources).includes("code_function-search-01.js"),
+  ok(getSelectedSourceURL(gSources).contains("code_function-search-01.js"),
     "The currently selected value in the sources container appears to be correct.");
 
   is(gSources.itemCount, TOTAL_SOURCES,
     "There should be " + TOTAL_SOURCES + " sources present in the sources list.");
   is(gSources.visibleItems.length, TOTAL_SOURCES,
     "There should be " + TOTAL_SOURCES + " sources visible in the sources list.");
   is(gSources.attachments.length, TOTAL_SOURCES,
     "There should be " + TOTAL_SOURCES + " attachments stored in the sources container model.")
   is(gSources.values.length, TOTAL_SOURCES,
     "There should be " + TOTAL_SOURCES + " values stored in the sources container model.")
 
   info("Source labels: " + gSources.attachments.toSource());
   info("Source values: " + gSources.values.toSource());
 
   is(gSources.attachments[0].label, "code_function-search-01.js",
     "The first source label is correct.");
-  ok(gSources.attachments[0].source.url.includes("code_function-search-01.js"),
+  ok(gSources.attachments[0].source.url.contains("code_function-search-01.js"),
     "The first source value appears to be correct.");
 
   is(gSources.attachments[1].label, "code_function-search-02.js",
     "The second source label is correct.");
-  ok(gSources.attachments[1].source.url.includes("code_function-search-02.js"),
+  ok(gSources.attachments[1].source.url.contains("code_function-search-02.js"),
     "The second source value appears to be correct.");
 
   is(gSources.attachments[2].label, "code_function-search-03.js",
     "The third source label is correct.");
-  ok(gSources.attachments[2].source.url.includes("code_function-search-03.js"),
+  ok(gSources.attachments[2].source.url.contains("code_function-search-03.js"),
     "The third source value appears to be correct.");
 
   is(gSources.attachments[3].label, "doc_function-search.html",
     "The third source label is correct.");
-  ok(gSources.attachments[3].source.url.includes("doc_function-search.html"),
+  ok(gSources.attachments[3].source.url.contains("doc_function-search.html"),
     "The third source value appears to be correct.");
 
   is(gDebugger.SourceUtils._labelsCache.size, TOTAL_SOURCES,
     "There should be " + TOTAL_SOURCES + " labels cached.");
   is(gDebugger.SourceUtils._groupsCache.size, TOTAL_SOURCES,
     "There should be " + TOTAL_SOURCES + " groups cached.");
 }
 
@@ -93,17 +93,17 @@ function performReloadAndTestState() {
 
 function testCacheIntegrity(aSources) {
   for (let [actor, contents] of aSources) {
     // Sources of a debugee don't always finish fetching consecutively. D'uh.
     let index = gSources.values.indexOf(actor);
 
     ok(index >= 0 && index <= TOTAL_SOURCES,
       "Found a source actor cached correctly (" + index + ").");
-    ok(contents.includes(
+    ok(contents.contains(
       ["First source!", "Second source!", "Third source!", "Peanut butter jelly time!"][index]),
       "Found a source's text contents cached correctly (" + index + ").");
 
     info("Cached source actor at " + index + ": " + actor);
     info("Cached source text at " + index + ": " + contents);
   }
 }
 
--- a/browser/devtools/debugger/test/browser_dbg_tabactor-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_tabactor-01.js
@@ -37,17 +37,17 @@ function test() {
   });
 }
 
 function testTabActor([aGrip, aResponse]) {
   let deferred = promise.defer();
 
   ok(aGrip.testTabActor1,
     "Found the test tab actor.");
-  ok(aGrip.testTabActor1.includes("test_one"),
+  ok(aGrip.testTabActor1.contains("test_one"),
     "testTabActor1's actorPrefix should be used.");
 
   gClient.request({ to: aGrip.testTabActor1, type: "ping" }, aResponse => {
     is(aResponse.pong, "pong",
       "Actor should respond to requests.");
 
     deferred.resolve();
   });
--- a/browser/devtools/debugger/test/browser_dbg_tabactor-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_tabactor-02.js
@@ -37,17 +37,17 @@ function test() {
   });
 }
 
 function testTabActor([aGrip, aResponse]) {
   let deferred = promise.defer();
 
   ok(aGrip.testTabActor1,
     "Found the test tab actor.");
-  ok(aGrip.testTabActor1.includes("test_one"),
+  ok(aGrip.testTabActor1.contains("test_one"),
     "testTabActor1's actorPrefix should be used.");
 
   gClient.request({ to: aGrip.testTabActor1, type: "ping" }, aResponse => {
     is(aResponse.pong, "pong",
       "Actor should respond to requests.");
 
     deferred.resolve(aResponse.actor);
   });
--- a/browser/devtools/debugger/test/browser_dbg_tracing-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_tracing-01.js
@@ -44,24 +44,24 @@ function testTraceLogs() {
                                    t => t.querySelector(".trace-name[value=onclick]"));
   is(onclickLogs.length, 2, "Should have two logs from 'onclick'");
   ok(onclickLogs[0].querySelector(".trace-call"),
      "The first 'onclick' log should be a call.");
   ok(onclickLogs[1].querySelector(".trace-return"),
      "The second 'onclick' log should be a return.");
   for (let t of onclickLogs) {
     ok(t.querySelector(".trace-item").getAttribute("tooltiptext")
-        .includes("doc_tracing-01.html"));
+        .contains("doc_tracing-01.html"));
   }
 
   const nonOnclickLogs = filterTraces(gPanel,
                                       t => !t.querySelector(".trace-name[value=onclick]"));
   for (let t of nonOnclickLogs) {
     ok(t.querySelector(".trace-item").getAttribute("tooltiptext")
-        .includes("code_tracing-01.js"));
+        .contains("code_tracing-01.js"));
   }
 
   const mainLogs = filterTraces(gPanel,
                                 t => t.querySelector(".trace-name[value=main]"));
   is(mainLogs.length, 2, "Should have an enter and an exit for 'main'");
   ok(mainLogs[0].querySelector(".trace-call"),
      "The first 'main' log should be a call.");
   ok(mainLogs[1].querySelector(".trace-return"),
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-01.js
@@ -10,29 +10,29 @@ const TAB_URL = EXAMPLE_URL + "doc_recur
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let variables = aPanel.panelWin.DebuggerView.Variables;
     let testScope = variables.addScope("test");
 
     ok(testScope,
       "Should have created a scope.");
-    ok(testScope.id.includes("test"),
+    ok(testScope.id.contains("test"),
       "The newly created scope should have the default id set.");
     is(testScope.name, "test",
       "The newly created scope should have the desired name set.");
 
     ok(!testScope.displayValue,
       "The newly created scope should not have a displayed value (1).");
     ok(!testScope.displayValueClassName,
       "The newly created scope should not have a displayed value (2).");
 
     ok(testScope.target,
       "The newly created scope should point to a target node.");
-    ok(testScope.target.id.includes("test"),
+    ok(testScope.target.id.contains("test"),
       "Should have the correct scope id on the element.");
 
     is(testScope.target.querySelector(".name").getAttribute("value"), "test",
       "Any new scope should have the designated name.");
     is(testScope.target.querySelector(".variables-view-element-details.enum").childNodes.length, 0,
       "Any new scope should have a container with no enumerable child nodes.");
     is(testScope.target.querySelector(".variables-view-element-details.nonenum").childNodes.length, 0,
       "Any new scope should have a container with no non-enumerable child nodes.");
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-02.js
@@ -22,29 +22,29 @@ function test() {
 
     ok(testScope,
       "Should have created a scope.");
     is(duplVar, null,
       "Shouldn't be able to duplicate variables in the same scope.");
 
     ok(testVar,
       "Should have created a variable.");
-    ok(testVar.id.includes("something"),
+    ok(testVar.id.contains("something"),
       "The newly created variable should have the default id set.");
     is(testVar.name, "something",
       "The newly created variable should have the desired name set.");
 
     ok(!testVar.displayValue,
       "The newly created variable should not have a displayed value yet (1).");
     ok(!testVar.displayValueClassName,
       "The newly created variable should not have a displayed value yet (2).");
 
     ok(testVar.target,
       "The newly created scope should point to a target node.");
-    ok(testVar.target.id.includes("something"),
+    ok(testVar.target.id.contains("something"),
       "Should have the correct variable id on the element.");
 
     is(testVar.target.querySelector(".name").getAttribute("value"), "something",
       "Any new variable should have the designated name.");
     is(testVar.target.querySelector(".variables-view-element-details.enum").childNodes.length, 0,
       "Any new variable should have a container with no enumerable child nodes.");
     is(testVar.target.querySelector(".variables-view-element-details.nonenum").childNodes.length, 0,
       "Any new variable should have a container with no non-enumerable child nodes.");
@@ -152,29 +152,29 @@ function test() {
         type: "object",
         class: "Object"
       }
     });
 
     let testChild = testVar.get("child");
     ok(testChild,
       "Should have created a child property.");
-    ok(testChild.id.includes("child"),
+    ok(testChild.id.contains("child"),
       "The newly created property should have the default id set.");
     is(testChild.name, "child",
       "The newly created property should have the desired name set.");
 
     is(testChild.displayValue, "Object",
       "The newly created property should not have a displayed value yet (1).");
     is(testChild.displayValueClassName, "token-other",
       "The newly created property should not have a displayed value yet (2).");
 
     ok(testChild.target,
       "The newly created scope should point to a target node.");
-    ok(testChild.target.id.includes("child"),
+    ok(testChild.target.id.contains("child"),
       "Should have the correct property id on the element.");
 
     is(testChild.target.querySelector(".name").getAttribute("value"), "child",
       "Any new property should have the designated name.");
     is(testChild.target.querySelector(".variables-view-element-details.enum").childNodes.length, 0,
       "Any new property should have a container with no enumerable child nodes.");
     is(testChild.target.querySelector(".variables-view-element-details.nonenum").childNodes.length, 0,
       "Any new property should have a container with no non-enumerable child nodes.");
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-frame-parameters-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-frame-parameters-01.js
@@ -33,19 +33,19 @@ function test() {
   });
 }
 
 function initialChecks() {
   let scopeNodes = gDebugger.document.querySelectorAll(".variables-view-scope");
   is(scopeNodes.length, 2,
     "There should be 2 scopes available.");
 
-  ok(scopeNodes[0].querySelector(".name").getAttribute("value").includes("[test]"),
+  ok(scopeNodes[0].querySelector(".name").getAttribute("value").contains("[test]"),
     "The local scope should be properly identified.");
-  ok(scopeNodes[1].querySelector(".name").getAttribute("value").includes("[Window]"),
+  ok(scopeNodes[1].querySelector(".name").getAttribute("value").contains("[Window]"),
     "The global scope should be properly identified.");
 
   is(gVariables.getScopeAtIndex(0).target, scopeNodes[0],
     "getScopeAtIndex(0) didn't return the expected scope.");
   is(gVariables.getScopeAtIndex(1).target, scopeNodes[1],
     "getScopeAtIndex(1) didn't return the expected scope.");
 
   is(gVariables.getItemForNode(scopeNodes[0]).target, scopeNodes[0],
@@ -84,64 +84,64 @@ function testExpandVariables() {
     "The cVar should not be expanded at this point.");
 
   waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES, 3).then(() => {
     is(thisVar.get("window").target.querySelector(".name").getAttribute("value"), "window",
       "Should have the right property name for 'window'.");
     is(thisVar.get("window").target.querySelector(".value").getAttribute("value"),
       "Window \u2192 doc_frame-parameters.html",
       "Should have the right property value for 'window'.");
-    ok(thisVar.get("window").target.querySelector(".value").className.includes("token-other"),
+    ok(thisVar.get("window").target.querySelector(".value").className.contains("token-other"),
       "Should have the right token class for 'window'.");
 
     is(thisVar.get("document").target.querySelector(".name").getAttribute("value"), "document",
       "Should have the right property name for 'document'.");
     is(thisVar.get("document").target.querySelector(".value").getAttribute("value"),
       "HTMLDocument \u2192 doc_frame-parameters.html",
       "Should have the right property value for 'document'.");
-    ok(thisVar.get("document").target.querySelector(".value").className.includes("token-domnode"),
+    ok(thisVar.get("document").target.querySelector(".value").className.contains("token-domnode"),
       "Should have the right token class for 'document'.");
 
     let argsProps = argsVar.target.querySelectorAll(".variables-view-property");
     is(argsProps.length, 8,
       "The 'arguments' variable should contain 5 enumerable and 3 non-enumerable properties");
 
     is(argsProps[0].querySelector(".name").getAttribute("value"), "0",
       "Should have the right property name for '0'.");
     is(argsProps[0].querySelector(".value").getAttribute("value"), "Object",
       "Should have the right property value for '0'.");
-    ok(argsProps[0].querySelector(".value").className.includes("token-other"),
+    ok(argsProps[0].querySelector(".value").className.contains("token-other"),
       "Should have the right token class for '0'.");
 
     is(argsProps[1].querySelector(".name").getAttribute("value"), "1",
       "Should have the right property name for '1'.");
     is(argsProps[1].querySelector(".value").getAttribute("value"), "\"beta\"",
       "Should have the right property value for '1'.");
-    ok(argsProps[1].querySelector(".value").className.includes("token-string"),
+    ok(argsProps[1].querySelector(".value").className.contains("token-string"),
       "Should have the right token class for '1'.");
 
     is(argsProps[2].querySelector(".name").getAttribute("value"), "2",
       "Should have the right property name for '2'.");
     is(argsProps[2].querySelector(".value").getAttribute("value"), "3",
       "Should have the right property name for '2'.");
-    ok(argsProps[2].querySelector(".value").className.includes("token-number"),
+    ok(argsProps[2].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for '2'.");
 
     is(argsProps[3].querySelector(".name").getAttribute("value"), "3",
       "Should have the right property name for '3'.");
     is(argsProps[3].querySelector(".value").getAttribute("value"), "false",
       "Should have the right property value for '3'.");
-    ok(argsProps[3].querySelector(".value").className.includes("token-boolean"),
+    ok(argsProps[3].querySelector(".value").className.contains("token-boolean"),
       "Should have the right token class for '3'.");
 
     is(argsProps[4].querySelector(".name").getAttribute("value"), "4",
       "Should have the right property name for '4'.");
     is(argsProps[4].querySelector(".value").getAttribute("value"), "null",
       "Should have the right property name for '4'.");
-    ok(argsProps[4].querySelector(".value").className.includes("token-null"),
+    ok(argsProps[4].querySelector(".value").className.contains("token-null"),
       "Should have the right token class for '4'.");
 
     is(gVariables.getItemForNode(argsProps[0]).target,
        argsVar.target.querySelectorAll(".variables-view-property")[0],
       "getItemForNode([0]) didn't return the expected property.");
 
     is(gVariables.getItemForNode(argsProps[1]).target,
        argsVar.target.querySelectorAll(".variables-view-property")[1],
@@ -166,52 +166,52 @@ function testExpandVariables() {
     let cProps = cVar.target.querySelectorAll(".variables-view-property");
     is(cProps.length, 7,
       "The 'c' variable should contain 6 enumerable and 1 non-enumerable properties");
 
     is(cProps[0].querySelector(".name").getAttribute("value"), "a",
       "Should have the right property name for 'a'.");
     is(cProps[0].querySelector(".value").getAttribute("value"), "1",
       "Should have the right property value for 'a'.");
-    ok(cProps[0].querySelector(".value").className.includes("token-number"),
+    ok(cProps[0].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'a'.");
 
     is(cProps[1].querySelector(".name").getAttribute("value"), "b",
       "Should have the right property name for 'b'.");
     is(cProps[1].querySelector(".value").getAttribute("value"), "\"beta\"",
       "Should have the right property value for 'b'.");
-    ok(cProps[1].querySelector(".value").className.includes("token-string"),
+    ok(cProps[1].querySelector(".value").className.contains("token-string"),
       "Should have the right token class for 'b'.");
 
     is(cProps[2].querySelector(".name").getAttribute("value"), "c",
       "Should have the right property name for 'c'.");
     is(cProps[2].querySelector(".value").getAttribute("value"), "3",
       "Should have the right property value for 'c'.");
-    ok(cProps[2].querySelector(".value").className.includes("token-number"),
+    ok(cProps[2].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'c'.");
 
     is(cProps[3].querySelector(".name").getAttribute("value"), "d",
       "Should have the right property name for 'd'.");
     is(cProps[3].querySelector(".value").getAttribute("value"), "false",
       "Should have the right property value for 'd'.");
-    ok(cProps[3].querySelector(".value").className.includes("token-boolean"),
+    ok(cProps[3].querySelector(".value").className.contains("token-boolean"),
       "Should have the right token class for 'd'.");
 
     is(cProps[4].querySelector(".name").getAttribute("value"), "e",
       "Should have the right property name for 'e'.");
     is(cProps[4].querySelector(".value").getAttribute("value"), "null",
       "Should have the right property value for 'e'.");
-    ok(cProps[4].querySelector(".value").className.includes("token-null"),
+    ok(cProps[4].querySelector(".value").className.contains("token-null"),
       "Should have the right token class for 'e'.");
 
     is(cProps[5].querySelector(".name").getAttribute("value"), "f",
       "Should have the right property name for 'f'.");
     is(cProps[5].querySelector(".value").getAttribute("value"), "undefined",
       "Should have the right property value for 'f'.");
-    ok(cProps[5].querySelector(".value").className.includes("token-undefined"),
+    ok(cProps[5].querySelector(".value").className.contains("token-undefined"),
       "Should have the right token class for 'f'.");
 
     is(gVariables.getItemForNode(cProps[0]).target,
        cVar.target.querySelectorAll(".variables-view-property")[0],
       "getItemForNode([0]) didn't return the expected property.");
 
     is(gVariables.getItemForNode(cProps[1]).target,
        cVar.target.querySelectorAll(".variables-view-property")[1],
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-frame-parameters-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-frame-parameters-02.js
@@ -51,94 +51,94 @@ function testScopeVariables() {
   is(localNonEnums.length, 0,
     "The local scope should contain all the created non-enumerable elements.");
 
   is(localEnums[0].querySelector(".name").getAttribute("value"), "this",
     "Should have the right property name for 'this'.");
   is(localEnums[0].querySelector(".value").getAttribute("value"),
     "Window \u2192 doc_frame-parameters.html",
     "Should have the right property value for 'this'.");
-  ok(localEnums[0].querySelector(".value").className.includes("token-other"),
+  ok(localEnums[0].querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'this'.");
 
   is(localEnums[1].querySelector(".name").getAttribute("value"), "aArg",
     "Should have the right property name for 'aArg'.");
   is(localEnums[1].querySelector(".value").getAttribute("value"), "Object",
     "Should have the right property value for 'aArg'.");
-  ok(localEnums[1].querySelector(".value").className.includes("token-other"),
+  ok(localEnums[1].querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'aArg'.");
 
   is(localEnums[2].querySelector(".name").getAttribute("value"), "bArg",
     "Should have the right property name for 'bArg'.");
   is(localEnums[2].querySelector(".value").getAttribute("value"), "\"beta\"",
     "Should have the right property value for 'bArg'.");
-  ok(localEnums[2].querySelector(".value").className.includes("token-string"),
+  ok(localEnums[2].querySelector(".value").className.contains("token-string"),
     "Should have the right token class for 'bArg'.");
 
   is(localEnums[3].querySelector(".name").getAttribute("value"), "cArg",
     "Should have the right property name for 'cArg'.");
   is(localEnums[3].querySelector(".value").getAttribute("value"), "3",
     "Should have the right property value for 'cArg'.");
-  ok(localEnums[3].querySelector(".value").className.includes("token-number"),
+  ok(localEnums[3].querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'cArg'.");
 
   is(localEnums[4].querySelector(".name").getAttribute("value"), "dArg",
     "Should have the right property name for 'dArg'.");
   is(localEnums[4].querySelector(".value").getAttribute("value"), "false",
     "Should have the right property value for 'dArg'.");
-  ok(localEnums[4].querySelector(".value").className.includes("token-boolean"),
+  ok(localEnums[4].querySelector(".value").className.contains("token-boolean"),
     "Should have the right token class for 'dArg'.");
 
   is(localEnums[5].querySelector(".name").getAttribute("value"), "eArg",
     "Should have the right property name for 'eArg'.");
   is(localEnums[5].querySelector(".value").getAttribute("value"), "null",
     "Should have the right property value for 'eArg'.");
-  ok(localEnums[5].querySelector(".value").className.includes("token-null"),
+  ok(localEnums[5].querySelector(".value").className.contains("token-null"),
     "Should have the right token class for 'eArg'.");
 
   is(localEnums[6].querySelector(".name").getAttribute("value"), "fArg",
     "Should have the right property name for 'fArg'.");
   is(localEnums[6].querySelector(".value").getAttribute("value"), "undefined",
     "Should have the right property value for 'fArg'.");
-  ok(localEnums[6].querySelector(".value").className.includes("token-undefined"),
+  ok(localEnums[6].querySelector(".value").className.contains("token-undefined"),
     "Should have the right token class for 'fArg'.");
 
   is(localEnums[7].querySelector(".name").getAttribute("value"), "a",
    "Should have the right property name for 'a'.");
   is(localEnums[7].querySelector(".value").getAttribute("value"), "1",
    "Should have the right property value for 'a'.");
-  ok(localEnums[7].querySelector(".value").className.includes("token-number"),
+  ok(localEnums[7].querySelector(".value").className.contains("token-number"),
    "Should have the right token class for 'a'.");
 
   is(localEnums[8].querySelector(".name").getAttribute("value"), "arguments",
     "Should have the right property name for 'arguments'.");
   is(localEnums[8].querySelector(".value").getAttribute("value"), "Arguments",
     "Should have the right property value for 'arguments'.");
-  ok(localEnums[8].querySelector(".value").className.includes("token-other"),
+  ok(localEnums[8].querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'arguments'.");
 
   is(localEnums[9].querySelector(".name").getAttribute("value"), "b",
    "Should have the right property name for 'b'.");
   is(localEnums[9].querySelector(".value").getAttribute("value"), "Object",
    "Should have the right property value for 'b'.");
-  ok(localEnums[9].querySelector(".value").className.includes("token-other"),
+  ok(localEnums[9].querySelector(".value").className.contains("token-other"),
    "Should have the right token class for 'b'.");
 
   is(localEnums[10].querySelector(".name").getAttribute("value"), "c",
    "Should have the right property name for 'c'.");
   is(localEnums[10].querySelector(".value").getAttribute("value"), "Object",
    "Should have the right property value for 'c'.");
-  ok(localEnums[10].querySelector(".value").className.includes("token-other"),
+  ok(localEnums[10].querySelector(".value").className.contains("token-other"),
    "Should have the right token class for 'c'.");
 
   is(localEnums[11].querySelector(".name").getAttribute("value"), "myVar",
    "Should have the right property name for 'myVar'.");
   is(localEnums[11].querySelector(".value").getAttribute("value"), "Object",
    "Should have the right property value for 'myVar'.");
-  ok(localEnums[11].querySelector(".value").className.includes("token-other"),
+  ok(localEnums[11].querySelector(".value").className.contains("token-other"),
    "Should have the right token class for 'myVar'.");
 }
 
 function testArgumentsProperties() {
   let deferred = promise.defer();
 
   let argsVar = gVariables.getScopeAtIndex(0).get("arguments");
   is(argsVar.expanded, false,
@@ -152,67 +152,67 @@ function testArgumentsProperties() {
       "The 'arguments' variable should contain all the created enumerable elements.");
     is(argsNonEnums.length, 3,
       "The 'arguments' variable should contain all the created non-enumerable elements.");
 
     is(argsEnums[0].querySelector(".name").getAttribute("value"), "0",
       "Should have the right property name for '0'.");
     is(argsEnums[0].querySelector(".value").getAttribute("value"), "Object",
       "Should have the right property value for '0'.");
-    ok(argsEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(argsEnums[0].querySelector(".value").className.contains("token-other"),
       "Should have the right token class for '0'.");
 
     is(argsEnums[1].querySelector(".name").getAttribute("value"), "1",
       "Should have the right property name for '1'.");
     is(argsEnums[1].querySelector(".value").getAttribute("value"), "\"beta\"",
       "Should have the right property value for '1'.");
-    ok(argsEnums[1].querySelector(".value").className.includes("token-string"),
+    ok(argsEnums[1].querySelector(".value").className.contains("token-string"),
       "Should have the right token class for '1'.");
 
     is(argsEnums[2].querySelector(".name").getAttribute("value"), "2",
       "Should have the right property name for '2'.");
     is(argsEnums[2].querySelector(".value").getAttribute("value"), "3",
       "Should have the right property name for '2'.");
-    ok(argsEnums[2].querySelector(".value").className.includes("token-number"),
+    ok(argsEnums[2].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for '2'.");
 
     is(argsEnums[3].querySelector(".name").getAttribute("value"), "3",
       "Should have the right property name for '3'.");
     is(argsEnums[3].querySelector(".value").getAttribute("value"), "false",
       "Should have the right property value for '3'.");
-    ok(argsEnums[3].querySelector(".value").className.includes("token-boolean"),
+    ok(argsEnums[3].querySelector(".value").className.contains("token-boolean"),
       "Should have the right token class for '3'.");
 
     is(argsEnums[4].querySelector(".name").getAttribute("value"), "4",
       "Should have the right property name for '4'.");
     is(argsEnums[4].querySelector(".value").getAttribute("value"), "null",
       "Should have the right property name for '4'.");
-    ok(argsEnums[4].querySelector(".value").className.includes("token-null"),
+    ok(argsEnums[4].querySelector(".value").className.contains("token-null"),
       "Should have the right token class for '4'.");
 
     is(argsNonEnums[0].querySelector(".name").getAttribute("value"), "callee",
      "Should have the right property name for 'callee'.");
     is(argsNonEnums[0].querySelector(".value").getAttribute("value"),
      "test(aArg,bArg,cArg,dArg,eArg,fArg)",
      "Should have the right property name for 'callee'.");
-    ok(argsNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(argsNonEnums[0].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for 'callee'.");
 
     is(argsNonEnums[1].querySelector(".name").getAttribute("value"), "length",
       "Should have the right property name for 'length'.");
     is(argsNonEnums[1].querySelector(".value").getAttribute("value"), "5",
       "Should have the right property value for 'length'.");
-    ok(argsNonEnums[1].querySelector(".value").className.includes("token-number"),
+    ok(argsNonEnums[1].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'length'.");
 
     is(argsNonEnums[2].querySelector(".name").getAttribute("value"), "__proto__",
      "Should have the right property name for '__proto__'.");
     is(argsNonEnums[2].querySelector(".value").getAttribute("value"), "Object",
      "Should have the right property value for '__proto__'.");
-    ok(argsNonEnums[2].querySelector(".value").className.includes("token-other"),
+    ok(argsNonEnums[2].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for '__proto__'.");
 
     deferred.resolve();
   });
 
   argsVar.expand();
   return deferred.promise;
 }
@@ -232,24 +232,24 @@ function testSimpleObject() {
       "The 'b' variable should contain all the created enumerable elements.");
     is(bNonEnums.length, 1,
       "The 'b' variable should contain all the created non-enumerable elements.");
 
     is(bEnums[0].querySelector(".name").getAttribute("value"), "a",
       "Should have the right property name for 'a'.");
     is(bEnums[0].querySelector(".value").getAttribute("value"), "1",
       "Should have the right property value for 'a'.");
-    ok(bEnums[0].querySelector(".value").className.includes("token-number"),
+    ok(bEnums[0].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'a'.");
 
     is(bNonEnums[0].querySelector(".name").getAttribute("value"), "__proto__",
      "Should have the right property name for '__proto__'.");
     is(bNonEnums[0].querySelector(".value").getAttribute("value"), "Object",
      "Should have the right property value for '__proto__'.");
-    ok(bNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(bNonEnums[0].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for '__proto__'.");
 
     deferred.resolve();
   });
 
   bVar.expand();
   return deferred.promise;
 }
@@ -269,59 +269,59 @@ function testComplexObject() {
       "The 'c' variable should contain all the created enumerable elements.");
     is(cNonEnums.length, 1,
       "The 'c' variable should contain all the created non-enumerable elements.");
 
     is(cEnums[0].querySelector(".name").getAttribute("value"), "a",
       "Should have the right property name for 'a'.");
     is(cEnums[0].querySelector(".value").getAttribute("value"), "1",
       "Should have the right property value for 'a'.");
-    ok(cEnums[0].querySelector(".value").className.includes("token-number"),
+    ok(cEnums[0].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'a'.");
 
     is(cEnums[1].querySelector(".name").getAttribute("value"), "b",
       "Should have the right property name for 'b'.");
     is(cEnums[1].querySelector(".value").getAttribute("value"), "\"beta\"",
       "Should have the right property value for 'b'.");
-    ok(cEnums[1].querySelector(".value").className.includes("token-string"),
+    ok(cEnums[1].querySelector(".value").className.contains("token-string"),
       "Should have the right token class for 'b'.");
 
     is(cEnums[2].querySelector(".name").getAttribute("value"), "c",
       "Should have the right property name for 'c'.");
     is(cEnums[2].querySelector(".value").getAttribute("value"), "3",
       "Should have the right property value for 'c'.");
-    ok(cEnums[2].querySelector(".value").className.includes("token-number"),
+    ok(cEnums[2].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'c'.");
 
     is(cEnums[3].querySelector(".name").getAttribute("value"), "d",
       "Should have the right property name for 'd'.");
     is(cEnums[3].querySelector(".value").getAttribute("value"), "false",
       "Should have the right property value for 'd'.");
-    ok(cEnums[3].querySelector(".value").className.includes("token-boolean"),
+    ok(cEnums[3].querySelector(".value").className.contains("token-boolean"),
       "Should have the right token class for 'd'.");
 
     is(cEnums[4].querySelector(".name").getAttribute("value"), "e",
       "Should have the right property name for 'e'.");
     is(cEnums[4].querySelector(".value").getAttribute("value"), "null",
       "Should have the right property value for 'e'.");
-    ok(cEnums[4].querySelector(".value").className.includes("token-null"),
+    ok(cEnums[4].querySelector(".value").className.contains("token-null"),
       "Should have the right token class for 'e'.");
 
     is(cEnums[5].querySelector(".name").getAttribute("value"), "f",
       "Should have the right property name for 'f'.");
     is(cEnums[5].querySelector(".value").getAttribute("value"), "undefined",
       "Should have the right property value for 'f'.");
-    ok(cEnums[5].querySelector(".value").className.includes("token-undefined"),
+    ok(cEnums[5].querySelector(".value").className.contains("token-undefined"),
       "Should have the right token class for 'f'.");
 
     is(cNonEnums[0].querySelector(".name").getAttribute("value"), "__proto__",
      "Should have the right property name for '__proto__'.");
     is(cNonEnums[0].querySelector(".value").getAttribute("value"), "Object",
      "Should have the right property value for '__proto__'.");
-    ok(cNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(cNonEnums[0].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for '__proto__'.");
 
     deferred.resolve();
   });
 
   cVar.expand();
   return deferred.promise;
 }
@@ -341,59 +341,59 @@ function testArgumentObject() {
       "The 'aArg' variable should contain all the created enumerable elements.");
     is(argNonEnums.length, 1,
       "The 'aArg' variable should contain all the created non-enumerable elements.");
 
     is(argEnums[0].querySelector(".name").getAttribute("value"), "a",
       "Should have the right property name for 'a'.");
     is(argEnums[0].querySelector(".value").getAttribute("value"), "1",
       "Should have the right property value for 'a'.");
-    ok(argEnums[0].querySelector(".value").className.includes("token-number"),
+    ok(argEnums[0].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'a'.");
 
     is(argEnums[1].querySelector(".name").getAttribute("value"), "b",
       "Should have the right property name for 'b'.");
     is(argEnums[1].querySelector(".value").getAttribute("value"), "\"beta\"",
       "Should have the right property value for 'b'.");
-    ok(argEnums[1].querySelector(".value").className.includes("token-string"),
+    ok(argEnums[1].querySelector(".value").className.contains("token-string"),
       "Should have the right token class for 'b'.");
 
     is(argEnums[2].querySelector(".name").getAttribute("value"), "c",
       "Should have the right property name for 'c'.");
     is(argEnums[2].querySelector(".value").getAttribute("value"), "3",
       "Should have the right property value for 'c'.");
-    ok(argEnums[2].querySelector(".value").className.includes("token-number"),
+    ok(argEnums[2].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'c'.");
 
     is(argEnums[3].querySelector(".name").getAttribute("value"), "d",
       "Should have the right property name for 'd'.");
     is(argEnums[3].querySelector(".value").getAttribute("value"), "false",
       "Should have the right property value for 'd'.");
-    ok(argEnums[3].querySelector(".value").className.includes("token-boolean"),
+    ok(argEnums[3].querySelector(".value").className.contains("token-boolean"),
       "Should have the right token class for 'd'.");
 
     is(argEnums[4].querySelector(".name").getAttribute("value"), "e",
       "Should have the right property name for 'e'.");
     is(argEnums[4].querySelector(".value").getAttribute("value"), "null",
       "Should have the right property value for 'e'.");
-    ok(argEnums[4].querySelector(".value").className.includes("token-null"),
+    ok(argEnums[4].querySelector(".value").className.contains("token-null"),
       "Should have the right token class for 'e'.");
 
     is(argEnums[5].querySelector(".name").getAttribute("value"), "f",
       "Should have the right property name for 'f'.");
     is(argEnums[5].querySelector(".value").getAttribute("value"), "undefined",
       "Should have the right property value for 'f'.");
-    ok(argEnums[5].querySelector(".value").className.includes("token-undefined"),
+    ok(argEnums[5].querySelector(".value").className.contains("token-undefined"),
       "Should have the right token class for 'f'.");
 
     is(argNonEnums[0].querySelector(".name").getAttribute("value"), "__proto__",
      "Should have the right property name for '__proto__'.");
     is(argNonEnums[0].querySelector(".value").getAttribute("value"), "Object",
      "Should have the right property value for '__proto__'.");
-    ok(argNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(argNonEnums[0].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for '__proto__'.");
 
     deferred.resolve();
   });
 
   argVar.expand();
   return deferred.promise;
 }
@@ -413,59 +413,59 @@ function testInnerArgumentObject() {
       "The 'arguments[0]' property should contain all the created enumerable elements.");
     is(argNonEnums.length, 1,
       "The 'arguments[0]' property should contain all the created non-enumerable elements.");
 
     is(argEnums[0].querySelector(".name").getAttribute("value"), "a",
       "Should have the right property name for 'a'.");
     is(argEnums[0].querySelector(".value").getAttribute("value"), "1",
       "Should have the right property value for 'a'.");
-    ok(argEnums[0].querySelector(".value").className.includes("token-number"),
+    ok(argEnums[0].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'a'.");
 
     is(argEnums[1].querySelector(".name").getAttribute("value"), "b",
       "Should have the right property name for 'b'.");
     is(argEnums[1].querySelector(".value").getAttribute("value"), "\"beta\"",
       "Should have the right property value for 'b'.");
-    ok(argEnums[1].querySelector(".value").className.includes("token-string"),
+    ok(argEnums[1].querySelector(".value").className.contains("token-string"),
       "Should have the right token class for 'b'.");
 
     is(argEnums[2].querySelector(".name").getAttribute("value"), "c",
       "Should have the right property name for 'c'.");
     is(argEnums[2].querySelector(".value").getAttribute("value"), "3",
       "Should have the right property value for 'c'.");
-    ok(argEnums[2].querySelector(".value").className.includes("token-number"),
+    ok(argEnums[2].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for 'c'.");
 
     is(argEnums[3].querySelector(".name").getAttribute("value"), "d",
       "Should have the right property name for 'd'.");
     is(argEnums[3].querySelector(".value").getAttribute("value"), "false",
       "Should have the right property value for 'd'.");
-    ok(argEnums[3].querySelector(".value").className.includes("token-boolean"),
+    ok(argEnums[3].querySelector(".value").className.contains("token-boolean"),
       "Should have the right token class for 'd'.");
 
     is(argEnums[4].querySelector(".name").getAttribute("value"), "e",
       "Should have the right property name for 'e'.");
     is(argEnums[4].querySelector(".value").getAttribute("value"), "null",
       "Should have the right property value for 'e'.");
-    ok(argEnums[4].querySelector(".value").className.includes("token-null"),
+    ok(argEnums[4].querySelector(".value").className.contains("token-null"),
       "Should have the right token class for 'e'.");
 
     is(argEnums[5].querySelector(".name").getAttribute("value"), "f",
       "Should have the right property name for 'f'.");
     is(argEnums[5].querySelector(".value").getAttribute("value"), "undefined",
       "Should have the right property value for 'f'.");
-    ok(argEnums[5].querySelector(".value").className.includes("token-undefined"),
+    ok(argEnums[5].querySelector(".value").className.contains("token-undefined"),
       "Should have the right token class for 'f'.");
 
     is(argNonEnums[0].querySelector(".name").getAttribute("value"), "__proto__",
      "Should have the right property name for '__proto__'.");
     is(argNonEnums[0].querySelector(".value").getAttribute("value"), "Object",
      "Should have the right property value for '__proto__'.");
-    ok(argNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(argNonEnums[0].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for '__proto__'.");
 
     deferred.resolve();
   });
 
   argProp.expand();
   return deferred.promise;
 }
@@ -485,55 +485,55 @@ function testGetterSetterObject() {
       "The myVar should contain all the created enumerable elements.");
     is(myVarNonEnums.length, 1,
       "The myVar should contain all the created non-enumerable elements.");
 
     is(myVarEnums[0].querySelector(".name").getAttribute("value"), "_prop",
       "Should have the right property name for '_prop'.");
     is(myVarEnums[0].querySelector(".value").getAttribute("value"), "42",
       "Should have the right property value for '_prop'.");
-    ok(myVarEnums[0].querySelector(".value").className.includes("token-number"),
+    ok(myVarEnums[0].querySelector(".value").className.contains("token-number"),
       "Should have the right token class for '_prop'.");
 
     is(myVarEnums[1].querySelector(".name").getAttribute("value"), "prop",
       "Should have the right property name for 'prop'.");
     is(myVarEnums[1].querySelector(".value").getAttribute("value"), "",
       "Should have the right property value for 'prop'.");
-    ok(!myVarEnums[1].querySelector(".value").className.includes("token"),
+    ok(!myVarEnums[1].querySelector(".value").className.contains("token"),
       "Should have no token class for 'prop'.");
 
     is(myVarNonEnums[0].querySelector(".name").getAttribute("value"), "__proto__",
      "Should have the right property name for '__proto__'.");
     is(myVarNonEnums[0].querySelector(".value").getAttribute("value"), "Object",
      "Should have the right property value for '__proto__'.");
-    ok(myVarNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(myVarNonEnums[0].querySelector(".value").className.contains("token-other"),
      "Should have the right token class for '__proto__'.");
 
     let propEnums = myVarEnums[1].querySelector(".variables-view-element-details.enum").childNodes;
     let propNonEnums = myVarEnums[1].querySelector(".variables-view-element-details.nonenum").childNodes;
 
     is(propEnums.length, 0,
       "The propEnums should contain all the created enumerable elements.");
     is(propNonEnums.length, 2,
       "The propEnums should contain all the created non-enumerable elements.");
 
     is(propNonEnums[0].querySelector(".name").getAttribute("value"), "get",
       "Should have the right property name for 'get'.");
     is(propNonEnums[0].querySelector(".value").getAttribute("value"),
       "test/myVar.prop()",
       "Should have the right property value for 'get'.");
-    ok(propNonEnums[0].querySelector(".value").className.includes("token-other"),
+    ok(propNonEnums[0].querySelector(".value").className.contains("token-other"),
       "Should have the right token class for 'get'.");
 
     is(propNonEnums[1].querySelector(".name").getAttribute("value"), "set",
       "Should have the right property name for 'set'.");
     is(propNonEnums[1].querySelector(".value").getAttribute("value"),
       "test/myVar.prop(val)",
       "Should have the right property value for 'set'.");
-    ok(propNonEnums[1].querySelector(".value").className.includes("token-other"),
+    ok(propNonEnums[1].querySelector(".value").className.contains("token-other"),
       "Should have the right token class for 'set'.");
 
     deferred.resolve();
   });
 
   myVar.expand();
   return deferred.promise;
 }
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-frame-with.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-frame-with.js
@@ -36,54 +36,54 @@ function test() {
     sendMouseClickToTab(gTab, content.document.querySelector("button"));
   });
 }
 
 function testFirstWithScope() {
   let firstWithScope = gVariables.getScopeAtIndex(0);
   is(firstWithScope.expanded, true,
     "The first 'with' scope should be expanded by default.");
-  ok(firstWithScope.target.querySelector(".name").getAttribute("value").includes("[Object]"),
+  ok(firstWithScope.target.querySelector(".name").getAttribute("value").contains("[Object]"),
     "The first 'with' scope should be properly identified.");
 
   let withEnums = firstWithScope._enum.childNodes;
   let withNonEnums = firstWithScope._nonenum.childNodes;
 
   is(withEnums.length, 3,
     "The first 'with' scope should contain all the created enumerable elements.");
   is(withNonEnums.length, 1,
     "The first 'with' scope should contain all the created non-enumerable elements.");
 
   is(withEnums[0].querySelector(".name").getAttribute("value"), "this",
     "Should have the right property name for 'this'.");
   is(withEnums[0].querySelector(".value").getAttribute("value"),
     "Window \u2192 doc_with-frame.html",
     "Should have the right property value for 'this'.");
-  ok(withEnums[0].querySelector(".value").className.includes("token-other"),
+  ok(withEnums[0].querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'this'.");
 
   is(withEnums[1].querySelector(".name").getAttribute("value"), "alpha",
     "Should have the right property name for 'alpha'.");
   is(withEnums[1].querySelector(".value").getAttribute("value"), "1",
     "Should have the right property value for 'alpha'.");
-  ok(withEnums[1].querySelector(".value").className.includes("token-number"),
+  ok(withEnums[1].querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'alpha'.");
 
   is(withEnums[2].querySelector(".name").getAttribute("value"), "beta",
     "Should have the right property name for 'beta'.");
   is(withEnums[2].querySelector(".value").getAttribute("value"), "2",
     "Should have the right property value for 'beta'.");
-  ok(withEnums[2].querySelector(".value").className.includes("token-number"),
+  ok(withEnums[2].querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'beta'.");
 
   is(withNonEnums[0].querySelector(".name").getAttribute("value"), "__proto__",
    "Should have the right property name for '__proto__'.");
   is(withNonEnums[0].querySelector(".value").getAttribute("value"), "Object",
    "Should have the right property value for '__proto__'.");
-  ok(withNonEnums[0].querySelector(".value").className.includes("token-other"),
+  ok(withNonEnums[0].querySelector(".value").className.contains("token-other"),
    "Should have the right token class for '__proto__'.");
 }
 
 function expandSecondWithScope() {
   let deferred = promise.defer();
 
   let secondWithScope = gVariables.getScopeAtIndex(1);
   is(secondWithScope.expanded, false,
@@ -97,53 +97,53 @@ function expandSecondWithScope() {
 
   return deferred.promise;
 }
 
 function testSecondWithScope() {
   let secondWithScope = gVariables.getScopeAtIndex(1);
   is(secondWithScope.expanded, true,
     "The second 'with' scope should now be expanded.");
-  ok(secondWithScope.target.querySelector(".name").getAttribute("value").includes("[Math]"),
+  ok(secondWithScope.target.querySelector(".name").getAttribute("value").contains("[Math]"),
     "The second 'with' scope should be properly identified.");
 
   let withEnums = secondWithScope._enum.childNodes;
   let withNonEnums = secondWithScope._nonenum.childNodes;
 
   is(withEnums.length, 0,
     "The second 'with' scope should contain all the created enumerable elements.");
   isnot(withNonEnums.length, 0,
     "The second 'with' scope should contain all the created non-enumerable elements.");
 
   is(secondWithScope.get("E").target.querySelector(".name").getAttribute("value"), "E",
     "Should have the right property name for 'E'.");
   is(secondWithScope.get("E").target.querySelector(".value").getAttribute("value"), "2.718281828459045",
     "Should have the right property value for 'E'.");
-  ok(secondWithScope.get("E").target.querySelector(".value").className.includes("token-number"),
+  ok(secondWithScope.get("E").target.querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'E'.");
 
   is(secondWithScope.get("PI").target.querySelector(".name").getAttribute("value"), "PI",
     "Should have the right property name for 'PI'.");
   is(secondWithScope.get("PI").target.querySelector(".value").getAttribute("value"), "3.141592653589793",
     "Should have the right property value for 'PI'.");
-  ok(secondWithScope.get("PI").target.querySelector(".value").className.includes("token-number"),
+  ok(secondWithScope.get("PI").target.querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'PI'.");
 
   is(secondWithScope.get("random").target.querySelector(".name").getAttribute("value"), "random",
     "Should have the right property name for 'random'.");
   is(secondWithScope.get("random").target.querySelector(".value").getAttribute("value"), "random()",
     "Should have the right property value for 'random'.");
-  ok(secondWithScope.get("random").target.querySelector(".value").className.includes("token-other"),
+  ok(secondWithScope.get("random").target.querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'random'.");
 
   is(secondWithScope.get("__proto__").target.querySelector(".name").getAttribute("value"), "__proto__",
     "Should have the right property name for '__proto__'.");
   is(secondWithScope.get("__proto__").target.querySelector(".value").getAttribute("value"), "Object",
     "Should have the right property value for '__proto__'.");
-  ok(secondWithScope.get("__proto__").target.querySelector(".value").className.includes("token-other"),
+  ok(secondWithScope.get("__proto__").target.querySelector(".value").className.contains("token-other"),
     "Should have the right token class for '__proto__'.");
 }
 
 function expandFunctionScope() {
   let funcScope = gVariables.getScopeAtIndex(2);
   is(funcScope.expanded, false,
     "The function scope shouldn't be expanded by default, but the " +
     "variables have been already fetched. This is how local scopes work.");
@@ -154,53 +154,53 @@ function expandFunctionScope() {
 
   return promise.resolve(null);
 }
 
 function testFunctionScope() {
   let funcScope = gVariables.getScopeAtIndex(2);
   is(funcScope.expanded, true,
     "The function scope should now be expanded.");
-  ok(funcScope.target.querySelector(".name").getAttribute("value").includes("[test]"),
+  ok(funcScope.target.querySelector(".name").getAttribute("value").contains("[test]"),
     "The function scope should be properly identified.");
 
   let funcEnums = funcScope._enum.childNodes;
   let funcNonEnums = funcScope._nonenum.childNodes;
 
   is(funcEnums.length, 6,
     "The function scope should contain all the created enumerable elements.");
   is(funcNonEnums.length, 0,
     "The function scope should contain all the created non-enumerable elements.");
 
   is(funcScope.get("aNumber").target.querySelector(".name").getAttribute("value"), "aNumber",
     "Should have the right property name for 'aNumber'.");
   is(funcScope.get("aNumber").target.querySelector(".value").getAttribute("value"), "10",
     "Should have the right property value for 'aNumber'.");
-  ok(funcScope.get("aNumber").target.querySelector(".value").className.includes("token-number"),
+  ok(funcScope.get("aNumber").target.querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'aNumber'.");
 
   is(funcScope.get("a").target.querySelector(".name").getAttribute("value"), "a",
     "Should have the right property name for 'a'.");
   is(funcScope.get("a").target.querySelector(".value").getAttribute("value"), "314.1592653589793",
     "Should have the right property value for 'a'.");
-  ok(funcScope.get("a").target.querySelector(".value").className.includes("token-number"),
+  ok(funcScope.get("a").target.querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'a'.");
 
   is(funcScope.get("r").target.querySelector(".name").getAttribute("value"), "r",
     "Should have the right property name for 'r'.");
   is(funcScope.get("r").target.querySelector(".value").getAttribute("value"), "10",
     "Should have the right property value for 'r'.");
-  ok(funcScope.get("r").target.querySelector(".value").className.includes("token-number"),
+  ok(funcScope.get("r").target.querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'r'.");
 
   is(funcScope.get("foo").target.querySelector(".name").getAttribute("value"), "foo",
     "Should have the right property name for 'foo'.");
   is(funcScope.get("foo").target.querySelector(".value").getAttribute("value"), "6.283185307179586",
     "Should have the right property value for 'foo'.");
-  ok(funcScope.get("foo").target.querySelector(".value").className.includes("token-number"),
+  ok(funcScope.get("foo").target.querySelector(".value").className.contains("token-number"),
     "Should have the right token class for 'foo'.");
 }
 
 registerCleanupFunction(function() {
   gTab = null;
   gPanel = null;
   gDebugger = null;
   gVariables = null;
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-large-array-buffer.js
@@ -41,31 +41,31 @@ function initialChecks() {
   ok(bufferVar, "There should be a 'buffer' variable present in the scope.");
   ok(arrayVar, "There should be a 'largeArray' variable present in the scope.");
   ok(objectVar, "There should be a 'largeObject' variable present in the scope.");
 
   is(bufferVar.target.querySelector(".name").getAttribute("value"), "buffer",
     "Should have the right property name for 'buffer'.");
   is(bufferVar.target.querySelector(".value").getAttribute("value"), "ArrayBuffer",
     "Should have the right property value for 'buffer'.");
-  ok(bufferVar.target.querySelector(".value").className.includes("token-other"),
+  ok(bufferVar.target.querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'buffer'.");
 
   is(arrayVar.target.querySelector(".name").getAttribute("value"), "largeArray",
     "Should have the right property name for 'largeArray'.");
   is(arrayVar.target.querySelector(".value").getAttribute("value"), "Int8Array[10000]",
     "Should have the right property value for 'largeArray'.");
-  ok(arrayVar.target.querySelector(".value").className.includes("token-other"),
+  ok(arrayVar.target.querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'largeArray'.");
 
   is(objectVar.target.querySelector(".name").getAttribute("value"), "largeObject",
     "Should have the right property name for 'largeObject'.");
   is(objectVar.target.querySelector(".value").getAttribute("value"), "Object",
     "Should have the right property value for 'largeObject'.");
-  ok(objectVar.target.querySelector(".value").className.includes("token-other"),
+  ok(objectVar.target.querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'largeObject'.");
 
   is(bufferVar.expanded, false,
     "The 'buffer' variable shouldn't be expanded.");
   is(arrayVar.expanded, false,
     "The 'largeArray' variable shouldn't be expanded.");
   is(objectVar.expanded, false,
     "The 'largeObject' variable shouldn't be expanded.");
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-popup-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-popup-01.js
@@ -20,17 +20,17 @@ function test() {
     function verifyContents(textContent, className) {
       is(tooltip.querySelectorAll(".variables-view-container").length, 0,
         "There should be no variables view containers added to the tooltip.");
       is(tooltip.querySelectorAll(".devtools-tooltip-simple-text").length, 1,
         "There should be a simple text node added to the tooltip instead.");
 
       is(tooltip.querySelector(".devtools-tooltip-simple-text").textContent, textContent,
         "The inspected property's value is correct.");
-      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.includes(className),
+      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.contains(className),
         "The inspected property's value is colorized correctly.");
     }
 
     callInTab(tab, "start");
     yield waitForSourceAndCaretAndScopes(panel, ".html", 24);
 
     // Inspect variables.
     yield openVarPopup(panel, { line: 15, ch: 12 });
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-popup-02.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-popup-02.js
@@ -18,17 +18,17 @@ function test() {
     function verifyContents(textContent, className) {
       is(tooltip.querySelectorAll(".variables-view-container").length, 0,
         "There should be no variables view containers added to the tooltip.");
       is(tooltip.querySelectorAll(".devtools-tooltip-simple-text").length, 1,
         "There should be a simple text node added to the tooltip instead.");
 
       is(tooltip.querySelector(".devtools-tooltip-simple-text").textContent, textContent,
         "The inspected property's value is correct.");
-      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.includes(className),
+      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.contains(className),
         "The inspected property's value is colorized correctly.");
     }
 
     callInTab(tab, "start");
     yield waitForSourceAndCaretAndScopes(panel, ".html", 24);
 
     // Inspect properties.
     yield openVarPopup(panel, { line: 19, ch: 10 });
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-popup-07.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-popup-07.js
@@ -18,17 +18,17 @@ function test() {
     function verifySimpleContents(textContent, className) {
       is(tooltip.querySelectorAll(".variables-view-container").length, 0,
         "There should be no variables view container added to the tooltip.");
       is(tooltip.querySelectorAll(".devtools-tooltip-simple-text").length, 1,
         "There should be one simple text node added to the tooltip.");
 
       is(tooltip.querySelector(".devtools-tooltip-simple-text").textContent, textContent,
         "The inspected property's value is correct.");
-      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.includes(className),
+      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.contains(className),
         "The inspected property's value is colorized correctly.");
     }
 
     function verifyComplexContents(propertyCount) {
       is(tooltip.querySelectorAll(".variables-view-container").length, 1,
         "There should be one variables view container added to the tooltip.");
       is(tooltip.querySelectorAll(".devtools-tooltip-simple-text").length, 0,
         "There should be no simple text node added to the tooltip.");
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-popup-08.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-popup-08.js
@@ -20,17 +20,17 @@ function test() {
     function verifyContents(textContent, className) {
       is(tooltip.querySelectorAll(".variables-view-container").length, 0,
         "There should be no variables view containers added to the tooltip.");
       is(tooltip.querySelectorAll(".devtools-tooltip-simple-text").length, 1,
         "There should be a simple text node added to the tooltip instead.");
 
       is(tooltip.querySelector(".devtools-tooltip-simple-text").textContent, textContent,
         "The inspected property's value is correct.");
-      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.includes(className),
+      ok(tooltip.querySelector(".devtools-tooltip-simple-text").className.contains(className),
         "The inspected property's value is colorized correctly.");
     }
 
     function checkView(selectedFrame, caretLine) {
       is(win.gThreadClient.state, "paused",
         "Should only be getting stack frames while paused.");
       is(frames.itemCount, 2,
         "Should have two frames.");
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-webidl.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-webidl.js
@@ -56,161 +56,161 @@ function performTest() {
   let buttonVar = globalScope.get("button");
   let buttonAsProtoVar = globalScope.get("buttonAsProto");
   let documentVar = globalScope.get("document");
 
   is(buttonVar.target.querySelector(".name").getAttribute("value"), "button",
     "Should have the right property name for 'button'.");
   is(buttonVar.target.querySelector(".value").getAttribute("value"), "<button>",
     "Should have the right property value for 'button'.");
-  ok(buttonVar.target.querySelector(".value").className.includes("token-domnode"),
+  ok(buttonVar.target.querySelector(".value").className.contains("token-domnode"),
     "Should have the right token class for 'button'.");
 
   is(buttonAsProtoVar.target.querySelector(".name").getAttribute("value"), "buttonAsProto",
     "Should have the right property name for 'buttonAsProto'.");
   is(buttonAsProtoVar.target.querySelector(".value").getAttribute("value"), "Object",
     "Should have the right property value for 'buttonAsProto'.");
-  ok(buttonAsProtoVar.target.querySelector(".value").className.includes("token-other"),
+  ok(buttonAsProtoVar.target.querySelector(".value").className.contains("token-other"),
     "Should have the right token class for 'buttonAsProto'.");
 
   is(documentVar.target.querySelector(".name").getAttribute("value"), "document",
     "Should have the right property name for 'document'.");
   is(documentVar.target.querySelector(".value").getAttribute("value"),
     "HTMLDocument \u2192 doc_frame-parameters.html",
     "Should have the right property value for 'document'.");
-  ok(documentVar.target.querySelector(".value").className.includes("token-domnode"),
+  ok(documentVar.target.querySelector(".value").className.contains("token-domnode"),
     "Should have the right token class for 'document'.");
 
   is(buttonVar.expanded, false,
     "The buttonVar should not be expanded at this point.");
   is(buttonAsProtoVar.expanded, false,
     "The buttonAsProtoVar should not be expanded at this point.");
   is(documentVar.expanded, false,
     "The documentVar should not be expanded at this point.");
 
   waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES, 3).then(() => {
     is(buttonVar.get("type").target.querySelector(".name").getAttribute("value"), "type",
       "Should have the right property name for 'type'.");
     is(buttonVar.get("type").target.querySelector(".value").getAttribute("value"), "\"submit\"",
       "Should have the right property value for 'type'.");
-    ok(buttonVar.get("type").target.querySelector(".value").className.includes("token-string"),
+    ok(buttonVar.get("type").target.querySelector(".value").className.contains("token-string"),
       "Should have the right token class for 'type'.");
 
     is(buttonVar.get("childNodes").target.querySelector(".name").getAttribute("value"), "childNodes",
       "Should have the right property name for 'childNodes'.");
     is(buttonVar.get("childNodes").target.querySelector(".value").getAttribute("value"), "NodeList[1]",
       "Should have the right property value for 'childNodes'.");
-    ok(buttonVar.get("childNodes").target.querySelector(".value").className.includes("token-other"),
+    ok(buttonVar.get("childNodes").target.querySelector(".value").className.contains("token-other"),
       "Should have the right token class for 'childNodes'.");
 
     is(buttonVar.get("onclick").target.querySelector(".name").getAttribute("value"), "onclick",
       "Should have the right property name for 'onclick'.");
     is(buttonVar.get("onclick").target.querySelector(".value").getAttribute("value"), "onclick(event)",
       "Should have the right property value for 'onclick'.");
-    ok(buttonVar.get("onclick").target.querySelector(".value").className.includes("token-other"),
+    ok(buttonVar.get("onclick").target.querySelector(".value").className.contains("token-other"),
       "Should have the right token class for 'onclick'.");
 
     is(documentVar.get("title").target.querySelector(".name").getAttribute("value"), "title",
       "Should have the right property name for 'title'.");
     is(documentVar.get("title").target.querySelector(".value").getAttribute("value"), "\"Debugger test page\"",
       "Should have the right property value for 'title'.");
-    ok(documentVar.get("title").target.querySelector(".value").className.includes("token-string"),
+    ok(documentVar.get("title").target.querySelector(".value").className.contains("token-string"),
       "Should have the right token class for 'title'.");
 
     is(documentVar.get("childNodes").target.querySelector(".name").getAttribute("value"), "childNodes",
       "Should have the right property name for 'childNodes'.");
     is(documentVar.get("childNodes").target.querySelector(".value").getAttribute("value"), "NodeList[3]",
       "Should have the right property value for 'childNodes'.");
-    ok(documentVar.get("childNodes").target.querySelector(".value").className.includes("token-other"),
+    ok(documentVar.get("childNodes").target.querySelector(".value").className.contains("token-other"),
       "Should have the right token class for 'childNodes'.");
 
     is(documentVar.get("onclick").target.querySelector(".name").getAttribute("value"), "onclick",
       "Should have the right property name for 'onclick'.");
     is(documentVar.get("onclick").target.querySelector(".value").getAttribute("value"), "null",
       "Should have the right property value for 'onclick'.");
-    ok(documentVar.get("onclick").target.querySelector(".value").className.includes("token-null"),
+    ok(documentVar.get("onclick").target.querySelector(".value").className.contains("token-null"),
       "Should have the right token class for 'onclick'.");
 
     let buttonProtoVar = buttonVar.get("__proto__");
     let buttonAsProtoProtoVar = buttonAsProtoVar.get("__proto__");
     let documentProtoVar = documentVar.get("__proto__");
 
     is(buttonProtoVar.target.querySelector(".name").getAttribute("value"), "__proto__",
       "Should have the right property name for '__proto__'.");
     is(buttonProtoVar.target.querySelector(".value").getAttribute("value"), "HTMLButtonElementPrototype",
       "Should have the right property value for '__proto__'.");
-    ok(buttonProtoVar.target.querySelector(".value").className.includes("token-other"),
+    ok(buttonProtoVar.target.querySelector(".value").className.contains("token-other"),
       "Should have the right token class for '__proto__'.");
 
     is(buttonAsProtoProtoVar.target.querySelector(".name").getAttribute("value"), "__proto__",
       "Should have the right property name for '__proto__'.");
     is(buttonAsProtoProtoVar.target.querySelector(".value").getAttribute("value"), "<button>",
       "Should have the right property value for '__proto__'.");
-    ok(buttonAsProtoProtoVar.target.querySelector(".value").className.includes("token-domnode"),
+    ok(buttonAsProtoProtoVar.target.querySelector(".value").className.contains("token-domnode"),
       "Should have the right token class for '__proto__'.");
 
     is(documentProtoVar.target.querySelector(".name").getAttribute("value"), "__proto__",
       "Should have the right property name for '__proto__'.");
     is(documentProtoVar.target.querySelector(".value").getAttribute("value"), "HTMLDocumentPrototype",
       "Should have the right property value for '__proto__'.");
-    ok(documentProtoVar.target.querySelector(".value").className.includes("token-other"),
+    ok(documentProtoVar.target.querySelector(".value").className.contains("token-other"),
       "Should have the right token class for '__proto__'.");
 
     is(buttonProtoVar.expanded, false,
       "The buttonProtoVar should not be expanded at this point.");
     is(buttonAsProtoProtoVar.expanded, false,
       "The buttonAsProtoProtoVar should not be expanded at this point.");
     is(documentProtoVar.expanded, false,
       "The documentProtoVar should not be expanded at this point.");
 
     waitForDebuggerEvents(gPanel, gDebugger.EVENTS.FETCHED_PROPERTIES, 3).then(() => {
       is(buttonAsProtoProtoVar.get("type").target.querySelector(".name").getAttribute("value"), "type",
         "Should have the right property name for 'type'.");
       is(buttonAsProtoProtoVar.get("type").target.querySelector(".value").getAttribute("value"), "\"submit\"",
         "Should have the right property value for 'type'.");
-      ok(buttonAsProtoProtoVar.get("type").target.querySelector(".value").className.includes("token-string"),
+      ok(buttonAsProtoProtoVar.get("type").target.querySelector(".value").className.contains("token-string"),
         "Should have the right token class for 'type'.");
 
       is(buttonAsProtoProtoVar.get("childNodes").target.querySelector(".name").getAttribute("value"), "childNodes",
         "Should have the right property name for 'childNodes'.");
       is(buttonAsProtoProtoVar.get("childNodes").target.querySelector(".value").getAttribute("value"), "NodeList[1]",
         "Should have the right property value for 'childNodes'.");
-      ok(buttonAsProtoProtoVar.get("childNodes").target.querySelector(".value").className.includes("token-other"),
+      ok(buttonAsProtoProtoVar.get("childNodes").target.querySelector(".value").className.contains("token-other"),
         "Should have the right token class for 'childNodes'.");
 
       is(buttonAsProtoProtoVar.get("onclick").target.querySelector(".name").getAttribute("value"), "onclick",
         "Should have the right property name for 'onclick'.");
       is(buttonAsProtoProtoVar.get("onclick").target.querySelector(".value").getAttribute("value"), "onclick(event)",
         "Should have the right property value for 'onclick'.");
-      ok(buttonAsProtoProtoVar.get("onclick").target.querySelector(".value").className.includes("token-other"),
+      ok(buttonAsProtoProtoVar.get("onclick").target.querySelector(".value").className.contains("token-other"),
         "Should have the right token class for 'onclick'.");
 
       let buttonProtoProtoVar = buttonProtoVar.get("__proto__");
       let buttonAsProtoProtoProtoVar = buttonAsProtoProtoVar.get("__proto__");
       let documentProtoProtoVar = documentProtoVar.get("__proto__");
 
       is(buttonProtoProtoVar.target.querySelector(".name").getAttribute("value"), "__proto__",
         "Should have the right property name for '__proto__'.");
       is(buttonProtoProtoVar.target.querySelector(".value").getAttribute("value"), "HTMLElementPrototype",
         "Should have the right property value for '__proto__'.");
-      ok(buttonProtoProtoVar.target.querySelector(".value").className.includes("token-other"),
+      ok(buttonProtoProtoVar.target.querySelector(".value").className.contains("token-other"),
         "Should have the right token class for '__proto__'.");
 
       is(buttonAsProtoProtoProtoVar.target.querySelector(".name").getAttribute("value"), "__proto__",
         "Should have the right property name for '__proto__'.");
       is(buttonAsProtoProtoProtoVar.target.querySelector(".value").getAttribute("value"), "HTMLButtonElementPrototype",
         "Should have the right property value for '__proto__'.");
-      ok(buttonAsProtoProtoProtoVar.target.querySelector(".value").className.includes("token-other"),
+      ok(buttonAsProtoProtoProtoVar.target.querySelector(".value").className.contains("token-other"),
         "Should have the right token class for '__proto__'.");
 
       is(documentProtoProtoVar.target.querySelector(".name").getAttribute("value"), "__proto__",
         "Should have the right property name for '__proto__'.");
       is(documentProtoProtoVar.target.querySelector(".value").getAttribute("value"), "DocumentPrototype",
         "Should have the right property value for '__proto__'.");
-      ok(documentProtoProtoVar.target.querySelector(".value").className.includes("token-other"),
+      ok(documentProtoProtoVar.target.querySelector(".value").className.contains("token-other"),
         "Should have the right token class for '__proto__'.")
 
       is(buttonAsProtoProtoProtoVar.expanded, false,
         "The buttonAsProtoProtoProtoVar should not be expanded at this point.");
       is(buttonAsProtoProtoProtoVar.expanded, false,
         "The buttonAsProtoProtoProtoVar should not be expanded at this point.");
       is(documentProtoProtoVar.expanded, false,
         "The documentProtoProtoVar should not be expanded at this point.");
--- a/browser/devtools/debugger/test/head.js
+++ b/browser/devtools/debugger/test/head.js
@@ -244,33 +244,33 @@ function waitForTime(aDelay) {
   return deferred.promise;
 }
 
 function waitForSourceShown(aPanel, aUrl) {
   return waitForDebuggerEvents(aPanel, aPanel.panelWin.EVENTS.SOURCE_SHOWN).then(aSource => {
     let sourceUrl = aSource.url || aSource.introductionUrl;
     info("Source shown: " + sourceUrl);
 
-    if (!sourceUrl.includes(aUrl)) {
+    if (!sourceUrl.contains(aUrl)) {
       return waitForSourceShown(aPanel, aUrl);
     } else {
       ok(true, "The correct source has been shown.");
     }
   });
 }
 
 function waitForEditorLocationSet(aPanel) {
   return waitForDebuggerEvents(aPanel, aPanel.panelWin.EVENTS.EDITOR_LOCATION_SET);
 }
 
 function ensureSourceIs(aPanel, aUrlOrSource, aWaitFlag = false) {
   let sources = aPanel.panelWin.DebuggerView.Sources;
 
   if (sources.selectedValue === aUrlOrSource ||
-      sources.selectedItem.attachment.source.url.includes(aUrlOrSource)) {
+      sources.selectedItem.attachment.source.url.contains(aUrlOrSource)) {
     ok(true, "Expected source is shown: " + aUrlOrSource);
     return promise.resolve(null);
   }
   if (aWaitFlag) {
     return waitForSourceShown(aPanel, aUrlOrSource);
   }
   ok(false, "Expected source was not already shown: " + aUrlOrSource);
   return promise.reject(null);
--- a/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js
+++ b/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js
@@ -109,17 +109,17 @@ function test() {
     for (let pool of client.__pools) {
       if (!pool.__poolMap) {
         continue;
       }
       for (let actor of pool.__poolMap.keys()) {
         // Bug 1056342: Profiler fails today because of framerate actor, but
         // this appears more complex to rework, so leave it for that bug to
         // resolve.
-        if (actor.includes("framerateActor")) {
+        if (actor.contains("framerateActor")) {
           todo(false, "Front for " + actor + " still held in pool!");
           continue;
         }
         ok(false, "Front for " + actor + " still held in pool!");
       }
     }
 
     gBrowser.removeCurrentTab();
--- a/browser/devtools/framework/test/browser_toolbox_window_shortcuts.js
+++ b/browser/devtools/framework/test/browser_toolbox_window_shortcuts.js
@@ -43,19 +43,19 @@ function testShortcuts(aToolbox, aIndex)
   toolbox = aToolbox;
   info("Toolbox fired a `ready` event");
 
   toolbox.once("select", selectCB);
 
   let key = gDevTools._tools.get(toolIDs[aIndex]).key;
   let toolModifiers = gDevTools._tools.get(toolIDs[aIndex]).modifiers;
   let modifiers = {
-    accelKey: toolModifiers.includes("accel"),
-    altKey: toolModifiers.includes("alt"),
-    shiftKey: toolModifiers.includes("shift"),
+    accelKey: toolModifiers.contains("accel"),
+    altKey: toolModifiers.contains("alt"),
+    shiftKey: toolModifiers.contains("shift"),
   };
   idIndex = aIndex;
   info("Testing shortcut for tool " + aIndex + ":" + toolIDs[aIndex] +
        " using key " + key);
   EventUtils.synthesizeKey(key, modifiers, toolbox.doc.defaultView.parent);
 }
 
 function selectCB(event, id) {
--- a/browser/devtools/inspector/test/browser_inspector_menu-02.js
+++ b/browser/devtools/inspector/test/browser_inspector_menu-02.js
@@ -211,17 +211,17 @@ add_task(function* () {
 
     let onNodeReselected = inspector.markup.once("reselectedonremoved");
     let menu = inspector.panelDoc.getElementById("node-menu-pasteouterhtml");
     dispatchCommandEvent(menu);
 
     info("Waiting for inspector selection to update");
     yield onNodeReselected;
 
-    ok(content.document.body.outerHTML.includes(clipboard.get()),
+    ok(content.document.body.outerHTML.contains(clipboard.get()),
        "Clipboard content was pasted into the node's outer HTML.");
     ok(!getNode(outerHTMLSelector, { expectNoMatch: true }),
       "The original node was removed.");
   }
 
   function* testPasteInnerHTMLMenu() {
     info("Testing that 'Paste Inner HTML' menu item works.");
     clipboard.set("this was pasted (innerHTML)");
--- a/browser/devtools/markupview/markup-view.js
+++ b/browser/devtools/markupview/markup-view.js
@@ -2189,18 +2189,18 @@ ElementEditor.prototype = {
     };
     this.template("attribute", data);
     var {attr, inner, name, val} = data;
 
     // Double quotes need to be handled specially to prevent DOMParser failing.
     // name="v"a"l"u"e" when editing -> name='v"a"l"u"e"'
     // name="v'a"l'u"e" when editing -> name="v'a&quot;l'u&quot;e"
     let editValueDisplayed = aAttr.value || "";
-    let hasDoubleQuote = editValueDisplayed.includes('"');
-    let hasSingleQuote = editValueDisplayed.includes("'");
+    let hasDoubleQuote = editValueDisplayed.contains('"');
+    let hasSingleQuote = editValueDisplayed.contains("'");
     let initial = aAttr.name + '="' + editValueDisplayed + '"';
 
     // Can't just wrap value with ' since the value contains both " and '.
     if (hasDoubleQuote && hasSingleQuote) {
         editValueDisplayed = editValueDisplayed.replace(/\"/g, "&quot;");
         initial = aAttr.name + '="' + editValueDisplayed + '"';
     }
 
--- a/browser/devtools/netmonitor/netmonitor-view.js
+++ b/browser/devtools/netmonitor/netmonitor-view.js
@@ -896,54 +896,54 @@ RequestsMenuView.prototype = Heritage.ex
    * Predicates used when filtering items.
    *
    * @param object aItem
    *        The filtered item.
    * @return boolean
    *         True if the item should be visible, false otherwise.
    */
   isHtml: function({ attachment: { mimeType } })
-    mimeType && mimeType.includes("/html"),
+    mimeType && mimeType.contains("/html"),
 
   isCss: function({ attachment: { mimeType } })
-    mimeType && mimeType.includes("/css"),
+    mimeType && mimeType.contains("/css"),
 
   isJs: function({ attachment: { mimeType } })
     mimeType && (
-      mimeType.includes("/ecmascript") ||
-      mimeType.includes("/javascript") ||
-      mimeType.includes("/x-javascript")),
+      mimeType.contains("/ecmascript") ||
+      mimeType.contains("/javascript") ||
+      mimeType.contains("/x-javascript")),
 
   isXHR: function({ attachment: { isXHR } })
     isXHR,
 
   isFont: function({ attachment: { url, mimeType } }) // Fonts are a mess.
     (mimeType && (
-      mimeType.includes("font/") ||
-      mimeType.includes("/font"))) ||
-    url.includes(".eot") ||
-    url.includes(".ttf") ||
-    url.includes(".otf") ||
-    url.includes(".woff"),
+      mimeType.contains("font/") ||
+      mimeType.contains("/font"))) ||
+    url.contains(".eot") ||
+    url.contains(".ttf") ||
+    url.contains(".otf") ||
+    url.contains(".woff"),
 
   isImage: function({ attachment: { mimeType } })
-    mimeType && mimeType.includes("image/"),
+    mimeType && mimeType.contains("image/"),
 
   isMedia: function({ attachment: { mimeType } }) // Not including images.
     mimeType && (
-      mimeType.includes("audio/") ||
-      mimeType.includes("video/") ||
-      mimeType.includes("model/")),
+      mimeType.contains("audio/") ||
+      mimeType.contains("video/") ||
+      mimeType.contains("model/")),
 
   isFlash: function({ attachment: { url, mimeType } }) // Flash is a mess.
     (mimeType && (
-      mimeType.includes("/x-flv") ||
-      mimeType.includes("/x-shockwave-flash"))) ||
-    url.includes(".swf") ||
-    url.includes(".flv"),
+      mimeType.contains("/x-flv") ||
+      mimeType.contains("/x-shockwave-flash"))) ||
+    url.contains(".swf") ||
+    url.contains(".flv"),
 
   isOther: function(e)
     !this.isHtml(e) && !this.isCss(e) && !this.isJs(e) && !this.isXHR(e) &&
     !this.isFont(e) && !this.isImage(e) && !this.isMedia(e) && !this.isFlash(e),
 
   /**
    * Predicates used when sorting items.
    *
@@ -1314,17 +1314,17 @@ RequestsMenuView.prototype = Heritage.ex
         node.setAttribute("value", text);
         node.setAttribute("tooltiptext", aValue);
         break;
       }
       case "responseContent": {
         let { mimeType } = aItem.attachment;
         let { text, encoding } = aValue.content;
 
-        if (mimeType.includes("image/")) {
+        if (mimeType.contains("image/")) {
           let responseBody = yield gNetwork.getString(text);
           let node = $(".requests-menu-icon", aItem.target);
           node.src = "data:" + mimeType + ";" + encoding + "," + responseBody;
           node.setAttribute("type", "thumbnail");
           node.removeAttribute("hidden");
 
           window.emit(EVENTS.RESPONSE_IMAGE_THUMBNAIL_DISPLAYED);
         }
@@ -1591,17 +1591,17 @@ RequestsMenuView.prototype = Heritage.ex
     if (!requestItem || !requestItem.attachment.responseContent) {
       return;
     }
 
     let hovered = requestItem.attachment;
     let { url } = hovered;
     let { mimeType, text, encoding } = hovered.responseContent.content;
 
-    if (mimeType && mimeType.includes("image/") && (
+    if (mimeType && mimeType.contains("image/") && (
       aTarget.classList.contains("requests-menu-icon") ||
       aTarget.classList.contains("requests-menu-file")))
     {
       return gNetwork.getString(text).then(aString => {
         let anchor = $(".requests-menu-icon", requestItem.target);
         let src = "data:" + mimeType + ";" + encoding + "," + aString;
         aTooltip.setImageContent(src, { maxDim: REQUESTS_TOOLTIP_IMAGE_MAX_DIM });
         return anchor;
@@ -1632,17 +1632,17 @@ RequestsMenuView.prototype = Heritage.ex
     copyUrlElement.hidden = !selectedItem;
 
     let copyAsCurlElement = $("#request-menu-context-copy-as-curl");
     copyAsCurlElement.hidden = !selectedItem || !selectedItem.attachment.responseContent;
 
     let copyImageAsDataUriElement = $("#request-menu-context-copy-image-as-data-uri");
     copyImageAsDataUriElement.hidden = !selectedItem ||
       !selectedItem.attachment.responseContent ||
-      !selectedItem.attachment.responseContent.content.mimeType.includes("image/");
+      !selectedItem.attachment.responseContent.content.mimeType.contains("image/");
 
     let separator = $("#request-menu-context-separator");
     separator.hidden = !selectedItem;
 
     let newTabElement = $("#request-menu-context-newtab");
     newTabElement.hidden = !selectedItem;
   },
 
@@ -2352,17 +2352,17 @@ NetworkDetailsView.prototype = {
     let contentTypeHeader = allHeaders.find(e => e.name.toLowerCase() == "content-type");
     let contentTypeLongString = contentTypeHeader ? contentTypeHeader.value : "";
     let postDataLongString = aPostDataResponse.postData.text;
 
     let postData = yield gNetwork.getString(postDataLongString);
     let contentType = yield gNetwork.getString(contentTypeLongString);
 
     // Handle query strings (e.g. "?foo=bar&baz=42").
-    if (contentType.includes("x-www-form-urlencoded")) {
+    if (contentType.contains("x-www-form-urlencoded")) {
       for (let section of postData.split(/\r\n|\r|\n/)) {
         // Before displaying it, make sure this section of the POST data
         // isn't a line containing upload stream headers.
         if (payloadHeaders.every(header => !section.startsWith(header.name))) {
           this._addParams(this._paramsFormData, section);
         }
       }
     }
@@ -2482,17 +2482,17 @@ NetworkDetailsView.prototype = {
         infoHeader.hidden = false;
 
         let editor = yield NetMonitorView.editor("#response-content-textarea");
         editor.setMode(Editor.modes.js);
         editor.setText(responseBody);
       }
     }
     // Handle images.
-    else if (mimeType.includes("image/")) {
+    else if (mimeType.contains("image/")) {
       $("#response-content-image-box").setAttribute("align", "center");
       $("#response-content-image-box").setAttribute("pack", "center");
       $("#response-content-image-box").hidden = false;
       $("#response-content-image").src =
         "data:" + mimeType + ";" + encoding + "," + responseBody;
 
       // Immediately display additional information about the image:
       // file name, mime type and encoding.
@@ -2515,17 +2515,17 @@ NetworkDetailsView.prototype = {
       $("#response-content-textarea-box").hidden = false;
       let editor = yield NetMonitorView.editor("#response-content-textarea");
       editor.setMode(Editor.modes.text);
       editor.setText(responseBody);
 
       // Maybe set a more appropriate mode in the Source Editor if possible,
       // but avoid doing this for very large files.
       if (responseBody.length < SOURCE_SYNTAX_HIGHLIGHT_MAX_FILE_SIZE) {
-        let mapping = Object.keys(CONTENT_MIME_TYPE_MAPPINGS).find(key => mimeType.includes(key));
+        let mapping = Object.keys(CONTENT_MIME_TYPE_MAPPINGS).find(key => mimeType.contains(key));
         if (mapping) {
           editor.setMode(CONTENT_MIME_TYPE_MAPPINGS[mapping]);
         }
       }
     }
 
     window.emit(EVENTS.RESPONSE_BODY_DISPLAYED);
   }),
--- a/browser/devtools/netmonitor/test/browser_net_post-data-01.js
+++ b/browser/devtools/netmonitor/test/browser_net_post-data-01.js
@@ -54,20 +54,20 @@ function test() {
         let tab = document.querySelectorAll("#details-pane tab")[2];
         let tabpanel = document.querySelectorAll("#details-pane tabpanel")[2];
 
         is(tab.getAttribute("selected"), "true",
           "The params tab in the network details pane should be selected.");
 
         function checkVisibility(aBox) {
           is(tabpanel.querySelector("#request-params-box")
-            .hasAttribute("hidden"), !aBox.includes("params"),
+            .hasAttribute("hidden"), !aBox.contains("params"),
             "The request params box doesn't have the indended visibility.");
           is(tabpanel.querySelector("#request-post-data-textarea-box")
-            .hasAttribute("hidden"), !aBox.includes("textarea"),
+            .hasAttribute("hidden"), !aBox.contains("textarea"),
             "The request post data textarea box doesn't have the indended visibility.");
         }
 
         is(tabpanel.querySelectorAll(".variables-view-scope").length, 2,
           "There should be 2 param scopes displayed in this tabpanel.");
         is(tabpanel.querySelectorAll(".variables-view-empty-notice").length, 0,
           "The empty notice should not be displayed in this tabpanel.");
 
@@ -122,29 +122,29 @@ function test() {
           is(tabpanel.querySelectorAll(".variables-view-variable").length, 3,
             "There should be 3 param values displayed in this tabpanel.");
           is(queryScope.querySelectorAll(".variables-view-variable").length, 3,
             "There should be 3 param values displayed in the query scope.");
           is(postScope.querySelectorAll(".variables-view-variable").length, 0,
             "There should be 0 param values displayed in the post scope.");
 
           return NetMonitorView.editor("#request-post-data-textarea").then((aEditor) => {
-            ok(aEditor.getText().includes("Content-Disposition: form-data; name=\"text\""),
+            ok(aEditor.getText().contains("Content-Disposition: form-data; name=\"text\""),
               "The text shown in the source editor is incorrect (1.1).");
-            ok(aEditor.getText().includes("Content-Disposition: form-data; name=\"email\""),
+            ok(aEditor.getText().contains("Content-Disposition: form-data; name=\"email\""),
               "The text shown in the source editor is incorrect (2.1).");
-            ok(aEditor.getText().includes("Content-Disposition: form-data; name=\"range\""),
+            ok(aEditor.getText().contains("Content-Disposition: form-data; name=\"range\""),
               "The text shown in the source editor is incorrect (3.1).");
-            ok(aEditor.getText().includes("Content-Disposition: form-data; name=\"Custom field\""),
+            ok(aEditor.getText().contains("Content-Disposition: form-data; name=\"Custom field\""),
               "The text shown in the source editor is incorrect (4.1).");
-            ok(aEditor.getText().includes("Some text..."),
+            ok(aEditor.getText().contains("Some text..."),
               "The text shown in the source editor is incorrect (2.2).");
-            ok(aEditor.getText().includes("42"),
+            ok(aEditor.getText().contains("42"),
               "The text shown in the source editor is incorrect (3.2).");
-            ok(aEditor.getText().includes("Extra data"),
+            ok(aEditor.getText().contains("Extra data"),
               "The text shown in the source editor is incorrect (4.2).");
             is(aEditor.getMode(), Editor.modes.text,
               "The mode active in the source editor is incorrect.");
           });
         }
       }
     });
 
--- a/browser/devtools/netmonitor/test/browser_net_simple-request-details.js
+++ b/browser/devtools/netmonitor/test/browser_net_simple-request-details.js
@@ -72,17 +72,17 @@ function test() {
       let responseScope = tabpanel.querySelectorAll(".variables-view-scope")[0];
       let requestScope = tabpanel.querySelectorAll(".variables-view-scope")[1];
 
       is(responseScope.querySelector(".name").getAttribute("value"),
         L10N.getStr("responseHeaders") + " (" +
         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").includes(
+      ok(requestScope.querySelector(".name").getAttribute("value").contains(
         L10N.getStr("requestHeaders") + " (0"),
         "The request headers scope doesn't have the correct title.");
       // Can't test for full request headers title because the size may
       // vary across platforms ("User-Agent" header differs). We're pretty
       // sure it's smaller than 1 MB though, so it starts with a 0.
 
       is(responseScope.querySelectorAll(".variables-view-variable .name")[0].getAttribute("value"),
         "Cache-Control", "The first response header name was incorrect.");
--- a/browser/devtools/netmonitor/test/sjs_content-type-test-server.sjs
+++ b/browser/devtools/netmonitor/test/sjs_content-type-test-server.sjs
@@ -2,18 +2,18 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const { classes: Cc, interfaces: Ci } = Components;
 
 function handleRequest(request, response) {
   response.processAsync();
 
   let params = request.queryString.split("&");
-  let format = (params.filter((s) => s.includes("fmt="))[0] || "").split("=")[1];
-  let status = (params.filter((s) => s.includes("sts="))[0] || "").split("=")[1] || 200;
+  let format = (params.filter((s) => s.contains("fmt="))[0] || "").split("=")[1];
+  let status = (params.filter((s) => s.contains("sts="))[0] || "").split("=")[1] || 200;
 
   let cachedCount = 0;
   let cacheExpire = 60; // seconds
 
   function setCacheHeaders() {
     if (status != 304) {
       response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
       response.setHeader("Pragma", "no-cache");
@@ -46,17 +46,17 @@ function handleRequest(request, response
         response.setStatusLine(request.httpVersion, status, "OK");
         response.setHeader("Content-Type", "text/xml; charset=utf-8", false);
         setCacheHeaders();
         response.write("<label value='greeting'>Hello XML!</label>");
         response.finish();
         break;
       }
       case "html": {
-        let content = params.filter((s) => s.includes("res="))[0].split("=")[1];
+        let content = params.filter((s) => s.contains("res="))[0].split("=")[1];
         response.setStatusLine(request.httpVersion, status, "OK");
         response.setHeader("Content-Type", "text/html; charset=utf-8", false);
         setCacheHeaders();
         response.write(content || "<p>Hello HTML!</p>");
         response.finish();
         break;
       }
       case "html-long": {
@@ -88,26 +88,26 @@ function handleRequest(request, response
         response.setStatusLine(request.httpVersion, status, "OK");
         response.setHeader("Content-Type", "application/json; charset=utf-8", false);
         setCacheHeaders();
         response.write("{ \"greeting\": \"Hello JSON!\" }");
         response.finish();
         break;
       }
       case "jsonp": {
-        let fun = params.filter((s) => s.includes("jsonp="))[0].split("=")[1];
+        let fun = params.filter((s) => s.contains("jsonp="))[0].split("=")[1];
         response.setStatusLine(request.httpVersion, status, "OK");
         response.setHeader("Content-Type", "text/json; charset=utf-8", false);
         setCacheHeaders();
         response.write(fun + "({ \"greeting\": \"Hello JSONP!\" })");
         response.finish();
         break;
       }
       case "jsonp2": {
-        let fun = params.filter((s) => s.includes("jsonp="))[0].split("=")[1];
+        let fun = params.filter((s) => s.contains("jsonp="))[0].split("=")[1];
         response.setStatusLine(request.httpVersion, status, "OK");
         response.setHeader("Content-Type", "text/json; charset=utf-8", false);
         setCacheHeaders();
         response.write(" " + fun + " ( { \"greeting\": \"Hello weird JSONP!\" } ) ; ");
         response.finish();
         break;
       }
       case "json-long": {
--- a/browser/devtools/netmonitor/test/sjs_sorting-test-server.sjs
+++ b/browser/devtools/netmonitor/test/sjs_sorting-test-server.sjs
@@ -2,17 +2,17 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const { classes: Cc, interfaces: Ci } = Components;
 
 function handleRequest(request, response) {
   response.processAsync();
 
   let params = request.queryString.split("&");
-  let index = params.filter((s) => s.includes("index="))[0].split("=")[1];
+  let index = params.filter((s) => s.contains("index="))[0].split("=")[1];
 
   let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
   timer.initWithCallback(() => {
     // to avoid garbage collection
     timer = null;
     response.setStatusLine(request.httpVersion, index == 1 ? 101 : index * 100, "Meh");
 
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
--- a/browser/devtools/netmonitor/test/sjs_status-codes-test-server.sjs
+++ b/browser/devtools/netmonitor/test/sjs_status-codes-test-server.sjs
@@ -2,17 +2,17 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const { classes: Cc, interfaces: Ci } = Components;
 
 function handleRequest(request, response) {
   response.processAsync();
 
   let params = request.queryString.split("&");
-  let status = params.filter((s) => s.includes("sts="))[0].split("=")[1];
+  let status = params.filter((s) => s.contains("sts="))[0].split("=")[1];
 
   let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
   timer.initWithCallback(() => {
     // to avoid garbage collection
     timer = null;
     switch (status) {
       case "100":
         response.setStatusLine(request.httpVersion, 101, "Switching Protocols");
--- a/browser/devtools/profiler/test/browser_profiler_tree-view-02.js
+++ b/browser/devtools/profiler/test/browser_profiler_tree-view-02.js
@@ -58,17 +58,17 @@ function test() {
   is($$perc(1).getAttribute("value"), "100%",
     "The .A node's percentage cell displays the correct value.");
   is($$sampl(1).getAttribute("value"), "4",
     "The .A node's samples cell displays the correct value.");
   is($$fun(".call-tree-name")[1].getAttribute("value"), "A",
     "The .A node's function cell displays the correct name.");
   is($$fun(".call-tree-url")[1].getAttribute("value"), "baz",
     "The .A node's function cell displays the correct url.");
-  ok($$fun(".call-tree-url")[1].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
+  ok($$fun(".call-tree-url")[1].getAttribute("tooltiptext").contains("http://foo/bar/baz"),
     "The .A node's function cell displays the correct url tooltiptext.");
   is($$fun(".call-tree-line")[1].getAttribute("value"), ":12",
     "The .A node's function cell displays the correct line.");
   is($$fun(".call-tree-host")[1].getAttribute("value"), "foo",
     "The .A node's function cell displays the correct host.");
   is($$fun(".call-tree-category")[1].getAttribute("value"), "Gecko",
     "The .A node's function cell displays the correct category.");
 
@@ -87,17 +87,17 @@ function test() {
   is($$perc(2).getAttribute("value"), "75%",
     "The .A.B node's percentage cell displays the correct value.");
   is($$sampl(2).getAttribute("value"), "3",
     "The .A.B node's samples cell displays the correct value.");
   is($$fun(".call-tree-name")[2].getAttribute("value"), "B",
     "The .A.B node's function cell displays the correct name.");
   is($$fun(".call-tree-url")[2].getAttribute("value"), "baz",
     "The .A.B node's function cell displays the correct url.");
-  ok($$fun(".call-tree-url")[2].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
+  ok($$fun(".call-tree-url")[2].getAttribute("tooltiptext").contains("http://foo/bar/baz"),
     "The .A.B node's function cell displays the correct url tooltiptext.");
   is($$fun(".call-tree-line")[2].getAttribute("value"), ":34",
     "The .A.B node's function cell displays the correct line.");
   is($$fun(".call-tree-host")[2].getAttribute("value"), "foo",
     "The .A.B node's function cell displays the correct host.");
   is($$fun(".call-tree-category")[2].getAttribute("value"), "Styles",
     "The .A.B node's function cell displays the correct category.");
 
@@ -106,17 +106,17 @@ function test() {
   is($$perc(3).getAttribute("value"), "25%",
     "The .A.E node's percentage cell displays the correct value.");
   is($$sampl(3).getAttribute("value"), "1",
     "The .A.E node's samples cell displays the correct value.");
   is($$fun(".call-tree-name")[3].getAttribute("value"), "E",
     "The .A.E node's function cell displays the correct name.");
   is($$fun(".call-tree-url")[3].getAttribute("value"), "baz",
     "The .A.E node's function cell displays the correct url.");
-  ok($$fun(".call-tree-url")[3].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
+  ok($$fun(".call-tree-url")[3].getAttribute("tooltiptext").contains("http://foo/bar/baz"),
     "The .A.E node's function cell displays the correct url tooltiptext.");
   is($$fun(".call-tree-line")[3].getAttribute("value"), ":90",
     "The .A.E node's function cell displays the correct line.");
   is($$fun(".call-tree-host")[3].getAttribute("value"), "foo",
     "The .A.E node's function cell displays the correct host.");
   is($$fun(".call-tree-category")[3].getAttribute("value"), "GC",
     "The .A.E node's function cell displays the correct category.");
 
--- a/browser/devtools/profiler/utils/tree-model.js
+++ b/browser/devtools/profiler/utils/tree-model.js
@@ -239,18 +239,18 @@ FrameNode.prototype = {
  * @param object frame
  *        The { category, location } properties of the frame.
  * @return boolean
  *         True if a content frame, false if a chrome frame.
  */
 function isContent({ category, location }) {
   // Only C++ stack frames have associated category information.
   return !category &&
-    !CHROME_SCHEMES.find(e => location.includes(e)) &&
-    CONTENT_SCHEMES.find(e => location.includes(e));
+    !CHROME_SCHEMES.find(e => location.contains(e)) &&
+    CONTENT_SCHEMES.find(e => location.contains(e));
 }
 
 /**
  * Helper for getting an nsIURL instance out of a string.
  */
 function nsIURL(url) {
   let cached = gNSURLStore.get(url);
   if (cached) {
--- a/browser/devtools/projecteditor/lib/editors.js
+++ b/browser/devtools/projecteditor/lib/editors.js
@@ -129,18 +129,18 @@ var TextEditor = Class({
     let extraKeys = {};
 
     // Copy all of the registered keys into extraKeys object, to notify CodeMirror
     // that it should be ignoring these keys
     [...this.projectEditorKeyset.querySelectorAll("key")].forEach((key) => {
       let keyUpper = key.getAttribute("key").toUpperCase();
       let toolModifiers = key.getAttribute("modifiers");
       let modifiers = {
-        alt: toolModifiers.includes("alt"),
-        shift: toolModifiers.includes("shift")
+        alt: toolModifiers.contains("alt"),
+        shift: toolModifiers.contains("shift")
       };
 
       // On the key press, we will dispatch the event within projecteditor.
       extraKeys[Editor.accel(keyUpper, modifiers)] = () => {
         let doc = this.projectEditorCommandset.ownerDocument;
         let event = doc.createEvent('Event');
         event.initEvent('command', true, true);
         let command = this.projectEditorCommandset.querySelector("#" + key.getAttribute("command"));
--- a/browser/devtools/scratchpad/test/browser_scratchpad_eval_func.js
+++ b/browser/devtools/scratchpad/test/browser_scratchpad_eval_func.js
@@ -73,14 +73,14 @@ function runTests(sw)
       sp.editor.setCursor({ line: 0, ch: 9 });
       return sp.evalTopLevelFunction();
     })
     .then(([text, error, result]) => {
       is(text, "function {}",
          "Should get the full text back since there was a parse error.");
       ok(!error, "Should not have got an error");
       ok(!result, "Should not have got a result");
-      ok(sp.getText().includes("SyntaxError"),
+      ok(sp.getText().contains("SyntaxError"),
          "We should have written the syntax error to the scratchpad.");
     })
 
     .then(finish, reportErrorAndQuit);
 }
--- a/browser/devtools/scratchpad/test/browser_scratchpad_pprint-02.js
+++ b/browser/devtools/scratchpad/test/browser_scratchpad_pprint-02.js
@@ -22,17 +22,17 @@ function runTests(sw)
   gTabsize = Services.prefs.getIntPref("devtools.editor.tabsize");
   Services.prefs.setIntPref("devtools.editor.tabsize", 6);
   const space = " ".repeat(6);
 
   const sp = sw.Scratchpad;
   sp.setText("function main() { console.log(5); }");
   sp.prettyPrint().then(() => {
     const prettyText = sp.getText();
-    ok(prettyText.includes(space));
+    ok(prettyText.contains(space));
     finish();
   }).then(null, error => {
     ok(false, error);
   });
 }
 
 registerCleanupFunction(function () {
   Services.prefs.setIntPref("devtools.editor.tabsize", gTabsize);
--- a/browser/devtools/scratchpad/test/browser_scratchpad_pprint.js
+++ b/browser/devtools/scratchpad/test/browser_scratchpad_pprint.js
@@ -16,14 +16,14 @@ function test()
 }
 
 function runTests(sw)
 {
   const sp = sw.Scratchpad;
   sp.setText("function main() { console.log(5); }");
   sp.prettyPrint().then(() => {
     const prettyText = sp.getText();
-    ok(prettyText.includes("\n"));
+    ok(prettyText.contains("\n"));
     finish();
   }).then(null, error => {
     ok(false, error);
   });
 }
--- a/browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js
+++ b/browser/devtools/shadereditor/test/browser_se_editors-error-gutter.js
@@ -97,19 +97,19 @@ function ifWebGLSupported() {
     is(parsed.length >= 1, bool,
       "There's " + (bool ? ">= 1" : "< 1") + " parsed vertex shader error(s).");
 
     if (bool) {
       is(parsed[0].line, line,
         "The correct line was parsed.");
       is(parsed[0].messages.length, 2,
         "There are 2 parsed messages.");
-      ok(parsed[0].messages[0].includes("'constructor' : too many arguments"),
+      ok(parsed[0].messages[0].contains("'constructor' : too many arguments"),
         "The correct first message was parsed.");
-      ok(parsed[0].messages[1].includes("'assign' : cannot convert from"),
+      ok(parsed[0].messages[1].contains("'assign' : cannot convert from"),
         "The correct second message was parsed.");
     }
   }
 
   function checkHasVertSecondError(bool, error) {
     ok(error, "Vertex shader compiled with errors.");
     isnot(error.link, "", "The linkage status should not be empty.");
 
@@ -125,17 +125,17 @@ function ifWebGLSupported() {
     is(parsed.length >= 2, bool,
       "There's " + (bool ? ">= 2" : "< 2") + " parsed vertex shader error(s).");
 
     if (bool) {
       is(parsed[1].line, line,
         "The correct line was parsed.");
       is(parsed[1].messages.length, 1,
         "There is 1 parsed message.");
-      ok(parsed[1].messages[0].includes("'assign' : cannot convert from"),
+      ok(parsed[1].messages[0].contains("'assign' : cannot convert from"),
         "The correct message was parsed.");
     }
   }
 
   function checkHasFragError(bool, error) {
     ok(error, "Fragment shader compiled with errors.");
     isnot(error.link, "", "The linkage status should not be empty.");
 
@@ -151,13 +151,13 @@ function ifWebGLSupported() {
     is(parsed.length >= 1, bool,
       "There's " + (bool ? ">= 2" : "< 1") + " parsed fragment shader error(s).");
 
     if (bool) {
       is(parsed[0].line, line,
         "The correct line was parsed.");
       is(parsed[0].messages.length, 1,
         "There is 1 parsed message.");
-      ok(parsed[0].messages[0].includes("'constructor' : too many arguments"),
+      ok(parsed[0].messages[0].contains("'constructor' : too many arguments"),
         "The correct message was parsed.");
     }
   }
 }
--- a/browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js
+++ b/browser/devtools/shadereditor/test/browser_se_editors-error-tooltip.js
@@ -37,27 +37,27 @@ function ifWebGLSupported() {
   ShadersEditorsView._onMarkerMouseOver(7, marker, parsed);
 
   let tooltip = marker._markerErrorsTooltip;
   ok(tooltip, "A tooltip was created successfully.");
 
   let content = tooltip.content;
   ok(tooltip.content,
     "Some tooltip's content was set.");
-  ok(tooltip.content.className.includes("devtools-tooltip-simple-text-container"),
+  ok(tooltip.content.className.contains("devtools-tooltip-simple-text-container"),
     "The tooltip's content container was created correctly.");
 
   let messages = content.childNodes;
   is(messages.length, 2,
     "There are two messages displayed in the tooltip.");
-  ok(messages[0].className.includes("devtools-tooltip-simple-text"),
+  ok(messages[0].className.contains("devtools-tooltip-simple-text"),
     "The first message was created correctly.");
-  ok(messages[1].className.includes("devtools-tooltip-simple-text"),
+  ok(messages[1].className.contains("devtools-tooltip-simple-text"),
     "The second message was created correctly.");
 
-  ok(messages[0].textContent.includes("'constructor' : too many arguments"),
+  ok(messages[0].textContent.contains("'constructor' : too many arguments"),
     "The first message contains the correct text.");
-  ok(messages[1].textContent.includes("'assign' : cannot convert"),
+  ok(messages[1].textContent.contains("'assign' : cannot convert"),
     "The second message contains the correct text.");
 
   yield teardown(panel);
   finish();
 }
--- a/browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js
+++ b/browser/devtools/shadereditor/test/browser_se_shaders-edit-02.js
@@ -32,33 +32,33 @@ function ifWebGLSupported() {
   ok(error,
     "The new vertex shader source was compiled with errors.");
   is(error.compile, "",
     "The compilation status should be empty.");
   isnot(error.link, "",
     "The linkage status should not be empty.");
   is(error.link.split("ERROR").length - 1, 2,
     "The linkage status contains two errors.");
-  ok(error.link.includes("ERROR: 0:8: 'constructor'"),
+  ok(error.link.contains("ERROR: 0:8: 'constructor'"),
     "A constructor error is contained in the linkage status.");
-  ok(error.link.includes("ERROR: 0:8: 'assign'"),
+  ok(error.link.contains("ERROR: 0:8: 'assign'"),
     "An assignment error is contained in the linkage status.");
 
   fsEditor.replaceText("vec4", { line: 2, ch: 14 }, { line: 2, ch: 18 });
   [, error] = yield onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
 
   ok(error,
     "The new fragment shader source was compiled with errors.");
   is(error.compile, "",
     "The compilation status should be empty.");
   isnot(error.link, "",
     "The linkage status should not be empty.");
   is(error.link.split("ERROR").length - 1, 1,
     "The linkage status contains one error.");
-  ok(error.link.includes("ERROR: 0:6: 'constructor'"),
+  ok(error.link.contains("ERROR: 0:6: 'constructor'"),
     "A constructor error is contained in the linkage status.");
 
   yield ensurePixelIs(gFront, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(gFront, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
 
   vsEditor.replaceText("vec4", { line: 7, ch: 22 }, { line: 7, ch: 26 });
   [, error] = yield onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
   ok(!error, "The new vertex shader source was compiled successfully.");
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-05.js
@@ -10,18 +10,18 @@ function ifWebGLSupported() {
   let { target, front } = yield initBackend(SIMPLE_CANVAS_URL);
   front.setup({ reload: true });
 
   let programActor = yield once(front, "program-linked");
   let vertexShader = yield programActor.getVertexShader();
   let fragmentShader = yield programActor.getFragmentShader();
 
   let vertSource = yield vertexShader.getText();
-  ok(vertSource.includes("gl_Position"),
+  ok(vertSource.contains("gl_Position"),
     "The correct vertex shader source was retrieved.");
 
   let fragSource = yield fragmentShader.getText();
-  ok(fragSource.includes("gl_FragColor"),
+  ok(fragSource.contains("gl_FragColor"),
     "The correct fragment shader source was retrieved.");
 
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-06.js
@@ -49,16 +49,16 @@ function ifWebGLSupported() {
       let newFragmentShader = yield programActor.getFragmentShader();
       is(vertexShader, newVertexShader,
         "The same vertex shader actor was retrieved.");
       is(fragmentShader, newFragmentShader,
         "The same fragment shader actor was retrieved.");
 
       let vertSource = yield newVertexShader.getText();
       let fragSource = yield newFragmentShader.getText();
-      ok(vertSource.includes("I'm special!") &&
-         fragSource.includes("I'm also special!"), aMessage);
+      ok(vertSource.contains("I'm special!") &&
+         fragSource.contains("I'm also special!"), aMessage);
     });
   }
 
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-07.js
@@ -14,48 +14,48 @@ function ifWebGLSupported() {
   let fragmentShader = yield programActor.getFragmentShader();
 
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 128, y: 128 }, { r: 191, g: 64, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
 
   let vertSource = yield vertexShader.getText();
   let fragSource = yield fragmentShader.getText();
-  ok(!vertSource.includes("2.0"),
+  ok(!vertSource.contains("2.0"),
     "The vertex shader source is correct before changing it.");
-  ok(!fragSource.includes("0.5"),
+  ok(!fragSource.contains("0.5"),
     "The fragment shader source is correct before changing it.");
 
   let newVertSource = vertSource.replace("1.0", "2.0");
   let status = yield vertexShader.compile(newVertSource);
   ok(!status,
     "The new vertex shader source was compiled without errors.");
 
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 0, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 128, y: 128 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 0, b: 0, a: 255 }, true);
 
   vertSource = yield vertexShader.getText();
   fragSource = yield fragmentShader.getText();
-  ok(vertSource.includes("2.0"),
+  ok(vertSource.contains("2.0"),
     "The vertex shader source is correct after changing it.");
-  ok(!fragSource.includes("0.5"),
+  ok(!fragSource.contains("0.5"),
     "The fragment shader source is correct after changing the vertex shader.");
 
   let newFragSource = fragSource.replace("1.0", "0.5");
   status = yield fragmentShader.compile(newFragSource);
   ok(!status,
     "The new fragment shader source was compiled without errors.");
 
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 0, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 128, y: 128 }, { r: 255, g: 0, b: 0, a: 127 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 0, b: 0, a: 255 }, true);
 
   vertSource = yield vertexShader.getText();
   fragSource = yield fragmentShader.getText();
-  ok(vertSource.includes("2.0"),
+  ok(vertSource.contains("2.0"),
     "The vertex shader source is correct after changing the fragment shader.");
-  ok(fragSource.includes("0.5"),
+  ok(fragSource.contains("0.5"),
     "The fragment shader source is correct after changing it.");
 
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-08.js
@@ -22,16 +22,16 @@ function ifWebGLSupported() {
 
   yield front.waitForFrame();
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 0, g: 0, b: 255, a: 255 }, true);
   yield ensurePixelIs(front, { x: 128, y: 128 }, { r: 0, g: 0, b: 255, a: 255 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 0, b: 255, a: 255 }, true);
 
   let vertSource = yield vertexShader.getText();
   let fragSource = yield fragmentShader.getText();
-  ok(vertSource.includes("vFragmentColor = vec3(0, 0, 1);"),
+  ok(vertSource.contains("vFragmentColor = vec3(0, 0, 1);"),
     "The vertex shader source is correct after changing it.");
-  ok(fragSource.includes("gl_FragColor = vec4(vFragmentColor, 1.0);"),
+  ok(fragSource.contains("gl_FragColor = vec4(vFragmentColor, 1.0);"),
     "The fragment shader source is correct after changing the vertex shader.");
 
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-09.js
@@ -24,28 +24,28 @@ function ifWebGLSupported() {
     ok(error,
       "The new vertex shader source was compiled with errors.");
     is(error.compile, "",
       "The compilation status should be empty.");
     isnot(error.link, "",
       "The linkage status should not be empty.");
     is(error.link.split("ERROR").length - 1, 2,
       "The linkage status contains two errors.");
-    ok(error.link.includes("ERROR: 0:8: 'constructor'"),
+    ok(error.link.contains("ERROR: 0:8: 'constructor'"),
       "A constructor error is contained in the linkage status.");
-    ok(error.link.includes("ERROR: 0:8: 'assign'"),
+    ok(error.link.contains("ERROR: 0:8: 'assign'"),
       "An assignment error is contained in the linkage status.");
   }
 
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
   ok(true, "The shader was reverted to the old source.");
 
   let vertSource = yield vertexShader.getText();
-  ok(vertSource.includes("vec4(aVertexPosition, 1.0);"),
+  ok(vertSource.contains("vec4(aVertexPosition, 1.0);"),
     "The previous correct vertex shader source was preserved.");
 
   let oldFragSource = yield fragmentShader.getText();
   let newFragSource = oldFragSource.replace("vec3", "vec4");
 
   try {
     yield fragmentShader.compile(newFragSource);
     ok(false, "Fragment shader was compiled with a defective source!");
@@ -53,26 +53,26 @@ function ifWebGLSupported() {
     ok(error,
       "The new fragment shader source was compiled with errors.");
     is(error.compile, "",
       "The compilation status should be empty.");
     isnot(error.link, "",
       "The linkage status should not be empty.");
     is(error.link.split("ERROR").length - 1, 1,
       "The linkage status contains one error.");
-    ok(error.link.includes("ERROR: 0:6: 'constructor'"),
+    ok(error.link.contains("ERROR: 0:6: 'constructor'"),
       "A constructor error is contained in the linkage status.");
   }
 
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
   ok(true, "The shader was reverted to the old source.");
 
   let fragSource = yield fragmentShader.getText();
-  ok(fragSource.includes("vec3 vFragmentColor;"),
+  ok(fragSource.contains("vec3 vFragmentColor;"),
     "The previous correct fragment shader source was preserved.");
 
   yield programActor.highlight([0, 1, 0, 1]);
   yield ensurePixelIs(front, { x: 0, y: 0 }, { r: 0, g: 0, b: 0, a: 255 }, true);
   yield ensurePixelIs(front, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
   ok(true, "Highlighting worked after setting a defective fragment source.");
 
   yield programActor.unhighlight();
--- a/browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js
+++ b/browser/devtools/shadereditor/test/browser_webgl-actor-test-12.js
@@ -12,16 +12,16 @@ function ifWebGLSupported() {
 
   let programActor = yield once(front, "program-linked");
   let vertexShader = yield programActor.getVertexShader();
   let fragmentShader = yield programActor.getFragmentShader();
 
   let vertSource = yield vertexShader.getText();
   let fragSource = yield fragmentShader.getText();
 
-  ok(vertSource.includes("I'm a vertex shader!"),
+  ok(vertSource.contains("I'm a vertex shader!"),
     "The correct vertex shader text was retrieved.");
-  ok(fragSource.includes("I'm a fragment shader!"),
+  ok(fragSource.contains("I'm a fragment shader!"),
     "The correct fragment shader text was retrieved.");
 
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/shared/Curl.jsm
+++ b/browser/devtools/shared/Curl.jsm
@@ -152,24 +152,24 @@ this.CurlUtils = {
    */
   isUrlEncodedRequest: function(aData) {
     let postDataText = aData.postDataText;
     if (!postDataText) {
       return false;
     }
 
     postDataText = postDataText.toLowerCase();
-    if (postDataText.includes("content-type: application/x-www-form-urlencoded")) {
+    if (postDataText.contains("content-type: application/x-www-form-urlencoded")) {
       return true;
     }
 
     let contentType = this.findHeader(aData.headers, "content-type");
 
     return (contentType &&
-      contentType.toLowerCase().includes("application/x-www-form-urlencoded"));
+      contentType.toLowerCase().contains("application/x-www-form-urlencoded"));
   },
 
   /**
    * Check if the request is a multipart request.
    *
    * @param object aData
    *        The data source.
    * @return boolean
@@ -177,24 +177,24 @@ this.CurlUtils = {
    */
   isMultipartRequest: function(aData) {
     let postDataText = aData.postDataText;
     if (!postDataText) {
       return false;
     }
 
     postDataText = postDataText.toLowerCase();
-    if (postDataText.includes("content-type: multipart/form-data")) {
+    if (postDataText.contains("content-type: multipart/form-data")) {
       return true;
     }
 
     let contentType = this.findHeader(aData.headers, "content-type");
 
     return (contentType &&
-      contentType.toLowerCase().includes("multipart/form-data;"));
+      contentType.toLowerCase().contains("multipart/form-data;"));
   },
 
   /**
    * Write out paramters from post data text.
    *
    * @param object aPostDataText
    *        Post data text.
    * @return string
@@ -273,18 +273,18 @@ this.CurlUtils = {
     let parts = aMultipartText.split(boundary);
     for (let part of parts) {
       // Each part is expected to have a content disposition line.
       let contentDispositionLine = part.trimLeft().split("\r\n")[0];
       if (!contentDispositionLine) {
         continue;
       }
       contentDispositionLine = contentDispositionLine.toLowerCase();
-      if (contentDispositionLine.includes("content-disposition: form-data")) {
-        if (contentDispositionLine.includes("filename=")) {
+      if (contentDispositionLine.contains("content-disposition: form-data")) {
+        if (contentDispositionLine.contains("filename=")) {
           // The header lines and the binary blob is separated by 2 CRLF's.
           // Add only the headers to the result.
           let headers = part.split("\r\n\r\n")[0];
           result += boundary + "\r\n" + headers + "\r\n\r\n";
         }
         else {
           result += boundary + "\r\n" + part;
         }
--- a/browser/devtools/shared/Parser.jsm
+++ b/browser/devtools/shared/Parser.jsm
@@ -322,17 +322,17 @@ SyntaxTree.prototype = {
 
     SyntaxTreeVisitor.walk(this.AST, {
       /**
        * Callback invoked for each function declaration node.
        * @param Node aNode
        */
       onFunctionDeclaration: function(aNode) {
         let functionName = aNode.id.name;
-        if (functionName.toLowerCase().includes(lowerCaseToken)) {
+        if (functionName.toLowerCase().contains(lowerCaseToken)) {
           store.push({
             functionName: functionName,
             functionLocation: ParserHelpers.getNodeLocation(aNode)
           });
         }
       },
 
       /**
@@ -350,18 +350,18 @@ SyntaxTree.prototype = {
         let inferredChain = inferredInfo.chain;
         let inferredLocation = inferredInfo.loc;
 
         // Current node may be part of a larger assignment expression stack.
         if (aNode._parent.type == "AssignmentExpression") {
           this.onFunctionExpression(aNode._parent);
         }
 
-        if ((functionName && functionName.toLowerCase().includes(lowerCaseToken)) ||
-            (inferredName && inferredName.toLowerCase().includes(lowerCaseToken))) {
+        if ((functionName && functionName.toLowerCase().contains(lowerCaseToken)) ||
+            (inferredName && inferredName.toLowerCase().contains(lowerCaseToken))) {
           store.push({
             functionName: functionName,
             functionLocation: functionLocation,
             inferredName: inferredName,
             inferredChain: inferredChain,
             inferredLocation: inferredLocation
           });
         }
@@ -378,17 +378,17 @@ SyntaxTree.prototype = {
         let inferredChain = inferredInfo.chain;
         let inferredLocation = inferredInfo.loc;
 
         // Current node may be part of a larger assignment expression stack.
         if (aNode._parent.type == "AssignmentExpression") {
           this.onFunctionExpression(aNode._parent);
         }
 
-        if (inferredName && inferredName.toLowerCase().includes(lowerCaseToken)) {
+        if (inferredName && inferredName.toLowerCase().contains(lowerCaseToken)) {
           store.push({
             inferredName: inferredName,
             inferredChain: inferredChain,
             inferredLocation: inferredLocation
           });
         }
       }
     });
--- a/browser/devtools/shared/autocomplete-popup.js
+++ b/browser/devtools/shared/autocomplete-popup.js
@@ -250,17 +250,17 @@ AutocompletePopup.prototype = {
 
   /**
    * Selects the first item of the richlistbox. Note that first item here is the
    * item closes to the input element, which means that 0th index if position is
    * below, and last index if position is above.
    */
   selectFirstItem: function AP_selectFirstItem()
   {
-    if (this.position.includes("before")) {
+    if (this.position.contains("before")) {
       this.selectedIndex = this.itemCount - 1;
     }
     else {
       this.selectedIndex = 0;
     }
     this._list.ensureIndexIsVisible(this._list.selectedIndex);
   },
 
--- a/browser/devtools/shared/test/browser_telemetry_button_paintflashing.js
+++ b/browser/devtools/shared/test/browser_telemetry_button_paintflashing.js
@@ -70,17 +70,17 @@ function delayedClicks(node, clicks) {
   return deferred.promise;
 }
 
 function checkResults(histIdFocus) {
   let result = Telemetry.prototype.telemetryInfo;
 
   for (let [histId, value] of Iterator(result)) {
     if (histId.startsWith("DEVTOOLS_INSPECTOR_") ||
-        !histId.includes(histIdFocus)) {
+        !histId.contains(histIdFocus)) {
       // Inspector stats are tested in
       // browser_telemetry_toolboxtabs_{toolname}.js so we skip them here
       // because we only open the inspector once for this test.
       continue;
     }
 
     if (histId.endsWith("OPENED_PER_USER_FLAG")) {
       ok(value.length === 1 && value[0] === true,
--- a/browser/devtools/shared/test/browser_telemetry_button_responsive.js
+++ b/browser/devtools/shared/test/browser_telemetry_button_responsive.js
@@ -70,17 +70,17 @@ function delayedClicks(node, clicks) {
   return deferred.promise;
 }
 
 function checkResults(histIdFocus) {
   let result = Telemetry.prototype.telemetryInfo;
 
   for (let [histId, value] of Iterator(result)) {
     if (histId.startsWith("DEVTOOLS_INSPECTOR_") ||
-        !histId.includes(histIdFocus)) {
+        !histId.contains(histIdFocus)) {
       // Inspector stats are tested in
       // browser_telemetry_toolboxtabs_{toolname}.js so we skip them here
       // because we only open the inspector once for this test.
       continue;
     }
 
     if (histId.endsWith("OPENED_PER_USER_FLAG")) {
       ok(value.length === 1 && value[0] === true,
--- a/browser/devtools/shared/test/browser_telemetry_button_scratchpad.js
+++ b/browser/devtools/shared/test/browser_telemetry_button_scratchpad.js
@@ -105,17 +105,17 @@ function delayedClicks(node, clicks) {
   return deferred.promise;
 }
 
 function checkResults(histIdFocus) {
   let result = Telemetry.prototype.telemetryInfo;
 
   for (let [histId, value] of Iterator(result)) {
     if (histId.startsWith("DEVTOOLS_INSPECTOR_") ||
-        !histId.includes(histIdFocus)) {
+        !histId.contains(histIdFocus)) {
       // Inspector stats are tested in
       // browser_telemetry_toolboxtabs_{toolname}.js so we skip them here
       // because we only open the inspector once for this test.
       continue;
     }
 
     if (histId.endsWith("OPENED_PER_USER_FLAG")) {
       ok(value.length === 1 && value[0] === true,
--- a/browser/devtools/shared/test/browser_telemetry_button_tilt.js
+++ b/browser/devtools/shared/test/browser_telemetry_button_tilt.js
@@ -70,17 +70,17 @@ function delayedClicks(node, clicks) {
   return deferred.promise;
 }
 
 function checkResults(histIdFocus) {
   let result = Telemetry.prototype.telemetryInfo;
 
   for (let [histId, value] of Iterator(result)) {
     if (histId.startsWith("DEVTOOLS_INSPECTOR_") ||
-        !histId.includes(histIdFocus)) {
+        !histId.contains(histIdFocus)) {
       // Inspector stats are tested in
       // browser_telemetry_toolboxtabs_{toolname}.js so we skip them here
       // because we only open the inspector once for this test.
       continue;
     }
 
     if (histId.endsWith("OPENED_PER_USER_FLAG")) {
       ok(value.length === 1 && value[0] === true,
--- a/browser/devtools/shared/widgets/SideMenuWidget.jsm
+++ b/browser/devtools/shared/widgets/SideMenuWidget.jsm
@@ -491,17 +491,17 @@ SideMenuGroup.prototype = {
    */
   findExpectedIndexForSelf: function(sortPredicate) {
     let identifier = this.identifier;
     let groupsArray = this._orderedGroupElementsArray;
 
     for (let group of groupsArray) {
       let name = group.getAttribute("name");
       if (sortPredicate(name, identifier) > 0 && // Insertion sort at its best :)
-          !name.includes(identifier)) { // Least significant group should be last.
+          !name.contains(identifier)) { // Least significant group should be last.
         return groupsArray.indexOf(group);
       }
     }
     return -1;
   },
 
   window: null,
   document: null,
--- a/browser/devtools/shared/widgets/VariablesView.jsm
+++ b/browser/devtools/shared/widgets/VariablesView.jsm
@@ -1152,17 +1152,17 @@ VariablesView.getterOrSetterEvalMacro = 
 
     default:
       // Wrap statements inside a function declaration if not already wrapped.
       if (!aCurrentString.startsWith("function")) {
         let header = "function(" + (type == "set" ? "value" : "") + ")";
         let body = "";
         // If there's a return statement explicitly written, always use the
         // standard function definition syntax
-        if (aCurrentString.includes("return ")) {
+        if (aCurrentString.contains("return ")) {
           body = "{" + aCurrentString + "}";
         }
         // If block syntax is used, use the whole string as the function body.
         else if (aCurrentString.startsWith("{")) {
           body = aCurrentString;
         }
         // Prefer an expression closure.
         else {
@@ -1911,18 +1911,18 @@ Scope.prototype = {
    */
   _performSearch: function(aLowerCaseQuery) {
     for (let [, variable] of this._store) {
       let currentObject = variable;
       let lowerCaseName = variable._nameString.toLowerCase();
       let lowerCaseValue = variable._valueString.toLowerCase();
 
       // Non-matched variables or properties require a corresponding attribute.
-      if (!lowerCaseName.includes(aLowerCaseQuery) &&
-          !lowerCaseValue.includes(aLowerCaseQuery)) {
+      if (!lowerCaseName.contains(aLowerCaseQuery) &&
+          !lowerCaseValue.contains(aLowerCaseQuery)) {
         variable._matched = false;
       }
       // Variable or property is matched.
       else {
         variable._matched = true;
 
         // If the variable was ever expanded, there's a possibility it may
         // contain some matched properties, so make sure they're visible
--- a/browser/devtools/sourceeditor/editor.js
+++ b/browser/devtools/sourceeditor/editor.js
@@ -1138,17 +1138,17 @@ function getCSSKeywords() {
   }
 
   let domUtils = Cc["@mozilla.org/inspector/dom-utils;1"]
                    .getService(Ci.inIDOMUtils);
   let cssProperties = domUtils.getCSSPropertyNames(domUtils.INCLUDE_ALIASES);
   let cssColors = {};
   let cssValues = {};
   cssProperties.forEach(property => {
-    if (property.includes("color")) {
+    if (property.contains("color")) {
       domUtils.getCSSValuesForProperty(property).forEach(value => {
         cssColors[value] = true;
       });
     }
     else {
       domUtils.getCSSValuesForProperty(property).forEach(value => {
         cssValues[value] = true;
       });
--- a/browser/devtools/storage/ui.js
+++ b/browser/devtools/storage/ui.js
@@ -443,18 +443,18 @@ StorageUI.prototype = {
       let kv = separators[i];
       for (let j = 0; j < separators.length; j++) {
         if (i == j) {
           continue;
         }
         let p = separators[j];
         let regex = new RegExp("^([^" + kv + p + "]*" + kv + "+[^" + kv + p +
                                "]*" + p + "*)+$", "g");
-        if (value.match(regex) && value.includes(kv) &&
-            (value.includes(p) || value.split(kv).length == 2)) {
+        if (value.match(regex) && value.contains(kv) &&
+            (value.contains(p) || value.split(kv).length == 2)) {
           return makeObject(kv, p);
         }
       }
     }
     // Testing for array
     for (let i = 0; i < separators.length; i++) {
       let p = separators[i];
       let regex = new RegExp("^[^" + p + "]+(" + p + "+[^" + p + "]*)+$", "g");
--- a/browser/devtools/styleeditor/test/head.js
+++ b/browser/devtools/styleeditor/test/head.js
@@ -137,17 +137,17 @@ function checkDiskCacheFor(host, done)
     onCacheStorageInfo: function(num, consumption)
     {
       info("disk storage contains " + num + " entries");
     },
     onCacheEntryInfo: function(uri)
     {
       var urispec = uri.asciiSpec;
       info(urispec);
-      foundPrivateData |= urispec.includes(host);
+      foundPrivateData |= urispec.contains(host);
     },
     onCacheEntryVisitCompleted: function()
     {
       is(foundPrivateData, false, "web content present in disk cache");
       done();
     }
   };
   function Visitor() {}
--- a/browser/devtools/styleinspector/css-parsing-utils.js
+++ b/browser/devtools/styleinspector/css-parsing-utils.js
@@ -7,18 +7,18 @@
 "use strict";
 
 const cssTokenizer  = require("devtools/sourceeditor/css-tokenizer");
 
 /**
  * Returns the string enclosed in quotes
  */
 function quoteString(string) {
-  let hasDoubleQuotes = string.includes('"');
-  let hasSingleQuotes = string.includes("'");
+  let hasDoubleQuotes = string.contains('"');
+  let hasSingleQuotes = string.contains("'");
 
   if (hasDoubleQuotes && !hasSingleQuotes) {
     // In this case, no escaping required, just enclose in single-quotes
     return "'" + string + "'";
   }
 
   // In all other cases, enclose in double-quotes, and escape any double-quote
   // that may be in the string
--- a/browser/devtools/webconsole/test/browser_bug_865871_variables_view_close_on_esc_key.js
+++ b/browser/devtools/webconsole/test/browser_bug_865871_variables_view_close_on_esc_key.js
@@ -21,17 +21,17 @@ function test()
 
     let msg = yield execute("fooObj");
     ok(msg, "output message found");
 
     let anchor = msg.querySelector("a");
     let body = msg.querySelector(".message-body");
     ok(anchor, "object anchor");
     ok(body, "message body");
-    ok(body.textContent.includes('testProp: "testValue"'), "message text check");
+    ok(body.textContent.contains('testProp: "testValue"'), "message text check");
 
     msg.scrollIntoView();
     executeSoon(() => {
       EventUtils.synthesizeMouse(anchor, 2, 2, {}, hud.iframeWindow);
     });
 
     let vviewVar = yield jsterm.once("variablesview-fetched");
     let vview = vviewVar._variablesView;
@@ -58,17 +58,17 @@ function test()
 
     msg = yield execute("window.location");
     ok(msg, "output message found");
 
     body = msg.querySelector(".message-body");
     ok(body, "message body");
     anchor = msg.querySelector("a");
     ok(anchor, "object anchor");
-    ok(body.textContent.includes("Location \u2192 http://example.com/browser/"),
+    ok(body.textContent.contains("Location \u2192 http://example.com/browser/"),
        "message text check");
 
     msg.scrollIntoView();
     executeSoon(() => {
       EventUtils.synthesizeMouse(anchor, 2, 2, {}, hud.iframeWindow)
     });
     vviewVar = yield jsterm.once("variablesview-fetched");
 
--- a/browser/devtools/webconsole/test/browser_bug_869003_inspect_cross_domain_object.js
+++ b/browser/devtools/webconsole/test/browser_bug_869003_inspect_cross_domain_object.js
@@ -47,17 +47,17 @@ function onConsoleMessage(aResults)
   let msg = [...aResults[0].matched][0];
   ok(msg, "message element");
 
   let body = msg.querySelector(".message-body");
   ok(body, "message body");
 
   let clickable = aResults[0].clickableElements[0];
   ok(clickable, "clickable object found");
-  ok(body.textContent.includes('{ hello: "world!",'), "message text check");
+  ok(body.textContent.contains('{ hello: "world!",'), "message text check");
 
   gJSTerm.once("variablesview-fetched", onObjFetch);
 
   EventUtils.synthesizeMouse(clickable, 2, 2, {}, gWebConsole.iframeWindow)
 }
 
 function onObjFetch(aEvent, aVar)
 {
--- a/browser/devtools/webconsole/test/browser_console_log_inspectable_object.js
+++ b/browser/devtools/webconsole/test/browser_console_log_inspectable_object.js
@@ -33,17 +33,17 @@ function performTest(hud)
     }],
   }).then(([result]) => {
     let msg = [...result.matched][0];
     ok(msg, "message element");
     let body = msg.querySelector(".message-body");
     ok(body, "message body");
     let clickable = result.clickableElements[0];
     ok(clickable, "the console.log() object anchor was found");
-    ok(body.textContent.includes('{ abba: "omgBug676722" }'),
+    ok(body.textContent.contains('{ abba: "omgBug676722" }'),
        "clickable node content is correct");
 
     hud.jsterm.once("variablesview-fetched",
       (aEvent, aVar) => {
         ok(aVar, "object inspector opened on click");
 
         findVariableViewProperties(aVar, [{
           name: "abba",
--- a/browser/devtools/webconsole/test/browser_console_variables_view.js
+++ b/browser/devtools/webconsole/test/browser_console_variables_view.js
@@ -23,17 +23,17 @@ function consoleOpened(hud)
   gWebConsole = hud;
   gJSTerm = hud.jsterm;
   gJSTerm.execute("fooObj", onExecuteFooObj);
 }
 
 function onExecuteFooObj(msg)
 {
   ok(msg, "output message found");
-  ok(msg.textContent.includes('{ testProp: "testValue" }'), "message text check");
+  ok(msg.textContent.contains('{ testProp: "testValue" }'), "message text check");
 
   let anchor = msg.querySelector("a");
   ok(anchor, "object link found");
 
   gJSTerm.once("variablesview-fetched", onFooObjFetch);
 
   executeSoon(() =>
     EventUtils.synthesizeMouse(anchor, 2, 2, {}, gWebConsole.iframeWindow)
--- a/browser/devtools/webconsole/test/browser_console_variables_view_while_debugging.js
+++ b/browser/devtools/webconsole/test/browser_console_variables_view_while_debugging.js
@@ -57,17 +57,17 @@ function onFramesAdded()
     )
   );
 }
 
 
 function onExecuteFooObj(msg)
 {
   ok(msg, "output message found");
-  ok(msg.textContent.includes('{ testProp2: "testValue2" }'), "message text check");
+  ok(msg.textContent.contains('{ testProp2: "testValue2" }'), "message text check");
 
   let anchor = msg.querySelector("a");
   ok(anchor, "object link found");
 
   gJSTerm.once("variablesview-fetched", onFooObjFetch);
 
   executeSoon(() => EventUtils.synthesizeMouse(anchor, 2, 2, {},
                                                gWebConsole.iframeWindow));
--- a/browser/devtools/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js
+++ b/browser/devtools/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js
@@ -52,17 +52,17 @@ function onFramesAdded()
   info("onFramesAdded");
 
   openConsole(null, () => gJSTerm.execute("fooObj", onExecuteFooObj));
 }
 
 function onExecuteFooObj(msg)
 {
   ok(msg, "output message found");
-  ok(msg.textContent.includes('{ testProp2: "testValue2" }'),
+  ok(msg.textContent.contains('{ testProp2: "testValue2" }'),
      "message text check");
 
   let anchor = msg.querySelector("a");
   ok(anchor, "object link found");
 
   gJSTerm.once("variablesview-fetched", onFooObjFetch);
 
   EventUtils.synthesizeMouse(anchor, 2, 2, {}, gWebConsole.iframeWindow);
--- a/browser/devtools/webconsole/test/browser_webconsole_column_numbers.js
+++ b/browser/devtools/webconsole/test/browser_webconsole_column_numbers.js
@@ -32,13 +32,13 @@ function consoleOpened(aHud) {
 
 function testLocationColumn() {
   let messages = hud.outputNode.children;
   let expected = ['10:6', '10:38', '11:8', '12:10', '13:8', '14:6'];
 
   for(let i = 0, len = messages.length; i < len; i++) {
     let msg = messages[i].textContent;
 
-    is(msg.includes(expected[i]), true, 'Found expected line:column of ' + expected[i]);
+    is(msg.contains(expected[i]), true, 'Found expected line:column of ' + expected[i]);
   }
 
   finishTest();
 }
--- a/browser/metro/base/content/bindings/urlbar.xml
+++ b/browser/metro/base/content/bindings/urlbar.xml
@@ -158,17 +158,17 @@
 
             // If the selection doesn't start at the beginning or doesn't span the full domain or
             // the URL bar is modified, nothing else to do here.
             if (this.selectionStart > 0 || this.valueIsTyped)
               return selectedVal;
 
             // The selection doesn't span the full domain if it doesn't contain a slash and is
             // followed by some character other than a slash.
-            if (!selectedVal.includes("/")) {
+            if (!selectedVal.contains("/")) {
               let remainder = inputVal.replace(selectedVal, "");
               if (remainder != "" && remainder[0] != "/")
                 return selectedVal;
             }
 
             let uriFixup = Cc["@mozilla.org/docshell/urifixup;1"].getService(Ci.nsIURIFixup);
 
             let uri;
--- a/browser/modules/Chat.jsm
+++ b/browser/modules/Chat.jsm
@@ -19,18 +19,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 function isWindowChromeless(win) {
   // XXX - stolen from browser-social.js, but there's no obvious place to
   // put this so it can be shared.
 
   // Is this a popup window that doesn't want chrome shown?
   let docElem = win.document.documentElement;
   // extrachrome is not restored during session restore, so we need
   // to check for the toolbar as well.
-  let chromeless = docElem.getAttribute("chromehidden").includes("extrachrome") ||
-                   docElem.getAttribute('chromehidden').includes("toolbar");
+  let chromeless = docElem.getAttribute("chromehidden").contains("extrachrome") ||
+                   docElem.getAttribute('chromehidden').contains("toolbar");
   return chromeless;
 }
 
 function isWindowGoodForChats(win) {
   return !win.closed &&
          !!win.document.getElementById("pinnedchats") &&
          !isWindowChromeless(win) &&
          !PrivateBrowsingUtils.isWindowPrivate(win);
--- a/browser/modules/UITour.jsm
+++ b/browser/modules/UITour.jsm
@@ -357,17 +357,17 @@ this.UITour = {
         if (!UITelemetry.enabled) {
           log.debug("registerPageID: Telemery disabled, not doing anything");
           break;
         }
 
         // We don't want to allow BrowserUITelemetry.BUCKET_SEPARATOR in the
         // pageID, as it could make parsing the telemetry bucket name difficult.
         if (typeof data.pageID != "string" ||
-            data.pageID.includes(BrowserUITelemetry.BUCKET_SEPARATOR)) {
+            data.pageID.contains(BrowserUITelemetry.BUCKET_SEPARATOR)) {
           log.warn("registerPageID: Invalid page ID specified");
           break;
         }
 
         this.addSeenPageID(data.pageID);
 
         // Store tabs and windows separately so we don't need to loop over all
         // tabs when a window is closed.
--- a/dom/base/test/csp/test_CSP_frameancestors.html
+++ b/dom/base/test/csp/test_CSP_frameancestors.html
@@ -68,17 +68,17 @@ examiner.prototype  = {
     try {
       asciiSpec = SpecialPowers.getPrivilegedProps(
                     SpecialPowers.do_QueryInterface(subject, "nsIURI"),
                     "asciiSpec");
 
       // skip checks on the test harness -- can't do this skipping for
       // cross-origin blocking since the observer doesn't get the URI.  This
       // can cause this test to over-succeed (but only in specific cases).
-      if (asciiSpec.includes("test_CSP_frameancestors.html")) {
+      if (asciiSpec.contains("test_CSP_frameancestors.html")) {
         return;
       }
     } catch (ex) {
       // was not an nsIURI, so it was probably a cross-origin report.
     }
 
 
     if (topic === "csp-on-violate-policy") {
--- a/dom/base/test/csp/test_connect-src.html
+++ b/dom/base/test/csp/test_connect-src.html
@@ -55,30 +55,30 @@ function examiner() {
   SpecialPowers.addObserver(this, "csp-on-violate-policy", false);
   SpecialPowers.addObserver(this, "specialpowers-http-notify-request", false);
 }
 examiner.prototype  = {
   observe: function(subject, topic, data) {
    if (topic === "specialpowers-http-notify-request") {
       // making sure we do not bubble a result for something other
       // then the request in question.
-      if (!data.includes("file_csp_testserver.sjs?foo")) {
+      if (!data.contains("file_csp_testserver.sjs?foo")) {
         return;
       }
       checkResult("allowed");
     }
 
     if (topic === "csp-on-violate-policy") {
       // making sure we do not bubble a result for something other
       // then the request in question.
       var asciiSpec = SpecialPowers.getPrivilegedProps(
                         SpecialPowers.do_QueryInterface(subject, "nsIURI"),
                         "asciiSpec");
 
-      if (!asciiSpec.includes("file_csp_testserver.sjs?foo")) {
+      if (!asciiSpec.contains("file_csp_testserver.sjs?foo")) {
         return;
       }
       checkResult("blocked");
     }
   },
   remove: function() {
     SpecialPowers.removeObserver(this, "csp-on-violate-policy");
     SpecialPowers.removeObserver(this, "specialpowers-http-notify-request");
--- a/dom/base/test/csp/test_form-action.html
+++ b/dom/base/test/csp/test_form-action.html
@@ -50,29 +50,29 @@ function examiner() {
   SpecialPowers.addObserver(this, "csp-on-violate-policy", false);
   SpecialPowers.addObserver(this, "specialpowers-http-notify-request", false);
 }
 examiner.prototype  = {
   observe: function(subject, topic, data) {
    if (topic === "specialpowers-http-notify-request") {
       // making sure we do not bubble a result for something other
       // then the request in question.
-      if (!data.includes("submit-form")) {
+      if (!data.contains("submit-form")) {
         return;
       }
       checkResult("allowed");
     }
 
     if (topic === "csp-on-violate-policy") {
       // making sure we do not bubble a result for something other
       // then the request in question.
       var asciiSpec = SpecialPowers.getPrivilegedProps(
                         SpecialPowers.do_QueryInterface(subject, "nsIURI"),
                         "asciiSpec");
-      if (!asciiSpec.includes("submit-form")) {
+      if (!asciiSpec.contains("submit-form")) {
         return;
       }
       checkResult("blocked");
     }
   },
   remove: function() {
     SpecialPowers.removeObserver(this, "csp-on-violate-policy");
     SpecialPowers.removeObserver(this, "specialpowers-http-notify-request");
--- a/dom/base/test/csp/test_leading_wildcard.html
+++ b/dom/base/test/csp/test_leading_wildcard.html
@@ -45,37 +45,37 @@ function examiner() {
   SpecialPowers.addObserver(this, "csp-on-violate-policy", false);
   SpecialPowers.addObserver(this, "specialpowers-http-notify-request", false);
 }
 examiner.prototype  = {
   observe: function(subject, topic, data) {
 
    // allowed requests
    if (topic === "specialpowers-http-notify-request") {
-      if (data.includes("leading_wildcard_allowed.js")) {
+      if (data.contains("leading_wildcard_allowed.js")) {
         ok (true, "CSP should allow file_leading_wildcard_allowed.js!");
         finishTest();
       }
-      if (data.includes("leading_wildcard_blocked.js")) {
+      if (data.contains("leading_wildcard_blocked.js")) {
         ok(false, "CSP should not allow file_leading_wildcard_blocked.js!");
         finishTest();
       }
     }
 
     // blocked requests
     if (topic === "csp-on-violate-policy") {
       var asciiSpec = SpecialPowers.getPrivilegedProps(
                         SpecialPowers.do_QueryInterface(subject, "nsIURI"),
                         "asciiSpec");
 
-      if (asciiSpec.includes("leading_wildcard_allowed.js")) {
+      if (asciiSpec.contains("leading_wildcard_allowed.js")) {
         ok (false, "CSP should not block file_leading_wildcard_allowed.js!");
         finishTest();
       }
-      if (asciiSpec.includes("leading_wildcard_blocked.js")) {
+      if (asciiSpec.contains("leading_wildcard_blocked.js")) {
         ok (true, "CSP should block file_leading_wildcard_blocked.js!");
         finishTest();
       }
     }
   },
   remove: function() {
     SpecialPowers.removeObserver(this, "csp-on-violate-policy");
     SpecialPowers.removeObserver(this, "specialpowers-http-notify-request");
--- a/dom/base/test/test_getFeature_with_perm.html
+++ b/dom/base/test/test_getFeature_with_perm.html
@@ -13,17 +13,17 @@ https://bugzilla.mozilla.org/show_bug.cg
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=983502">Mozilla Bug 983502</a>
 <script type="application/javascript">
 
 function testSupported() {
   var mem;
   navigator.getFeature("hardware.memory").then(function(mem) {
 
     var isLinux = (navigator.platform.indexOf('Linux') != -1);
-    var isAndroid = !!navigator.userAgent.includes("Android");
+    var isAndroid = !!navigator.userAgent.contains("Android");
     var isB2G = !isAndroid && /Mobile|Tablet/.test(navigator.userAgent);
 
     if (isLinux) {
       info("It is Linux version:");
     }
     if (isAndroid) {
       info("It is Android version");
     }
@@ -98,17 +98,17 @@ info("About to run " + tests.length + " 
 
 SpecialPowers.pushPermissions([
   {type: "feature-detection", allow: 1, context: document}
 ], function() {
   ok('getFeature' in navigator, "navigator.getFeature should exist");
   ok('hasFeature' in navigator, "navigator.hasFeature should exist");
   // B2G specific manifest features.
   // Touching navigator before pushPermissions makes it fail.
-  if (!navigator.userAgent.includes("Android") &&
+  if (!navigator.userAgent.contains("Android") &&
         /Mobile|Tablet/.test(navigator.userAgent)) {
     info("Adding B2G specific tests");
     tests.push(createManifestTest("manifest.chrome.navigation"));
     tests.push(createManifestTest("manifest.precompile"));
   }
   runNextTest();
   ok(true, "Test DONE");
 });
--- a/dom/base/test/test_hasFeature.html
+++ b/dom/base/test/test_hasFeature.html
@@ -18,17 +18,17 @@ function testAPIs() {
     try {
       return SpecialPowers.getBoolPref(name);
     } catch (e) {
       return false;
     }
   }
 
   var b2gOnly = (function() {
-    var isAndroid = !!navigator.userAgent.includes("Android");
+    var isAndroid = !!navigator.userAgent.contains("Android");
     var isB2g = !isAndroid && /Mobile|Tablet/.test(navigator.userAgent);
     return isB2g ? true : undefined;
   })();
 
   var APIEndPoints = [
     { name: "MozMobileNetworkInfo", enabled: pref("dom.mobileconnection.enabled") },
     // { name: "Navigator.mozBluetooth", enabled: b2gOnly }, // conditional on MOZ_B2G_BT, tricky to test
     { name: "Navigator.mozContacts", enabled: pref("dom.mozContacts.enabled") },
--- a/dom/bindings/test/test_sequence_detection.html
+++ b/dom/bindings/test/test_sequence_detection.html
@@ -20,26 +20,26 @@ https://bugzilla.mozilla.org/show_bug.cg
     var std_iterator = JS_HAS_SYMBOLS ? Symbol.iterator : "@@iterator";
     var nonIterableObject = {[std_iterator]: 5};
 
     try {
       testInterfaceJS.testSequenceOverload(nonIterableObject);
       ok(false, "Should have thrown in the overload case");  // see long comment above!
     } catch (e) {
       ise(e.name, "TypeError", "Should get a TypeError for the overload case");
-      ok(e.message.includes("not iterable"),
+      ok(e.message.contains("not iterable"),
          "Should have a message about being non-iterable in the overload case");
     }
 
     try {
       testInterfaceJS.testSequenceUnion(nonIterableObject);
       ok(false, "Should have thrown in the union case");
     } catch (e) {
       ise(e.name, "TypeError", "Should get a TypeError for the union case");
-      ok(e.message.includes("not iterable"),
+      ok(e.message.contains("not iterable"),
          "Should have a message about being non-iterable in the union case");
     }
 
     SimpleTest.finish();
   });
 
   </script>
 </head>
--- a/dom/canvas/test/test_drawWindow.html
+++ b/dom/canvas/test/test_drawWindow.html
@@ -33,17 +33,17 @@
     // page, which we expect to have transparency.
     runDrawWindowTests(document.getElementById("source").contentWindow,
                        0, true);
 
     // Run the tests on the same source document, but in a window opened
     // by window.open.  We do not expect this to have transparency...
     // except on B2G.  (This is *probably* a bug in B2G.)
     var isB2G = /Mobile|Tablet/.test(navigator.userAgent) &&
-                !navigator.userAgent.includes("Android");
+                !navigator.userAgent.contains("Android");
     runDrawWindowTests(sourceWindow, 0, isB2G);
 
     sourceWindow.close();
 
     SimpleTest.finish();
   }
 
   </script>
--- a/dom/canvas/test/webgl-mochitest/driver-info.js
+++ b/dom/canvas/test/webgl-mochitest/driver-info.js
@@ -123,23 +123,23 @@ DriverInfo = (function() {
   }
 
   try {
     var glVendor, glRenderer;
     [glVendor, glRenderer] = detectDriverInfo();
     info('GL vendor: ' + glVendor);
     info('GL renderer: ' + glRenderer);
 
-    if (glRenderer.includes('llvmpipe')) {
+    if (glRenderer.contains('llvmpipe')) {
       kDriver = DRIVER.MESA;
-    } else if (glRenderer.includes('Android Emulator')) {
+    } else if (glRenderer.contains('Android Emulator')) {
       kDriver = DRIVER.ANDROID_X86_EMULATOR;
-    } else if (glRenderer.includes('ANGLE')) {
+    } else if (glRenderer.contains('ANGLE')) {
       kDriver = DRIVER.ANGLE;
-    } else if (glVendor.includes('NVIDIA')) {
+    } else if (glVendor.contains('NVIDIA')) {
       kDriver = DRIVER.NVIDIA;
     }
   } catch (e) {
     // detectDriverInfo is fallible where WebGL fails.
   }
 
   if (kOS) {
     info('OS detected as: ' + kOS);
--- a/dom/manifest/ManifestProcessor.jsm
+++ b/dom/manifest/ManifestProcessor.jsm
@@ -274,17 +274,17 @@ this.ManifestProcessor.prototype.process
       /*
        * Implementation of HTML's link@size attribute checker
        */
       function isValidSizeValue(size) {
         if (anyRegEx.test(size)) {
           return true;
         }
         size = size.toLowerCase();
-        if (!size.includes('x') || size.indexOf('x') !== size.lastIndexOf('x')) {
+        if (!size.contains('x') || size.indexOf('x') !== size.lastIndexOf('x')) {
           return false;
         }
 
         //split left of x for width, after x for height
         const width = size.substring(0, size.indexOf('x'));
         const height = size.substring(size.indexOf('x') + 1, size.length);
         const isValid = !(height.startsWith('0') || width.startsWith('0') || !onlyDecimals.test(width + height));
         return isValid;
--- a/dom/media/tests/mochitest/identity/test_setIdentityProvider.html
+++ b/dom/media/tests/mochitest/identity/test_setIdentityProvider.html
@@ -78,31 +78,31 @@ function theTest() {
       ok(localEvents.peeridentity, "local got peer identity");
       ok(remoteEvents.peeridentity, "remote got peer identity");
       test.next();
     }
   ],
   [
     "OFFERS_AND_ANSWERS_INCLUDE_IDENTITY",
     function(test) {
-      ok(test.originalOffer.sdp.includes("a=identity"), "a=identity is in the offer SDP");
-      ok(test.originalAnswer.sdp.includes("a=identity"), "a=identity is in the answer SDP");
+      ok(test.originalOffer.sdp.contains("a=identity"), "a=identity is in the offer SDP");
+      ok(test.originalAnswer.sdp.contains("a=identity"), "a=identity is in the answer SDP");
       test.next();
     }
   ],
   [
     "DESCRIPTIONS_CONTAIN_IDENTITY",
     function(test) {
-      ok(test.pcLocal.localDescription.sdp.includes("a=identity"),
+      ok(test.pcLocal.localDescription.sdp.contains("a=identity"),
                          "a=identity is in the local copy of the offer");
-      ok(test.pcRemote.localDescription.sdp.includes("a=identity"),
+      ok(test.pcRemote.localDescription.sdp.contains("a=identity"),
                          "a=identity is in the remote copy of the offer");
-      ok(test.pcLocal.remoteDescription.sdp.includes("a=identity"),
+      ok(test.pcLocal.remoteDescription.sdp.contains("a=identity"),
                          "a=identity is in the local copy of the answer");
-      ok(test.pcRemote.remoteDescription.sdp.includes("a=identity"),
+      ok(test.pcRemote.remoteDescription.sdp.contains("a=identity"),
                          "a=identity is in the remote copy of the answer");
       test.next();
     }
   ]
   ]);
   test.run();
 }
 runNetworkTest(theTest);
--- a/dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html
+++ b/dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html
@@ -65,18 +65,18 @@ runNetworkTest(function () {
         ok(!test.pcLocal._pc.peerIdentity, 'local peerIdentity is not set');
         ok(!test.pcRemote._pc.peerIdentity, 'remote peerIdentity is not set');
         test.next();
       }
     ],
     [
       'ONLY_REMOTE_SDP_INCLUDES_IDENTITY_ASSERTION',
       function(test) {
-        ok(!test.originalOffer.sdp.includes('a=identity'), 'a=identity not contained in the offer SDP');
-        ok(test.originalAnswer.sdp.includes('a=identity'), 'a=identity is contained in the answer SDP');
+        ok(!test.originalOffer.sdp.contains('a=identity'), 'a=identity not contained in the offer SDP');
+        ok(test.originalAnswer.sdp.contains('a=identity'), 'a=identity is contained in the answer SDP');
         test.next();
       }
     ]
   ]);
   test.run();
 });
 
 </script>
--- a/dom/media/tests/mochitest/nonTrickleIce.js
+++ b/dom/media/tests/mochitest/nonTrickleIce.js
@@ -53,17 +53,17 @@ function makeOffererNonTrickle(chain) {
     ]
   ]);
   chain.insertAfter('PC_REMOTE_SANE_REMOTE_SDP', [
     ['PC_REMOTE_REQUIRE_REMOTE_SDP_CANDIDATES',
       function (test) {
         info("test.pcLocal.localDescription.sdp: " + JSON.stringify(test.pcLocal.localDescription.sdp));
         info("test._local_offer.sdp" + JSON.stringify(test._local_offer.sdp));
         ok(!test.localRequiresTrickleIce, "Local does NOT require trickle");
-        ok(test._local_offer.sdp.includes("a=candidate"), "offer has ICE candidates")
+        ok(test._local_offer.sdp.contains("a=candidate"), "offer has ICE candidates")
         // TODO check for a=end-of-candidates once implemented
         test.next();
       }
     ]
   ]);
 }
 
 function makeAnswererNonTrickle(chain) {
@@ -116,15 +116,15 @@ function makeAnswererNonTrickle(chain) {
     ]
   ]);
   chain.insertAfter('PC_LOCAL_SANE_REMOTE_SDP', [
     ['PC_LOCAL_REQUIRE_REMOTE_SDP_CANDIDATES',
       function (test) {
         info("test.pcRemote.localDescription.sdp: " + JSON.stringify(test.pcRemote.localDescription.sdp));
         info("test._remote_answer.sdp" + JSON.stringify(test._remote_answer.sdp));
         ok(!test.remoteRequiresTrickleIce, "Remote does NOT require trickle");
-        ok(test._remote_answer.sdp.includes("a=candidate"), "answer has ICE candidates")
+        ok(test._remote_answer.sdp.contains("a=candidate"), "answer has ICE candidates")
         // TODO check for a=end-of-candidates once implemented
         test.next();
       }
     ]
   ]);
 }
--- a/dom/media/tests/mochitest/pc.js
+++ b/dom/media/tests/mochitest/pc.js
@@ -870,21 +870,21 @@ PeerConnectionTest.prototype.teardown = 
  */
 PeerConnectionTest.prototype.iceCandidateHandler = function
 PCT_iceCandidateHandler(caller, candidate) {
   var self = this;
 
   info("Received: " + JSON.stringify(candidate) + " from " + caller);
 
   var target = null;
-  if (caller.includes("pcLocal")) {
+  if (caller.contains("pcLocal")) {
     if (self.pcRemote) {
       target = self.pcRemote;
     }
-  } else if (caller.includes("pcRemote")) {
+  } else if (caller.contains("pcRemote")) {
     if (self.pcLocal) {
       target = self.pcLocal;
     }
   } else {
     ok(false, "received event from unknown caller: " + caller);
     return;
   }
 
@@ -2371,61 +2371,61 @@ PeerConnectionWrapper.prototype = {
   verifySdp : function PCW_verifySdp(desc, expectedType, offerConstraintsList,
       offerOptions, trickleIceCallback) {
     info("Examining this SessionDescription: " + JSON.stringify(desc));
     info("offerConstraintsList: " + JSON.stringify(offerConstraintsList));
     info("offerOptions: " + JSON.stringify(offerOptions));
     ok(desc, "SessionDescription is not null");
     is(desc.type, expectedType, "SessionDescription type is " + expectedType);
     ok(desc.sdp.length > 10, "SessionDescription body length is plausible");
-    ok(desc.sdp.includes("a=ice-ufrag"), "ICE username is present in SDP");
-    ok(desc.sdp.includes("a=ice-pwd"), "ICE password is present in SDP");
-    ok(desc.sdp.includes("a=fingerprint"), "ICE fingerprint is present in SDP");
+    ok(desc.sdp.contains("a=ice-ufrag"), "ICE username is present in SDP");
+    ok(desc.sdp.contains("a=ice-pwd"), "ICE password is present in SDP");
+    ok(desc.sdp.contains("a=fingerprint"), "ICE fingerprint is present in SDP");
     //TODO: update this for loopback support bug 1027350
-    ok(!desc.sdp.includes(LOOPBACK_ADDR), "loopback interface is absent from SDP");
-    if (desc.sdp.includes("a=candidate")) {
+    ok(!desc.sdp.contains(LOOPBACK_ADDR), "loopback interface is absent from SDP");
+    if (desc.sdp.contains("a=candidate")) {
       ok(true, "at least one ICE candidate is present in SDP");
       trickleIceCallback(false);
     } else {
       info("No ICE candidate in SDP -> requiring trickle ICE");
       trickleIceCallback(true);
     }
     //TODO: how can we check for absence/presence of m=application?
 
     var audioTracks =
       this.countAudioTracksInMediaConstraint(offerConstraintsList) ||
       this.audioInOfferOptions(offerOptions);
 
     info("expected audio tracks: " + audioTracks);
     if (audioTracks == 0) {
-      ok(!desc.sdp.includes("m=audio"), "audio m-line is absent from SDP");
+      ok(!desc.sdp.contains("m=audio"), "audio m-line is absent from SDP");
     } else {
-      ok(desc.sdp.includes("m=audio"), "audio m-line is present in SDP");
-      ok(desc.sdp.includes("a=rtpmap:109 opus/48000/2"), "OPUS codec is present in SDP");
+      ok(desc.sdp.contains("m=audio"), "audio m-line is present in SDP");
+      ok(desc.sdp.contains("a=rtpmap:109 opus/48000/2"), "OPUS codec is present in SDP");
       //TODO: ideally the rtcp-mux should be for the m=audio, and not just
       //      anywhere in the SDP (JS SDP parser bug 1045429)
-      ok(desc.sdp.includes("a=rtcp-mux"), "RTCP Mux is offered in SDP");
+      ok(desc.sdp.contains("a=rtcp-mux"), "RTCP Mux is offered in SDP");
 
     }
 
     var videoTracks =
       this.countVideoTracksInMediaConstraint(offerConstraintsList) ||
       this.videoInOfferOptions(offerOptions);
 
     info("expected video tracks: " + videoTracks);
     if (videoTracks == 0) {
-      ok(!desc.sdp.includes("m=video"), "video m-line is absent from SDP");
+      ok(!desc.sdp.contains("m=video"), "video m-line is absent from SDP");
     } else {
-      ok(desc.sdp.includes("m=video"), "video m-line is present in SDP");
+      ok(desc.sdp.contains("m=video"), "video m-line is present in SDP");
       if (this.h264) {
-        ok(desc.sdp.includes("a=rtpmap:126 H264/90000"), "H.264 codec is present in SDP");
+        ok(desc.sdp.contains("a=rtpmap:126 H264/90000"), "H.264 codec is present in SDP");
       } else {
-        ok(desc.sdp.includes("a=rtpmap:120 VP8/90000"), "VP8 codec is present in SDP");
+        ok(desc.sdp.contains("a=rtpmap:120 VP8/90000"), "VP8 codec is present in SDP");
       }
-      ok(desc.sdp.includes("a=rtcp-mux"), "RTCP Mux is offered in SDP");
+      ok(desc.sdp.contains("a=rtcp-mux"), "RTCP Mux is offered in SDP");
     }
 
   },
 
   /**
    * Check that media flow is present on all media elements involved in this
    * test by waiting for confirmation that media flow is present.
    *
@@ -2651,17 +2651,17 @@ PeerConnectionWrapper.prototype = {
       offerConstraintsList, offerOptions, numDataTracks, answer) {
     var numIceConnections = 0;
     Object.keys(stats).forEach(function(key) {
       if ((stats[key].type === "candidatepair") && stats[key].selected) {
         numIceConnections += 1;
       }
     });
     info("ICE connections according to stats: " + numIceConnections);
-    if (answer.sdp.includes('a=group:BUNDLE')) {
+    if (answer.sdp.contains('a=group:BUNDLE')) {
       is(numIceConnections, 1, "stats reports exactly 1 ICE connection");
     } else {
       // This code assumes that no media sections have been rejected due to
       // codec mismatch or other unrecoverable negotiation failures.
       var numAudioTracks =
         this.countAudioTracksInMediaConstraint(offerConstraintsList) ||
         this.audioInOfferOptions(offerOptions);
 
--- a/dom/media/tests/mochitest/templates.js
+++ b/dom/media/tests/mochitest/templates.js
@@ -828,17 +828,17 @@ var commandsDataChannel = [
     }
   ],
   [
     'PC_LOCAL_CREATE_OFFER',
     function (test) {
       test.createOffer(test.pcLocal, function (offer) {
         is(test.pcLocal.signalingState, STABLE,
            "Local create offer does not change signaling state");
-        ok(offer.sdp.includes("m=application"),
+        ok(offer.sdp.contains("m=application"),
            "m=application is contained in the SDP");
         if (test.steeplechase) {
           send_message({"type": "offer",
                         "offer": test.originalOffer,
                         "offer_constraints": test.pcLocal.constraints,
                         "offer_options": test.pcLocal.offerOptions});
           test._local_offer = test.pcLocal._last_offer;
           test._offer_constraints = test.pcLocal.constraints;
@@ -912,17 +912,17 @@ var commandsDataChannel = [
     }
   ],
   [
     'PC_REMOTE_CREATE_ANSWER',
     function (test) {
       test.createAnswer(test.pcRemote, function (answer) {
         is(test.pcRemote.signalingState, HAVE_REMOTE_OFFER,
            "Remote createAnswer does not change signaling state");
-        ok(answer.sdp.includes("m=application"),
+        ok(answer.sdp.contains("m=application"),
            "m=application is contained in the SDP");
         if (test.steeplechase) {
           send_message({"type":"answer",
                         "answer": test.originalAnswer,
                         "answer_constraints": test.pcRemote.constraints});
           test._remote_answer = test.pcRemote._last_answer;
           test._answer_constraints = test.pcRemote.constraints;
         }
--- a/dom/media/tests/mochitest/test_dataChannel_noOffer.html
+++ b/dom/media/tests/mochitest/test_dataChannel_noOffer.html
@@ -16,17 +16,17 @@
 
   runNetworkTest(function () {
     var pc = new mozRTCPeerConnection();
 
     // necessary to circumvent bug 864109
     var options = { offerToReceiveAudio: true };
 
     pc.createOffer(function (offer) {
-      ok(!offer.sdp.includes("m=application"),
+      ok(!offer.sdp.contains("m=application"),
         "m=application is not contained in the SDP");
 
       networkTestFinished();
     }, generateErrorCallback(), options);
   });
 
 </script>
 </pre>
--- a/dom/media/tests/mochitest/test_peerConnection_bug1042791.html
+++ b/dom/media/tests/mochitest/test_peerConnection_bug1042791.html
@@ -23,19 +23,19 @@
     options.h264 = true;
     test = new PeerConnectionTest(options);
     test.setMediaConstraints([{video: true}], [{video: true}]);
     test.chain.removeAfter("PC_LOCAL_CREATE_OFFER");
 
     test.chain.append([[
       "PC_LOCAL_VERIFY_H264_OFFER",
       function (test) {
-        ok(!test.pcLocal._latest_offer.sdp.toLowerCase().includes("profile-level-id=0x42e0"),
+        ok(!test.pcLocal._latest_offer.sdp.toLowerCase().contains("profile-level-id=0x42e0"),
           "H264 offer does not contain profile-level-id=0x42e0");
-        ok(test.pcLocal._latest_offer.sdp.toLowerCase().includes("profile-level-id=42e0"),
+        ok(test.pcLocal._latest_offer.sdp.toLowerCase().contains("profile-level-id=42e0"),
           "H264 offer contains profile-level-id=42e0");
         test.next();
       }
     ]]);
 
     test.run();
   });
 </script>
--- a/dom/tests/browser/browser_bug1008941_dismissGeolocationHanger.js
+++ b/dom/tests/browser/browser_bug1008941_dismissGeolocationHanger.js
@@ -20,17 +20,17 @@ add_task(function testDismissHanger() {
   info("Panel is shown");
 
   // click outside the Geolocation hanger to dismiss it
   window.document.getElementById("nav-bar").click();
   info("Clicked outside the Geolocation panel to dismiss it");
 
   let result = gBrowser.getBrowserForTab(gBrowser.selectedTab)
                        .contentDocument.body.innerHTML;
-  ok(result.includes("location..."), "Location is not shared");
+  ok(result.contains("location..."), "Location is not shared");
 });
 
 add_task(function asyncCleanup() {
   // close the tab
   gBrowser.removeTab(gBrowser.selectedTab);
   info("Cleanup: Closed the tab");
 });
 
--- a/dom/tests/mochitest/general/test_donottrack.html
+++ b/dom/tests/mochitest/general/test_donottrack.html
@@ -26,17 +26,17 @@ function nextTest() {
     return;
   }
 
   tests[currentTestIdx]();
 }
 
 tests.push(function testDefaultValues() {
   // The default pref values depend on the OS it seems.
-  var isAndroid = !!navigator.userAgent.includes("Android");
+  var isAndroid = !!navigator.userAgent.contains("Android");
   var isB2G = !isAndroid && /Mobile|Tablet/.test(navigator.userAgent);
 
   is(SpecialPowers.getBoolPref(dntPref), false,
      'DNT should be disabled by default');
   is(navigator.doNotTrack, 'unspecified',
      'navigator.doNotTrack should initially be "unspecified".');
 
   nextTest();
--- a/dom/tests/mochitest/general/test_interfaces.html
+++ b/dom/tests/mochitest/general/test_interfaces.html
@@ -1388,19 +1388,19 @@ var interfaceNamesInGlobalScope =
 // IMPORTANT: Do not change this list without review from a DOM peer!
   ];
 // IMPORTANT: Do not change the list above without review from a DOM peer!
 
 function createInterfaceMap(isXBLScope) {
   var prefs = SpecialPowers.Services.prefs;
   var version = SpecialPowers.Cc["@mozilla.org/xre/app-info;1"].getService(SpecialPowers.Ci.nsIXULAppInfo).version;
   var isNightly = version.endsWith("a1");
-  var isRelease = !version.includes("a");
+  var isRelease = !version.contains("a");
   var isDesktop = !/Mobile|Tablet/.test(navigator.userAgent);
-  var isB2G = !isDesktop && !navigator.userAgent.includes("Android");
+  var isB2G = !isDesktop && !navigator.userAgent.contains("Android");
   var hasPermission = function (aPermissions) {
     var result = false;
     for (var p of aPermissions) {
       result = result || SpecialPowers.hasPermission(p, window.document);
     }
     return result;
   };
 
--- a/dom/workers/test/navigator_worker.js
+++ b/dom/workers/test/navigator_worker.js
@@ -14,17 +14,17 @@ var supportedProps = [
   "taintEnabled",
   "userAgent",
   "onLine",
   "language",
   "languages",
 ];
 
 var isDesktop = !/Mobile|Tablet/.test(navigator.userAgent);
-var isB2G = !isDesktop && !navigator.userAgent.includes("Android");
+var isB2G = !isDesktop && !navigator.userAgent.contains("Android");
 
 // Prepare the interface map showing if a propery should exist in this build.
 // For example, if interfaceMap[foo] = true means navigator.foo should exist.
 var interfaceMap = {};
 
 for (var prop of supportedProps) {
   if (typeof(prop) === "string") {
     interfaceMap[prop] = true;
--- a/dom/workers/test/test_worker_interfaces.js
+++ b/dom/workers/test/test_worker_interfaces.js
@@ -138,19 +138,19 @@ var interfaceNamesInGlobalScope =
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "WorkerNavigator",
 // IMPORTANT: Do not change this list without review from a DOM peer!
   ];
 // IMPORTANT: Do not change the list above without review from a DOM peer!
 
 function createInterfaceMap(prefMap, permissionMap, version, userAgent) {
   var isNightly = version.endsWith("a1");
-  var isRelease = !version.includes("a");
+  var isRelease = !version.contains("a");
   var isDesktop = !/Mobile|Tablet/.test(userAgent);
-  var isB2G = !isDesktop && !userAgent.includes("Android");
+  var isB2G = !isDesktop && !userAgent.contains("Android");
 
   var interfaceMap = {};
 
   function addInterfaces(interfaces)
   {
     for (var entry of interfaces) {
       if (typeof(entry) === "string") {
         interfaceMap[entry] = true;
--- a/dom/xul/test/test_import_xul_to_content.xul
+++ b/dom/xul/test/test_import_xul_to_content.xul
@@ -29,17 +29,17 @@
     var sawWarning = false;
     var msgs = Services.console.getMessageArray();
     for (var i = 0; i < msgs.length; i++) {
       var msg = msgs[i];
       if (!msg || !(msg instanceof Components.interfaces.nsIScriptError)) {
         continue;
       }
 
-      if (msg.category.includes("DOM") && msg.errorMessage.includes("Importing XUL")) {
+      if (msg.category.contains("DOM") && msg.errorMessage.contains("Importing XUL")) {
         sawWarning = true;
       }
     }
 
     ok(sawWarning == expected, "correct warning condition when " + when);
   }
 
   var browser = document.getElementById("browserelt");
--- a/js/src/jit-test/tests/baseline/bug842431-2.js
+++ b/js/src/jit-test/tests/baseline/bug842431-2.js
@@ -16,10 +16,10 @@ dbg.onDebuggerStatement = function handl
 	return {throw: 555};
     }
 };
 
 try {
     g.f();
     assertEq(0, 2);
 } catch(e) {
-    assertEq(e.toString().includes("555"), true);
+    assertEq(e.toString().contains("555"), true);
 }
--- a/js/src/jit-test/tests/baseline/bug842431-3.js
+++ b/js/src/jit-test/tests/baseline/bug842431-3.js
@@ -15,10 +15,10 @@ dbg.onExceptionUnwind = function(frame) 
 
     return {return: 11};
 };
 
 try {
     g.f();
     assertEq(0, 1);
 } catch(e) {
-    assertEq(e.toString().includes("321"), true);
+    assertEq(e.toString().contains("321"), true);
 }
--- a/js/src/jit-test/tests/baseline/bug892787-1.js
+++ b/js/src/jit-test/tests/baseline/bug892787-1.js
@@ -4,15 +4,15 @@ function f() {
     new Function.prototype
 }
 function g() {
     var count = 0;
     for (var i=0; i<3; i++) {
 	try {
             f();
 	} catch (e) {
-	    assertEq(e.message.includes("is not a constructor"), true);
+	    assertEq(e.message.contains("is not a constructor"), true);
 	    count++;
 	}
     }
     assertEq(count, 3);
 }
 g();
--- a/js/src/jit-test/tests/baseline/bug892787-2.js
+++ b/js/src/jit-test/tests/baseline/bug892787-2.js
@@ -22,15 +22,15 @@ function f(callee) {
     new callee;
 }
 function g() {
     var c = 0;
     for (var i=0; i<50; i++) {
 	try {
 	    f(funs[i % funs.length]);
 	} catch (e) {
-	    assertEq(e.message.includes("not a constructor"), true);
+	    assertEq(e.message.contains("not a constructor"), true);
 	    c++;
 	}
     }
     assertEq(c, 4);
 }
 g();
--- a/js/src/jit-test/tests/basic/bug1091757.js
+++ b/js/src/jit-test/tests/basic/bug1091757.js
@@ -2,10 +2,10 @@ try {
     (function() {
 	let a = 3;
 	let XY = XY;
 	return function() { return a; };
     })();
     assertEq(0, 1);
 } catch(e) {
     assertEq(e instanceof ReferenceError, true);
-    assertEq(e.message.includes("XY"), true);
+    assertEq(e.message.contains("XY"), true);
 }
--- a/js/src/jit-test/tests/basic/bug839420.js
+++ b/js/src/jit-test/tests/basic/bug839420.js
@@ -1,17 +1,17 @@
 function f() {
     var x = undefined;
     try {
 	[1, 2, 3].map(x);
 	assertEq(0, 1);
     } catch(e) {
-	assertEq(e.toString().includes("x is not"), true);
+	assertEq(e.toString().contains("x is not"), true);
     }
 
     try {
 	[1, 2, 3].filter(x, 1, 2);
 	assertEq(0, 1);
     } catch(e) {
-	assertEq(e.toString().includes("x is not"), true);
+	assertEq(e.toString().contains("x is not"), true);
     }
 }
 f();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/basic/string-contains.js
@@ -0,0 +1,46 @@
+assertEq("abc".contains("a"), true);
+assertEq("abc".contains("b"), true);
+assertEq("abc".contains("abc"), true);
+assertEq("abc".contains("bc"), true);
+assertEq("abc".contains("d"), false);
+assertEq("abc".contains("abcd"), false);
+assertEq("abc".contains("ac"), false);
+assertEq("abc".contains("abc", 0), true);
+assertEq("abc".contains("bc", 0), true);
+assertEq("abc".contains("de", 0), false);
+assertEq("abc".contains("bc", 1), true);
+assertEq("abc".contains("c", 1), true);
+assertEq("abc".contains("a", 1), false);
+assertEq("abc".contains("abc", 1), false);
+assertEq("abc".contains("c", 2), true);
+assertEq("abc".contains("d", 2), false);
+assertEq("abc".contains("dcd", 2), false);
+assertEq("abc".contains("a", 42), false);
+assertEq("abc".contains("a", Infinity), false);
+assertEq("abc".contains("ab", -43), true);
+assertEq("abc".contains("cd", -42), false);
+assertEq("abc".contains("ab", -Infinity), true);
+assertEq("abc".contains("cd", -Infinity), false);
+assertEq("abc".contains("ab", NaN), true);
+assertEq("abc".contains("cd", NaN), false);
+var myobj = {toString : (function () "abc"), contains : String.prototype.contains};
+assertEq(myobj.contains("abc"), true);
+assertEq(myobj.contains("cd"), false);
+var gotStr = false, gotPos = false;
+myobj = {toString : (function () {
+    assertEq(gotPos, false);
+    gotStr = true;
+    return "xyz";
+}),
+contains : String.prototype.contains};
+var idx = {valueOf : (function () {
+    assertEq(gotStr, true);
+    gotPos = true;
+    return 42;
+})};
+myobj.contains("elephant", idx);
+assertEq(gotPos, true);
+assertEq("xyzzy".contains("zy\0", 2), false);
+var dots = Array(10000).join('.');
+assertEq(dots.contains("\x01", 10000), false);
+assertEq(dots.contains("\0", 10000), false);
deleted file mode 100644
--- a/js/src/jit-test/tests/basic/string-includes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-assertEq("abc".includes("a"), true);
-assertEq("abc".includes("b"), true);
-assertEq("abc".includes("abc"), true);
-assertEq("abc".includes("bc"), true);
-assertEq("abc".includes("d"), false);
-assertEq("abc".includes("abcd"), false);
-assertEq("abc".includes("ac"), false);
-assertEq("abc".includes("abc", 0), true);
-assertEq("abc".includes("bc", 0), true);
-assertEq("abc".includes("de", 0), false);
-assertEq("abc".includes("bc", 1), true);
-assertEq("abc".includes("c", 1), true);
-assertEq("abc".includes("a", 1), false);
-assertEq("abc".includes("abc", 1), false);
-assertEq("abc".includes("c", 2), true);
-assertEq("abc".includes("d", 2), false);
-assertEq("abc".includes("dcd", 2), false);
-assertEq("abc".includes("a", 42), false);
-assertEq("abc".includes("a", Infinity), false);
-assertEq("abc".includes("ab", -43), true);
-assertEq("abc".includes("cd", -42), false);
-assertEq("abc".includes("ab", -Infinity), true);
-assertEq("abc".includes("cd", -Infinity), false);
-assertEq("abc".includes("ab", NaN), true);
-assertEq("abc".includes("cd", NaN), false);
-var myobj = {toString : (function () "abc"), includes : String.prototype.includes};
-assertEq(myobj.includes("abc"), true);
-assertEq(myobj.includes("cd"), false);
-var gotStr = false, gotPos = false;
-myobj = {toString : (function () {
-    assertEq(gotPos, false);
-    gotStr = true;
-    return "xyz";
-}),
-includes : String.prototype.includes};
-var idx = {valueOf : (function () {
-    assertEq(gotStr, true);
-    gotPos = true;
-    return 42;
-})};
-myobj.includes("elephant", idx);
-assertEq(gotPos, true);
-assertEq("xyzzy".includes("zy\0", 2), false);
-var dots = Array(10000).join('.');
-assertEq(dots.includes("\x01", 10000), false);
-assertEq(dots.includes("\0", 10000), false);
--- a/js/src/jit-test/tests/debug/Debugger-findScripts-18.js
+++ b/js/src/jit-test/tests/debug/Debugger-findScripts-18.js
@@ -37,10 +37,10 @@ assertEq(allScripts.indexOf(hw.script) !
 
 try {
   dbg.findScripts({ displayURL: 3 });
   // Should never get here because the above line should throw
   // JSMSG_UNEXPECTED_TYPE.
   assertEq(true, false);
 } catch(e) {
   assertEq(e.name, "TypeError");
-  assertEq(e.message.includes("displayURL"), true);
+  assertEq(e.message.contains("displayURL"), true);
 }
--- a/js/src/jit-test/tests/debug/Frame-eval-stack.js
+++ b/js/src/jit-test/tests/debug/Frame-eval-stack.js
@@ -9,11 +9,11 @@ dbg.onDebuggerStatement = function(frame
     frame = frame.older;
     g.trace = frame.older.eval("(new Error()).stack;").return;
 }
 g.f();
 
 assertEq(typeof g.trace, "string");
 
 var frames = g.trace.split("\n");
-assertEq(frames[0].includes("eval code"), true);
+assertEq(frames[0].contains("eval code"), true);
 assertEq(frames[1].startsWith("f@"), true);
 assertEq(frames[2].startsWith("@"), true);
--- a/js/src/jit-test/tests/generators/wrappers.js
+++ b/js/src/jit-test/tests/generators/wrappers.js
@@ -25,10 +25,10 @@ assertIteratorResult(it.next.call(g.it4)
 // StarGenerator.throw
 assertThrowsValue(() => it.throw.call(g.it4, 8), 8);
 
 // Other objects should throw.
 try {
     it.next.call([]);
     assertEq(0, 1);
 } catch (e) {
-    assertEq(e.toString().includes("called on incompatible Array"), true);
+    assertEq(e.toString().contains("called on incompatible Array"), true);
 }
--- a/js/src/jit-test/tests/ion/bug1060398.js
+++ b/js/src/jit-test/tests/ion/bug1060398.js
@@ -2,15 +2,15 @@ function test() {
     var c = 0;
     for (var i=0; i<20; i++) {
 	var arr = [1];
 	if (i > 5)
 	    Object.defineProperty(arr, "length", { writable: false, value: 4 });
 	try {
 	    arr.push(2);
 	} catch(e) {
-	    assertEq(e.toString().includes("length"), true);
+	    assertEq(e.toString().contains("length"), true);
 	    c++;
 	}
     }
     assertEq(c, 14);
 }
 test();
--- a/js/src/jit-test/tests/ion/bug870328.js
+++ b/js/src/jit-test/tests/ion/bug870328.js
@@ -1,7 +1,7 @@
 var g = newGlobal("same-compartment");
 try {
     evalcx("'use strict'; (function() { x = 33; })()", g);
     assertEq(0, 1);
 } catch(e) {
-    assertEq(e.toString().includes("variable x"), true);
+    assertEq(e.toString().contains("variable x"), true);
 }
--- a/js/src/jit-test/tests/ion/bug906284.js
+++ b/js/src/jit-test/tests/ion/bug906284.js
@@ -4,12 +4,12 @@ function f() {
 }
 var c = 0;
 for (var i=0; i<3; i++) {
     try {
 	new f();
 	assertEq(0, 1);
     } catch(e) {
 	c++;
-	assertEq(e.message.includes("undeclared variable"), true);
+	assertEq(e.message.contains("undeclared variable"), true);
     }
 }
 assertEq(c, 3);
--- a/js/src/jit-test/tests/ion/bug909997.js
+++ b/js/src/jit-test/tests/ion/bug909997.js
@@ -18,17 +18,17 @@ var method_D = function() {
 
 var func = [method_A, method_B, method_C, method_D]
 
 for (var n = 0; n < 4; ++n) {
     try {
 	setJitCompilerOption("baseline.enable", n & 1);
 	setJitCompilerOption("ion.enable", n & 2 ? 1: 0);
     } catch(e) {
-	if (e.toString().includes("on the stack"))
+	if (e.toString().contains("on the stack"))
 	    continue;
 	throw e;
     }
     var opt = getJitCompilerOptions();
     assertEq(opt["baseline.enable"], n & 1);
     assertEq(opt["ion.enable"], n & 2 ? 1 : 0);
     for (var i = 0; i < 1001; ++i)
         func[n]();
--- a/js/src/jit-test/tests/ion/bug945294.js
+++ b/js/src/jit-test/tests/ion/bug945294.js
@@ -12,11 +12,11 @@ arr[1] = new C;
 function f() {
     for (var i = 0; i < arr.length; i++)
         arr[i].dump();
 }
 
 try {
     f();
 } catch (exc) {
-    assertEq(exc.message.includes("is not a function"), true);
+    assertEq(exc.message.contains("is not a function"), true);
 }
 f();
--- a/js/src/jit-test/tests/latin1/decompiler.js
+++ b/js/src/jit-test/tests/latin1/decompiler.js
@@ -1,20 +1,20 @@
 // Latin1
 function f(someName) {
     someName();
 }
 try {
     f(3);
 } catch(e) {
-    assertEq(e.message.includes("someName"), true);
+    assertEq(e.message.contains("someName"), true);
 }
 
 // TwoByte
 function g(someName\u1200) {
     someName\u1200();
 }
 try {
     g(3);
 } catch(e) {
     // Note: string is deflated; don't check for the \u1200.
-    assertEq(e.message.includes("someName"), true);
+    assertEq(e.message.contains("someName"), true);
 }
--- a/js/src/jit-test/tests/latin1/function.js
+++ b/js/src/jit-test/tests/latin1/function.js
@@ -1,16 +1,16 @@
 function test() {
     var arg1TwoByte = "arg1\u1200";
     var arg2Latin1 = "arg2";
 
     var bodyLatin1 = "return arg2 * 3";
 
     var f = Function(arg1TwoByte, arg2Latin1, bodyLatin1);
     assertEq(f(10, 20), 60);
-    assertEq(f.toSource().includes("arg1\u1200, arg2"), true);
+    assertEq(f.toSource().contains("arg1\u1200, arg2"), true);
 
     var bodyTwoByte = "return arg1\u1200 + arg2;";
     f = Function(arg1TwoByte, arg2Latin1, bodyTwoByte);
     assertEq(f(30, 40), 70);
-    assertEq(f.toSource().includes("arg1\u1200, arg2"), true);
+    assertEq(f.toSource().contains("arg1\u1200, arg2"), true);
 }
 test();
--- a/js/src/jit-test/tests/latin1/indexOf.js
+++ b/js/src/jit-test/tests/latin1/indexOf.js
@@ -57,45 +57,45 @@ function testIndexOf() {
     // TwoByte + TwoByte
     assertEq(s3.indexOf("\u1123a4"), 11);
     assertEq(s3.indexOf("\u1123a4", 12), -1);
     assertEq(s3.indexOf("\u1123a\u1098"), -1);
     assertEq(s3.indexOf(s3), 0);
 }
 testIndexOf();
 
-function testincludes() {
+function testContains() {
     var s1 = toLatin1("abcdefgh123456defghi\u00EEj");
     var s2 = toLatin1("456defghi\u00EE");
 
     // Latin1 + Latin1
-    assertEq(s1.includes(s1), true);
-    assertEq(s1.includes(s2), true);
-    assertEq(s1.includes(s2, 12), false);
-    assertEq(s2.includes(s1), false);
+    assertEq(s1.contains(s1), true);
+    assertEq(s1.contains(s2), true);
+    assertEq(s1.contains(s2, 12), false);
+    assertEq(s2.contains(s1), false);
 
     // Latin1 + TwoByte
-    assertEq(s1.includes("abc\u1234"), false);
-    assertEq(s1.includes("def\u1234".substring(0, 3)), true);
-    assertEq(s1.includes("def\u1234".substring(0, 3), 9), true);
+    assertEq(s1.contains("abc\u1234"), false);
+    assertEq(s1.contains("def\u1234".substring(0, 3)), true);
+    assertEq(s1.contains("def\u1234".substring(0, 3), 9), true);
 
     // TwoByte + Latin1
     var s3 = "123456defg\u1123a456defghi\u00EEj";
     assertEq(isLatin1(s2), true);
-    assertEq(s3.includes(s2), true);
-    assertEq(s3.includes(s2, 13), false);
-    assertEq(s3.includes(toLatin1("defg8")), false);
+    assertEq(s3.contains(s2), true);
+    assertEq(s3.contains(s2, 13), false);
+    assertEq(s3.contains(toLatin1("defg8")), false);
 
     // TwoByte + TwoByte
-    assertEq(s3.includes("\u1123a4"), true);
-    assertEq(s3.includes("\u1123a4", 11), false);
-    assertEq(s3.includes("\u1123a\u1098"), false);
-    assertEq(s3.includes(s3), true);
+    assertEq(s3.contains("\u1123a4"), true);
+    assertEq(s3.contains("\u1123a4", 11), false);
+    assertEq(s3.contains("\u1123a\u1098"), false);
+    assertEq(s3.contains(s3), true);
 }
-testincludes();
+testContains();
 
 function testIndexOfBMH() {
     // BoyerMooreHorspool algorithm is used for large strings.
     var s = "012345678901234567890123456789".repeat(20);
     var text = s + "abcdefghijklmnopqrst\u00C1uvwxyz";
     text.indexOf("333");
 
     var textL1 = toLatin1(text);
--- a/js/src/jit-test/tests/latin1/json.js
+++ b/js/src/jit-test/tests/latin1/json.js
@@ -15,26 +15,26 @@ function testErrorPos() {
 
     // Latin1
     var s = '[1, \n2,';
     try {
 	JSON.parse(s);
 	assertEq(0, 1);
     } catch(e) {
 	assertEq(e instanceof SyntaxError, true);
-	assertEq(e.toString().includes("line 2 column 3"), true);
+	assertEq(e.toString().contains("line 2 column 3"), true);
     }
 
     s = '[1, "\u1300",\n2,';
     try {
 	JSON.parse(s);
 	assertEq(0, 1);
     } catch(e) {
 	assertEq(e instanceof SyntaxError, true);
-	assertEq(e.toString().includes("line 2 column 3"), true);
+	assertEq(e.toString().contains("line 2 column 3"), true);
     }
 }
 testErrorPos();
 
 function testEvalHack() {
     // Latin1
     var arr = eval("[1, 2, 3, \"abc\"]");
     assertEq(JSON.stringify(arr), '[1,2,3,"abc"]');
--- a/js/src/jit-test/tests/saved-stacks/evals.js
+++ b/js/src/jit-test/tests/saved-stacks/evals.js
@@ -1,38 +1,38 @@
 // Test that we can save stacks with direct and indirect eval calls.
 
 const directEval = (function iife() {
   return eval("(" + function evalFrame() {
     return saveStack();
   } + "())");
 }());
 
-assertEq(directEval.source.includes("> eval"), true);
+assertEq(directEval.source.contains("> eval"), true);
 assertEq(directEval.functionDisplayName, "evalFrame");
 
-assertEq(directEval.parent.source.includes("> eval"), true);
+assertEq(directEval.parent.source.contains("> eval"), true);
 
-assertEq(directEval.parent.parent.source.includes("> eval"), false);
+assertEq(directEval.parent.parent.source.contains("> eval"), false);
 assertEq(directEval.parent.parent.functionDisplayName, "iife");
 
-assertEq(directEval.parent.parent.parent.source.includes("> eval"), false);
+assertEq(directEval.parent.parent.parent.source.contains("> eval"), false);
 
 assertEq(directEval.parent.parent.parent.parent, null);
 
 const lave = eval;
 const indirectEval = (function iife() {
   return lave("(" + function evalFrame() {
     return saveStack();
   } + "())");
 }());
 
-assertEq(indirectEval.source.includes("> eval"), true);
+assertEq(indirectEval.source.contains("> eval"), true);
 assertEq(indirectEval.functionDisplayName, "evalFrame");
 
-assertEq(indirectEval.parent.source.includes("> eval"), true);
+assertEq(indirectEval.parent.source.contains("> eval"), true);
 
-assertEq(indirectEval.parent.parent.source.includes("> eval"), false);
+assertEq(indirectEval.parent.parent.source.contains("> eval"), false);
 assertEq(indirectEval.parent.parent.functionDisplayName, "iife");
 
-assertEq(indirectEval.parent.parent.parent.source.includes("> eval"), false);
+assertEq(indirectEval.parent.parent.parent.source.contains("> eval"), false);
 
 assertEq(indirectEval.parent.parent.parent.parent, null);
--- a/js/src/jit-test/tests/saved-stacks/stringify-with-self-hosted.js
+++ b/js/src/jit-test/tests/saved-stacks/stringify-with-self-hosted.js
@@ -1,8 +1,8 @@
 // Test that stringify'ing a saved frame with self-hosted parent frames doesn't
 // include the self-hosted parent frame in the output.
 
 const map = (function () {
   return [3].map(n => saveStack()).pop();
 }());
 
-assertEq(map.toString().includes("@self-hosted:"), false);
+assertEq(map.toString().contains("@self-hosted:"), false);
--- a/js/src/jit-test/tests/xdr/asm.js
+++ b/js/src/jit-test/tests/xdr/asm.js
@@ -9,11 +9,11 @@ var test = (function () {
     };
   };
   return f.toSource();
 })();
 
 try {
   evalWithCache(test, {});
 } catch (x) {
-  assertEq(x.message.includes("AsmJS"), true);
-  assertEq(x.message.includes("XDR"), true);
+  assertEq(x.message.contains("AsmJS"), true);
+  assertEq(x.message.contains("XDR"), true);
 }
--- a/js/src/js.msg
+++ b/js/src/js.msg
@@ -116,17 +116,16 @@ MSG_DEF(JSMSG_INVALID_DATE,            0
 MSG_DEF(JSMSG_BAD_TOISOSTRING_PROP,    0, JSEXN_TYPEERR, "toISOString property is not callable")
 
 // String
 MSG_DEF(JSMSG_BAD_URI,                 0, JSEXN_URIERR, "malformed URI sequence")
 MSG_DEF(JSMSG_INVALID_NORMALIZE_FORM,  0, JSEXN_RANGEERR, "form must be one of 'NFC', 'NFD', 'NFKC', or 'NFKD'")
 MSG_DEF(JSMSG_NEGATIVE_REPETITION_COUNT, 0, JSEXN_RANGEERR, "repeat count must be non-negative")
 MSG_DEF(JSMSG_NOT_A_CODEPOINT,         1, JSEXN_RANGEERR, "{0} is not a valid code point")
 MSG_DEF(JSMSG_RESULTING_STRING_TOO_LARGE, 0, JSEXN_RANGEERR, "repeat count must be less than infinity and not overflow maximum string size")
-MSG_DEF(JSMSG_DEPRECATED_STRING_CONTAINS, 0, JSEXN_NONE, "String.prototype.contains() is deprecated and will be removed in a future release; use String.prototype.includes() instead")
 
 // Number
 MSG_DEF(JSMSG_BAD_RADIX,               0, JSEXN_RANGEERR, "radix must be an integer at least 2 and no greater than 36")
 MSG_DEF(JSMSG_PRECISION_RANGE,         1, JSEXN_RANGEERR, "precision {0} out of range")
 
 // Function
 MSG_DEF(JSMSG_BAD_APPLY_ARGS,          1, JSEXN_TYPEERR, "second argument to Function.prototype.{0} must be an array")
 MSG_DEF(JSMSG_BAD_FORMAL,              0, JSEXN_SYNTAXERR, "malformed formal parameter")
--- a/js/src/jsstr.cpp
+++ b/js/src/jsstr.cpp
@@ -1506,19 +1506,19 @@ RopeMatch(JSContext *cx, JSRope *text, J
             *match = RopeMatchImpl<char16_t>(nogc, strings, pat->latin1Chars(nogc), patLen);
         else
             *match = RopeMatchImpl<char16_t>(nogc, strings, pat->twoByteChars(nogc), patLen);
     }
 
     return true;
 }
 
-/* ES6 20141014 draft 21.1.3.6. */
+/* ES6 20121026 draft 15.5.4.24. */
 static bool
-str_includes(JSContext *cx, unsigned argc, Value *vp)
+str_contains(JSContext *cx, unsigned argc, Value *vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 
     // Steps 1, 2, and 3
     RootedString str(cx, ThisToStringForStringProto(cx, args));
     if (!str)
         return false;
 
@@ -1551,29 +1551,16 @@ str_includes(JSContext *cx, unsigned arg
     JSLinearString *text = str->ensureLinear(cx);
     if (!text)
         return false;
 
     args.rval().setBoolean(StringMatch(text, searchStr, start) != -1);
     return true;
 }
 
-/* TODO: remove String.prototype.contains (bug 1103588) */
-static bool
-str_contains(JSContext *cx, unsigned argc, Value *vp)
-{
-#ifndef RELEASE_BUILD
-    CallArgs args = CallArgsFromVp(argc, vp);
-    RootedObject callee(cx, &args.callee());
-    if (!GlobalObject::warnOnceAboutStringContains(cx, callee))
-        return false;
-#endif
-    return str_includes(cx, argc, vp);
-}
-
 /* ES6 20120927 draft 15.5.4.7. */
 bool
 js::str_indexOf(JSContext *cx, unsigned argc, Value *vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 
     // Steps 1, 2, and 3
     RootedString str(cx, ThisToStringForStringProto(cx, args));
@@ -3953,17 +3940,16 @@ static const JSFunctionSpec string_metho
     JS_FN(js_toString_str,     js_str_toString,       0,0),
     JS_FN(js_valueOf_str,      js_str_toString,       0,0),
     JS_FN("toLowerCase",       str_toLowerCase,       0,JSFUN_GENERIC_NATIVE),
     JS_FN("toUpperCase",       str_toUpperCase,       0,JSFUN_GENERIC_NATIVE),
     JS_FN("charAt",            js_str_charAt,         1,JSFUN_GENERIC_NATIVE),
     JS_FN("charCodeAt",        js_str_charCodeAt,     1,JSFUN_GENERIC_NATIVE),
     JS_SELF_HOSTED_FN("substring", "String_substring", 2,0),
     JS_SELF_HOSTED_FN("codePointAt", "String_codePointAt", 1,0),
-    JS_FN("includes",          str_includes,          1,JSFUN_GENERIC_NATIVE),
     JS_FN("contains",          str_contains,          1,JSFUN_GENERIC_NATIVE),
     JS_FN("indexOf",           str_indexOf,           1,JSFUN_GENERIC_NATIVE),
     JS_FN("lastIndexOf",       str_lastIndexOf,       1,JSFUN_GENERIC_NATIVE),
     JS_FN("startsWith",        str_startsWith,        1,JSFUN_GENERIC_NATIVE),
     JS_FN("endsWith",          str_endsWith,          1,JSFUN_GENERIC_NATIVE),
     JS_FN("trim",              str_trim,              0,JSFUN_GENERIC_NATIVE),
     JS_FN("trimLeft",          str_trimLeft,          0,JSFUN_GENERIC_NATIVE),
     JS_FN("trimRight",         str_trimRight,         0,JSFUN_GENERIC_NATIVE),
--- a/js/src/tests/ecma_5/extensions/strict-function-toSource.js
+++ b/js/src/tests/ecma_5/extensions/strict-function-toSource.js
@@ -6,12 +6,12 @@
 options("strict_mode");
 function testRunOptionStrictMode(str, arg, result) {
     var strict_inner = new Function('return typeof this == "undefined";');
     return strict_inner;
 }
 assertEq(eval(uneval(testRunOptionStrictMode()))(), true);
 
 if (typeof decompileBody !== "undefined") {
-    assertEq(decompileBody(new Function('x', 'return x*2;')).includes('\n"use strict"'), true);
+    assertEq(decompileBody(new Function('x', 'return x*2;')).contains('\n"use strict"'), true);
 }
 
 reportCompare(true, true);
--- a/js/src/vm/GlobalObject.h
+++ b/js/src/vm/GlobalObject.h
@@ -101,17 +101,16 @@ class GlobalObject : public NativeObject
     static const unsigned WARNED_WATCH_DEPRECATED = REGEXP_STATICS + 1;
     static const unsigned WARNED_PROTO_SETTING_SLOW = WARNED_WATCH_DEPRECATED + 1;
     static const unsigned RUNTIME_CODEGEN_ENABLED = WARNED_PROTO_SETTING_SLOW + 1;
     static const unsigned DEBUGGERS               = RUNTIME_CODEGEN_ENABLED + 1;
     static const unsigned INTRINSICS              = DEBUGGERS + 1;
     static const unsigned FLOAT32X4_TYPE_DESCR   = INTRINSICS + 1;
     static const unsigned INT32X4_TYPE_DESCR     = FLOAT32X4_TYPE_DESCR + 1;
     static const unsigned FOR_OF_PIC_CHAIN        = INT32X4_TYPE_DESCR + 1;
-    static const unsigned WARNED_STRING_CONTAINS_DEPRECATED = INT32X4_TYPE_DESCR + 1;
 
     /* Total reserved-slot count for global objects. */
     static const unsigned RESERVED_SLOTS = FOR_OF_PIC_CHAIN + 1;
 
     /*
      * The slot count must be in the public API for JSCLASS_GLOBAL_FLAGS, and
      * we won't expose GlobalObject, so just assert that the two values are
      * synchronized.
@@ -607,21 +606,16 @@ class GlobalObject : public NativeObject
     }
 
     // Warn about use of the given __proto__ setter to attempt to mutate an
     // object's [[Prototype]], if no prior warning was given.
     static bool warnOnceAboutPrototypeMutation(JSContext *cx, HandleObject protoSetter) {
         return warnOnceAbout(cx, protoSetter, WARNED_PROTO_SETTING_SLOW, JSMSG_PROTO_SETTING_SLOW);
     }
 
-    // Warn about use of the deprecated String.prototype.contains method
-    static bool warnOnceAboutStringContains(JSContext *cx, HandleObject strContains) {
-        return warnOnceAbout(cx, strContains, WARNED_STRING_CONTAINS_DEPRECATED, JSMSG_DEPRECATED_STRING_CONTAINS);
-    }
-
     static bool getOrCreateEval(JSContext *cx, Handle<GlobalObject*> global,
                                 MutableHandleObject eval);
 
     // Infallibly test whether the given value is the eval function for this global.
     bool valueIsEval(Value val);
 
     // Implemented in jsiter.cpp.
     static bool initIteratorClasses(JSContext *cx, Handle<GlobalObject*> global);
--- a/js/src/vm/Xdr.h
+++ b/js/src/vm/Xdr.h
@@ -30,26 +30,26 @@ namespace js {
  *  https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/Bytecode
  *
  * === GREETINGS, FELLOW SUBTRAHEND INCREMENTER! ===
  * For the time being, please increment the subtrahend by 2 each time it
  * changes, because we have two flavors of bytecode: with JSOP_SYMBOL (in
  * Nightly) and without (all others).  FIXME: Bug 1066322 - Enable ES6 symbols
  * in all builds.
  */
-static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 222;
+static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 220;
 static_assert(XDR_BYTECODE_VERSION_SUBTRAHEND % 2 == 0, "see the comment above");
 static const uint32_t XDR_BYTECODE_VERSION =
     uint32_t(0xb973c0de - (XDR_BYTECODE_VERSION_SUBTRAHEND
 #ifdef JS_HAS_SYMBOLS
                                                            + 1
 #endif
                                                               ));
 
-static_assert(JSErr_Limit == 369,
+static_assert(JSErr_Limit == 368,
               "GREETINGS, POTENTIAL SUBTRAHEND INCREMENTER! If you added or "
               "removed MSG_DEFs from js.msg, you should increment "
               "XDR_BYTECODE_VERSION_SUBTRAHEND and update this assertion's "
               "expected JSErr_Limit value.");
 
 class XDRBuffer {
   public:
     explicit XDRBuffer(JSContext *cx)
--- a/js/xpconnect/tests/chrome/test_xrayToJS.xul
+++ b/js/xpconnect/tests/chrome/test_xrayToJS.xul
@@ -139,17 +139,17 @@ https://bugzilla.mozilla.org/show_bug.cg
 
   // Maintain a static list of the properties that are available on each standard
   // prototype, so that we make sure to audit any new ones to make sure they're
   // Xray-safe.
   //
   // DO NOT CHANGE WTIHOUT REVIEW FROM AN XPCONNECT PEER.
   var version = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).version;
   var isNightlyBuild = version.endsWith("a1");
-  var isReleaseBuild = !version.includes("a");
+  var isReleaseBuild = !version.contains("a");
   const jsHasSymbols = typeof Symbol === "function";
   const kIteratorSymbol = jsHasSymbols ? Symbol.iterator : "@@iterator";
   var gPrototypeProperties = {};
   gPrototypeProperties['Date'] =
     ["getTime", "getTimezoneOffset", "getYear", "getFullYear", "getUTCFullYear",
     "getMonth", "getUTCMonth", "getDate", "getUTCDate", "getDay", "getUTCDay",
     "getHours", "getUTCHours", "getMinutes", "getUTCMinutes", "getSeconds",
     "getUTCSeconds", "getMilliseconds", "getUTCMilliseconds", "setTime",
--- a/layout/reftests/invalidation/nudge-to-integer-invalidation.html
+++ b/layout/reftests/invalidation/nudge-to-integer-invalidation.html
@@ -9,17 +9,17 @@
     <g transform="translate(0, -220.999756)">
       <rect x="100" y="400" height="50" width="50" fill="grey" class="reftest-no-paint"/>
     </g>
 </svg>
 
 <script>
 
 var scrollPositions = [0, 50];
-if (location.search.includes("reverse")) {
+if (location.search.contains("reverse")) {
   scrollPositions.reverse();
 }
 document.documentElement.scrollTop = scrollPositions[0];
 
 function doTest() {
   document.documentElement.scrollTop = scrollPositions[1];
   document.documentElement.removeAttribute("class");
 }
--- a/layout/reftests/invalidation/transform-floating-point-invalidation.html
+++ b/layout/reftests/invalidation/transform-floating-point-invalidation.html
@@ -9,17 +9,17 @@
   <rect x="100" y="600" width="120" height="120" fill="#EEE"
         transform="matrix(0,0.969665,-2.0321494,0,1828.58132,65.718239)"
         class="reftest-no-paint"/>
 </svg>
 
 <script>
 
 var scrollPositions = [81, 82];
-if (location.search.includes("reverse")) {
+if (location.search.contains("reverse")) {
   scrollPositions.reverse();
 }
 document.documentElement.scrollTop = scrollPositions[0];
 
 function doTest() {
   document.documentElement.scrollTop = scrollPositions[1];
   document.documentElement.removeAttribute("class");
 }
--- a/memory/replace/dmd/test/test_dmd.js
+++ b/memory/replace/dmd/test/test_dmd.js
@@ -16,17 +16,17 @@ let gEnv = Cc["@mozilla.org/process/envi
 let gPythonName = gEnv.get("PYTHON");
 
 // If we're testing locally, the executable file is in "CurProcD". Otherwise,
 // it is in another location that we have to find.
 function getExecutable(aFilename) {
   let file = FileUtils.getFile("CurProcD", [aFilename]);
   if (!file.exists()) {
     file = FileUtils.getFile("CurWorkD", []);
-    while (file.path.includes("xpcshell")) {
+    while (file.path.contains("xpcshell")) {
       file = file.parent;
     }
     file.append("bin");
     file.append(aFilename);
   }
   return file;
 }
 
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -5737,17 +5737,17 @@ var FormAssistant = {
       let item = options.item(i);
 
       let label = item.value;
       if (item.label)
         label = item.label;
       else if (item.text)
         label = item.text;
 
-      if (filter && !(label.toLowerCase().includes(lowerFieldValue)) )
+      if (filter && !(label.toLowerCase().contains(lowerFieldValue)) )
         continue;
       suggestions.push({ label: label, value: item.value });
     }
 
     return suggestions;
   },
 
   // Retrieves autocomplete suggestions for an element from the form autocomplete service
--- a/modules/libpref/test/unit/test_warnings.js
+++ b/modules/libpref/test/unit/test_warnings.js
@@ -19,17 +19,17 @@ function makeBuffer(length) {
  */
 function checkWarning(pref, buffer) {
   let deferred = Promise.defer();
   let complete = false;
   let listener = {
     observe: function(event) {
       let message = event.message;
       if (!(message.startsWith("Warning: attempting to write")
-            && message.includes(pref))) {
+            && message.contains(pref))) {
         return;
       }
       if (complete) {
         return;
       }
       complete = true;
       do_print("Warning while setting " + pref);
       cs.unregisterListener(listener);
--- a/services/common/modules-testing/bagheeraserver.js
+++ b/services/common/modules-testing/bagheeraserver.js
@@ -200,17 +200,17 @@ BagheeraServer.prototype = {
     }
 
     if (!rest) {
       this._log.info("No ID defined.");
       throw HTTP_404;
     }
 
     let id = rest;
-    if (id.includes("/")) {
+    if (id.contains("/")) {
       this._log.info("URI has too many components.");
       throw HTTP_404;
     }
 
     if (request.method == "POST") {
       return this._handleNamespaceSubmitPost(namespace, id, request, response);
     }
 
--- a/services/healthreport/healthreporter.jsm
+++ b/services/healthreport/healthreporter.jsm
@@ -751,17 +751,17 @@ AbstractHealthReporter.prototype = Objec
       // Try is because .spec can throw on invalid URI.
       try {
         recordMessage = recordMessage.replace(uri.spec, '<' + thing + 'URI>', 'g');
       } catch (ex) { }
 
       recordMessage = recordMessage.replace(path, '<' + thing + 'Path>', 'g');
     }
 
-    if (appData.path.includes(profile.path)) {
+    if (appData.path.contains(profile.path)) {
       replace(appDataURI, appData.path, 'AppData');
       replace(profileURI, profile.path, 'Profile');
     } else {
       replace(profileURI, profile.path, 'Profile');
       replace(appDataURI, appData.path, 'AppData');
     }
 
     this._log.warn(logMessage);
--- a/services/healthreport/providers.jsm
+++ b/services/healthreport/providers.jsm
@@ -1272,17 +1272,17 @@ UpdateHotfixMeasurement1.prototype = Obj
     "notificationsShown": Metrics.Storage.FIELD_LAST_NUMERIC,
   },
 
   fields: { },
 
   // Our fields have dynamic names from the hotfix version that supplied them.
   // We need to override the default behavior to deal with unknown fields.
   shouldIncludeField: function (name) {
-    return name.includes(".");
+    return name.contains(".");
   },
 
   fieldType: function (name) {
     for (let known in this.hotfixFieldTypes) {
       if (name.endsWith(known)) {
         return this.hotfixFieldTypes[known];
       }
     }
@@ -1521,17 +1521,17 @@ SearchCountMeasurementBase.prototype = O
    * various Firefox locales.
    *
    * We use the "provider.type" syntax as a rudimentary check for validity.
    *
    * We trust that measurement versioning is sufficient to exclude old provider
    * data.
    */
   shouldIncludeField: function (name) {
-    return name.includes(".");
+    return name.contains(".");
   },
 
   /**
    * The measurement type mechanism doesn't introspect the DB. Override it
    * so that we can assume all unknown fields are counters.
    */
   fieldType: function (name) {
     if (name in this.fields) {
--- a/services/healthreport/tests/xpcshell/test_healthreporter.js
+++ b/services/healthreport/tests/xpcshell/test_healthreporter.js
@@ -912,27 +912,27 @@ add_task(function test_failure_if_not_in
   let reporter = yield getReporter("failure_if_not_initialized");
   yield reporter._shutdown();
 
   let error = false;
   try {
     yield reporter.requestDataUpload();
   } catch (ex) {
     error = true;
-    do_check_true(ex.message.includes("Not initialized."));
+    do_check_true(ex.message.contains("Not initialized."));
   } finally {
     do_check_true(error);
     error = false;
   }
 
   try {
     yield reporter.collectMeasurements();
   } catch (ex) {
     error = true;
-    do_check_true(ex.message.includes("Not initialized."));
+    do_check_true(ex.message.contains("Not initialized."));
   } finally {
     do_check_true(error);
     error = false;
   }
 
   // getJSONPayload always works (to facilitate error upload).
   yield reporter.getJSONPayload();
 });
@@ -979,17 +979,17 @@ add_task(function test_upload_on_init_fa
   yield deferred.promise;
 
   do_check_true(server.hasDocument(reporter.serverNamespace, reporter.lastSubmitID));
   let doc = server.getDocument(reporter.serverNamespace, reporter.lastSubmitID);
   do_check_true("notInitialized" in doc);
   do_check_eq(doc.notInitialized, 1);
   do_check_true("errors" in doc);
   do_check_eq(doc.errors.length, 1);
-  do_check_true(doc.errors[0].includes(MESSAGE));
+  do_check_true(doc.errors[0].contains(MESSAGE));
 
   yield reporter._shutdown();
   yield shutdownServer(server);
 });
 
 // Simulate a SQLite write error during upload.
 add_task(function* test_upload_with_provider_record_failure() {
   let [reporter, server] = yield getReporterAndServer("upload_with_provider_record_failure");
--- a/services/metrics/tests/xpcshell/test_metrics_provider_manager.js
+++ b/services/metrics/tests/xpcshell/test_metrics_provider_manager.js
@@ -107,17 +107,17 @@ add_task(function test_collect_constant_
   manager.onProviderError = function (error) { errors.push(error); };
 
   let provider = new DummyProvider();
   provider.throwDuringCollectConstantData = "Fake error during collect";
   yield manager.registerProvider(provider);
 
   yield manager.collectConstantData();
   do_check_eq(errors.length, 1);
-  do_check_true(errors[0].includes(provider.throwDuringCollectConstantData));
+  do_check_true(errors[0].contains(provider.throwDuringCollectConstantData));
 
   yield storage.close();
 });
 
 add_task(function test_collect_constant_populate_throws() {
   let storage = yield Metrics.Storage("collect_constant_populate_throws");
   let manager = new Metrics.ProviderManager(storage);
   let errors = [];
@@ -125,17 +125,17 @@ add_task(function test_collect_constant_
 
   let provider = new DummyProvider();
   provider.throwDuringConstantPopulate = "Fake error during constant populate";
   yield manager.registerProvider(provider);
 
   yield manager.collectConstantData();
 
   do_check_eq(errors.length, 1);
-  do_check_true(errors[0].includes(provider.throwDuringConstantPopulate));
+  do_check_true(errors[0].contains(provider.throwDuringConstantPopulate));
   do_check_false(manager._providers.get(provider.name).constantsCollected);
 
   yield storage.close();
 });
 
 add_task(function test_collect_constant_onetime() {
   let storage = yield Metrics.Storage("collect_constant_onetime");
   let manager = new Metrics.ProviderManager(storage);
@@ -291,17 +291,17 @@ add_task(function test_category_manager_
     deferred.resolve(msg);
   };
 
   yield manager.registerProvidersFromCategoryManager("registration-errors");
   do_check_eq(manager.providers.length, 0);
   do_check_eq(errorCount, 1);
 
   let msg = yield deferred.promise;
-  do_check_true(msg.includes("Provider error: DummyThrowOnInitProvider: "
+  do_check_true(msg.contains("Provider error: DummyThrowOnInitProvider: "
                              + "Error registering provider from category manager: "
                              + "Error: Dummy Error"));
 
   yield storage.close();
 });
 
 add_task(function test_pull_only_registration_error() {
   let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB);
@@ -317,17 +317,17 @@ add_task(function test_pull_only_registr
 
   yield manager.registerProviderFromType(DummyPullOnlyThrowsOnInitProvider);
   do_check_eq(errorCount, 0);
 
   yield manager.ensurePullOnlyProvidersRegistered();
   do_check_eq(errorCount, 1);
 
   let msg = yield deferred.promise;
-  do_check_true(msg.includes("Provider error: DummyPullOnlyThrowsOnInitProvider: " +
+  do_check_true(msg.contains("Provider error: DummyPullOnlyThrowsOnInitProvider: " +
                              "Error registering pull-only provider: Error: Dummy Error"));
 
   yield storage.close();
 });
 
 add_task(function test_error_during_shutdown() {
   let storage = yield Metrics.Storage(REGISTRATION_ERRORS_DB);
   let manager = new Metrics.ProviderManager(storage);
@@ -345,13 +345,13 @@ add_task(function test_error_during_shut
   do_check_eq(errorCount, 0);
   do_check_eq(manager.providers.length, 1);
 
   yield manager.ensurePullOnlyProvidersRegistered();
   do_check_eq(errorCount, 0);
   yield manager.ensurePullOnlyProvidersUnregistered();
   do_check_eq(errorCount, 1);
   let msg = yield deferred.promise;
-  do_check_true(msg.includes("Provider error: DummyThrowOnShutdownProvider: " +
+  do_check_true(msg.contains("Provider error: DummyThrowOnShutdownProvider: " +
                              "Error when shutting down provider: Error: Dummy shutdown error"));
 
   yield storage.close();
 });
--- a/services/metrics/tests/xpcshell/test_metrics_storage.js
+++ b/services/metrics/tests/xpcshell/test_metrics_storage.js
@@ -338,17 +338,17 @@ add_task(function test_enqueue_operation
   let mID = yield backend.registerMeasurement("foo", "bar", 1);
   let fID = yield backend.registerField(mID, "baz", backend.FIELD_DAILY_COUNTER);
   let now = new Date();
 
   let deferred = Promise.defer();
   backend.enqueueOperation(function bad() {
     throw new Error("I failed.");
   }).then(do_throw, function onError(error) {
-    do_check_true(error.message.includes("I failed."));
+    do_check_true(error.message.contains("I failed."));
     deferred.resolve();
   });
 
   let promise = backend.enqueueOperation(function () {
     return backend.incrementDailyCounterFromFieldID(fID, now);
   });
 
   yield deferred.promise;
--- a/services/sync/Weave.js
+++ b/services/sync/Weave.js
@@ -102,17 +102,17 @@ WeaveService.prototype = {
    *
    * @return bool
    */
   get fxAccountsEnabled() {
     try {
       // Old sync guarantees '@' will never appear in the username while FxA
       // uses the FxA email address - so '@' is the flag we use.
       let username = Services.prefs.getCharPref(SYNC_PREFS_BRANCH + "username");
-      return !username || username.includes('@');
+      return !username || username.contains('@');
     } catch (_) {
       return true; // No username == only allow FxA to be configured.
     }
   },
 
   /**
    * Whether Sync appears to be enabled.
    *
--- a/services/sync/modules/service.js
+++ b/services/sync/modules/service.js
@@ -108,17 +108,17 @@ Sync11Service.prototype = {
    *
    * This is the base URI of the service as applicable to all users up to
    * and including the server version path component, complete with trailing
    * forward slash.
    */
   get userAPIURI() {
     // Append to the serverURL if it's a relative fragment.
     let url = Svc.Prefs.get("userURL");
-    if (!url.includes(":")) {
+    if (!url.contains(":")) {
       url = this.serverURL + url;
     }
 
     return url + USER_API_VERSION + "/";
   },
 
   get pwResetURL() {
     return this.serverURL + "weave-password-reset";
--- a/services/sync/tests/unit/test_browserid_identity.js
+++ b/services/sync/tests/unit/test_browserid_identity.js
@@ -119,17 +119,17 @@ add_test(function test_getRESTRequestAut
     _("BrowserIDManager supplies a REST Request Authenticator callback which sets a Hawk header on a request object.");
     let request = new SyncStorageRequest(
       "https://example.net/somewhere/over/the/rainbow");
     let authenticator = browseridManager.getRESTRequestAuthenticator();
     do_check_true(!!authenticator);
     let output = authenticator(request, 'GET');
     do_check_eq(request.uri, output.uri);
     do_check_true(output._headers.authorization.startsWith('Hawk'));
-    do_check_true(output._headers.authorization.includes('nonce'));
+    do_check_true(output._headers.authorization.contains('nonce'));
     do_check_true(browseridManager.hasValidToken());
     run_next_test();
   }
 );
 
 add_test(function test_resourceAuthenticatorSkew() {
   _("BrowserIDManager Resource Authenticator compensates for clock skew in Hawk header.");
 
--- a/testing/modules/Assert.jsm
+++ b/testing/modules/Assert.jsm
@@ -103,17 +103,17 @@ Assert.AssertionError = function(options
   this.actual = options.actual;
   this.expected = options.expected;
   this.operator = options.operator;
   this.message = getMessage(this, options.message);
   // The part of the stack that comes from this module is not interesting.
   let stack = Components.stack;
   do {
     stack = stack.caller;
-  } while(stack.filename && stack.filename.includes("Assert.jsm"))
+  } while(stack.filename && stack.filename.contains("Assert.jsm"))
   this.stack = stack;
 };
 
 // assert.AssertionError instanceof Error
 Assert.AssertionError.prototype = Object.create(Error.prototype, {
   constructor: {
     value: Assert.AssertionError,
     enumerable: false,
--- a/testing/xpcshell/head.js
+++ b/testing/xpcshell/head.js
@@ -736,17 +736,17 @@ function do_check_neq(left, right, stack
 function todo_check_neq(left, right, stack) {
   if (!stack)
       stack = Components.stack.caller;
 
   _do_check_neq(left, right, stack, true);
 }
 
 function do_report_result(passed, text, stack, todo) {
-  while (stack.filename.includes("head.js") && stack.caller) {
+  while (stack.filename.contains("head.js") && stack.caller) {
     stack = stack.caller;
   }
 
   let name = _gRunningTest ? _gRunningTest.name : stack.name;
   let message;
   if (name) {
      message = "[" + name + " : " + stack.lineNumber + "] " + text;
   } else {
--- a/toolkit/components/aboutmemory/tests/test_memoryReporters.xul
+++ b/toolkit/components/aboutmemory/tests/test_memoryReporters.xul
@@ -98,35 +98,35 @@
     } else if (aPath.search(/^explicit\/xpti-working-set$/) >= 0) {
       present.xptiWorkingSet = true;
     } else if (aPath.search(/^explicit\/atom-tables\/main$/) >= 0) {
       present.atomTablesMain = true;
     } else if (/\[System Principal\].*this-is-a-sandbox-name/.test(aPath)) {
       // A system compartment with a location (such as a sandbox) should
       // show that location.
       present.sandboxLocation = true;
-    } else if (aPath.includes(bigStringPrefix)) {
+    } else if (aPath.contains(bigStringPrefix)) {
       present.bigString = true;
-    } else if (aPath.includes("!)(*&")) {
+    } else if (aPath.contains("!)(*&")) {
       present.smallString1 = true;
-    } else if (aPath.includes("@)(*&")) {
+    } else if (aPath.contains("@)(*&")) {
       present.smallString2 = true;
     }
 
     // Shouldn't get any anonymized paths.
-    if (aPath.includes('<anonymized')) {
+    if (aPath.contains('<anonymized')) {
         present.anonymizedWhenUnnecessary = aPath;
     }
   }
 
   function handleReportAnonymized(aProcess, aPath, aKind, aUnits, aAmount,
                                   aDescription)
   {
     // Shouldn't get http: or https: in any paths.
-    if (aPath.includes('http:')) {
+    if (aPath.contains('http:')) {
         present.httpWhenAnonymized = aPath;
     }
 
     // file: URLs should have their path anonymized.
     if (aPath.search('file:..[^<]') !== -1) {
         present.unanonymizedFilePathWhenAnonymized = aPath;
     }
   }
--- a/toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown.js
+++ b/toolkit/components/asyncshutdown/tests/xpcshell/test_AsyncShutdown.js
@@ -134,18 +134,18 @@ add_task(function* test_state() {
   let promiseDone = barrier.wait();
 
   // Now that we have called `wait()`, the state contains interesting things
   let state = barrier.state[0];
   do_print("State: " + JSON.stringify(barrier.state, null, "\t"));
   Assert.equal(state.filename, filename);
   Assert.equal(state.lineNumber, lineNumber + 1);
   Assert.equal(state.name, BLOCKER_NAME);
-  Assert.ok(state.stack.some(x => x.includes("test_state")), "The stack contains the caller function's name");
-  Assert.ok(state.stack.some(x => x.includes(filename)), "The stack contains the calling file's name");
+  Assert.ok(state.stack.some(x => x.contains("test_state")), "The stack contains the caller function's name");
+  Assert.ok(state.stack.some(x => x.contains(filename)), "The stack contains the calling file's name");
 
   deferred.resolve();
   yield promiseDone;
 });
 
 add_task(function*() {
   Services.prefs.clearUserPref("toolkit.asyncshutdown.testing");
 });
--- a/toolkit/components/osfile/tests/xpcshell/test_osfile_async_largefiles.js
+++ b/toolkit/components/osfile/tests/xpcshell/test_osfile_async_largefiles.js
@@ -78,28 +78,28 @@ function test_setPosition_failures() {
     try {
       let pos = 0;
 
       // 1. Use an invalid position value
       try {
         yield file.setPosition(0.5, OS.File.POS_START);
         do_throw("Shouldn't have succeeded");
       } catch (ex) {
-        do_check_true(ex.toString().includes("expected type"));
+        do_check_true(ex.toString().contains("expected type"));
       }
       // Since setPosition should have bailed, it shouldn't have moved the
       // file pointer at all.
       do_check_eq((yield file.getPosition()), 0);
 
       // 2. Use an invalid position value
       try {
         yield file.setPosition(0xffffffff + 0.5, OS.File.POS_START);
         do_throw("Shouldn't have succeeded");
       } catch (ex) {
-        do_check_true(ex.toString().includes("expected type"));
+        do_check_true(ex.toString().contains("expected type"));
       }
       // Since setPosition should have bailed, it shouldn't have moved the
       // file pointer at all.
       do_check_eq((yield file.getPosition()), 0);
 
       // 3. Use a position that cannot be represented as a double
       try {
         // Not all numbers after 9007199254740992 can be represented as a
--- a/toolkit/components/places/PlacesUtils.jsm
+++ b/toolkit/components/places/PlacesUtils.jsm
@@ -1487,17 +1487,17 @@ this.PlacesUtils = {
    *        The target image height
    *
    * @return The URL with the fragment at the end
    */
   getImageURLForResolution:
   function PU_getImageURLForResolution(aWindow, aURL, aWidth = 16, aHeight = 16) {
     let width  = Math.round(aWidth * aWindow.devicePixelRatio);
     let height = Math.round(aHeight * aWindow.devicePixelRatio);
-    return aURL + (aURL.includes("#") ? "&" : "#") +
+    return aURL + (aURL.contains("#") ? "&" : "#") +
            "-moz-resolution=" + width + "," + height;
   },
 
   /**
    * Get the unique id for an item (a bookmark, a folder or a separator) given
    * its item id.
    *
    * @param aItemId
--- a/toolkit/components/places/UnifiedComplete.js
+++ b/toolkit/components/places/UnifiedComplete.js
@@ -1148,17 +1148,17 @@ Search.prototype = {
     let match = {};
     let trimmedHost = row.getResultByIndex(QUERYINDEX_URL);
     let untrimmedHost = row.getResultByIndex(QUERYINDEX_TITLE);
     let frecency = row.getResultByIndex(QUERYINDEX_FRECENCY);
 
     // If the untrimmed value doesn't preserve the user's input just
     // ignore it and complete to the found host.
     if (untrimmedHost &&
-        !untrimmedHost.toLowerCase().includes(this._trimmedOriginalSearchString.toLowerCase())) {
+        !untrimmedHost.toLowerCase().contains(this._trimmedOriginalSearchString.toLowerCase())) {
       untrimmedHost = null;
     }
 
     match.value = this._strippedPrefix + trimmedHost;
     // Remove the trailing slash.
     match.comment = stripHttpAndTrim(trimmedHost);
     match.finalCompleteValue = untrimmedHost;
 
@@ -1195,17 +1195,17 @@ Search.prototype = {
       }
       url = url.slice(0, separatorIndex);
     }
 
     // If the untrimmed value doesn't preserve the user's input just
     // ignore it and complete to the found url.
     let untrimmedURL = prefix + url;
     if (untrimmedURL &&
-        !untrimmedURL.toLowerCase().includes(this._trimmedOriginalSearchString.toLowerCase())) {
+        !untrimmedURL.toLowerCase().contains(this._trimmedOriginalSearchString.toLowerCase())) {
       untrimmedURL = null;
      }
 
     match.value = this._strippedPrefix + url;
     match.comment = url;
     match.finalCompleteValue = untrimmedURL;
     // Although this has a frecency, this query is executed before any other
     // queries that would result in frecency matches.
--- a/toolkit/components/places/nsPlacesAutoComplete.js
+++ b/toolkit/components/places/nsPlacesAutoComplete.js
@@ -1495,17 +1495,17 @@ urlInlineComplete.prototype = {
     let wrapper = new AutoCompleteStatementCallbackWrapper(this, {
       handleResult: function (aResultSet) {
         let row = aResultSet.getNextRow();
         let trimmedHost = row.getResultByIndex(0);
         let untrimmedHost = row.getResultByIndex(1);
         // If the untrimmed value doesn't preserve the user's input just
         // ignore it and complete to the found host.
         if (untrimmedHost &&
-            !untrimmedHost.toLowerCase().includes(ac._originalSearchString.toLowerCase())) {
+            !untrimmedHost.toLowerCase().contains(ac._originalSearchString.toLowerCase())) {
           untrimmedHost = null;
         }
 
         ac._result.appendMatch(ac._strippedPrefix + trimmedHost, "", "", "", untrimmedHost);
 
         // handleCompletion() will cause the result listener to be called, and
         // will display the result in the UI.
       },
@@ -1570,17 +1570,17 @@ urlInlineComplete.prototype = {
           url = url.slice(0, separatorIndex);
         }
 
         // Add the result.
         // If the untrimmed value doesn't preserve the user's input just
         // ignore it and complete to the found url.
         let untrimmedURL = prefix + url;
         if (untrimmedURL &&
-            !untrimmedURL.toLowerCase().includes(ac._originalSearchString.toLowerCase())) {
+            !untrimmedURL.toLowerCase().contains(ac._originalSearchString.toLowerCase())) {
           untrimmedURL = null;
          }
 
         ac._result.appendMatch(ac._strippedPrefix + url, "", "", "", untrimmedURL);
 
         // handleCompletion() will cause the result listener to be called, and
         // will display the result in the UI.
       },
--- a/toolkit/components/search/tests/xpcshell/test_multipleIcons.js
+++ b/toolkit/components/search/tests/xpcshell/test_multipleIcons.js
@@ -16,20 +16,20 @@ function run_test() {
 }
 
 add_task(function* test_multipleIcons() {
   let [engine] = yield addTestEngines([
     { name: "IconsTest", xmlFileName: "engineImages.xml" },
   ]);
 
   do_print("The default should be the 16x16 icon");
-  do_check_true(engine.iconURI.spec.includes("ico16"));
+  do_check_true(engine.iconURI.spec.contains("ico16"));
 
-  do_check_true(engine.getIconURLBySize(32,32).includes("ico32"));
-  do_check_true(engine.getIconURLBySize(74,74).includes("ico74"));
+  do_check_true(engine.getIconURLBySize(32,32).contains("ico32"));
+  do_check_true(engine.getIconURLBySize(74,74).contains("ico74"));
 
   do_print("Invalid dimensions should return null.");
   do_check_null(engine.getIconURLBySize(50,50));
 
   let allIcons = engine.getIcons();
 
   do_print("Check that allIcons contains expected icon sizes");
   do_check_eq(allIcons.length, 3);
--- a/toolkit/components/telemetry/tests/unit/test_TelemetryPing.js
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryPing.js
@@ -558,17 +558,17 @@ add_task(function* test_saveLoadPing() {
   yield TelemetryPing.testLoadHistograms(histogramsFile);
   yield sendPing();
 
   // Get requests received by dummy server.
   let request1 = yield gRequestIterator.next();
   let request2 = yield gRequestIterator.next();
 
   // Check we have the correct two requests. Ordering is not guaranteed.
-  if (request1.path.includes("test-ping")) {
+  if (request1.path.contains("test-ping")) {
     checkPayload(request1, "test-ping", 1);
     checkPayload(request2, "saved-session", 1);
   } else {
     checkPayload(request1, "saved-session", 1);
     checkPayload(request2, "test-ping", 1);
   }
 });
 
--- a/toolkit/content/tests/widgets/test_videocontrols_standalone.html
+++ b/toolkit/content/tests/widgets/test_videocontrols_standalone.html
@@ -62,17 +62,17 @@ function runTestAudioPre() {
         runTestAudio(audio);
       })
     }
   })
 }
 
 function runTestAudio(aAudio) {
   info("User agent (help diagnose bug #943556): " + navigator.userAgent);
-  var isAndroid = navigator.userAgent.includes("Android");
+  var isAndroid = navigator.userAgent.contains("Android");
   var expectedHeight = isAndroid ? 103 : 28;
   var condition = function () {
     var boundingRect = aAudio.getBoundingClientRect();
     return boundingRect.height == expectedHeight;
   };
   waitForCondition(condition, function () {
     var boundingRect = aAudio.getBoundingClientRect();
     is(boundingRect.height, expectedHeight,
--- a/toolkit/content/widgets/autocomplete.xml
+++ b/toolkit/content/widgets/autocomplete.xml
@@ -1108,17 +1108,17 @@ extends="chrome://global/content/binding
         <parameter name="aWin"/>
         <parameter name="aURL"/>
         <parameter name="aWidth"/>
         <parameter name="aHeight"/>
         <body>
           <![CDATA[
           let width  = Math.round(aWidth * aWin.devicePixelRatio);
           let height = Math.round(aHeight * aWin.devicePixelRatio);
-          return aURL + (aURL.includes("#") ? "&" : "#") +
+          return aURL + (aURL.contains("#") ? "&" : "#") +
                  "-moz-resolution=" + width + "," + height;
           ]]>
         </body>
       </method>
 
       <method name="_appendCurrentResult">
         <body>
           <![CDATA[
--- a/toolkit/devtools/event-emitter.js
+++ b/toolkit/devtools/event-emitter.js
@@ -150,17 +150,17 @@ EventEmitter.prototype = {
     let logging = isWorker ? true : Services.prefs.getBoolPref("devtools.dump.emit");
 
     if (logging) {
       let caller, func, path;
       if (!isWorker) {
         caller = components.stack.caller.caller;
         func = caller.name;
         let file = caller.filename;
-        if (file.includes(" -> ")) {
+        if (file.contains(" -> ")) {
           file = caller.filename.split(/ -> /)[1];
         }
         path = file + ":" + caller.lineNumber;
       }
 
       let argOut = "(";
       if (args.length === 1) {
         argOut += aEvent;
--- a/toolkit/devtools/event-parsers.js
+++ b/toolkit/devtools/event-parsers.js
@@ -98,17 +98,17 @@ let parsers = [
 
       let name = handlerDO.displayName;
 
       if (!name) {
         return handlerDO;
       }
 
       for (let path of paths) {
-        if (name.includes(path[0])) {
+        if (name.contains(path[0])) {
           path.splice(0, 1);
 
           for (let point of path) {
             let names = handlerDO.environment.names();
 
             for (let varName of names) {
               let temp = handlerDO.environment.getVariable(varName);
               if (!temp) {
@@ -116,17 +116,17 @@ let parsers = [
               }
 
               let displayName = temp.displayName;
               if (!displayName) {
                 continue;
               }
 
               if (temp.class === "Function" &&
-                  (displayName.includes(point) || point === "*")) {
+                  (displayName.contains(point) || point === "*")) {
                 handlerDO = temp;
                 break;
               }
             }
           }
           break;
         }
       }
--- a/toolkit/devtools/server/actors/script.js
+++ b/toolkit/devtools/server/actors/script.js
@@ -1617,17 +1617,17 @@ ThreadActor.prototype = {
     if (aFrame) {
       aFrame.onStep = undefined;
       aFrame.onPop = undefined;
     }
 
     // Clear DOM event breakpoints.
     // XPCShell tests don't use actual DOM windows for globals and cause
     // removeListenerForAllEvents to throw.
-    if (this.global && !this.global.toString().includes("Sandbox")) {
+    if (this.global && !this.global.toString().contains("Sandbox")) {
       let els = Cc["@mozilla.org/eventlistenerservice;1"]
                 .getService(Ci.nsIEventListenerService);
       els.removeListenerForAllEvents(this.global, this._allEventsListener, true);
       for (let [,bp] of this._hiddenBreakpoints) {
         bp.onDelete();
       }
       this._hiddenBreakpoints.clear();
     }
--- a/toolkit/devtools/server/tests/unit/test_source-01.js
+++ b/toolkit/devtools/server/tests/unit/test_source-01.js
@@ -51,17 +51,17 @@ function test_source()
 
       do_check_true(!!source);
 
       let sourceClient = gThreadClient.source(source);
       sourceClient.source(function (aResponse) {
         do_check_true(!!aResponse);
         do_check_true(!aResponse.error);
         do_check_true(!!aResponse.contentType);
-        do_check_true(aResponse.contentType.includes("javascript"));
+        do_check_true(aResponse.contentType.contains("javascript"));
 
         do_check_true(!!aResponse.source);
         do_check_eq(SOURCE_CONTENT,
                     aResponse.source);
 
         gThreadClient.resume(function () {
           finishClient(gClient);
         });
--- a/toolkit/devtools/tests/unit/test_safeErrorString.js
+++ b/toolkit/devtools/tests/unit/test_safeErrorString.js
@@ -10,37 +10,37 @@ function run_test() {
   test_with_string();
   test_with_thrower();
   test_with_psychotic();
 }
 
 function test_with_error() {
   let s = DevToolsUtils.safeErrorString(new Error("foo bar"));
   // Got the message.
-  do_check_true(s.includes("foo bar"));
+  do_check_true(s.contains("foo bar"));
   // Got the stack.
-  do_check_true(s.includes("test_with_error"))
-  do_check_true(s.includes("test_safeErrorString.js"));
+  do_check_true(s.contains("test_with_error"))
+  do_check_true(s.contains("test_safeErrorString.js"));
   // Got the lineNumber and columnNumber.
-  do_check_true(s.includes("Line"));
-  do_check_true(s.includes("column"));
+  do_check_true(s.contains("Line"));
+  do_check_true(s.contains("column"));
 }
 
 function test_with_tricky_error() {
   let e = new Error("batman");
   e.stack = { toString: Object.create(null) };
   let s = DevToolsUtils.safeErrorString(e);
   // Still got the message, despite a bad stack property.
-  do_check_true(s.includes("batman"));
+  do_check_true(s.contains("batman"));
 }
 
 function test_with_string() {
   let s = DevToolsUtils.safeErrorString("not really an error");
   // Still get the message.
-  do_check_true(s.includes("not really an error"));
+  do_check_true(s.contains("not really an error"));
 }
 
 function test_with_thrower() {
   let s = DevToolsUtils.safeErrorString({
     toString: () => {
       throw new Error("Muahahaha");
     }
   });
--- a/toolkit/devtools/webconsole/utils.js
+++ b/toolkit/devtools/webconsole/utils.js
@@ -590,17 +590,17 @@ let WebConsoleUtils = {
           // Cleanup function if notification is dismissed
           if (eventType == "removed") {
             inputField.removeEventListener("keyup", pasteKeyUpHandler);
           }
         });
 
       function pasteKeyUpHandler(aEvent2) {
         let value = inputField.value || inputField.textContent;
-        if (value.includes(okstring)) {
+        if (value.contains(okstring)) {
           notificationBox.removeNotification(notification);
           inputField.removeEventListener("keyup", pasteKeyUpHandler);
           WebConsoleUtils.usageCount = CONSOLE_ENTRY_THRESHOLD;
         }
       }
       inputField.addEventListener("keyup", pasteKeyUpHandler);
 
       aEvent.preventDefault();
--- a/toolkit/modules/GMPInstallManager.jsm
+++ b/toolkit/modules/GMPInstallManager.jsm
@@ -770,17 +770,17 @@ GMPExtractor.prototype = {
                       createInstance(Ci.nsIZipReader);
       zipReader.open(zipFile)
       let entries = this._getZipEntries(zipReader);
       let extractedPaths = [];
 
       // Extract each of the entries
       entries.forEach(entry => {
         // We don't need these types of files
-        if (entry.includes("__MACOSX")) {
+        if (entry.contains("__MACOSX")) {
           return;
         }
         let outFile = Cc["@mozilla.org/file/local;1"].
                       createInstance(Ci.nsILocalFile);
         outFile.initWithPath(this.installToDirPath);
         outFile.appendRelativePath(entry);
 
         // Make sure the directory hierarchy exists
--- a/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
+++ b/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js
@@ -195,17 +195,17 @@ add_test(function test_checkForAddons_ba
 
 
   overrideXHR(200, "");
   let installManager = new GMPInstallManager();
   let promise = installManager.checkForAddons();
   promise.then(function() {
     do_throw("Defensive timeout should reject");
   }, function(err) {
-    do_check_true(err.message.includes("SSL is required and URI scheme is not https."));
+    do_check_true(err.message.contains("SSL is required and URI scheme is not https."));
     installManager.uninit();
     if (PREF_KEY_URL_OVERRIDE_BACKUP) {
       Preferences.set(GMPPrefs.KEY_URL_OVERRIDE,
         PREF_KEY_URL_OVERRIDE_BACKUP);
     }
     if (PREF_CERTS_BRANCH_DOT_ONE_BACKUP) {
       Preferences.set(CERTS_BRANCH_DOT_ONE,
         PREF_CERTS_BRANCH_DOT_ONE_BACKUP);
--- a/toolkit/modules/tests/xpcshell/test_Log.js
+++ b/toolkit/modules/tests/xpcshell/test_Log.js
@@ -423,26 +423,26 @@ add_task(function log_message_with_param
 
   /*
    * Check that errors get special formatting if they're formatted directly as
    * a named param or they're the only param, but not if they're a field in a
    * larger structure.
    */
   let err = Components.Exception("test exception", Components.results.NS_ERROR_FAILURE);
   let str = formatMessage("Exception is ${}", err);
-  do_check_true(str.includes('Exception is [Exception... "test exception"'));
-  do_check_true(str.includes("(NS_ERROR_FAILURE)"));
+  do_check_true(str.contains('Exception is [Exception... "test exception"'));
+  do_check_true(str.contains("(NS_ERROR_FAILURE)"));
   str = formatMessage("Exception is", err);
-  do_check_true(str.includes('Exception is: [Exception... "test exception"'));
+  do_check_true(str.contains('Exception is: [Exception... "test exception"'));
   str = formatMessage("Exception is ${error}", {error: err});
-  do_check_true(str.includes('Exception is [Exception... "test exception"'));
+  do_check_true(str.contains('Exception is [Exception... "test exception"'));
   str = formatMessage("Exception is", {_error: err});
   do_print(str);
   // Exceptions buried inside objects are formatted badly.
-  do_check_true(str.includes('Exception is: {"_error":{}'));
+  do_check_true(str.contains('Exception is: {"_error":{}'));
   // If the message text is null, the message contains only the formatted params object.
   str = formatMessage(null, err);
   do_check_true(str.startsWith('[Exception... "test exception"'));
   // If the text is null and 'params' is a String object, the message is exactly that string.
   str = formatMessage(null, new String("String in place of params"));
   do_check_eq(str, "String in place of params");
 
   // We use object.valueOf() internally; make sure a broken valueOf() method
@@ -519,24 +519,24 @@ add_task(function test_structured_basic(
   log.level = Log.Level.Info;
   appender.level = Log.Level.Info;
   log.addAppender(appender);
 
   // A structured entry with no _message is treated the same as log./level/(null, params)
   // except the 'action' field is added to the object.
   log.logStructured("action", {data: "structure"});
   do_check_eq(appender.messages.length, 1);
-  do_check_true(appender.messages[0].includes('{"data":"structure","action":"action"}'));
+  do_check_true(appender.messages[0].contains('{"data":"structure","action":"action"}'));
 
   // A structured entry with _message and substitution is treated the same as
   // log./level/(null, params).
   log.logStructured("action", {_message: "Structured sub ${data}", data: "structure"});
   do_check_eq(appender.messages.length, 2);
   do_print(appender.messages[1]);
-  do_check_true(appender.messages[1].includes('Structured sub structure'));
+  do_check_true(appender.messages[1].contains('Structured sub structure'));
 });
 
 /*
  * Test that all the basic logger methods pass the message and params through to the appender.
  */
 add_task(function log_message_with_params() {
   let log = Log.repository.getLogger("error.logger");
   let testFormatter = { format: msg => msg };
@@ -562,24 +562,24 @@ add_task(function log_message_with_param
  * Check that we format JS Errors reasonably.
  */
 add_task(function format_errors() {
   let pFormat = new Log.ParameterFormatter();
 
   // Test that subclasses of Error are recognized as errors.
   err = new ReferenceError("Ref Error", "ERROR_FILE", 28);
   str = pFormat.format(err);
-  do_check_true(str.includes("ReferenceError"));
-  do_check_true(str.includes("ERROR_FILE:28"));
-  do_check_true(str.includes("Ref Error"));
+  do_check_true(str.contains("ReferenceError"));
+  do_check_true(str.contains("ERROR_FILE:28"));
+  do_check_true(str.contains("Ref Error"));
 
   // Test that JS-generated Errors are recognized and formatted.
   try {
     eval("javascript syntax error");
   }
   catch (e) {
     str = pFormat.format(e);
-    do_check_true(str.includes("SyntaxError: missing ;"));
+    do_check_true(str.contains("SyntaxError: missing ;"));
     // Make sure we identified it as an Error and formatted the error location as
     // lineNumber:columnNumber.
-    do_check_true(str.includes(":1:11)"));
+    do_check_true(str.contains(":1:11)"));
   }
 });
--- a/toolkit/modules/tests/xpcshell/test_task.js
+++ b/toolkit/modules/tests/xpcshell/test_task.js
@@ -547,17 +547,17 @@ add_test(function test_throw_stack_do_no
         for (let i = 0; i < iter_a; ++i) {
           yield Promise.resolve();
         }
         throw new Error("BOOM");
       }).then(do_throw, function(ex) {
         do_check_rewritten_stack(["task_a",
                                   "test_throw_stack_do_not_capture_the_wrong_task"],
                                   ex);
-        do_check_true(!ex.stack.includes("task_b"));
+        do_check_true(!ex.stack.contains("task_b"));
         run_next_test();
       });
       Task.spawn(function* task_b() {
         for (let i = 0; i < iter_b; ++i) {
           yield Promise.resolve();
         }
       });
     }
--- a/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
@@ -184,17 +184,17 @@ add_task(function* uninstall_bootstrap()
   let [pe, pd, ue, ud] = yield promiseAddonsByIDs([
          "packed-enabled@tests.mozilla.org",
          "packed-disabled@tests.mozilla.org",
          "unpacked-enabled@tests.mozilla.org",
          "unpacked-disabled@tests.mozilla.org"
          ]);
   pe.uninstall();
   let xpiState = Services.prefs.getCharPref("extensions.xpiState");
-  do_check_false(xpiState.includes("\"packed-enabled@tests.mozilla.org\""));
+  do_check_false(xpiState.contains("\"packed-enabled@tests.mozilla.org\""));
 });
 
 /*
  * Installing a restartless add-on should immediately add it to XPIState
  */
 add_task(function* install_bootstrap() {
   let XS = getXS();
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js
@@ -107,20 +107,20 @@ function test() {
 }
 
 function endThisTest() {
   is(gResults.length, 2, "Should have two urls");
   isnot(gResults[0].loc, gResults[1].loc, "Should not have results from the same page.");
   isnot(gResults[0].xpi, gResults[1].xpi, "Should not have the same XPIs.");
   for (let i = 0; i < 2; i++) {
     let {loc, xpi} = gResults[i];
-    if (loc.includes("example.org")) {
-      ok(xpi.includes("example.org"), "Should get .org XPI for .org loc");
-    } else if (loc.includes("example.com")) {
-      ok(xpi.includes("example.com"), "Should get .com XPI for .com loc");
+    if (loc.contains("example.org")) {
+      ok(xpi.contains("example.org"), "Should get .org XPI for .org loc");
+    } else if (loc.contains("example.com")) {
+      ok(xpi.contains("example.com"), "Should get .com XPI for .com loc");
     } else {
       ok(false, "Should never get anything that isn't from example.org or example.com");
     }
   }
 
   finish();
 }
 
--- a/toolkit/webapps/tests/test_hosted_uninstall.xul
+++ b/toolkit/webapps/tests/test_hosted_uninstall.xul
@@ -103,17 +103,17 @@ let runTest = Task.async(function*() {
   }
   // On Mac, the app is moved to the trash, it is still considered launchable
   // (because it does have a install path).
   if (!MAC) {
     ok(!WebappOSUtils.isLaunchable(app), "App not launchable");
     is(WebappOSUtils.getInstallPath(app), null, "getInstallPath == null");
   } else {
     testAppInfo.trashDir = WebappOSUtils.getInstallPath(app);
-    ok(testAppInfo.trashDir.includes(".Trash"), "App moved to Trash");
+    ok(testAppInfo.trashDir.contains(".Trash"), "App moved to Trash");
   }
 
   is(WebappOSUtils.launch(app), false, "Launch fails");
 
   // On Mac, after we've tried to launch the app, its install path becomes null
   // We can now repeat the tests we've already done on the other platforms:
   if (MAC) {
     while (WebappOSUtils.isLaunchable(app)) {
--- a/toolkit/webapps/tests/test_packaged_uninstall.xul
+++ b/toolkit/webapps/tests/test_packaged_uninstall.xul
@@ -113,17 +113,17 @@ let runTest = Task.async(function*() {
 
   // On Mac, the app is moved to the trash, it is still considered launchable
   // (because it does have a install path).
   if (!MAC) {
     ok(!WebappOSUtils.isLaunchable(app), "App not launchable");
     is(WebappOSUtils.getInstallPath(app), null, "getInstallPath == null");
   } else {
     testAppInfo.trashDir = WebappOSUtils.getInstallPath(app);
-    ok(testAppInfo.trashDir.includes(".Trash"), "App moved to Trash");
+    ok(testAppInfo.trashDir.contains(".Trash"), "App moved to Trash");
   }
 
   is(WebappOSUtils.launch(app), false, "Launch fails");
 
   // On Mac, after we've tried to launch the app, its install path becomes null
   // We can now repeat the tests we've already done on the other platforms:
   if (MAC) {
     while (WebappOSUtils.isLaunchable(app)) {
--- a/webapprt/content/downloads/downloads.js
+++ b/webapprt/content/downloads/downloads.js
@@ -471,17 +471,17 @@ DownloadItem.prototype = {
   /**
    * Check if the download matches the provided search term based on the texts
    * shown to the user. All search terms are checked to see if each matches any
    * of the displayed texts.
    *
    * @return Boolean true if it matches the search; false otherwise
    */
   matchesSearch: function(aTerms, aAttributes) {
-    return aTerms.some(term => aAttributes.some(attr => this.element.getAttribute(attr).includes(term)));
+    return aTerms.some(term => aAttributes.some(attr => this.element.getAttribute(attr).contains(term)));
   },
 
   isCommandEnabled: function(aCommand) {
     switch (aCommand) {
       case "cmd_cancel":
         return this.inProgress;
 
       case "cmd_open":