Bug 1097419 - Part 2: Add mochitest for nested mozbrowser iframe case. r=kchen
☠☠ backed out by 088cfed82c74 ☠ ☠
authorMorris Tseng <mtseng@mozilla.com>
Tue, 23 Dec 2014 17:38:00 -0500
changeset 238124 e85722c30be37b7eddec9485707546a5c13020e3
parent 238123 28714f577de0b501dfffb8c961cc8877c3d4ac95
child 238125 866eedaf819c745d9a38a8bd96046e17377931e8
push id7472
push userraliiev@mozilla.com
push dateMon, 12 Jan 2015 20:36:27 +0000
treeherdermozilla-aurora@300ca104f8fb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskchen
bugs1097419
milestone37.0a1
Bug 1097419 - Part 2: Add mochitest for nested mozbrowser iframe case. r=kchen
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,115 +44,140 @@ 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);
+  iframeInner.addEventListener("mozbrowserloadend", function onloadend2(e) {
+    iframeInner.removeEventListener("mozbrowserloadend", onloadend2);
     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 testSelectAll(e) {
-  iframe.addEventListener("mozbrowserselectionstatechanged", function selectchangeforselectall(e) {
-    iframe.removeEventListener("mozbrowserselectionstatechanged", selectchangeforselectall, true);
+  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) {
@@ -236,19 +264,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) {
@@ -265,9 +295,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]