Bug 1222586 - Don't assume document to be HTML when pasting markup into the markup-view; r=pbro
authorFlorent Fayolle <fayolle-florent@orange.fr>
Sat, 10 Sep 2016 00:59:00 +0200
changeset 356973 cd2f33114ac415889028969fa92ea2e803a1d2be
parent 356941 a07fb64ae0a7dc76aa0f8e7067ed169baf11ef7c
child 356974 4cba7ff88539a9b47628cd86d0eb86199a7d0077
push id1324
push usermtabara@mozilla.com
push dateMon, 16 Jan 2017 13:07:44 +0000
treeherdermozilla-release@a01c49833940 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerspbro
bugs1222586
milestone51.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 1222586 - Don't assume document to be HTML when pasting markup into the markup-view; r=pbro
devtools/client/inspector/test/browser.ini
devtools/client/inspector/test/browser_inspector_menu-03-paste-items-svg.js
devtools/client/inspector/test/doc_inspector_svg.svg
devtools/server/actors/inspector.js
--- a/devtools/client/inspector/test/browser.ini
+++ b/devtools/client/inspector/test/browser.ini
@@ -29,16 +29,17 @@ support-files =
   doc_inspector_outerhtml.html
   doc_inspector_remove-iframe-during-load.html
   doc_inspector_search.html
   doc_inspector_search-reserved.html
   doc_inspector_search-suggestions.html
   doc_inspector_search-svg.html
   doc_inspector_select-last-selected-01.html
   doc_inspector_select-last-selected-02.html
+  doc_inspector_svg.svg
   head.js
   shared-head.js
   !/devtools/client/commandline/test/helpers.js
   !/devtools/client/framework/test/shared-head.js
   !/devtools/client/shared/test/test-actor.js
   !/devtools/client/shared/test/test-actor-registry.js
 
 [browser_inspector_addNode_01.js]
@@ -115,16 +116,18 @@ skip-if = (e10s && debug) # Bug 1250058 
 subsuite = clipboard
 [browser_inspector_keyboard-shortcuts.js]
 [browser_inspector_menu-01-sensitivity.js]
 subsuite = clipboard
 [browser_inspector_menu-02-copy-items.js]
 subsuite = clipboard
 [browser_inspector_menu-03-paste-items.js]
 subsuite = clipboard
+[browser_inspector_menu-03-paste-items-svg.js]
+subsuite = clipboard
 [browser_inspector_menu-04-use-in-console.js]
 [browser_inspector_menu-05-attribute-items.js]
 [browser_inspector_menu-06-other.js]
 [browser_inspector_navigation.js]
 [browser_inspector_pane-toggle-01.js]
 [browser_inspector_pane-toggle-02.js]
 [browser_inspector_pane-toggle-03.js]
 [browser_inspector_pane-toggle-04.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/test/browser_inspector_menu-03-paste-items-svg.js
@@ -0,0 +1,42 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+// Test that HTML can be pasted in SVG elements.
+
+const TEST_URL = URL_ROOT + "doc_inspector_svg.svg";
+const PASTE_AS_FIRST_CHILD = '<circle xmlns="http://www.w3.org/2000/svg" cx="42" cy="42" r="5"/>';
+const PASTE_AS_LAST_CHILD = '<circle xmlns="http://www.w3.org/2000/svg" cx="42" cy="42" r="15"/>';
+
+add_task(function* () {
+  let clipboard = require("sdk/clipboard");
+
+  let { inspector, testActor } = yield openInspectorForURL(TEST_URL);
+
+  let refSelector = "svg";
+  let oldHTML = yield testActor.getProperty(refSelector, "innerHTML");
+  yield selectNode(refSelector, inspector);
+  let markupTagLine = getContainerForSelector(refSelector, inspector).tagLine;
+
+  yield pasteContent("node-menu-pastefirstchild", PASTE_AS_FIRST_CHILD);
+  yield pasteContent("node-menu-pastelastchild", PASTE_AS_LAST_CHILD);
+
+  let html = yield testActor.getProperty(refSelector, "innerHTML");
+  let expectedHtml = PASTE_AS_FIRST_CHILD + oldHTML + PASTE_AS_LAST_CHILD;
+  is(html, expectedHtml, "The innerHTML of the SVG node is correct");
+
+  // Helpers
+  function* pasteContent(menuId, clipboardData) {
+    let allMenuItems = openContextMenuAndGetAllItems(inspector, {
+      target: markupTagLine,
+    });
+    info(`Testing ${menuId} for ${clipboardData}`);
+    clipboard.set(clipboardData);
+
+    let onMutation = inspector.once("markupmutation");
+    allMenuItems.find(item => item.id === menuId).click();
+    info("Waiting for mutation to occur");
+    yield onMutation;
+  }
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/test/doc_inspector_svg.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+  <circle r="5"/>
+</svg>
--- a/devtools/server/actors/inspector.js
+++ b/devtools/server/actors/inspector.js
@@ -1982,28 +1982,22 @@ var WalkerActor = protocol.ActorClassWit
    * @param {string} value The HTML content.
    */
   insertAdjacentHTML: function (node, position, value) {
     if (isNodeDead(node)) {
       return {node: [], newParents: []};
     }
 
     let rawNode = node.rawNode;
-    // Don't insert anything adjacent to the document element,
-    // the head or the body.
-    if (node.isDocumentElement()) {
-      throw new Error("Can't insert adjacent element to the root.");
-    }
-
     let isInsertAsSibling = position === "beforeBegin" ||
       position === "afterEnd";
-    if ((rawNode.tagName === "BODY" || rawNode.tagName === "HEAD") &&
-      isInsertAsSibling) {
-      throw new Error("Can't insert element before or after the body " +
-        "or the head.");
+
+    // Don't insert anything adjacent to the document element.
+    if (isInsertAsSibling && node.isDocumentElement()) {
+      throw new Error("Can't insert adjacent element to the root.");
     }
 
     let rawParentNode = rawNode.parentNode;
     if (!rawParentNode && isInsertAsSibling) {
       throw new Error("Can't insert as sibling without parent node.");
     }
 
     // We can't use insertAdjacentHTML, because we want to return the nodes