Bug 1097419 - Part 2: Add mochitest for nested mozbrowser iframe case. r=kanru
authorMorris Tseng <mtseng@mozilla.com>
Mon, 05 Jan 2015 01:03:00 -0500
changeset 248076 496546af038ec0899f35b574bf9d21eac0a62d20
parent 248075 8e5920cdf87b89bdc578ccf085e63f017bf22c94
child 248077 d4c66f8130fc00bb6a6cd5cbe7865d439d588b88
push id4489
push userraliiev@mozilla.com
push dateMon, 23 Feb 2015 15:17:55 +0000
treeherdermozilla-beta@fd7c3dc24146 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskanru
bugs1097419
milestone37.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1097419 - Part 2: Add mochitest for nested mozbrowser iframe case. r=kanru
dom/browser-element/mochitest/browserElement_CopyPaste.js
dom/browser-element/mochitest/file_NestedFramesOuter_CopyPaste.html
dom/browser-element/mochitest/mochitest.ini
--- a/dom/browser-element/mochitest/browserElement_CopyPaste.js
+++ b/dom/browser-element/mochitest/browserElement_CopyPaste.js
@@ -5,24 +5,27 @@
 "use strict";
 
 SimpleTest.waitForExplicitFinish();
 SimpleTest.requestFlakyTimeout("untriaged");
 browserElementTestHelpers.setEnabledPref(true);
 browserElementTestHelpers.setSelectionChangeEnabledPref(true);
 browserElementTestHelpers.addPermission();
 const { Services } = SpecialPowers.Cu.import('resource://gre/modules/Services.jsm');
+
 var gTextarea = null;
 var mm;
-var iframe;
+var iframeOuter;
+var iframeInner;
 var state = 0;
 var stateMeaning;
 var defaultData;
 var pasteData;
 var focusScript;
+var createEmbededFrame = false;
 
 function copyToClipboard(str) {
   gTextarea.value = str;
   SpecialPowers.wrap(gTextarea).editor.selectAll();
   SpecialPowers.wrap(gTextarea).editor.copy();
 }
 
 function getScriptForGetContent() {
@@ -41,127 +44,164 @@ function getScriptForGetContent() {
 }
 
 function getScriptForSetFocus() {
   var script = 'data:,' + focusScript + 'sendAsyncMessage("content-focus")';
   return script;
 }
 
 function runTest() {
-  iframe = document.createElement('iframe');
-  iframe.setAttribute('mozbrowser', 'true');
-  document.body.appendChild(iframe);
+  iframeOuter = document.createElement('iframe');
+  iframeOuter.setAttribute('mozbrowser', 'true');
+  if (createEmbededFrame) {
+    iframeOuter.src = "file_NestedFramesOuter_CopyPaste.html";
+  }
+  document.body.appendChild(iframeOuter);
 
   gTextarea = document.createElement('textarea');
   document.body.appendChild(gTextarea);
 
-  mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
+  iframeOuter.addEventListener("mozbrowserloadend", function onloadend(e) {
+    iframeOuter.removeEventListener("mozbrowserloadend", onloadend);
 
-  iframe.addEventListener("mozbrowserloadend", function onloadend(e) {
-    iframe.removeEventListener("mozbrowserloadend", onloadend);
-    dispatchTest(e);
+    if (createEmbededFrame) {
+      var contentWin = SpecialPowers.wrap(iframeOuter)
+                             .QueryInterface(SpecialPowers.Ci.nsIFrameLoaderOwner)
+                             .frameLoader.docShell.contentViewer.DOMDocument.defaultView;
+      var contentDoc = contentWin.document;
+      iframeInner = contentDoc.getElementById('iframeInner');
+      iframeInner.addEventListener("mozbrowserloadend", function onloadendinner(e) {
+        iframeInner.removeEventListener("mozbrowserloadend", onloadendinner);
+        mm = SpecialPowers.getBrowserFrameMessageManager(iframeInner);
+        dispatchTest(e);
+      });
+    } else {
+      iframeInner = iframeOuter;
+      mm = SpecialPowers.getBrowserFrameMessageManager(iframeInner);
+      dispatchTest(e);
+    }
   });
 }
 
 function doCommand(cmd) {
-  Services.obs.notifyObservers({wrappedJSObject: iframe},
+  Services.obs.notifyObservers({wrappedJSObject: SpecialPowers.unwrap(iframeInner)},
                                'copypaste-docommand', cmd);
 }
 
 function dispatchTest(e) {
-  iframe.addEventListener("mozbrowserloadend", function onloadend2(e) {
-    iframe.removeEventListener("mozbrowserloadend", onloadend2);
-    iframe.focus();
+  iframeInner.addEventListener("mozbrowserloadend", function onloadend2(e) {
+    iframeInner.removeEventListener("mozbrowserloadend", onloadend2);
+    iframeInner.focus();
     SimpleTest.executeSoon(function() { testSelectAll(e); });
   });
 
   switch (state) {
     case 0: // test for textarea
       defaultData = "Test for selection change event";
       pasteData = "from parent ";
-      iframe.src = "data:text/html,<html><body>" +
+      iframeInner.src = "data:text/html,<html><body>" +
                    "<textarea id='text'>" + defaultData + "</textarea>" +
                    "</body>" +
                    "</html>";
       stateMeaning = " (test: textarea)";
       focusScript = "var elt=content.document.getElementById('text');elt.focus();elt.select();";
       break;
     case 1: // test for input text
       defaultData = "Test for selection change event";
       pasteData = "from parent ";
-      iframe.src = "data:text/html,<html><body>" +
+      iframeInner.src = "data:text/html,<html><body>" +
                    "<input type='text' id='text' value='" + defaultData + "'>" +
                    "</body>" +
                    "</html>";
       stateMeaning = " (test: <input type=text>)";
       focusScript = "var elt=content.document.getElementById('text');elt.focus();elt.select();";
       break;
     case 2: // test for input number
       defaultData = "12345";
       pasteData = "67890";
-      iframe.src = "data:text/html,<html><body>" +
+      iframeInner.src = "data:text/html,<html><body>" +
                    "<input type='number' id='text' value='" + defaultData + "'>" +
                    "</body>" +
                    "</html>";
       stateMeaning = " (test: <input type=number>)";
       focusScript = "var elt=content.document.getElementById('text');elt.focus();elt.select();";
       break;
     case 3: // test for div contenteditable
       defaultData = "Test for selection change event";
       pasteData = "from parent ";
-      iframe.src = "data:text/html,<html><body>" +
+      iframeInner.src = "data:text/html,<html><body>" +
                    "<div contenteditable='true' id='text'>" + defaultData + "</div>" +
                    "</body>" +
                    "</html>";
       stateMeaning = " (test: content editable div)";
       focusScript = "var elt=content.document.getElementById('text');elt.focus();";
       break;
     case 4: // test for normal div
-      SimpleTest.finish();
-      return;
       defaultData = "Test for selection change event";
       pasteData = "from parent ";
-      iframe.src = "data:text/html,<html><body>" +
+      iframeInner.src = "data:text/html,<html><body>" +
                    "<div id='text'>" + defaultData + "</div>" +
                    "</body>" +
                    "</html>";
       stateMeaning = " (test: normal div)";
       focusScript = "var elt=content.document.getElementById('text');elt.focus();";
       break;
     case 5: // test for normal div with designMode:on
       defaultData = "Test for selection change event";
       pasteData = "from parent ";
-      iframe.src = "data:text/html,<html><body id='text'>" +
+      iframeInner.src = "data:text/html,<html><body id='text'>" +
                    defaultData +
                    "</body>" +
                    "<script>document.designMode='on';</script>" +
                    "</html>";
       stateMeaning = " (test: normal div with designMode:on)";
       focusScript = "var elt=content.document.getElementById('text');elt.focus();";
       break;
     default:
-      SimpleTest.finish();
+      if (createEmbededFrame || browserElementTestHelpers.getOOPByDefaultPref()) {
+        SimpleTest.finish();
+      } else {
+        createEmbededFrame = true;
+
+        // clean up and run test again.
+        document.body.removeChild(iframeOuter);
+        document.body.removeChild(gTextarea);
+        state = 0;
+        runTest();
+      }
       break;
   }
 }
 
+function isChildProcess() {
+  return SpecialPowers.Cc["@mozilla.org/xre/app-info;1"]
+                         .getService(SpecialPowers.Ci.nsIXULRuntime)
+                         .processType != SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
+}
+
 function testSelectAll(e) {
-  iframe.addEventListener("mozbrowserselectionstatechanged", function selectchangeforselectall(e) {
-    iframe.removeEventListener("mozbrowserselectionstatechanged", selectchangeforselectall, true);
-    ok(true, "got mozbrowserselectionstatechanged event." + stateMeaning);
-    ok(e.detail, "event.detail is not null." + stateMeaning);
-    ok(e.detail.width != 0, "event.detail.width is not zero" + stateMeaning);
-    ok(e.detail.height != 0, "event.detail.height is not zero" + stateMeaning);
-    SimpleTest.executeSoon(function() { testCopy1(e); });
-  }, true);
+  // Skip mozbrowser test if we're at child process.
+  if (!isChildProcess()) {
+    iframeOuter.addEventListener("mozbrowserselectionstatechanged", function selectchangeforselectall(e) {
+      iframeOuter.removeEventListener("mozbrowserselectionstatechanged", selectchangeforselectall, true);
+      ok(true, "got mozbrowserselectionstatechanged event." + stateMeaning);
+      ok(e.detail, "event.detail is not null." + stateMeaning);
+      ok(e.detail.width != 0, "event.detail.width is not zero" + stateMeaning);
+      ok(e.detail.height != 0, "event.detail.height is not zero" + stateMeaning);
+      SimpleTest.executeSoon(function() { testCopy1(e); });
+    }, true);
+  }
 
   mm.addMessageListener('content-focus', function messageforfocus(msg) {
     mm.removeMessageListener('content-focus', messageforfocus);
     // test selectall command, after calling this the selectionstatechanged event should be fired.
     doCommand('selectall');
+    if (isChildProcess()) {
+      SimpleTest.executeSoon(function() { testCopy1(e); });
+    }
   });
 
   mm.loadFrameScript(getScriptForSetFocus(), false);
 }
 
 function testCopy1(e) {
   // Right now we're at "selectall" state, so we can test copy commnad by
   // calling doCommand
@@ -237,19 +277,21 @@ function testCut1(e) {
     nextTest(true);
   }
 
   let fail = function() {
     nextTest(false);
   }
 
   let compareData = pasteData;
-  if (state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) {
-    // Something weird when we doCommand with content editable element in OOP.
-    // Always true in this case
+  // Something weird when we doCommand with content editable element in OOP.
+  // Always true in this case
+  // Normal div case cannot cut, always true as well.
+  if ((state == 3 && browserElementTestHelpers.getOOPByDefaultPref()) ||
+      state == 4) {
     compareData = function() { return true; }
   }
 
   SimpleTest.waitForClipboard(compareData, setup, success, fail);
 }
 
 function testCut2(e) {
   mm.addMessageListener('content-text', function messageforcut(msg) {
@@ -266,9 +308,20 @@ function testCut2(e) {
 
     state++;
     dispatchTest(e);
   });
 
   mm.loadFrameScript(getScriptForGetContent(), false);
 }
 
-addEventListener('testready', runTest);
+// Give our origin permission to open browsers, and remove it when the test is complete.
+var principal = SpecialPowers.wrap(document).nodePrincipal;
+var context = { 'url': SpecialPowers.wrap(principal.URI).spec,
+                'appId': principal.appId,
+                'isInBrowserElement': true };
+
+addEventListener('testready', function() {
+  SpecialPowers.pushPermissions([
+    {'type': 'browser', 'allow': 1, 'context': context}
+  ], runTest);
+});
+
new file mode 100644
--- /dev/null
+++ b/dom/browser-element/mochitest/file_NestedFramesOuter_CopyPaste.html
@@ -0,0 +1,21 @@
+<html>
+<body>
+<p>file_NestedFramesOuter_CopyPaste.html</p>
+<script>
+
+addEventListener('load', function() {
+  setTimeout(createIframe, 0);
+});
+
+function createIframe()
+{
+  var iframe = document.createElement('iframe');
+  iframe.setAttribute('id', 'iframeInner');
+  iframe.setAttribute('mozbrowser', true);
+  iframe.setAttribute('remote', 'false');
+  document.body.appendChild(iframe);
+}
+
+</script>
+</body>
+</html>
--- a/dom/browser-element/mochitest/mochitest.ini
+++ b/dom/browser-element/mochitest/mochitest.ini
@@ -108,16 +108,17 @@ support-files =
   file_download_bin.sjs
   file_empty.html
   file_empty_script.js
   file_focus.html
   file_http_401_response.sjs
   file_inputmethod.html
   file_post_request.html
   file_wyciwyg.html
+  file_NestedFramesOuter_CopyPaste.html
 
 # Note: browserElementTestHelpers.js looks at the test's filename to determine
 # whether the test should be OOP.  "_oop_" signals OOP, "_inproc_" signals in
 # process.  Default is OOP.
 [test_browserElement_NoAttr.html]
 [test_browserElement_NoPref.html]
 [test_browserElement_NoPermission.html]
 [test_browserElement_inproc_Alert.html]