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(+)
--- 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) {