From b9699f810dcaa5822c9cd14aa6ee1d6dc770610a Mon Sep 17 00:00:00 2001 From: Florent Fayolle Date: Sat, 10 Sep 2016 00:59:00 +0200 Subject: [PATCH] Bug 1222586 - Don't assume document to be HTML when pasting markup into the markup-view; r=pbro --- devtools/client/inspector/test/browser.ini | 3 ++ ...owser_inspector_menu-03-paste-items-svg.js | 42 +++++++++++++++++++ .../inspector/test/doc_inspector_svg.svg | 3 ++ devtools/server/actors/inspector.js | 14 ++----- 4 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 devtools/client/inspector/test/browser_inspector_menu-03-paste-items-svg.js create mode 100644 devtools/client/inspector/test/doc_inspector_svg.svg diff --git a/devtools/client/inspector/test/browser.ini b/devtools/client/inspector/test/browser.ini index 543f5eb79cc6..f9a142842bc9 100644 --- a/devtools/client/inspector/test/browser.ini +++ b/devtools/client/inspector/test/browser.ini @@ -34,6 +34,7 @@ support-files = 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 @@ -120,6 +121,8 @@ subsuite = clipboard 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] diff --git a/devtools/client/inspector/test/browser_inspector_menu-03-paste-items-svg.js b/devtools/client/inspector/test/browser_inspector_menu-03-paste-items-svg.js new file mode 100644 index 000000000000..26ae3ff00310 --- /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 = ''; +const PASTE_AS_LAST_CHILD = ''; + +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; + } +}); diff --git a/devtools/client/inspector/test/doc_inspector_svg.svg b/devtools/client/inspector/test/doc_inspector_svg.svg new file mode 100644 index 000000000000..75154dcf3d74 --- /dev/null +++ b/devtools/client/inspector/test/doc_inspector_svg.svg @@ -0,0 +1,3 @@ + + + diff --git a/devtools/server/actors/inspector.js b/devtools/server/actors/inspector.js index 12a78fd9f9f2..453477641b0c 100644 --- a/devtools/server/actors/inspector.js +++ b/devtools/server/actors/inspector.js @@ -1987,18 +1987,12 @@ var WalkerActor = protocol.ActorClassWithSpec(walkerSpec, { } 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;