Release assert with <img usemap> in shadow tree
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 13 Jan 2019 13:15:11 +0000 (13:15 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 13 Jan 2019 13:15:11 +0000 (13:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=193378

Reviewed by Ryosuke Niwa.

Source/WebCore:

When a shadow host that has <img usemap> in the shadow tree is removed from the document, we try
to remove the map from the scope of the host.

* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::parseAttribute):
(WebCore::HTMLImageElement::insertedIntoAncestor):
(WebCore::HTMLImageElement::removedFromAncestor):

Tree scope changes are relevant, not the connection to the document.

LayoutTests:

* fast/shadow-dom/image-map-tree-scope.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@239905 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/shadow-dom/image-map-tree-scope-expected.txt
LayoutTests/fast/shadow-dom/image-map-tree-scope.html
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLImageElement.cpp

index f2101ba..0f9c05a 100644 (file)
@@ -1,3 +1,12 @@
+2019-01-13  Antti Koivisto  <antti@apple.com>
+
+        Release assert with <img usemap> in shadow tree
+        https://bugs.webkit.org/show_bug.cgi?id=193378
+
+        Reviewed by Ryosuke Niwa.
+
+        * fast/shadow-dom/image-map-tree-scope.html:
+
 2019-01-12  Timothy Hatcher  <timothy@apple.com>
 
         Have prefers-color-scheme: light always match on macOS versions before Mojave.
 2019-01-12  Timothy Hatcher  <timothy@apple.com>
 
         Have prefers-color-scheme: light always match on macOS versions before Mojave.
index 14af92a..021ed34 100644 (file)
@@ -6,7 +6,7 @@ if (window.testRunner)
 
 function test() {
     var shadow = host.attachShadow({mode: "open"});
 
 function test() {
     var shadow = host.attachShadow({mode: "open"});
-    shadow.innerHTML = '<map name="bar">';
+    shadow.innerHTML = '<map name="bar"></map><img usemap="#bar">';
     host.remove();
 }
 </script>
     host.remove();
 }
 </script>
@@ -14,6 +14,7 @@ function test() {
 <body onload="test()">
 This test passes if it doesn't crash.
 <map id="map" name="foo"></map>
 <body onload="test()">
 This test passes if it doesn't crash.
 <map id="map" name="foo"></map>
+<img usemap="#foo">
 <div id="host"></div>
 </body>
 </html>
 <div id="host"></div>
 </body>
 </html>
index 4c23442..13a5e33 100644 (file)
@@ -1,3 +1,20 @@
+2019-01-13  Antti Koivisto  <antti@apple.com>
+
+        Release assert with <img usemap> in shadow tree
+        https://bugs.webkit.org/show_bug.cgi?id=193378
+
+        Reviewed by Ryosuke Niwa.
+
+        When a shadow host that has <img usemap> in the shadow tree is removed from the document, we try
+        to remove the map from the scope of the host.
+
+        * html/HTMLImageElement.cpp:
+        (WebCore::HTMLImageElement::parseAttribute):
+        (WebCore::HTMLImageElement::insertedIntoAncestor):
+        (WebCore::HTMLImageElement::removedFromAncestor):
+
+        Tree scope changes are relevant, not the connection to the document.
+
 2019-01-12  Timothy Hatcher  <timothy@apple.com>
 
         Have prefers-color-scheme: light always match on macOS versions before Mojave.
 2019-01-12  Timothy Hatcher  <timothy@apple.com>
 
         Have prefers-color-scheme: light always match on macOS versions before Mojave.
index 2e728ae..6d1320c 100644 (file)
@@ -227,12 +227,12 @@ void HTMLImageElement::parseAttribute(const QualifiedName& name, const AtomicStr
     } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr)
         selectImageSource();
     else if (name == usemapAttr) {
     } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr)
         selectImageSource();
     else if (name == usemapAttr) {
-        if (isConnected() && !m_parsedUsemap.isNull())
+        if (isInTreeScope() && !m_parsedUsemap.isNull())
             treeScope().removeImageElementByUsemap(*m_parsedUsemap.impl(), *this);
 
         m_parsedUsemap = parseHTMLHashNameReference(value);
 
             treeScope().removeImageElementByUsemap(*m_parsedUsemap.impl(), *this);
 
         m_parsedUsemap = parseHTMLHashNameReference(value);
 
-        if (isConnected() && !m_parsedUsemap.isNull())
+        if (isInTreeScope() && !m_parsedUsemap.isNull())
             treeScope().addImageElementByUsemap(*m_parsedUsemap.impl(), *this);
     } else if (name == compositeAttr) {
         // FIXME: images don't support blend modes in their compositing attribute.
             treeScope().addImageElementByUsemap(*m_parsedUsemap.impl(), *this);
     } else if (name == compositeAttr) {
         // FIXME: images don't support blend modes in their compositing attribute.
@@ -356,7 +356,7 @@ Node::InsertedIntoAncestorResult HTMLImageElement::insertedIntoAncestor(Insertio
     if (insertionType.connectedToDocument && hasEditableImageAttribute())
         insertNotificationRequest = InsertedIntoAncestorResult::NeedsPostInsertionCallback;
 
     if (insertionType.connectedToDocument && hasEditableImageAttribute())
         insertNotificationRequest = InsertedIntoAncestorResult::NeedsPostInsertionCallback;
 
-    if (insertionType.connectedToDocument && !m_parsedUsemap.isNull())
+    if (insertionType.treeScopeChanged && !m_parsedUsemap.isNull())
         treeScope().addImageElementByUsemap(*m_parsedUsemap.impl(), *this);
 
     if (is<HTMLPictureElement>(parentNode())) {
         treeScope().addImageElementByUsemap(*m_parsedUsemap.impl(), *this);
 
     if (is<HTMLPictureElement>(parentNode())) {
@@ -383,7 +383,7 @@ void HTMLImageElement::removedFromAncestor(RemovalType removalType, ContainerNod
     if (m_form)
         m_form->removeImgElement(this);
 
     if (m_form)
         m_form->removeImgElement(this);
 
-    if (removalType.disconnectedFromDocument && !m_parsedUsemap.isNull())
+    if (removalType.treeScopeChanged && !m_parsedUsemap.isNull())
         oldParentOfRemovedTree.treeScope().removeImageElementByUsemap(*m_parsedUsemap.impl(), *this);
 
     if (is<HTMLPictureElement>(parentNode()))
         oldParentOfRemovedTree.treeScope().removeImageElementByUsemap(*m_parsedUsemap.impl(), *this);
 
     if (is<HTMLPictureElement>(parentNode()))