Bug 787203: Get Marionette working in Fennec. draft
authorDavid Burns <dburns@mozilla.com>
Tue, 01 Mar 2016 21:06:29 +0000
changeset 339857 3e8b5815180c530e5c131b2a8437fc9e474660c1
parent 339856 48314f305f726c8e6253442167ca44f09a4c667d
child 516058 fe1cf2d1b1216f4e422d4c37397c761e4dd26f74
push id12810
push usernalexander@mozilla.com
push dateMon, 14 Mar 2016 00:19:10 +0000
bugs787203
milestone48.0a1
Bug 787203: Get Marionette working in Fennec. MozReview-Commit-ID: D5sFULBOdcU
mobile/android/app/mobile.js
mobile/android/chrome/content/browser.js
testing/marionette/driver.js
testing/marionette/harness/marionette/marionette_test.py
testing/marionette/harness/marionette/runner/base.py
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -14,16 +14,21 @@
 //
 // For instance: cachePercentageWidth is 1500
 //               viewport height is 500
 //               => display port height will be 500 * 1.5 = 750
 //
 pref("toolkit.browser.cacheRatioWidth", 2000);
 pref("toolkit.browser.cacheRatioHeight", 3000);
 
+//marionette to be removed
+
+pref("marionette.defaultPrefs.enabled", true);
+pref("marionette.defaultPrefs.port", 2828);
+
 // How long before a content view (a handle to a remote scrollable object)
 // expires.
 pref("toolkit.browser.contentViewExpire", 3000);
 
 pref("toolkit.defaultChromeURI", "chrome://browser/content/browser.xul");
 pref("browser.chromeURL", "chrome://browser/content/");
 
 // If a tab has not been active for this long (seconds), then it may be
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -3342,16 +3342,18 @@ Tab.prototype = {
       return;
 
     aParams = aParams || {};
 
     this.browser = document.createElement("browser");
     this.browser.setAttribute("type", "content-targetable");
     this.browser.setAttribute("messagemanagergroup", "browsers");
 
+    this.browser.permanentKey = {};
+
     // Make sure the previously selected panel remains selected. The selected panel of a deck is
     // not stable when panels are added.
     let selectedPanel = BrowserApp.deck.selectedPanel;
     BrowserApp.deck.insertBefore(this.browser, aParams.sibling || null);
     BrowserApp.deck.selectedPanel = selectedPanel;
 
     if (BrowserApp.manifestUrl) {
       let appsService = Cc["@mozilla.org/AppsService;1"].getService(Ci.nsIAppsService);
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -1499,39 +1499,39 @@ GeckoDriver.prototype.setWindowPosition 
  * Switch current top-level browsing context by name or server-assigned ID.
  * Searches for windows by name, then ID.  Content windows take precedence.
  *
  * @param {string} name
  *     Target name or ID of the window to switch to.
  */
 GeckoDriver.prototype.switchToWindow = function*(cmd, resp) {
   let switchTo = cmd.parameters.name;
-  let isB2G = this.appName == "B2G";
+  let isMobile = this.appName == "B2G" || this.appName == "Fennec";
   let found;
 
   let getOuterWindowId = function(win) {
     let rv = win.QueryInterface(Ci.nsIInterfaceRequestor)
         .getInterface(Ci.nsIDOMWindowUtils)
         .outerWindowID;
-    rv += isB2G ? "-b2g" : "";
+    rv += isMobile ? "-b2g" : "";
     return rv;
   };
 
   let byNameOrId = function(name, outerId, contentWindowId) {
     return switchTo == name ||
         switchTo == contentWindowId ||
         switchTo == outerId;
   };
 
   let winEn = this.getWinEnumerator();
   while (winEn.hasMoreElements()) {
     let win = winEn.getNext();
     let outerId = getOuterWindowId(win);
 
-    if (win.gBrowser && !isB2G) {
+    if (win.gBrowser && !isMobile) {
       let tabbrowser = win.gBrowser;
       for (let i = 0; i < tabbrowser.browsers.length; ++i) {
         let browser = tabbrowser.getBrowserAtIndex(i);
         let contentWindowId = this.getIdForBrowser(browser);
         if (byNameOrId(win.name, contentWindowId, outerId)) {
           found = {
             win: win,
             outerId: outerId,
@@ -3034,29 +3034,33 @@ var BrowserObj = function(win, driver) {
   this.updateIdForBrowser = driver.updateIdForBrowser.bind(driver);
   this._curFrameId = null;
   this._browserWasRemote = null;
   this._hasRemotenessChange = false;
 };
 
 Object.defineProperty(BrowserObj.prototype, "browserForTab", {
   get() {
-    return this.browser.getBrowserForTab(this.tab);
+    if (this.browser.getBrowserForTab) {
+      return this.browser.getBrowserForTab(this.tab);
+    } else {
+      return this.browser.selectedBrowser;
+    }
   }
 });
 
 /**
  * The current frame ID is managed per browser element on desktop in
  * case the ID needs to be refreshed. The currently selected window is
  * identified within BrowserObject by a tab.
  */
 Object.defineProperty(BrowserObj.prototype, "curFrameId", {
   get() {
     let rv = null;
-    if (this.driver.appName != "Firefox") {
+    if (this.driver.appName != "Firefox" && this.driver.appName != "Fennec") {
       rv = this._curFrameId;
     } else if (this.tab) {
       rv = this.getIdForBrowser(this.browserForTab);
     }
     return rv;
   },
 
   set(id) {
@@ -3137,20 +3141,21 @@ BrowserObj.prototype.addTab = function(u
  * If a window is provided, this BrowserObj's internal reference is updated
  * before proceeding.
  */
 BrowserObj.prototype.switchToTab = function(ind, win) {
   if (win) {
     this.window = win;
     this.setBrowser(win);
   }
-
-  this.browser.selectTabAtIndex(ind);
+  if (this.browser.selectTabAtIndex) {
+    this.browser.selectTabAtIndex(ind);
+    this._browserWasRemote = this.browserForTab.isRemoteBrowser;
+  }
   this.tab = this.browser.selectedTab;
-  this._browserWasRemote = this.browserForTab.isRemoteBrowser;
   this._hasRemotenessChange = false;
 };
 
 /**
  * Registers a new frame, and sets its current frame id to this frame
  * if it is not already assigned, and if a) we already have a session
  * or b) we're starting a new session and it is the right start frame.
  *
--- a/testing/marionette/harness/marionette/marionette_test.py
+++ b/testing/marionette/harness/marionette/marionette_test.py
@@ -90,17 +90,18 @@ def skip_if_desktop(target):
     def wrapper(self, *args, **kwargs):
         if self.marionette.session_capabilities.get('b2g') is None:
             raise SkipTest('skipping due to desktop')
         return target(self, *args, **kwargs)
     return wrapper
 
 def skip_if_b2g(target):
     def wrapper(self, *args, **kwargs):
-        if self.marionette.session_capabilities.get('b2g') == True:
+        if self.marionette.session_capabilities.get('b2g') == True or \
+           self.marionette.session_capabilities.get('browserName') == 'Fennec':
             raise SkipTest('skipping due to b2g')
         return target(self, *args, **kwargs)
     return wrapper
 
 def skip_if_e10s(target):
     def wrapper(self, *args, **kwargs):
         with self.marionette.using_context('chrome'):
             multi_process_browser = self.marionette.execute_script("""
--- a/testing/marionette/harness/marionette/runner/base.py
+++ b/testing/marionette/harness/marionette/runner/base.py
@@ -808,17 +808,17 @@ setReq.onerror = function() {
         need_external_ip = True
         if not self.marionette:
             self.start_marionette()
             # Retrieve capabilities for later use
             if not self._capabilities:
                 self.capabilities
             # if we're working against a desktop version, we usually don't need
             # an external ip
-            if self._capabilities['device'] == "desktop":
+            if self._capabilities['device'] == "desktop" and self.capabilities['browserName'] != 'Fennec':
                 need_external_ip = False
         self.logger.info('Initial Profile Destination is '
                          '"{}"'.format(self.marionette.profile_path))
 
         # Gaia sets server_root and that means we shouldn't spin up our own httpd
         if not self.httpd:
             if self.server_root is None or os.path.isdir(self.server_root):
                 self.logger.info("starting httpd")
@@ -847,25 +847,25 @@ setReq.onerror = function() {
         invalid_tests = \
             [t['filepath'] for t in self.tests
              if not os.path.basename(t['filepath']).startswith('test_')]
         if invalid_tests:
             raise Exception("Tests file names must starts with 'test_'."
                             " Invalid test names:\n  %s"
                             % '\n  '.join(invalid_tests))
 
-        version_info = mozversion.get_version(binary=self.bin,
-                                              sources=self.sources,
-                                              dm_type=os.environ.get('DM_TRANS', 'adb'),
-                                              device_serial=self.device_serial,
-                                              adb_host=self.marionette.adb_host,
-                                              adb_port=self.marionette.adb_port)
+        # version_info = mozversion.get_version(binary=self.bin,
+        #                                       sources=self.sources,
+        #                                       dm_type=os.environ.get('DM_TRANS', 'adb'),
+        #                                       device_serial=self.device_serial,
+        #                                       adb_host=self.marionette.adb_host,
+        #                                       adb_port=self.marionette.adb_port)
 
         self.logger.suite_start(self.tests,
-                                version_info=version_info,
+                                # version_info=version_info,
                                 device_info=device_info)
 
         for test in self.manifest_skipped_tests:
             name = os.path.basename(test['path'])
             self.logger.test_start(name)
             self.logger.test_end(name,
                                  'SKIP',
                                  message=test['disabled'])