Merge mozilla-central to mozilla-inbound. a=merge
authorDaniel Varga <dvarga@mozilla.com>
Thu, 25 Oct 2018 19:20:33 +0300
changeset 491319 6d5587e42c0c5812bb38e33219b6c36555cd3494
parent 491298 f93013d0b826fb2377fd5fa4f5b9abec8e03fb1e (current diff)
parent 491318 37d240a1d498bd1662e0f9d6053ee75ccdb90786 (diff)
child 491320 efe5af408bffa6ef648efd2152405ffa8ddecafe
push id247
push userfmarier@mozilla.com
push dateSat, 27 Oct 2018 01:06:44 +0000
reviewersmerge
milestone65.0a1
Merge mozilla-central to mozilla-inbound. a=merge
build/build-clang/clang-6-linux64.json
taskcluster/scripts/misc/build-clang-6-linux.sh
--- a/browser/base/content/test/general/browser_visibleTabs_tabPreview.js
+++ b/browser/base/content/test/general/browser_visibleTabs_tabPreview.js
@@ -6,30 +6,29 @@ add_task(async function test() {
   await SpecialPowers.pushPrefEnv({"set": [["browser.ctrlTab.recentlyUsedOrder", true]]});
 
   let [origTab] = gBrowser.visibleTabs;
   let tabOne = BrowserTestUtils.addTab(gBrowser);
   let tabTwo = BrowserTestUtils.addTab(gBrowser);
 
   // test the ctrlTab.tabList
   pressCtrlTab();
-  is(ctrlTab.tabList.length, 3, "Show 3 tabs in tab preview");
+  ok(ctrlTab.isOpen, "With 3 tab open, Ctrl+Tab opens the preview panel");
+  is(ctrlTab.tabList.length, 3, "Ctrl+Tab panel displays all visible tabs");
   releaseCtrl();
 
   gBrowser.showOnlyTheseTabs([origTab]);
   pressCtrlTab();
-
-  // XXX: Switched to from ok() to todo_is() in Bug 1467712. Follow up in 1500959
-  // `ctrlTab.tabList.length` is still equal to 3 at this step.
-  todo_is(ctrlTab.tabList.length, 1, "Show 1 tab in tab preview");
   ok(!ctrlTab.isOpen, "With 1 tab open, Ctrl+Tab doesn't open the preview panel");
+  releaseCtrl();
 
   gBrowser.showOnlyTheseTabs([origTab, tabOne, tabTwo]);
   pressCtrlTab();
-  ok(ctrlTab.isOpen, "With 3 tabs open, Ctrl+Tab does open the preview panel");
+  ok(ctrlTab.isOpen, "Ctrl+Tab opens the preview panel after re-showing hidden tabs");
+  is(ctrlTab.tabList.length, 3, "Ctrl+Tab panel displays all visible tabs after re-showing hidden ones");
   releaseCtrl();
 
   // cleanup
   gBrowser.removeTab(tabOne);
   gBrowser.removeTab(tabTwo);
 });
 
 function pressCtrlTab(aShiftKey) {
--- a/browser/components/controlcenter/content/panel.inc.xul
+++ b/browser/components/controlcenter/content/panel.inc.xul
@@ -2,16 +2,17 @@
    - 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/. -->
 
 <panel id="identity-popup"
        type="arrow"
        hidden="true"
        photon="true"
        role="alertdialog"
+       aria-labelledby="identity-popup-mainView-panel-header-span"
        onpopupshown="gIdentityHandler.onPopupShown(event);"
        onpopuphidden="gIdentityHandler.onPopupHidden(event);"
        orient="vertical">
 
   <panelmultiview id="identity-popup-multiView"
                   mainViewId="identity-popup-mainView">
     <panelview id="identity-popup-mainView"
                descriptionheightworkaround="true">
--- a/browser/components/places/PlacesUIUtils.jsm
+++ b/browser/components/places/PlacesUIUtils.jsm
@@ -709,20 +709,16 @@ var PlacesUIUtils = {
         where = "tab";
       }
       if (where == "tab" && browserWindow.isTabEmpty(browserWindow.gBrowser.selectedTab)) {
         where = "current";
       }
     }
 
     this._openNodeIn(aNode, where, window);
-    let view = this.getViewForNode(aEvent.target);
-    if (view && view.controller.hasCachedLivemarkInfo(aNode.parent)) {
-      Services.telemetry.scalarAdd("browser.feeds.livebookmark_item_opened", 1);
-    }
   },
 
   /**
    * Loads the node's URL in the appropriate tab or window.
    * see also openUILinkIn
    */
   openNodeIn: function PUIU_openNodeIn(aNode, aWhere, aView, aPrivate) {
     let window = aView.ownerWindow;
--- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js
@@ -927,19 +927,16 @@ PlacesViewBase.prototype = {
     // Remove any delayed element, see _cleanPopup for details.
     if ("_delayedRemovals" in popup) {
       while (popup._delayedRemovals.length > 0) {
         popup.removeChild(popup._delayedRemovals.shift());
       }
     }
 
     if (popup._placesNode && PlacesUIUtils.getViewForNode(popup) == this) {
-      if (this.controller.hasCachedLivemarkInfo(popup._placesNode)) {
-        Services.telemetry.scalarAdd("browser.feeds.livebookmark_opened", 1);
-      }
       if (!popup._placesNode.containerOpen)
         popup._placesNode.containerOpen = true;
       if (!popup._built)
         this._rebuildPopup(popup);
 
       this._mayAddCommandsItems(popup);
     }
   },
deleted file mode 100644
--- a/build/build-clang/clang-6-linux64.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "llvm_revision": "335538",
-    "stages": "3",
-    "build_libcxx": true,
-    "build_type": "Release",
-    "assertions": false,
-    "llvm_repo": "https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_601/final",
-    "clang_repo": "https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_601/final",
-    "lld_repo": "https://llvm.org/svn/llvm-project/lld/tags/RELEASE_601/final",
-    "compiler_repo": "https://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_601/final",
-    "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_601/final",
-    "libcxxabi_repo": "https://llvm.org/svn/llvm-project/libcxxabi/tags/RELEASE_601/final",
-    "python_path": "/usr/bin/python2.7",
-    "gcc_dir": "/builds/worker/workspace/build/src/gcc",
-    "cc": "/builds/worker/workspace/build/src/gcc/bin/gcc",
-    "cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
-    "as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
-    "patches": [
-      "static-llvm-symbolizer.patch",
-      "find_symbolizer_linux.patch",
-      "r322325.patch",
-      "r322401.patch",
-      "r325356.patch",
-      "r339636.patch"
-    ]
-}
--- a/build/unix/build-hfsplus/build-hfsplus.sh
+++ b/build/unix/build-hfsplus/build-hfsplus.sh
@@ -1,10 +1,14 @@
 #!/bin/bash
 
+# hfsplus needs to be rebuilt when changing the clang version used to build it.
+# Until bug 1471905 is addressed, increase the following number
+# when that happens: 1
+
 set -e
 set -x
 
 hfplus_version=540.1.linux3
 md5sum=0435afc389b919027b69616ad1b05709
 filename=diskdev_cmds-${hfplus_version}.tar.gz
 make_flags="-j$(getconf _NPROCESSORS_ONLN)"
 
--- a/devtools/client/aboutdebugging-new/src/actions/ui.js
+++ b/devtools/client/aboutdebugging-new/src/actions/ui.js
@@ -11,20 +11,23 @@ const {
   ADB_ADDON_UNINSTALL_START,
   ADB_ADDON_UNINSTALL_SUCCESS,
   ADB_ADDON_UNINSTALL_FAILURE,
   ADB_ADDON_STATUS_UPDATED,
   DEBUG_TARGET_COLLAPSIBILITY_UPDATED,
   NETWORK_LOCATIONS_UPDATED,
   PAGE_SELECTED,
   PAGES,
+  USB_RUNTIMES_SCAN_START,
+  USB_RUNTIMES_SCAN_SUCCESS,
 } = require("../constants");
 
 const NetworkLocationsModule = require("../modules/network-locations");
 const { adbAddon } = require("devtools/shared/adb/adb-addon");
+const { refreshUSBRuntimes } = require("../modules/usb-runtimes");
 
 const Actions = require("./index");
 
 // XXX: Isolating the code here, because it feels wrong to rely solely on the page "not"
 // being CONNECT to decide what to do. Should we have a page "type" on top of page "id"?
 function _isRuntimePage(page) {
   return page && page !== PAGES.CONNECT;
 }
@@ -97,18 +100,32 @@ function uninstallAdbAddon() {
       await adbAddon.uninstall();
       dispatch({ type: ADB_ADDON_UNINSTALL_SUCCESS });
     } catch (e) {
       dispatch({ type: ADB_ADDON_UNINSTALL_FAILURE, error: e });
     }
   };
 }
 
+function scanUSBRuntimes() {
+  return async (dispatch, getState) => {
+    // do not re-scan if we are already doing it
+    if (getState().ui.isScanningUsb) {
+      return;
+    }
+
+    dispatch({ type: USB_RUNTIMES_SCAN_START });
+    await refreshUSBRuntimes();
+    dispatch({ type: USB_RUNTIMES_SCAN_SUCCESS });
+  };
+}
+
 module.exports = {
   addNetworkLocation,
   installAdbAddon,
   removeNetworkLocation,
+  scanUSBRuntimes,
   selectPage,
   uninstallAdbAddon,
   updateAdbAddonStatus,
   updateDebugTargetCollapsibility,
   updateNetworkLocations,
 };
--- a/devtools/client/aboutdebugging-new/src/components/App.js
+++ b/devtools/client/aboutdebugging-new/src/components/App.js
@@ -23,16 +23,17 @@ class App extends PureComponent {
   static get propTypes() {
     return {
       adbAddonStatus: PropTypes.string,
       // The "dispatch" helper is forwarded to the App component via connect.
       // From that point, components are responsible for forwarding the dispatch
       // property to all components who need to dispatch actions.
       dispatch: PropTypes.func.isRequired,
       fluentBundles: PropTypes.arrayOf(PropTypes.object).isRequired,
+      isScanningUsb: PropTypes.bool.isRequired,
       networkEnabled: PropTypes.bool.isRequired,
       networkLocations: PropTypes.arrayOf(PropTypes.string).isRequired,
       networkRuntimes: PropTypes.arrayOf(Types.runtime).isRequired,
       selectedPage: PropTypes.string,
       usbRuntimes: PropTypes.arrayOf(Types.runtime).isRequired,
       wifiEnabled: PropTypes.bool.isRequired,
     };
   }
@@ -67,30 +68,32 @@ class App extends PureComponent {
     }
   }
 
   render() {
     const {
       adbAddonStatus,
       dispatch,
       fluentBundles,
+      isScanningUsb,
       networkRuntimes,
       selectedPage,
       usbRuntimes,
     } = this.props;
 
     return LocalizationProvider(
       { messages: fluentBundles },
       dom.div(
         { className: "app" },
         Sidebar(
           {
             adbAddonStatus,
             className: "app__sidebar",
             dispatch,
+            isScanningUsb,
             networkRuntimes,
             selectedPage,
             usbRuntimes,
           }
         ),
         dom.main(
           { className: "app__content" },
           this.getSelectedPageComponent()
@@ -98,16 +101,17 @@ class App extends PureComponent {
       )
     );
   }
 }
 
 const mapStateToProps = state => {
   return {
     adbAddonStatus: state.ui.adbAddonStatus,
+    isScanningUsb: state.ui.isScanningUsb,
     networkEnabled: state.ui.networkEnabled,
     networkLocations: state.ui.networkLocations,
     networkRuntimes: state.runtimes.networkRuntimes,
     selectedPage: state.ui.selectedPage,
     usbRuntimes: state.runtimes.usbRuntimes,
     wifiEnabled: state.ui.wifiEnabled,
   };
 };
--- a/devtools/client/aboutdebugging-new/src/components/connect/ConnectPage.js
+++ b/devtools/client/aboutdebugging-new/src/components/connect/ConnectPage.js
@@ -116,17 +116,17 @@ class ConnectPage extends PureComponent 
     const disabled = usbStatus === USB_STATES.UPDATING_USB;
 
     return Localized(
       {
         id: localizedState,
       },
       dom.button(
         {
-          className: "std-button connect-page__usb__toggle-button " +
+          className: "default-button connect-page__usb__toggle-button " +
                      "js-connect-usb-toggle-button",
           disabled,
           onClick: () => this.onToggleUSBClick(),
         },
         localizedState
       )
     );
   }
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/RefreshDevicesButton.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
+const dom = require("devtools/client/shared/vendor/react-dom-factories");
+
+const FluentReact = require("devtools/client/shared/vendor/fluent-react");
+const Localized = createFactory(FluentReact.Localized);
+
+const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
+const Actions = require("../../actions/index");
+
+class RefreshDevicesButton extends PureComponent {
+  static get propTypes() {
+    return {
+      dispatch: PropTypes.func.isRequired,
+      isScanning: PropTypes.bool.isRequired,
+    };
+  }
+
+  refreshDevices() {
+    this.props.dispatch(Actions.scanUSBRuntimes());
+  }
+
+  render() {
+    return Localized(
+      { id: "about-debugging-refresh-usb-devices-button" },
+      dom.button(
+        {
+          className: "default-button",
+          disabled: this.props.isScanning,
+          onClick: () => this.refreshDevices(),
+        },
+        "Refresh devices"
+      )
+    );
+  }
+}
+
+module.exports = RefreshDevicesButton;
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.css
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.css
@@ -3,9 +3,13 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 .sidebar__devices__message {
   color: var(--grey-40);
   display: inline-block;
   padding: 12px 0;
   text-align: center;
   width: 100%;
-}
\ No newline at end of file
+}
+
+.sidebar__refresh-usb {
+  text-align: center;
+}
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
@@ -10,29 +10,32 @@ const PropTypes = require("devtools/clie
 
 const FluentReact = require("devtools/client/shared/vendor/fluent-react");
 const Localized = createFactory(FluentReact.Localized);
 
 const { PAGES, RUNTIMES } = require("../../constants");
 const Types = require("../../types");
 loader.lazyRequireGetter(this, "ADB_ADDON_STATES", "devtools/shared/adb/adb-addon", true);
 
+const SidebarItem = createFactory(require("./SidebarItem"));
 const SidebarFixedItem = createFactory(require("./SidebarFixedItem"));
 const SidebarRuntimeItem = createFactory(require("./SidebarRuntimeItem"));
+const RefreshDevicesButton = createFactory(require("./RefreshDevicesButton"));
 const FIREFOX_ICON = "chrome://devtools/skin/images/aboutdebugging-firefox-logo.svg";
 const CONNECT_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 const GLOBE_ICON = "chrome://devtools/skin/images/globe.svg";
 const USB_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 
 class Sidebar extends PureComponent {
   static get propTypes() {
     return {
       adbAddonStatus: PropTypes.string,
       className: PropTypes.string,
       dispatch: PropTypes.func.isRequired,
+      isScanningUsb: PropTypes.bool.isRequired,
       networkRuntimes: PropTypes.arrayOf(Types.runtime).isRequired,
       selectedPage: PropTypes.string,
       usbRuntimes: PropTypes.arrayOf(Types.runtime).isRequired,
     };
   }
 
   renderAdbAddonStatus() {
     const isAddonInstalled = this.props.adbAddonStatus === ADB_ADDON_STATES.INSTALLED;
@@ -45,31 +48,44 @@ class Sidebar extends PureComponent {
         {
           className: "sidebar__devices__message js-sidebar-usb-status",
         },
         localizationId
       )
     );
   }
 
-  renderDevices() {
-    const { networkRuntimes, usbRuntimes } = this.props;
-    if (!networkRuntimes.length && !usbRuntimes.length) {
-      return Localized(
+  renderDevicesEmpty() {
+    return SidebarItem(
+      {
+        isSelected: false,
+        selectable: false,
+      },
+      Localized(
         {
           id: "about-debugging-sidebar-no-devices",
-        }, dom.aside(
+        },
+        dom.aside(
           {
             className: "sidebar__devices__message js-sidebar-no-devices",
           },
           "No devices discovered"
         )
-      );
+      )
+    );
+  }
+
+  renderDevices() {
+    const { networkRuntimes, usbRuntimes } = this.props;
+
+    // render a "no devices" messages when the lists are empty
+    if (!networkRuntimes.length && !usbRuntimes.length) {
+      return this.renderDevicesEmpty();
     }
-
+    // render all devices otherwise
     return [
       ...this.renderSidebarItems(GLOBE_ICON, networkRuntimes),
       ...this.renderSidebarItems(USB_ICON, usbRuntimes),
     ];
   }
 
   renderSidebarItems(icon, runtimes) {
     const { dispatch, selectedPage } = this.props;
@@ -88,17 +104,17 @@ class Sidebar extends PureComponent {
         key: pageId,
         name: runtime.name,
         runtimeId: runtime.id,
       });
     });
   }
 
   render() {
-    const { dispatch, selectedPage } = this.props;
+    const { dispatch, selectedPage, isScanningUsb } = this.props;
 
     return dom.aside(
       {
         className: `sidebar ${this.props.className || ""}`,
       },
       dom.ul(
         {},
         Localized(
@@ -117,17 +133,34 @@ class Sidebar extends PureComponent {
           SidebarFixedItem({
             id: PAGES.CONNECT,
             dispatch,
             icon: CONNECT_ICON,
             isSelected: PAGES.CONNECT === selectedPage,
             name: "Connect",
           })
         ),
-        dom.hr({ className: "separator" }),
-        this.renderAdbAddonStatus(),
-        this.renderDevices()
+        SidebarItem(
+          {
+            isSelected: false,
+            selectable: false,
+          },
+          dom.hr({ className: "separator" }),
+          this.renderAdbAddonStatus(),
+        ),
+        this.renderDevices(),
+        SidebarItem(
+          {
+            className: "sidebar-item--breathe sidebar__refresh-usb",
+            isSelected: false,
+            selectable: false,
+          },
+          RefreshDevicesButton({
+            dispatch,
+            isScanning: isScanningUsb,
+          })
+        ),
       )
     );
   }
 }
 
 module.exports = Sidebar;
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.css
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.css
@@ -23,8 +23,13 @@
 
 .sidebar-item--selectable:hover {
   background-color: var(--sidebar-background-hover);
 }
 
 .sidebar-item--selected {
   color: var(--sidebar-selected-color);
 }
+
+.sidebar-item--breathe {
+  margin-block-start: calc(2 * var(--base-distance));
+  margin-block-end: calc(2 * var(--base-distance));
+}
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.js
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.js
@@ -9,21 +9,29 @@ const dom = require("devtools/client/sha
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
 /**
  * This component is used as a wrapper by items in the sidebar.
  */
 class SidebarItem extends PureComponent {
   static get propTypes() {
     return {
-      children: PropTypes.arrayOf(PropTypes.element).isRequired,
+      children: PropTypes.node.isRequired,
       className: PropTypes.string,
       isSelected: PropTypes.bool.isRequired,
       selectable: PropTypes.bool.isRequired,
-      onSelect: PropTypes.func.isRequired,
+      // only require `onSelect` function when `selectable` is true
+      onSelect: (props, propName, componentName) => {
+        const isFn = props[propName] && typeof props[propName] === "function";
+        if (props.selectable && !isFn) {
+          return new Error(`Missing ${propName} function supplied to ${componentName}. ` +
+            "(you must set this prop when selectable is true)");
+        }
+        return null; // for eslint (consistent-return rule)
+      },
     };
   }
 
   onItemClick() {
     this.props.onSelect();
   }
 
   render() {
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/moz.build
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/moz.build
@@ -1,13 +1,14 @@
 # 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/.
 
 DevToolsModules(
+    'RefreshDevicesButton.js',
     'Sidebar.css',
     'Sidebar.js',
     'SidebarFixedItem.css',
     'SidebarFixedItem.js',
     'SidebarItem.css',
     'SidebarItem.js',
     'SidebarRuntimeItem.css',
     'SidebarRuntimeItem.js',
--- a/devtools/client/aboutdebugging-new/src/constants.js
+++ b/devtools/client/aboutdebugging-new/src/constants.js
@@ -31,16 +31,18 @@ const actionTypes = {
   REQUEST_WORKERS_START: "REQUEST_WORKERS_START",
   REQUEST_WORKERS_SUCCESS: "REQUEST_WORKERS_SUCCESS",
   UNWATCH_RUNTIME_FAILURE: "UNWATCH_RUNTIME_FAILURE",
   UNWATCH_RUNTIME_START: "UNWATCH_RUNTIME_START",
   UNWATCH_RUNTIME_SUCCESS: "UNWATCH_RUNTIME_SUCCESS",
   UPDATE_CONNECTION_PROMPT_SETTING_FAILURE: "UPDATE_CONNECTION_PROMPT_SETTING_FAILURE",
   UPDATE_CONNECTION_PROMPT_SETTING_START: "UPDATE_CONNECTION_PROMPT_SETTING_START",
   UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS: "UPDATE_CONNECTION_PROMPT_SETTING_SUCCESS",
+  USB_RUNTIMES_SCAN_START: "USB_RUNTIMES_SCAN_START",
+  USB_RUNTIMES_SCAN_SUCCESS: "USB_RUNTIMES_SCAN_SUCCESS",
   USB_RUNTIMES_UPDATED: "USB_RUNTIMES_UPDATED",
   WATCH_RUNTIME_FAILURE: "WATCH_RUNTIME_FAILURE",
   WATCH_RUNTIME_START: "WATCH_RUNTIME_START",
   WATCH_RUNTIME_SUCCESS: "WATCH_RUNTIME_SUCCESS",
 };
 
 const DEBUG_TARGETS = {
   EXTENSION: "EXTENSION",
--- a/devtools/client/aboutdebugging-new/src/modules/usb-runtimes.js
+++ b/devtools/client/aboutdebugging-new/src/modules/usb-runtimes.js
@@ -32,8 +32,13 @@ function getUSBRuntimes() {
   return adbScanner.listRuntimes();
 }
 exports.getUSBRuntimes = getUSBRuntimes;
 
 function removeUSBRuntimesObserver(listener) {
   adbScanner.off("runtime-list-updated", listener);
 }
 exports.removeUSBRuntimesObserver = removeUSBRuntimesObserver;
+
+function refreshUSBRuntimes() {
+  return adbScanner.scan();
+}
+exports.refreshUSBRuntimes = refreshUSBRuntimes;
--- a/devtools/client/aboutdebugging-new/src/reducers/ui-state.js
+++ b/devtools/client/aboutdebugging-new/src/reducers/ui-state.js
@@ -4,23 +4,26 @@
 
 "use strict";
 
 const {
   ADB_ADDON_STATUS_UPDATED,
   DEBUG_TARGET_COLLAPSIBILITY_UPDATED,
   NETWORK_LOCATIONS_UPDATED,
   PAGE_SELECTED,
+  USB_RUNTIMES_SCAN_START,
+  USB_RUNTIMES_SCAN_SUCCESS,
 } = require("../constants");
 
 function UiState(locations = [], debugTargetCollapsibilities = {},
                  networkEnabled = false, wifiEnabled = false) {
   return {
     adbAddonStatus: null,
     debugTargetCollapsibilities,
+    isScanningUsb: false,
     networkEnabled,
     networkLocations: locations,
     selectedPage: null,
     wifiEnabled,
   };
 }
 
 function uiReducer(state = UiState(), action) {
@@ -42,16 +45,24 @@ function uiReducer(state = UiState(), ac
       return Object.assign({}, state, { networkLocations: locations });
     }
 
     case PAGE_SELECTED: {
       const { page } = action;
       return Object.assign({}, state, { selectedPage: page });
     }
 
+    case USB_RUNTIMES_SCAN_START: {
+      return Object.assign({}, state, { isScanningUsb: true });
+    }
+
+    case USB_RUNTIMES_SCAN_SUCCESS: {
+      return Object.assign({}, state, { isScanningUsb: false });
+    }
+
     default:
       return state;
   }
 }
 
 module.exports = {
   UiState,
   uiReducer,
--- a/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
+++ b/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
@@ -31,16 +31,20 @@ about-debugging-sidebar-no-devices = No 
 # Text displayed in buttons found in sidebar items representing remote runtimes.
 # Clicking on the button will attempt to connect to the runtime.
 about-debugging-sidebar-item-connect-button = Connect
 
 # Temporary text displayed in sidebar items representing remote runtimes after
 # successfully connecting to them. Temporary UI, do not localize.
 about-debugging-sidebar-item-connected-label = Connected
 
+# Temporary text displayed in a sidebar button to refresh USB devices. Temporary
+# UI, do not localize.
+about-debugging-refresh-usb-devices-button = Refresh devices
+
 # Title of the Connect page.
 about-debugging-connect-title = Connect a Device
 
 # WiFi section of the Connect page
 about-debugging-connect-wifi
   .title = Via WiFi
 
 # Temporary text displayed when wifi support is turned off via preferences.
--- a/devtools/client/inspector/rules/test/browser.ini
+++ b/devtools/client/inspector/rules/test/browser.ini
@@ -213,16 +213,17 @@ skip-if = (os == "win" && debug) # bug 9
 [browser_rules_multiple-properties-priority.js]
 [browser_rules_multiple-properties-unfinished_01.js]
 [browser_rules_multiple-properties-unfinished_02.js]
 [browser_rules_multiple_properties_01.js]
 [browser_rules_multiple_properties_02.js]
 [browser_rules_non_ascii.js]
 [browser_rules_original-source-link.js]
 [browser_rules_original-source-link2.js]
+[browser_rules_preview-tooltips-sizes.js]
 [browser_rules_pseudo-element_01.js]
 [browser_rules_pseudo-element_02.js]
 [browser_rules_pseudo_lock_options.js]
 [browser_rules_refresh-no-flicker.js]
 [browser_rules_refresh-on-attribute-change_01.js]
 [browser_rules_refresh-on-style-change.js]
 [browser_rules_search-filter-computed-list_01.js]
 [browser_rules_search-filter-computed-list_02.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/rules/test/browser_rules_preview-tooltips-sizes.js
@@ -0,0 +1,69 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test that the dimensions of the preview tooltips are correctly updated to fit their
+// content.
+
+// Small 32x32 image.
+const BASE_64_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr" +
+  "0AAAAUElEQVRYR+3UsQkAQAhD0TjJ7T+Wk3gbxMIizbcVITwwJWlkZtptpXp+v94TAAEE4gLTvgfOf770RB" +
+  "EAAQTiAvEiIgACCMQF4kVEAAQQSAt8xsyeAW6R8eIAAAAASUVORK5CYII=";
+
+add_task(async function() {
+  await addTab("data:text/html;charset=utf-8," +
+    encodeURIComponent(`
+      <style>
+        html {
+          /* Using a long variable name to ensure preview tooltip for variable will be */
+          /* wider than the preview tooltip for the test 32x32 image. */
+          --test-var-wider-than-image: red;
+        }
+
+        div {
+          color: var(--test-var-wider-than-image);
+          background: url(${BASE_64_URL});
+        }
+      </style>
+      <div id="target">inspect me</div>
+    `));
+  const {inspector, view} = await openRuleView();
+  await selectNode("#target", inspector);
+
+  // Retrieve the element for `--test-var` on which the CSS variable tooltip will appear.
+  const colorPropertySpan = getRuleViewProperty(view, "div", "color").valueSpan;
+  const colorVariableElement = colorPropertySpan.querySelector(".ruleview-variable");
+
+  // Retrieve the element for the background url on which the image preview will appear.
+  const backgroundPropertySpan = getRuleViewProperty(view, "div", "background").valueSpan;
+  const backgroundUrlElement = backgroundPropertySpan.querySelector(".theme-link");
+
+  info("Show preview tooltip for CSS variable");
+  let previewTooltip = await assertShowPreviewTooltip(view, colorVariableElement);
+  // Measure tooltip dimensions.
+  let tooltipRect = previewTooltip.panel.getBoundingClientRect();
+  const originalHeight = tooltipRect.height;
+  const originalWidth = tooltipRect.width;
+  info(`Original dimensions: ${originalWidth} x ${originalHeight}`);
+  await assertTooltipHiddenOnMouseOut(previewTooltip, colorVariableElement);
+
+  info("Show preview tooltip for background url");
+  previewTooltip = await assertShowPreviewTooltip(view, backgroundUrlElement);
+  // Compare new tooltip dimensions to previous measures.
+  tooltipRect = previewTooltip.panel.getBoundingClientRect();
+  info(`Image preview dimensions: ${tooltipRect.width} x ${tooltipRect.height}`);
+  ok(tooltipRect.height > originalHeight, "Tooltip is taller for image preview");
+  ok(tooltipRect.width < originalWidth, "Tooltip is narrower for image preview");
+  await assertTooltipHiddenOnMouseOut(previewTooltip, colorVariableElement);
+
+  info("Show preview tooltip for CSS variable again");
+  previewTooltip = await assertShowPreviewTooltip(view, colorVariableElement);
+  // Check measures are identical to initial ones.
+  tooltipRect = previewTooltip.panel.getBoundingClientRect();
+  info(`CSS variable tooltip dimensions: ${tooltipRect.width} x ${tooltipRect.height}`);
+  is(tooltipRect.height, originalHeight, "Tooltip has the same height as the original");
+  is(tooltipRect.width, originalWidth, "Tooltip has the same width as the original");
+  await assertTooltipHiddenOnMouseOut(previewTooltip, colorVariableElement);
+});
--- a/devtools/client/shared/widgets/tooltip/ImageTooltipHelper.js
+++ b/devtools/client/shared/widgets/tooltip/ImageTooltipHelper.js
@@ -133,13 +133,14 @@ function setImageTooltip(tooltip, doc, i
 function setBrokenImageTooltip(tooltip, doc) {
   const div = doc.createElementNS(XHTML_NS, "div");
   div.className = "theme-comment devtools-tooltip-image-broken";
   const message = L10N.getStr("previewTooltip.image.brokenImage");
   div.textContent = message;
 
   tooltip.panel.innerHTML = "";
   tooltip.panel.appendChild(div);
+  tooltip.setContentSize({width: "auto", height: "auto"});
 }
 
 module.exports.getImageDimensions = getImageDimensions;
 module.exports.setImageTooltip = setImageTooltip;
 module.exports.setBrokenImageTooltip = setBrokenImageTooltip;
--- a/devtools/client/shared/widgets/tooltip/VariableTooltipHelper.js
+++ b/devtools/client/shared/widgets/tooltip/VariableTooltipHelper.js
@@ -20,11 +20,12 @@ const XHTML_NS = "http://www.w3.org/1999
 function setVariableTooltip(tooltip, doc, text) {
   // Create tooltip content
   const div = doc.createElementNS(XHTML_NS, "div");
   div.classList.add("devtools-monospace", "devtools-tooltip-css-variable");
   div.textContent = text;
 
   tooltip.panel.innerHTML = "";
   tooltip.panel.appendChild(div);
+  tooltip.setContentSize({width: "auto", height: "auto"});
 }
 
 module.exports.setVariableTooltip = setVariableTooltip;
--- a/devtools/server/actors/highlighters/flexbox.js
+++ b/devtools/server/actors/highlighters/flexbox.js
@@ -61,16 +61,28 @@ const JUSTIFY_CONTENT = "justify-content
  *
  * Available Options:
  * - color(colorValue)
  *     @param  {String} colorValue
  *     The color that should be used to draw the highlighter for this flexbox.
  * - showAlignment(isShown)
  *     @param  {Boolean} isShown
  *     Shows the alignment in the flexbox highlighter.
+ *
+ * Structure:
+ * <div class="highlighter-container">
+ *   <div id="flexbox-root" class="flexbox-root">
+ *     <canvas id="flexbox-canvas"
+ *             class="flexbox-canvas"
+ *             width="4096"
+ *             height="4096"
+ *             hidden="true">
+ *     </canvas>
+ *   </div>
+ * </div>
  */
 class FlexboxHighlighter extends AutoRefreshHighlighter {
   constructor(highlighterEnv) {
     super(highlighterEnv);
 
     this.ID_CLASS_PREFIX = "flexbox-";
 
     this.markup = new CanvasFrameAnonymousContentHelper(this.highlighterEnv,
@@ -678,18 +690,20 @@ class FlexboxHighlighter extends AutoRef
     this._winDimensions = getWindowDimensions(this.win);
     const { width, height } = this._winDimensions;
 
     // Updates the <canvas> element's position and size.
     // It also clear the <canvas>'s drawing context.
     updateCanvasElement(this.canvas, this._canvasPosition, this.win.devicePixelRatio);
 
     // Update the current matrix used in our canvas' rendering
-    const { currentMatrix, hasNodeTransformations } = getCurrentMatrix(this.currentNode,
-      this.win);
+    const { currentMatrix, hasNodeTransformations } =
+      getCurrentMatrix(this.currentNode, this.win, {
+        ignoreWritingModeAndTextDirection: true,
+      });
     this.currentMatrix = currentMatrix;
     this.hasNodeTransformations = hasNodeTransformations;
 
     this.renderFlexContainer();
     this.renderFlexLines();
     this.renderJustifyContent();
     this.renderFlexItems();
     this.renderAlignItemLine();
--- a/devtools/server/actors/highlighters/utils/canvas.js
+++ b/devtools/server/actors/highlighters/utils/canvas.js
@@ -279,23 +279,26 @@ function getBoundsFromPoints(points) {
  *
  *  The transformations of the element's ancestors are not currently computed (see
  *  bug 1355675).
  *
  * @param  {Element} element
  *         The current element.
  * @param  {Window} window
  *         The window object.
+ * @param  {Object} [options.ignoreWritingModeAndTextDirection=false]
+ *                  Avoid transforming the current matrix to match the text direction
+ *                  and writing mode.
  * @return {Object} An object with the following properties:
  *         - {Array} currentMatrix
  *           The current matrix.
  *         - {Boolean} hasNodeTransformations
  *           true if the node has transformed and false otherwise.
  */
-function getCurrentMatrix(element, window) {
+function getCurrentMatrix(element, window, { ignoreWritingModeAndTextDirection } = {}) {
   const computedStyle = getComputedStyle(element);
 
   const paddingTop = parseFloat(computedStyle.paddingTop);
   const paddingRight = parseFloat(computedStyle.paddingRight);
   const paddingBottom = parseFloat(computedStyle.paddingBottom);
   const paddingLeft = parseFloat(computedStyle.paddingLeft);
   const borderTop = parseFloat(computedStyle.borderTopWidth);
   const borderRight = parseFloat(computedStyle.borderRightWidth);
@@ -324,19 +327,22 @@ function getCurrentMatrix(element, windo
   currentMatrix = multiply(currentMatrix,
     translate(paddingLeft + borderLeft, paddingTop + borderTop));
 
   // Adjust as needed to match the writing mode and text direction of the element.
   const size = {
     width: element.offsetWidth - borderLeft - borderRight - paddingLeft - paddingRight,
     height: element.offsetHeight - borderTop - borderBottom - paddingTop - paddingBottom,
   };
-  const writingModeMatrix = getWritingModeMatrix(size, computedStyle);
-  if (!isIdentity(writingModeMatrix)) {
-    currentMatrix = multiply(currentMatrix, writingModeMatrix);
+
+  if (!ignoreWritingModeAndTextDirection) {
+    const writingModeMatrix = getWritingModeMatrix(size, computedStyle);
+    if (!isIdentity(writingModeMatrix)) {
+      currentMatrix = multiply(currentMatrix, writingModeMatrix);
+    }
   }
 
   return { currentMatrix, hasNodeTransformations };
 }
 
 /**
  * Given an array of four points, returns a string represent a path description.
  *
--- a/dom/xbl/nsXBLPrototypeBinding.cpp
+++ b/dom/xbl/nsXBLPrototypeBinding.cpp
@@ -716,42 +716,34 @@ nsXBLPrototypeBinding::ConstructInterfac
     // so that we don't have to convert from Unicode to ASCII and then back
 
     char* token = nsCRT::strtok( str, ", ", &newStr );
     while( token != nullptr ) {
       // get the InterfaceInfo for the name
       const nsXPTInterfaceInfo* iinfo = nsXPTInterfaceInfo::ByName(token);
 
       if (iinfo) {
-        // obtain an IID.
-        const nsIID* iid = nullptr;
-        iinfo->GetIIDShared(&iid);
-
-        if (iid) {
-          // We found a valid iid.  Add it to our table.
-          mInterfaceTable.Put(*iid, mBinding);
+        // Add the iid to our table.
+        mInterfaceTable.Put(iinfo->IID(), mBinding);
 
-          // this block adds the parent interfaces of each interface
-          // defined in the xbl definition (implements="nsI...")
-          const nsXPTInterfaceInfo* parentInfo;
-          // if it has a parent, add it to the table
-          while (NS_SUCCEEDED(iinfo->GetParent(&parentInfo)) && parentInfo) {
-            // get the iid
-            parentInfo->GetIIDShared(&iid);
+        // this block adds the parent interfaces of each interface
+        // defined in the xbl definition (implements="nsI...")
+        const nsXPTInterfaceInfo* parentInfo;
+        // if it has a parent, add it to the table
+        while ((parentInfo = iinfo->GetParent())) {
+          // don't add nsISupports to the table
+          if (parentInfo->IID().Equals(NS_GET_IID(nsISupports))) {
+            break;
+          }
 
-            // don't add nsISupports to the table
-            if (!iid || iid->Equals(NS_GET_IID(nsISupports)))
-              break;
+          // add the iid to the table
+          mInterfaceTable.Put(parentInfo->IID(), mBinding);
 
-            // add the iid to the table
-            mInterfaceTable.Put(*iid, mBinding);
-
-            // look for the next parent
-            iinfo = parentInfo;
-          }
+          // look for the next parent
+          iinfo = parentInfo;
         }
       }
 
       token = nsCRT::strtok( newStr, ", ", &newStr );
     }
   }
 
   return NS_OK;
--- a/js/xpconnect/src/XPCInlines.h
+++ b/js/xpconnect/src/XPCInlines.h
@@ -233,25 +233,23 @@ XPCNativeMember::GetInterface() const
     return reinterpret_cast<XPCNativeInterface*>(xpcNativeInterfaceStart);
 }
 
 /***************************************************************************/
 
 inline const nsIID*
 XPCNativeInterface::GetIID() const
 {
-    const nsIID* iid;
-    return NS_SUCCEEDED(mInfo->GetIIDShared(&iid)) ? iid : nullptr;
+    return &mInfo->IID();
 }
 
 inline const char*
 XPCNativeInterface::GetNameString() const
 {
-    const char* name;
-    return NS_SUCCEEDED(mInfo->GetNameShared(&name)) ? name : nullptr;
+    return mInfo->Name();
 }
 
 inline XPCNativeMember*
 XPCNativeInterface::FindMember(jsid name) const
 {
     const XPCNativeMember* member = mMembers;
     for (int i = (int) mMemberCount; i > 0; i--, member++) {
         if (member->GetName() == name) {
@@ -259,19 +257,17 @@ XPCNativeInterface::FindMember(jsid name
         }
     }
     return nullptr;
 }
 
 inline bool
 XPCNativeInterface::HasAncestor(const nsIID* iid) const
 {
-    bool found = false;
-    mInfo->HasAncestor(iid, &found);
-    return found;
+    return mInfo->HasAncestor(*iid);
 }
 
 /* static */
 inline size_t
 XPCNativeInterface::OffsetOfMembers()
 {
     return offsetof(XPCNativeInterface, mMembers);
 }
--- a/js/xpconnect/src/XPCJSID.cpp
+++ b/js/xpconnect/src/XPCJSID.cpp
@@ -304,34 +304,31 @@ nsJSIID::nsJSIID(const nsXPTInterfaceInf
 }
 
 nsJSIID::~nsJSIID() {}
 
 // If mInfo is present we use it and ignore mDetails, else we use mDetails.
 
 NS_IMETHODIMP nsJSIID::GetName(char * *aName)
 {
-    return mInfo->GetName(aName);
+    *aName = moz_xstrdup(mInfo->Name());
+    return NS_OK;
 }
 
 NS_IMETHODIMP nsJSIID::GetNumber(char * *aNumber)
 {
     char str[NSID_LENGTH];
-    const nsIID* id;
-    mInfo->GetIIDShared(&id);
-    id->ToProvidedString(str);
+    mInfo->IID().ToProvidedString(str);
     *aNumber = (char*) moz_xmemdup(str, NSID_LENGTH);
     return NS_OK;
 }
 
 NS_IMETHODIMP_(const nsID*) nsJSIID::GetID()
 {
-    const nsIID* id;
-    mInfo->GetIIDShared(&id);
-    return id;
+    return &mInfo->IID();
 }
 
 NS_IMETHODIMP nsJSIID::GetValid(bool* aValid)
 {
     *aValid = true;
     return NS_OK;
 }
 
@@ -341,43 +338,40 @@ NS_IMETHODIMP nsJSIID::Equals(nsIJSID* o
         return NS_ERROR_NULL_POINTER;
     }
 
     if (!other) {
         *_retval = false;
         return NS_OK;
     }
 
-    mInfo->IsIID(other->GetID(), _retval);
+    *_retval = mInfo->IID() == *other->GetID();
     return NS_OK;
 }
 
 NS_IMETHODIMP nsJSIID::Initialize(const char* idString)
 {
     return NS_ERROR_FAILURE;
 }
 
 NS_IMETHODIMP nsJSIID::ToString(char** _retval)
 {
-    return mInfo->GetName(_retval);
+    *_retval = moz_xstrdup(mInfo->Name());
+    return NS_OK;
 }
 
 // static
 already_AddRefed<nsJSIID>
 nsJSIID::NewID(const nsXPTInterfaceInfo* aInfo)
 {
     if (!aInfo) {
         NS_ERROR("no info");
         return nullptr;
     }
 
-    if (!aInfo->IsScriptable()) {
-        return nullptr;
-    }
-
     RefPtr<nsJSIID> idObj = new nsJSIID(aInfo);
     return idObj.forget();
 }
 
 
 NS_IMETHODIMP
 nsJSIID::Resolve(nsIXPConnectWrappedNative* wrapper,
                  JSContext * cx, JSObject * objArg,
@@ -532,18 +526,17 @@ nsJSIID::HasInstance(nsIXPConnectWrapped
 
     if (val.isPrimitive()) {
         return NS_OK;
     }
 
     // we have a JSObject
     RootedObject obj(cx, &val.toObject());
 
-    const nsIID* iid;
-    mInfo->GetIIDShared(&iid);
+    const nsIID* iid = &mInfo->IID();
     return xpc::HasInstance(cx, obj, iid, bp);
 }
 
 /***************************************************************************/
 
 NS_IMPL_QUERY_INTERFACE_CI(nsJSCID,
                            nsIJSID,
                            nsIJSCID,
--- a/js/xpconnect/src/XPCWrappedJS.cpp
+++ b/js/xpconnect/src/XPCWrappedJS.cpp
@@ -345,19 +345,17 @@ nsXPCWrappedJS::GetNewOrUsed(JSContext* 
                              nsXPCWrappedJS** wrapperResult)
 {
     // Do a release-mode assert against accessing nsXPCWrappedJS off-main-thread.
     MOZ_RELEASE_ASSERT(NS_IsMainThread(),
                        "nsXPCWrappedJS::GetNewOrUsed called off main thread");
 
     MOZ_RELEASE_ASSERT(js::GetContextCompartment(cx) == js::GetObjectCompartment(jsObj));
 
-    bool allowNonScriptable = mozilla::jsipc::IsWrappedCPOW(jsObj);
-    RefPtr<nsXPCWrappedJSClass> clasp = nsXPCWrappedJSClass::GetNewOrUsed(cx, aIID,
-                                                                          allowNonScriptable);
+    RefPtr<nsXPCWrappedJSClass> clasp = nsXPCWrappedJSClass::GetNewOrUsed(cx, aIID);
     if (!clasp) {
         return NS_ERROR_FAILURE;
     }
 
     JS::RootedObject rootJSObj(cx, clasp->GetRootJSObject(cx, jsObj));
     if (!rootJSObj) {
         return NS_ERROR_FAILURE;
     }
@@ -611,20 +609,19 @@ nsXPCWrappedJS::Find(REFNSIID aIID)
 
 // check if asking for an interface that some wrapper in the chain inherits from
 nsXPCWrappedJS*
 nsXPCWrappedJS::FindInherited(REFNSIID aIID)
 {
     MOZ_ASSERT(!aIID.Equals(NS_GET_IID(nsISupports)), "bad call sequence");
 
     for (nsXPCWrappedJS* cur = mRoot; cur; cur = cur->mNext) {
-        bool found;
-        if (NS_SUCCEEDED(cur->GetClass()->GetInterfaceInfo()->
-                         HasAncestor(&aIID, &found)) && found)
+        if (cur->GetClass()->GetInterfaceInfo()->HasAncestor(aIID)) {
             return cur;
+        }
     }
 
     return nullptr;
 }
 
 NS_IMETHODIMP
 nsXPCWrappedJS::GetInterfaceInfo(const nsXPTInterfaceInfo** infoResult)
 {
@@ -746,22 +743,18 @@ NS_IMETHODIMP
 nsXPCWrappedJS::DebugDump(int16_t depth)
 {
 #ifdef DEBUG
     XPC_LOG_ALWAYS(("nsXPCWrappedJS @ %p with mRefCnt = %" PRIuPTR, this, mRefCnt.get()));
         XPC_LOG_INDENT();
 
         XPC_LOG_ALWAYS(("%s wrapper around JSObject @ %p",              \
                         IsRootWrapper() ? "ROOT":"non-root", mJSObj.get()));
-        char* name;
-        GetClass()->GetInterfaceInfo()->GetName(&name);
+        const char* name = GetClass()->GetInterfaceInfo()->Name();
         XPC_LOG_ALWAYS(("interface name is %s", name));
-        if (name) {
-            free(name);
-        }
         char * iid = GetClass()->GetIID().ToString();
         XPC_LOG_ALWAYS(("IID number is %s", iid ? iid : "invalid"));
         if (iid) {
             free(iid);
         }
         XPC_LOG_ALWAYS(("nsXPCWrappedJSClass @ %p", mClass.get()));
 
         if (!IsRootWrapper()) {
--- a/js/xpconnect/src/XPCWrappedJSClass.cpp
+++ b/js/xpconnect/src/XPCWrappedJSClass.cpp
@@ -102,90 +102,72 @@ public:
     }
 private:
     XPCJSContext* mXPCContext;
     nsresult mSavedResult;
 };
 
 // static
 already_AddRefed<nsXPCWrappedJSClass>
-nsXPCWrappedJSClass::GetNewOrUsed(JSContext* cx, REFNSIID aIID, bool allowNonScriptable)
+nsXPCWrappedJSClass::GetNewOrUsed(JSContext* cx, REFNSIID aIID)
 {
     XPCJSRuntime* xpcrt = nsXPConnect::GetRuntimeInstance();
     IID2WrappedJSClassMap* map = xpcrt->GetWrappedJSClassMap();
     RefPtr<nsXPCWrappedJSClass> clasp = map->Find(aIID);
 
     if (!clasp) {
         const nsXPTInterfaceInfo* info = nsXPTInterfaceInfo::ByIID(aIID);
         if (info) {
-            bool canScript, isBuiltin;
-            if (NS_SUCCEEDED(info->IsScriptable(&canScript)) && (canScript || allowNonScriptable) &&
-                NS_SUCCEEDED(info->IsBuiltinClass(&isBuiltin)) && !isBuiltin &&
-                nsXPConnect::IsISupportsDescendant(info))
-            {
+            if (!info->IsBuiltinClass() && nsXPConnect::IsISupportsDescendant(info)) {
                 clasp = new nsXPCWrappedJSClass(cx, aIID, info);
                 if (!clasp->mDescriptors) {
                     clasp = nullptr;
                 }
             }
         }
     }
     return clasp.forget();
 }
 
 nsXPCWrappedJSClass::nsXPCWrappedJSClass(JSContext* cx, REFNSIID aIID,
                                          const nsXPTInterfaceInfo* aInfo)
     : mRuntime(nsXPConnect::GetRuntimeInstance()),
       mInfo(aInfo),
-      mName(nullptr),
       mIID(aIID),
       mDescriptors(nullptr)
 {
     mRuntime->GetWrappedJSClassMap()->Add(this);
 
-    uint16_t methodCount;
-    if (NS_SUCCEEDED(mInfo->GetMethodCount(&methodCount))) {
-        if (methodCount) {
-            int wordCount = (methodCount/32)+1;
-            if (nullptr != (mDescriptors = new uint32_t[wordCount])) {
-                int i;
-                // init flags to 0;
-                for (i = wordCount-1; i >= 0; i--) {
-                    mDescriptors[i] = 0;
-                }
+    uint16_t methodCount = mInfo->MethodCount();
+    if (methodCount) {
+        int wordCount = (methodCount/32)+1;
+        if (nullptr != (mDescriptors = new uint32_t[wordCount])) {
+            int i;
+            // init flags to 0;
+            for (i = wordCount-1; i >= 0; i--) {
+                mDescriptors[i] = 0;
+            }
 
-                for (i = 0; i < methodCount; i++) {
-                    const nsXPTMethodInfo* info;
-                    if (NS_SUCCEEDED(mInfo->GetMethodInfo(i, &info))) {
-                        SetReflectable(i, XPCConvert::IsMethodReflectable(*info));
-                    } else {
-                        delete [] mDescriptors;
-                        mDescriptors = nullptr;
-                        break;
-                    }
-                }
+            for (i = 0; i < methodCount; i++) {
+                SetReflectable(i, XPCConvert::IsMethodReflectable(mInfo->Method(i)));
             }
-        } else {
-            mDescriptors = &zero_methods_descriptor;
         }
+    } else {
+        mDescriptors = &zero_methods_descriptor;
     }
 }
 
 nsXPCWrappedJSClass::~nsXPCWrappedJSClass()
 {
     if (mDescriptors && mDescriptors != &zero_methods_descriptor) {
         delete [] mDescriptors;
     }
     if (mRuntime) {
         mRuntime->GetWrappedJSClassMap()->Remove(this);
     }
-
-    if (mName) {
-        free(mName);
-    }
 }
 
 JSObject*
 nsXPCWrappedJSClass::CallQueryInterfaceOnJSObject(JSContext* cx,
                                                   JSObject* jsobjArg,
                                                   HandleObject scope,
                                                   REFNSIID aIID)
 {
@@ -221,29 +203,20 @@ nsXPCWrappedJSClass::CallQueryInterfaceO
     }
 
     // check upfront for the existence of the function property
     HandleId funid = mRuntime->GetStringID(XPCJSContext::IDX_QUERY_INTERFACE);
     if (!JS_GetPropertyById(cx, jsobj, funid, &fun) || fun.isPrimitive()) {
         return nullptr;
     }
 
-    // Ensure that we are asking for a scriptable interface.
-    // NB:  It's important for security that this check is here rather
-    // than later, since it prevents untrusted objects from implementing
-    // some interfaces in JS and aggregating a trusted object to
-    // implement intentionally (for security) unscriptable interfaces.
-    // We so often ask for nsISupports that we can short-circuit the test...
+    // Ensure that we are asking for a non-builtinclass interface
     if (!aIID.Equals(NS_GET_IID(nsISupports))) {
-        bool allowNonScriptable = mozilla::jsipc::IsWrappedCPOW(jsobj);
-
         const nsXPTInterfaceInfo* info = nsXPTInterfaceInfo::ByIID(aIID);
-        if (!info || info->IsBuiltinClass() ||
-            (!info->IsScriptable() && !allowNonScriptable))
-        {
+        if (!info || info->IsBuiltinClass()) {
             return nullptr;
         }
     }
 
     dom::MozQueryInterface* mozQI = nullptr;
     if (NS_SUCCEEDED(UNWRAP_OBJECT(MozQueryInterface, &fun, mozQI))) {
         if (mozQI->QueriesTo(aIID)) {
             return jsobj.get();
@@ -1076,34 +1049,29 @@ nsXPCWrappedJSClass::CallMethod(nsXPCWra
     if (!(info->IsSetter() || info->IsGetter())) {
         // We get fval before allocating the stack to avoid gc badness that can
         // happen if the GetProperty call leaves our request and the gc runs
         // while the stack we allocate contains garbage.
 
         // If the interface is marked as a [function] then we will assume that
         // our JSObject is a function and not an object with a named method.
 
-        bool isFunction;
-        if (NS_FAILED(mInfo->IsFunction(&isFunction))) {
-            goto pre_call_clean_up;
-        }
-
         // In the xpidl [function] case we are making sure now that the
         // JSObject is callable. If it is *not* callable then we silently
         // fallback to looking up the named property...
         // (because jst says he thinks this fallback is 'The Right Thing'.)
         //
         // In the normal (non-function) case we just lookup the property by
         // name and as long as the object has such a named property we go ahead
         // and try to make the call. If it turns out the named property is not
         // a callable object then the JS engine will throw an error and we'll
         // pass this along to the caller as an exception/result code.
 
         fval = ObjectValue(*obj);
-        if (!isFunction || JS_TypeOfValue(ccx, fval) != JSTYPE_FUNCTION) {
+        if (!mInfo->IsFunction() || JS_TypeOfValue(ccx, fval) != JSTYPE_FUNCTION) {
             if (!JS_GetPropertyById(cx, obj, id, &fval)) {
                 goto pre_call_clean_up;
             }
             // XXX We really want to factor out the error reporting better and
             // specifically report the failure to find a function with this name.
             // This is what we do below if the property is found but is not a
             // function. We just need to factor better so we can get to that
             // reporting path from here.
@@ -1333,20 +1301,17 @@ pre_call_clean_up:
     }
 
     return retval;
 }
 
 const char*
 nsXPCWrappedJSClass::GetInterfaceName()
 {
-    if (!mName) {
-        mInfo->GetName(&mName);
-    }
-    return mName;
+    return mInfo->Name();
 }
 
 static const JSClass XPCOutParamClass = {
     "XPCOutParam",
     0,
     JS_NULL_CLASS_OPS
 };
 
@@ -1365,39 +1330,31 @@ xpc::NewOutObject(JSContext* cx)
 
 NS_IMETHODIMP
 nsXPCWrappedJSClass::DebugDump(int16_t depth)
 {
 #ifdef DEBUG
     depth-- ;
     XPC_LOG_ALWAYS(("nsXPCWrappedJSClass @ %p with mRefCnt = %" PRIuPTR, this, mRefCnt.get()));
     XPC_LOG_INDENT();
-        char* name;
-        mInfo->GetName(&name);
+        const char* name = mInfo->Name();
         XPC_LOG_ALWAYS(("interface name is %s", name));
-        if (name) {
-            free(name);
-        }
         char * iid = mIID.ToString();
         XPC_LOG_ALWAYS(("IID number is %s", iid ? iid : "invalid"));
         if (iid) {
             free(iid);
         }
         XPC_LOG_ALWAYS(("InterfaceInfo @ %p", mInfo));
         uint16_t methodCount = 0;
         if (depth) {
-            uint16_t i;
-            const nsXPTInterfaceInfo* parent;
             XPC_LOG_INDENT();
-            mInfo->GetParent(&parent);
-            XPC_LOG_ALWAYS(("parent @ %p", parent));
-            mInfo->GetMethodCount(&methodCount);
+            XPC_LOG_ALWAYS(("parent @ %p", mInfo->GetParent()));
+            methodCount = mInfo->MethodCount();
             XPC_LOG_ALWAYS(("MethodCount = %d", methodCount));
-            mInfo->GetConstantCount(&i);
-            XPC_LOG_ALWAYS(("ConstantCount = %d", i));
+            XPC_LOG_ALWAYS(("ConstantCount = %d", mInfo->ConstantCount()));
             XPC_LOG_OUTDENT();
         }
         XPC_LOG_ALWAYS(("mRuntime @ %p", mRuntime));
         XPC_LOG_ALWAYS(("mDescriptors @ %p count = %d", mDescriptors, methodCount));
         if (depth && mDescriptors && methodCount) {
             depth--;
             XPC_LOG_INDENT();
             for (uint16_t i = 0; i < methodCount; i++) {
--- a/js/xpconnect/src/XPCWrappedNative.cpp
+++ b/js/xpconnect/src/XPCWrappedNative.cpp
@@ -1886,36 +1886,33 @@ static void DEBUG_CheckClassInfoClaims(X
 
     nsISupports* obj = wrapper->GetIdentityObject();
     XPCNativeSet* set = wrapper->GetSet();
     uint16_t count = set->GetInterfaceCount();
     for (uint16_t i = 0; i < count; i++) {
         nsIClassInfo* clsInfo = wrapper->GetClassInfo();
         XPCNativeInterface* iface = set->GetInterfaceAt(i);
         const nsXPTInterfaceInfo* info = iface->GetInterfaceInfo();
-        const nsIID* iid;
         nsISupports* ptr;
 
-        info->GetIIDShared(&iid);
-        nsresult rv = obj->QueryInterface(*iid, (void**)&ptr);
+        nsresult rv = obj->QueryInterface(info->IID(), (void**)&ptr);
         if (NS_SUCCEEDED(rv)) {
             NS_RELEASE(ptr);
             continue;
         }
         if (rv == NS_ERROR_OUT_OF_MEMORY) {
             continue;
         }
 
         // Houston, We have a problem...
 
         char* className = nullptr;
         char* contractID = nullptr;
-        const char* interfaceName;
+        const char* interfaceName = info->Name();
 
-        info->GetNameShared(&interfaceName);
         clsInfo->GetContractID(&contractID);
         if (wrapper->GetScriptable()) {
             wrapper->GetScriptable()->GetClassName(&className);
         }
 
         printf("\n!!! Object's nsIClassInfo lies about its interfaces!!!\n"
                "   classname: %s \n"
                "   contractid: %s \n"
--- a/js/xpconnect/src/XPCWrappedNativeInfo.cpp
+++ b/js/xpconnect/src/XPCWrappedNativeInfo.cpp
@@ -163,29 +163,24 @@ XPCNativeInterface::GetNewOrUsed(const n
 }
 
 // static
 already_AddRefed<XPCNativeInterface>
 XPCNativeInterface::GetNewOrUsed(const nsXPTInterfaceInfo* info)
 {
     RefPtr<XPCNativeInterface> iface;
 
-    const nsIID* iid;
-    if (NS_FAILED(info->GetIIDShared(&iid)) || !iid) {
-        return nullptr;
-    }
-
     XPCJSRuntime* rt = XPCJSRuntime::Get();
 
     IID2NativeInterfaceMap* map = rt->GetIID2NativeInterfaceMap();
     if (!map) {
         return nullptr;
     }
 
-    iface = map->Find(*iid);
+    iface = map->Find(info->IID());
 
     if (iface) {
         return iface.forget();
     }
 
     iface = NewInstance(info);
     if (!iface) {
         return nullptr;
@@ -225,62 +220,49 @@ XPCNativeInterface::NewInstance(const ns
     AutoJSContext cx;
     static const uint16_t MAX_LOCAL_MEMBER_COUNT = 16;
     XPCNativeMember local_members[MAX_LOCAL_MEMBER_COUNT];
     RefPtr<XPCNativeInterface> obj;
     XPCNativeMember* members = nullptr;
 
     int i;
     bool failed = false;
-    uint16_t constCount;
-    uint16_t methodCount;
     uint16_t totalCount;
     uint16_t realTotalCount = 0;
     XPCNativeMember* cur;
     RootedString str(cx);
     RootedId interfaceName(cx);
 
     // XXX Investigate lazy init? This is a problem given the
     // 'placement new' scheme - we need to at least know how big to make
     // the object. We might do a scan of methods to determine needed size,
     // then make our object, but avoid init'ing *any* members until asked?
     // Find out how often we create these objects w/o really looking at
     // (or using) the members.
 
-    bool canScript;
-    if (NS_FAILED(aInfo->IsScriptable(&canScript)) || !canScript) {
-        return nullptr;
-    }
-
-    bool mainProcessScriptableOnly;
-    if (NS_FAILED(aInfo->IsMainProcessScriptableOnly(&mainProcessScriptableOnly))) {
-        return nullptr;
-    }
-    if (mainProcessScriptableOnly && !XRE_IsParentProcess()) {
+    if (aInfo->IsMainProcessScriptableOnly() && !XRE_IsParentProcess()) {
         nsCOMPtr<nsIConsoleService> console(do_GetService(NS_CONSOLESERVICE_CONTRACTID));
         if (console) {
-            const char* intfNameChars;
-            aInfo->GetNameShared(&intfNameChars);
+            const char* intfNameChars = aInfo->Name();
             nsPrintfCString errorMsg("Use of %s in content process is deprecated.", intfNameChars);
 
             nsAutoString filename;
             uint32_t lineno = 0, column = 0;
             nsJSUtils::GetCallingLocation(cx, filename, &lineno, &column);
             nsCOMPtr<nsIScriptError> error(do_CreateInstance(NS_SCRIPTERROR_CONTRACTID));
             error->Init(NS_ConvertUTF8toUTF16(errorMsg),
                         filename, EmptyString(),
                         lineno, column, nsIScriptError::warningFlag, "chrome javascript",
                         false /* from private window */);
             console->LogMessage(error);
         }
     }
 
-    if (NS_FAILED(aInfo->GetMethodCount(&methodCount)) ||
-        NS_FAILED(aInfo->GetConstantCount(&constCount)))
-        return nullptr;
+    uint16_t methodCount = aInfo->MethodCount();
+    uint16_t constCount = aInfo->ConstantCount();
 
     // If the interface does not have nsISupports in its inheritance chain
     // then we know we can't reflect its methods. However, some interfaces that
     // are used just to reflect constants are declared this way. We need to
     // go ahead and build the thing. But, we'll ignore whatever methods it may
     // have.
     if (!nsXPConnect::IsISupportsDescendant(aInfo)) {
         methodCount = 0;
@@ -296,45 +278,41 @@ XPCNativeInterface::NewInstance(const ns
     } else {
         members = local_members;
     }
 
     // NOTE: since getters and setters share a member, we might not use all
     // of the member objects.
 
     for (i = 0; i < methodCount; i++) {
-        const nsXPTMethodInfo* info;
-        if (NS_FAILED(aInfo->GetMethodInfo(i, &info))) {
-            failed = true;
-            break;
-        }
+        const nsXPTMethodInfo& info = aInfo->Method(i);
 
         // don't reflect Addref or Release
         if (i == 1 || i == 2) {
             continue;
         }
 
-        if (!XPCConvert::IsMethodReflectable(*info)) {
+        if (!XPCConvert::IsMethodReflectable(info)) {
             continue;
         }
 
         jsid name;
-        if (info->IsSymbol()) {
-            name = SYMBOL_TO_JSID(info->GetSymbol(cx));
+        if (info.IsSymbol()) {
+            name = SYMBOL_TO_JSID(info.GetSymbol(cx));
         } else {
-            str = JS_AtomizeAndPinString(cx, info->GetName());
+            str = JS_AtomizeAndPinString(cx, info.GetName());
             if (!str) {
                 NS_ERROR("bad method name");
                 failed = true;
                 break;
             }
             name = INTERNED_STRING_TO_JSID(cx, str);
         }
 
-        if (info->IsSetter()) {
+        if (info.IsSetter()) {
             MOZ_ASSERT(realTotalCount,"bad setter");
             // Note: ASSUMES Getter/Setter pairs are next to each other
             // This is a rule of the typelib spec.
             cur = &members[realTotalCount-1];
             MOZ_ASSERT(cur->GetName() == name,"bad setter");
             MOZ_ASSERT(cur->IsReadOnlyAttribute(),"bad setter");
             MOZ_ASSERT(cur->GetIndex() == i-1,"bad setter");
             cur->SetWritableAttribute();
@@ -343,17 +321,17 @@ XPCNativeInterface::NewInstance(const ns
             // MOZ_ASSERT(!LookupMemberByID(name),"duplicate method name");
             if (realTotalCount == XPCNativeMember::GetMaxIndexInInterface()) {
                 NS_WARNING("Too many members in interface");
                 failed = true;
                 break;
             }
             cur = &members[realTotalCount];
             cur->SetName(name);
-            if (info->IsGetter()) {
+            if (info.IsGetter()) {
                 cur->SetReadOnlyAttribute(i);
             } else {
                 cur->SetMethod(i);
             }
             cur->SetIndexInInterface(realTotalCount);
             ++realTotalCount;
         }
     }
@@ -386,18 +364,18 @@ XPCNativeInterface::NewInstance(const ns
             cur->SetName(name);
             cur->SetConstant(i);
             cur->SetIndexInInterface(realTotalCount);
             ++realTotalCount;
         }
     }
 
     if (!failed) {
-        const char* bytes;
-        if (NS_FAILED(aInfo->GetNameShared(&bytes)) || !bytes ||
+        const char* bytes = aInfo->Name();
+        if (nullptr == bytes ||
             nullptr == (str = JS_AtomizeAndPinString(cx, bytes))) {
             failed = true;
         }
         interfaceName = INTERNED_STRING_TO_JSID(cx, str);
     }
 
     if (!failed) {
         // Use placement new to create an object with the right amount of space
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -1708,19 +1708,17 @@ NS_DEFINE_STATIC_IID_ACCESSOR(nsIXPCWrap
 class nsXPCWrappedJSClass final : public nsIXPCWrappedJSClass
 {
     // all the interface method declarations...
     NS_DECL_ISUPPORTS
     NS_IMETHOD DebugDump(int16_t depth) override;
 public:
 
     static already_AddRefed<nsXPCWrappedJSClass>
-    GetNewOrUsed(JSContext* cx,
-                 REFNSIID aIID,
-                 bool allowNonScriptable = false);
+    GetNewOrUsed(JSContext* cx, REFNSIID aIID);
 
     REFNSIID GetIID() const {return mIID;}
     XPCJSRuntime* GetRuntime() const {return mRuntime;}
     const nsXPTInterfaceInfo* GetInterfaceInfo() const {return mInfo;}
     const char* GetInterfaceName();
 
     NS_IMETHOD DelegatedQueryInterface(nsXPCWrappedJS* self, REFNSIID aIID,
                                        void** aInstancePtr);
@@ -1780,17 +1778,16 @@ private:
 
     void CleanupOutparams(const nsXPTMethodInfo* info,
                           nsXPTCMiniVariant* nativeParams,
                           bool inOutOnly, uint8_t n) const;
 
 private:
     XPCJSRuntime* mRuntime;
     const nsXPTInterfaceInfo* mInfo;
-    char* mName;
     nsIID mIID;
     uint32_t* mDescriptors;
 };
 
 /*************************/
 // nsXPCWrappedJS is a wrapper for a single JSObject for use from native code.
 // nsXPCWrappedJS objects are chained together to represent the various
 // interface on the single underlying (possibly aggregate) JSObject.
--- a/taskcluster/ci/test/raptor.yml
+++ b/taskcluster/ci/test/raptor.yml
@@ -342,29 +342,51 @@ raptor-assorted-dom-chrome:
         extra-options:
             - --test=raptor-assorted-dom
             - --app=chrome
     fetches:
         fetch:
             - assorted-dom
 
 raptor-wasm-godot-firefox:
-    description: "Raptor Wasm GoDot on Firefox"
+    description: "Raptor Wasm Godot on Firefox"
     try-name: raptor-wasm-godot-firefox
     treeherder-symbol: Rap(godot)
     run-on-projects: ['try', 'mozilla-central']
     tier: 2
     max-run-time: 1500
     mozharness:
         extra-options:
             - --test=raptor-wasm-godot
 
 raptor-wasm-godot-chrome:
-    description: "Raptor Wasm GoDot on Chrome"
+    description: "Raptor Wasm Godot on Chrome"
     try-name: raptor-wasm-godot-chrome
     treeherder-symbol: Rap-C(godot)
     run-on-projects: ['try', 'mozilla-central']
     tier: 2
     max-run-time: 1500
     mozharness:
         extra-options:
             - --test=raptor-wasm-godot
             - --app=chrome
+
+raptor-wasm-godot-baseline-firefox:
+    description: "Raptor Wasm Godot on Firefox with baseline JIT"
+    try-name: raptor-wasm-godot-baseline-firefox
+    treeherder-symbol: Rap(godot-b)
+    run-on-projects: ['try', 'mozilla-central']
+    tier: 2
+    max-run-time: 1500
+    mozharness:
+        extra-options:
+            - --test=raptor-wasm-godot-baseline
+
+raptor-wasm-godot-ion-firefox:
+    description: "Raptor WASM godot on Firefox with ION Monkey"
+    try-name: raptor-wasm-godot-ion-firefox
+    treeherder-symbol: Rap(godot-i)
+    run-on-projects: ['try', 'mozilla-central']
+    tier: 2
+    max-run-time: 1500
+    mozharness:
+        extra-options:
+            - --test=raptor-wasm-godot-ion
--- a/taskcluster/ci/test/test-sets.yml
+++ b/taskcluster/ci/test/test-sets.yml
@@ -103,16 +103,18 @@ raptor-chrome:
 
 # Fetch tasks are only supported on Linux for now,
 # so these need to be separate sets.
 raptor-fetch-firefox:
     - raptor-unity-webgl-firefox
     - raptor-wasm-misc-firefox
     - raptor-wasm-misc-baseline-firefox
     - raptor-wasm-misc-ion-firefox
+    - raptor-wasm-godot-baseline-firefox
+    - raptor-wasm-godot-ion-firefox
     - raptor-assorted-dom-firefox
 
 raptor-fetch-geckoview:
     - raptor-unity-webgl-geckoview
 
 raptor-fetch-chrome:
     - raptor-unity-webgl-chrome
     - raptor-wasm-misc-chrome
--- a/taskcluster/ci/toolchain/linux.yml
+++ b/taskcluster/ci/toolchain/linux.yml
@@ -22,37 +22,16 @@ linux64-clang-3.9:
         resources:
             - 'build/build-clang/build-clang.py'
             - 'build/build-clang/clang-3.9-linux64.json'
             - 'taskcluster/scripts/misc/tooltool-download.sh'
         toolchain-artifact: public/build/clang.tar.xz
     toolchains:
         - linux64-gcc-4.9
 
-linux64-clang-6:
-    description: "Clang 6 toolchain build"
-    treeherder:
-        kind: build
-        platform: toolchains/opt
-        symbol: TL(clang6)
-        tier: 1
-    worker-type: aws-provisioner-v1/gecko-{level}-b-linux-xlarge
-    worker:
-        max-run-time: 7200
-    run:
-        using: toolchain-script
-        script: build-clang-6-linux.sh
-        resources:
-            - 'build/build-clang/build-clang.py'
-            - 'build/build-clang/clang-6-linux64.json'
-            - 'taskcluster/scripts/misc/tooltool-download.sh'
-        toolchain-artifact: public/build/clang.tar.xz
-    toolchains:
-        - linux64-gcc-4.9
-
 linux64-clang-7:
     description: "Clang 7 toolchain build"
     treeherder:
         kind: build
         platform: toolchains/opt
         symbol: TL(clang7)
         tier: 1
     worker-type: aws-provisioner-v1/gecko-{level}-b-linux-xlarge
@@ -369,17 +348,17 @@ linux64-hfsplus:
     run:
         using: toolchain-script
         script: build-hfsplus-linux.sh
         resources:
             - 'build/unix/build-hfsplus/build-hfsplus.sh'
             - 'taskcluster/scripts/misc/tooltool-download.sh'
         toolchain-artifact: public/build/hfsplus-tools.tar.xz
     toolchains:
-        - linux64-clang-6
+        - linux64-clang-7
 
 linux64-libdmg:
     description: "libdmg-hfsplus toolchain build"
     treeherder:
         kind: build
         platform: toolchains/opt
         symbol: TL(libdmg-hfs+)
         tier: 1
deleted file mode 100755
--- a/taskcluster/scripts/misc/build-clang-6-linux.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-set -x -e -v
-
-# This script is for building clang for Linux.
-
-WORKSPACE=$HOME/workspace
-HOME_DIR=$WORKSPACE/build
-UPLOAD_DIR=$HOME/artifacts
-
-cd $HOME_DIR/src
-
-. taskcluster/scripts/misc/tooltool-download.sh
-
-# gets a bit too verbose here
-set +x
-
-cd build/build-clang
-# |mach python| sets up a virtualenv for us!
-../../mach python ./build-clang.py -c clang-6-linux64.json
-
-set -x
-
-# Put a tarball in the artifacts dir
-mkdir -p $UPLOAD_DIR
-cp clang.tar.* $UPLOAD_DIR
--- a/testing/raptor/raptor/output.py
+++ b/testing/raptor/raptor/output.py
@@ -113,17 +113,17 @@ class Output(object):
                     subtests, vals = self.parseWebaudioOutput(test)
                 elif 'unity-webgl' in test.measurements:
                     subtests, vals = self.parseUnityWebGLOutput(test)
                 elif 'assorted-dom' in test.measurements:
                     subtests, vals = self.parseAssortedDomOutput(test)
                 elif 'wasm-misc' in test.measurements:
                     subtests, vals = self.parseWASMMiscOutput(test)
                 elif 'wasm-godot' in test.measurements:
-                    subtests, vals = self.parseWASMGoDotOutput(test)
+                    subtests, vals = self.parseWASMGodotOutput(test)
                 suite['subtests'] = subtests
 
             else:
                 LOG.error("output.summarize received unsupported test results type")
                 return
 
             # for pageload tests, if there are > 1 subtests here, that means there
             # were multiple measurements captured in each single pageload; we want
@@ -214,17 +214,17 @@ class Output(object):
         names.sort(reverse=True)
         for name in names:
             _subtests[name]['value'] = filter.median(_subtests[name]['replicates'])
             subtests.append(_subtests[name])
             vals.append([_subtests[name]['value'], name])
 
         return subtests, vals
 
-    def parseWASMGoDotOutput(self, test):
+    def parseWASMGodotOutput(self, test):
         '''
             {u'wasm-godot': [
                 {
                   "name": "wasm-instantiate",
                   "time": 349
                 },{
                   "name": "engine-instantiate",
                   "time": 1263
--- a/testing/raptor/raptor/raptor.ini
+++ b/testing/raptor/raptor/raptor.ini
@@ -7,9 +7,11 @@
 [include:tests/raptor-motionmark-animometer.ini]
 [include:tests/raptor-unity-webgl.ini]
 [include:tests/raptor-webaudio.ini]
 [include:tests/raptor-gdocs.ini]
 [include:tests/raptor-wasm-misc.ini]
 [include:tests/raptor-wasm-misc-baseline.ini]
 [include:tests/raptor-wasm-misc-ion.ini]
 [include:tests/raptor-wasm-godot.ini]
+[include:tests/raptor-wasm-godot-baseline.ini]
+[include:tests/raptor-wasm-godot-ion.ini]
 [include:tests/raptor-assorted-dom.ini]
new file mode 100644
--- /dev/null
+++ b/testing/raptor/raptor/tests/raptor-wasm-godot-baseline.ini
@@ -0,0 +1,20 @@
+# 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/.
+
+# Wasm-godot benchmark for firefox and chrome
+
+[DEFAULT]
+type =  benchmark
+test_url = http://localhost:<port>/wasm-godot/index.html
+page_cycles = 5
+page_timeout = 120000
+unit = ms
+lower_is_better = true
+alert_threshold = 2.0
+newtab_per_cycle = true
+
+[raptor-wasm-godot-baseline-firefox]
+apps = firefox
+preferences = {"javascript.options.wasm_baselinejit": true,
+               "javascript.options.wasm_ionjit": false}
new file mode 100644
--- /dev/null
+++ b/testing/raptor/raptor/tests/raptor-wasm-godot-ion.ini
@@ -0,0 +1,20 @@
+# 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/.
+
+# Wasm-godot benchmark for firefox and chrome
+
+[DEFAULT]
+type =  benchmark
+test_url = http://localhost:<port>/wasm-godot/index.html
+page_cycles = 5
+page_timeout = 120000
+unit = ms
+lower_is_better = true
+alert_threshold = 2.0
+newtab_per_cycle = true
+
+[raptor-wasm-godot-ion-firefox]
+apps = firefox
+preferences = {"javascript.options.wasm_baselinejit": false,
+               "javascript.options.wasm_ionjit": true}
--- a/testing/web-platform/meta/audio-output/setSinkId.html.ini
+++ b/testing/web-platform/meta/audio-output/setSinkId.html.ini
@@ -1,2 +1,6 @@
 [setSinkId.html]
   prefs: [media.setsinkid.enabled:true]
+  [List device, setSinkId should be allowed on the default, the rest of the devices will get a NotAllowedError]
+    expected:
+      if os == "android": FAIL
+
--- a/testing/web-platform/meta/audio-output/setSinkId.https.html.ini
+++ b/testing/web-platform/meta/audio-output/setSinkId.https.html.ini
@@ -1,2 +1,6 @@
 [setSinkId.https.html]
   prefs: [media.setsinkid.enabled:true]
+  [List device, setSinkId should be allowed on the default, the rest of the devices will get a NotAllowedError]
+    expected:
+      if os == "android": FAIL
+
--- a/toolkit/components/places/PlacesDBUtils.jsm
+++ b/toolkit/components/places/PlacesDBUtils.jsm
@@ -973,19 +973,16 @@ var PlacesDBUtils = {
   /**
    * Collects telemetry data and reports it to Telemetry.
    *
    * Note: although this function isn't actually async, we keep it async to
    * allow us to maintain a simple, consistent API for the tasks within this object.
    *
    */
   async telemetry() {
-    // First deal with some scalars for feeds:
-    await this._telemetryForFeeds();
-
     // This will be populated with one integer property for each probe result,
     // using the histogram name as key.
     let probeValues = {};
 
     // The following array contains an ordered list of entries that are
     // processed to collect telemetry data.  Each entry has these properties:
     //
     //  histogram: Name of the telemetry histogram to update.
@@ -1123,26 +1120,16 @@ var PlacesDBUtils = {
       if ("callback" in probe) {
         val = await probe.callback(val);
       }
       probeValues[probe.histogram] = val;
       Services.telemetry.getHistogramById(probe.histogram).add(val);
     }
   },
 
-  async _telemetryForFeeds() {
-    let db = await PlacesUtils.promiseDBConnection();
-    let livebookmarkCount = await db.execute(
-      `SELECT count(*) FROM moz_items_annos a
-                       JOIN moz_anno_attributes aa ON a.anno_attribute_id = aa.id
-                       WHERE aa.name = 'livemark/feedURI'`);
-    livebookmarkCount = livebookmarkCount[0].getResultByIndex(0);
-    Services.telemetry.scalarSet("browser.feeds.livebookmark_count", livebookmarkCount);
-  },
-
   /**
    * Runs a list of tasks, returning a Map when done.
    *
    * @param tasks
    *        Array of tasks to be executed, in form of pointers to methods in
    *        this module.
    * @return {Promise}
    *        A promise that resolves with a Map[taskName(String) -> Object].
--- a/toolkit/components/telemetry/Scalars.yaml
+++ b/toolkit/components/telemetry/Scalars.yaml
@@ -261,84 +261,16 @@ browser.engagement.navigation:
     kind: uint
     keyed: true
     notification_emails:
       - mkaply@mozilla.com
     release_channel_collection: opt-out
     record_in_processes:
       - 'main'
 
-# The following section contains (RSS/Atom) feed usage
-browser.feeds:
-  preview_loaded:
-    bug_numbers:
-      - 1350349
-    description: >
-      The number of times a feed preview page is loaded.
-    expires: "65"
-    kind: uint
-    notification_emails:
-      - gijs@mozilla.com
-    release_channel_collection: opt-out
-    record_in_processes:
-      - 'main'
-      - 'content'
-
-  feed_subscribed:
-    bug_numbers:
-      - 1350349
-    description: >
-      The number of times a user subscribes to a feed.
-    expires: "65"
-    kind: uint
-    notification_emails:
-      - gijs@mozilla.com
-    release_channel_collection: opt-out
-    record_in_processes:
-      - 'main'
-
-  livebookmark_opened:
-    bug_numbers:
-      - 1350349
-    description: >
-      The number of times a user opens a live bookmark dropdown.
-    expires: "65"
-    kind: uint
-    notification_emails:
-      - gijs@mozilla.com
-    release_channel_collection: opt-out
-    record_in_processes:
-      - 'main'
-
-  livebookmark_item_opened:
-    bug_numbers:
-      - 1350349
-    description: >
-      The number of times a user opens an item that is part of a live bookmark.
-    expires: "65"
-    kind: uint
-    notification_emails:
-      - gijs@mozilla.com
-    release_channel_collection: opt-out
-    record_in_processes:
-      - 'main'
-
-  livebookmark_count:
-    bug_numbers:
-      - 1350349
-    description: >
-      The number of live bookmark folders the user has (ie not individual items).
-    expires: "65"
-    kind: uint
-    notification_emails:
-      - gijs@mozilla.com
-    release_channel_collection: opt-out
-    record_in_processes:
-      - 'main'
-
 # The following section contains the browser usage scalars.
 browser.usage:
   graphite:
     bug_numbers:
       - 1331915
     description: >
       The number of times a graphite2 font has been loaded.
     expires: "65"
--- a/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl
+++ b/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl
@@ -135,17 +135,17 @@ detail-home-value =
 detail-repository =
     .label = Add-on Profile
 
 detail-repository-value =
     .value = { detail-repository.label }
 
 detail-check-for-updates =
     .label = Check for Updates
-    .accesskey = F
+    .accesskey = U
     .tooltiptext = Check for updates for this add-on
 
 detail-show-preferences =
     .label =
         { PLATFORM() ->
             [windows] Options
            *[other] Preferences
         }
--- a/widget/nsTransferable.cpp
+++ b/widget/nsTransferable.cpp
@@ -32,29 +32,19 @@ Notes to self:
 #include "nsCRT.h"
 #include "nsNetUtil.h"
 #include "nsIOutputStream.h"
 #include "nsIInputStream.h"
 #include "nsIWeakReferenceUtils.h"
 #include "nsILoadContext.h"
 #include "mozilla/UniquePtr.h"
 
-NS_IMPL_ISUPPORTS(nsTransferable, nsITransferable)
+using namespace mozilla;
 
-size_t
-GetDataForFlavor(const nsTArray<DataStruct>& aArray, const char* aDataFlavor)
-{
-  for (size_t i = 0; i < aArray.Length(); ++i) {
-    if (aArray[i].GetFlavor().Equals(aDataFlavor)) {
-      return i;
-    }
-  }
-
-  return aArray.NoIndex;
-}
+NS_IMPL_ISUPPORTS(nsTransferable, nsITransferable)
 
 DataStruct::DataStruct(DataStruct&& aRHS)
   : mData(aRHS.mData.forget())
   , mDataLen(aRHS.mDataLen)
   , mCacheFD(aRHS.mCacheFD)
   , mFlavor(aRHS.mFlavor)
 {
   aRHS.mCacheFD = nullptr;
@@ -162,17 +152,17 @@ DataStruct::ReadCache(nsISupports** aDat
   if (PR_GetOpenFileInfo(mCacheFD, &fileInfo) != PR_SUCCESS) {
     return NS_ERROR_FAILURE;
   }
   if (PR_Seek64(mCacheFD, 0, PR_SEEK_SET) == -1) {
     return NS_ERROR_FAILURE;
   }
   uint32_t fileSize = fileInfo.size;
 
-  auto data = mozilla::MakeUnique<char[]>(fileSize);
+  auto data = MakeUnique<char[]>(fileSize);
   if (!data) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
 
   uint32_t actual = PR_Read(mCacheFD, data.get(), fileSize);
   if (actual != fileSize) {
     return NS_ERROR_FAILURE;
   }
@@ -230,16 +220,31 @@ nsTransferable::GetTransferDataFlavors(n
   MOZ_ASSERT(mInitialized);
 
   for (size_t i = 0; i < mDataArray.Length(); ++i) {
     DataStruct& data = mDataArray.ElementAt(i);
     aFlavors.AppendElement(data.GetFlavor());
   }
 }
 
+Maybe<size_t>
+nsTransferable::FindDataFlavor(const char* aFlavor)
+{
+  nsDependentCString flavor(aFlavor);
+
+  for (size_t i = 0; i < mDataArray.Length(); ++i) {
+    if (mDataArray[i].GetFlavor().Equals(flavor)) {
+      return Some(i);
+    }
+  }
+
+  return Nothing();
+}
+
+
 //
 // GetTransferData
 //
 // Returns the data of the requested flavor, obtained from either having the
 // data on hand or using a converter to get it. The data is wrapped in a
 // nsISupports primitive so that it is accessible from JS.
 //
 NS_IMETHODIMP
@@ -249,47 +254,43 @@ nsTransferable::GetTransferData(const ch
 {
   MOZ_ASSERT(mInitialized);
 
   *aData = nullptr;
   *aDataLen = 0;
 
   nsresult rv = NS_OK;
 
-  // first look and see if the data is present in one of the intrinsic flavors
-  for (size_t i = 0; i < mDataArray.Length(); ++i) {
-    DataStruct& data = mDataArray.ElementAt(i);
-    if (data.GetFlavor().Equals(aFlavor)) {
-      nsCOMPtr<nsISupports> dataBytes;
-      uint32_t len;
-      data.GetData(getter_AddRefs(dataBytes), &len);
+  // First look and see if the data is present in one of the intrinsic flavors.
+  if (Maybe<size_t> index = FindDataFlavor(aFlavor)) {
+    nsCOMPtr<nsISupports> dataBytes;
+    uint32_t len;
+    mDataArray[index.value()].GetData(getter_AddRefs(dataBytes), &len);
 
-      // Do we have a (lazy) data provider?
-      if (nsCOMPtr<nsIFlavorDataProvider> dataProvider =
-            do_QueryInterface(dataBytes)) {
-        rv = dataProvider->GetFlavorData(this, aFlavor,
-                                         getter_AddRefs(dataBytes), &len);
-        if (NS_FAILED(rv)) {
-          // The provider failed, fall into the converter code below.
-          break;
-        }
+    // Do we have a (lazy) data provider?
+    if (nsCOMPtr<nsIFlavorDataProvider> dataProvider =
+          do_QueryInterface(dataBytes)) {
+      rv = dataProvider->GetFlavorData(this, aFlavor,
+                                       getter_AddRefs(dataBytes), &len);
+      if (NS_FAILED(rv)) {
+        dataBytes = nullptr;
+        // The provider failed, fall into the converter code below.
       }
+    }
 
-      if (dataBytes) {
-        *aDataLen = len;
-        dataBytes.forget(aData);
-        return NS_OK;
-      }
+    if (dataBytes) {
+      *aDataLen = len;
+      dataBytes.forget(aData);
+      return NS_OK;
+    }
 
-      // Not found.
-      break;
-    }
+    // Empty data
   }
 
-  // if not, try using a format converter to get the requested flavor
+  // If not, try using a format converter to get the requested flavor.
   if (mFormatConv) {
     for (size_t i = 0; i < mDataArray.Length(); ++i) {
       DataStruct& data = mDataArray.ElementAt(i);
       bool canConvert = false;
       mFormatConv->CanConvert(data.GetFlavor().get(), aFlavor, &canConvert);
       if (canConvert) {
         nsCOMPtr<nsISupports> dataBytes;
         uint32_t len;
@@ -348,22 +349,20 @@ nsTransferable::GetAnyTransferData(nsACS
 NS_IMETHODIMP
 nsTransferable::SetTransferData(const char* aFlavor,
                                 nsISupports* aData,
                                 uint32_t aDataLen)
 {
   MOZ_ASSERT(mInitialized);
 
   // first check our intrinsic flavors to see if one has been registered.
-  for (size_t i = 0; i < mDataArray.Length(); ++i) {
-    DataStruct& data = mDataArray.ElementAt(i);
-    if (data.GetFlavor().Equals(aFlavor)) {
-      data.SetData(aData, aDataLen, mPrivateData);
-      return NS_OK;
-    }
+  if (Maybe<size_t> index = FindDataFlavor(aFlavor)) {
+    DataStruct& data = mDataArray.ElementAt(index.value());
+    data.SetData(aData, aDataLen, mPrivateData);
+    return NS_OK;
   }
 
   // if not, try using a format converter to find a flavor to put the data in
   if (mFormatConv) {
     for (size_t i = 0; i < mDataArray.Length(); ++i) {
       DataStruct& data = mDataArray.ElementAt(i);
       bool canConvert = false;
       mFormatConv->CanConvert(aFlavor, data.GetFlavor().get(), &canConvert);
@@ -397,42 +396,41 @@ nsTransferable::SetTransferData(const ch
 //
 // Adds a data flavor to our list with no data. Error if it already exists.
 //
 NS_IMETHODIMP
 nsTransferable::AddDataFlavor(const char* aDataFlavor)
 {
   MOZ_ASSERT(mInitialized);
 
-  if (GetDataForFlavor(mDataArray, aDataFlavor) != mDataArray.NoIndex) {
+  if (FindDataFlavor(aDataFlavor).isSome()) {
     return NS_ERROR_FAILURE;
   }
 
   // Create a new "slot" for the data
   mDataArray.AppendElement(DataStruct(aDataFlavor));
-
   return NS_OK;
 }
 
 //
 // RemoveDataFlavor
 //
 // Removes a data flavor (and causes the data to be destroyed). Error if
 // the requested flavor is not present.
 //
 NS_IMETHODIMP
 nsTransferable::RemoveDataFlavor(const char* aDataFlavor)
 {
   MOZ_ASSERT(mInitialized);
 
-  size_t idx = GetDataForFlavor(mDataArray, aDataFlavor);
-  if (idx != mDataArray.NoIndex) {
-    mDataArray.RemoveElementAt(idx);
+  if (Maybe<size_t> index = FindDataFlavor(aDataFlavor)) {
+    mDataArray.RemoveElementAt(index.value());
     return NS_OK;
   }
+
   return NS_ERROR_FAILURE;
 }
 
 NS_IMETHODIMP
 nsTransferable::SetConverter(nsIFormatConverter* aConverter)
 {
   MOZ_ASSERT(mInitialized);
 
--- a/widget/nsTransferable.h
+++ b/widget/nsTransferable.h
@@ -8,16 +8,17 @@
 
 #include "nsIFormatConverter.h"
 #include "nsITransferable.h"
 #include "nsCOMPtr.h"
 #include "nsString.h"
 #include "nsTArray.h"
 #include "nsIPrincipal.h"
 #include "prio.h"
+#include "mozilla/Maybe.h"
 
 class nsIMutableArray;
 
 //
 // DataStruct
 //
 // Holds a flavor (a mime type) that describes the data and the associated data.
 //
@@ -68,19 +69,22 @@ public:
 
     // nsISupports
   NS_DECL_ISUPPORTS
   NS_DECL_NSITRANSFERABLE
 
 protected:
   virtual ~nsTransferable();
 
-  // get flavors w/out converter
+  // Get flavors w/out converter
   void GetTransferDataFlavors(nsTArray<nsCString>& aFlavors);
- 
+
+  // Find index for data with the matching flavor in mDataArray.
+  mozilla::Maybe<size_t> FindDataFlavor(const char* aFlavor);
+
   nsTArray<DataStruct> mDataArray;
   nsCOMPtr<nsIFormatConverter> mFormatConv;
   bool mPrivateData;
   nsCOMPtr<nsIPrincipal> mRequestingPrincipal;
   nsContentPolicyType mContentPolicyType;
 #if DEBUG
   bool mInitialized;
 #endif
--- a/xpcom/reflect/xptcall/xptcall.cpp
+++ b/xpcom/reflect/xptcall/xptcall.cpp
@@ -38,18 +38,19 @@ nsXPTCStubBase::Release()
 EXPORT_XPCOM_API(nsresult)
 NS_GetXPTCallStub(REFNSIID aIID, nsIXPTCProxy* aOuter,
                   nsISomeInterface* *aResult)
 {
     if (NS_WARN_IF(!aOuter) || NS_WARN_IF(!aResult))
         return NS_ERROR_INVALID_ARG;
 
     const nsXPTInterfaceInfo* iie = nsXPTInterfaceInfo::ByIID(aIID);
-    if (!iie || !iie->EnsureResolved() || iie->IsBuiltinClass())
+    if (!iie || iie->IsBuiltinClass()) {
         return NS_ERROR_FAILURE;
+    }
 
     *aResult = new nsXPTCStubBase(aOuter, iie);
     return NS_OK;
 }
 
 EXPORT_XPCOM_API(void)
 NS_DestroyXPTCallStub(nsISomeInterface* aStub)
 {
--- a/xpcom/reflect/xptinfo/xptinfo.cpp
+++ b/xpcom/reflect/xptinfo/xptinfo.cpp
@@ -57,63 +57,16 @@ nsXPTInterfaceInfo::Method(uint16_t aInd
       return pi->Method(aIndex);
     }
     aIndex -= pi->MethodCount();
   }
 
   return xpt::detail::GetMethod(mMethods + aIndex);
 }
 
-
-////////////////////////////////////////////////
-// nsIInterfaceInfo backcompat implementation //
-////////////////////////////////////////////////
-
-nsresult
-nsXPTInterfaceInfo::GetName(char** aName) const
-{
-  *aName = moz_xstrdup(Name());
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::IsScriptable(bool* aRes) const
-{
-  *aRes = IsScriptable();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::IsBuiltinClass(bool* aRes) const
-{
-  *aRes = IsBuiltinClass();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::GetParent(const nsXPTInterfaceInfo** aParent) const
-{
-  *aParent = GetParent();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::GetMethodCount(uint16_t* aMethodCount) const
-{
-  *aMethodCount = MethodCount();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::GetConstantCount(uint16_t* aConstantCount) const
-{
-  *aConstantCount = ConstantCount();
-  return NS_OK;
-}
-
 nsresult
 nsXPTInterfaceInfo::GetMethodInfo(uint16_t aIndex, const nsXPTMethodInfo** aInfo) const
 {
   *aInfo = aIndex < MethodCount() ? &Method(aIndex) : nullptr;
   return *aInfo ? NS_OK : NS_ERROR_FAILURE;
 }
 
 nsresult
@@ -124,58 +77,16 @@ nsXPTInterfaceInfo::GetConstant(uint16_t
   if (aIndex < ConstantCount()) {
     aConstant.set(Constant(aIndex).JSValue());
     *aName = moz_xstrdup(Constant(aIndex).Name());
     return NS_OK;
   }
   return NS_ERROR_FAILURE;
 }
 
-nsresult
-nsXPTInterfaceInfo::IsIID(const nsIID* aIID, bool* aIs) const
-{
-  *aIs = mIID == *aIID;
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::GetNameShared(const char** aName) const
-{
-  *aName = Name();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::GetIIDShared(const nsIID** aIID) const
-{
-  *aIID = &IID();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::IsFunction(bool* aRetval) const
-{
-  *aRetval = IsFunction();
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::HasAncestor(const nsIID* aIID, bool* aRetval) const
-{
-  *aRetval = HasAncestor(*aIID);
-  return NS_OK;
-}
-
-nsresult
-nsXPTInterfaceInfo::IsMainProcessScriptableOnly(bool* aRetval) const
-{
-  *aRetval = IsMainProcessScriptableOnly();
-  return NS_OK;
-}
-
 ////////////////////////////////////
 // nsXPTMethodInfo symbol helpers //
 ////////////////////////////////////
 
 void
 nsXPTMethodInfo::GetSymbolDescription(JSContext* aCx, nsACString& aID) const
 {
   JS::RootedSymbol symbol(aCx, GetSymbol(aCx));
--- a/xpcom/reflect/xptinfo/xptinfo.h
+++ b/xpcom/reflect/xptinfo/xptinfo.h
@@ -74,17 +74,16 @@ struct nsXPTInterfaceInfo
   static const nsXPTInterfaceInfo* ByIndex(uint16_t aIndex) {
     // NOTE: We add 1 here, as the internal index 0 is reserved for null.
     return xpt::detail::GetInterface(aIndex + 1);
   }
   static uint16_t InterfaceCount() { return xpt::detail::sInterfacesSize; }
 
 
   // Interface flag getters
-  bool IsScriptable() const { return true; } // XXX remove (bug 1480245)
   bool IsFunction() const { return mFunction; }
   bool IsBuiltinClass() const { return mBuiltinClass; }
   bool IsMainProcessScriptableOnly() const { return mMainProcessScriptableOnly; }
 
   const char* Name() const { return xpt::detail::GetString(mName); }
   const nsIID& IID() const { return mIID; }
 
   // Get the parent interface, or null if this interface doesn't have a parent.
@@ -96,39 +95,20 @@ struct nsXPTInterfaceInfo
   bool HasAncestor(const nsIID& aIID) const;
 
   // Get methods & constants
   uint16_t ConstantCount() const { return mNumConsts; }
   const nsXPTConstantInfo& Constant(uint16_t aIndex) const;
   uint16_t MethodCount() const { return mNumMethods; }
   const nsXPTMethodInfo& Method(uint16_t aIndex) const;
 
-
-  ////////////////////////////////////////////////////////////
-  // nsIInterfaceInfo backwards compatibility (bug 1480245) //
-  ////////////////////////////////////////////////////////////
-
-  nsresult GetName(char** aName) const;
-  nsresult IsScriptable(bool* aRes) const;
-  nsresult IsBuiltinClass(bool* aRes) const;
-  nsresult GetParent(const nsXPTInterfaceInfo** aParent) const;
-  nsresult GetMethodCount(uint16_t* aMethodCount) const;
-  nsresult GetConstantCount(uint16_t* aConstantCount) const;
   nsresult GetMethodInfo(uint16_t aIndex, const nsXPTMethodInfo** aInfo) const;
   nsresult GetConstant(uint16_t aIndex,
                        JS::MutableHandleValue constant,
                        char** aName) const;
-  nsresult IsIID(const nsIID* aIID, bool* aIs) const;
-  nsresult GetNameShared(const char** aName) const;
-  nsresult GetIIDShared(const nsIID** aIID) const;
-  nsresult IsFunction(bool* aRetval) const;
-  nsresult HasAncestor(const nsIID* aIID, bool* aRetval) const;
-  nsresult IsMainProcessScriptableOnly(bool* aRetval) const;
-
-  bool EnsureResolved() const { return true; } // XXX: Remove (bug 1480245)
 
   ////////////////////////////////////////////////////////////////
   // Ensure these fields are in the same order as xptcodegen.py //
   ////////////////////////////////////////////////////////////////
 
   nsID mIID;
   uint32_t mName; // Index into xpt::detail::sStrings