Bug 1237698 - adding support for switch to frame inside anonymous content. draft
authorYura Zenevich <yzenevich@mozilla.com>
Fri, 08 Jan 2016 17:03:05 -0500
changeset 320167 559ec69368ca7403b7a1b7b10c44bfefb33fcf86
parent 310966 2dbf097f3449b39888cbaab921afdaeddaf38f59
child 512696 770abde17c99ae7c0cb7e2b056cca3566092ddd0
push id9144
push useryura.zenevich@gmail.com
push dateFri, 08 Jan 2016 22:03:42 +0000
bugs1237698
milestone45.0a1
Bug 1237698 - adding support for switch to frame inside anonymous content. --- .../marionette/chrome/test_anonymous_content.xul | 9 +++++++++ .../tests/unit/test_anonymous_content.py | 10 ++++++++++ testing/marionette/driver.js | 23 ++++++++++++++++++++++ 3 files changed, 42 insertions(+)
testing/marionette/client/marionette/chrome/test_anonymous_content.xul
testing/marionette/client/marionette/tests/unit/test_anonymous_content.py
testing/marionette/driver.js
--- a/testing/marionette/client/marionette/chrome/test_anonymous_content.xul
+++ b/testing/marionette/client/marionette/chrome/test_anonymous_content.xul
@@ -14,13 +14,22 @@
     <binding id="framebox">
       <content orient="vertical" mousethrough="never">
         <xul:browser anonid="content" id="browser" flex="1"
                    context="contentAreaContextMenu"
                    src="test.xul"
                    type="content"/>
       </content>
     </binding>
+
+    <binding id="iframebox">
+      <content>
+        <xul:box>
+          <xul:iframe anonid="iframe" src="chrome://marionette/content/test.xul"></xul:iframe>
+        </xul:box>
+      </content>
+    </binding>
   </bindings>
   <hbox id="testAnonymousContentBox"/>
   <hbox id="container" style="-moz-binding: url('#testBindings');"/>
+  <hbox id="container2" style="-moz-binding: url('#iframebox');"/>
   </dialog>
 </window>
--- a/testing/marionette/client/marionette/tests/unit/test_anonymous_content.py
+++ b/testing/marionette/client/marionette/tests/unit/test_anonymous_content.py
@@ -28,16 +28,26 @@ class TestAnonymousContent(MarionetteTes
         self.marionette.find_element("id", "testAnonymousContentBox")
         anon_browser_el = self.marionette.find_element("id", "browser")
         self.assertTrue("test_anonymous_content.xul" in self.marionette.get_url())
         self.marionette.switch_to_frame(anon_browser_el)
         self.assertTrue("test.xul" in self.marionette.get_url())
         self.marionette.find_element("id", "testXulBox")
         self.assertRaises(NoSuchElementException, self.marionette.find_element, "id", "testAnonymousContentBox")
 
+    def test_switch_to_anonymous_iframe(self):
+        self.marionette.find_element("id", "testAnonymousContentBox")
+        el = self.marionette.find_element("id", "container2")
+        anon_iframe_el = el.find_element("anon attribute", {"anonid": "iframe"})
+        self.marionette.switch_to_frame(anon_iframe_el)
+        self.assertTrue("test.xul" in self.marionette.get_url())
+        self.marionette.find_element("id", "testXulBox")
+        self.assertRaises(NoSuchElementException, self.marionette.find_element, "id",
+                          "testAnonymousContentBox")
+
     def test_find_anonymous_element_by_attribute(self):
         el = Wait(self.marionette).until(element_present("id", "dia"))
         self.assertEquals(HTMLElement, type(el.find_element("anon attribute", {"anonid": "buttons"})))
         self.assertEquals(1, len(el.find_elements("anon attribute", {"anonid": "buttons"})))
 
         with self.assertRaises(NoSuchElementException):
             el.find_element("anon attribute", {"anonid": "nonexistent"})
         self.assertEquals([], el.find_elements("anon attribute", {"anonid": "nonexistent"}))
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -1681,16 +1681,39 @@ GeckoDriver.prototype.switchToFrame = fu
           curWindow = wantedFrame.contentWindow;
           this.curFrame = curWindow;
           if (focus) {
             this.curFrame.focus();
           }
           checkTimer.initWithCallback(checkLoad.bind(this), 100, Ci.nsITimer.TYPE_ONE_SHOT);
           return;
         }
+
+        // Check if the frame is XBL anonymous
+        let parent = curWindow.document.getBindingParent(wantedFrame);
+        // Shadow nodes also show up in getAnonymousNodes, we should ignore them.
+        if (parent && !(parent.shadowRoot && parent.shadowRoot.contains(wantedFrame))) {
+          let anonNodes = [...curWindow.document.getAnonymousNodes(parent) || []];
+          if (anonNodes.length > 0) {
+            let el = wantedFrame;
+            while (el) {
+              if (anonNodes.indexOf(el) > -1) {
+                curWindow = wantedFrame.contentWindow;
+                this.curFrame = curWindow;
+                if (focus) {
+                  this.curFrame.focus();
+                }
+                checkTimer.initWithCallback(checkLoad.bind(this), 100, Ci.nsITimer.TYPE_ONE_SHOT);
+                return;
+              }
+              el = el.parentNode;
+            }
+          }
+        }
+
         // else, assume iframe
         let frames = curWindow.document.getElementsByTagName("iframe");
         let numFrames = frames.length;
         for (let i = 0; i < numFrames; i++) {
           if (XPCNativeWrapper(frames[i]) == XPCNativeWrapper(wantedFrame)) {
             curWindow = frames[i].contentWindow;
             this.curFrame = curWindow;
             if (focus) {