<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[195064] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/195064">195064</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2016-01-14 11:13:26 -0800 (Thu, 14 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Avoid downloading the wrong image for &lt;picture&gt; elements.
https://bugs.webkit.org/show_bug.cgi?id=153027

Reviewed by Dean Jackson.

Source/WebCore:

Added test in fast/picture.

* html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::HTMLImageElement):
(WebCore::HTMLImageElement::~HTMLImageElement):
(WebCore::HTMLImageElement::createForJSConstructor):
(WebCore::HTMLImageElement::bestFitSourceFromPictureElement):
(WebCore::HTMLImageElement::insertedInto):
(WebCore::HTMLImageElement::removedFrom):
(WebCore::HTMLImageElement::pictureElement):
(WebCore::HTMLImageElement::setPictureElement):
(WebCore::HTMLImageElement::width):
* html/HTMLImageElement.h:
(WebCore::HTMLImageElement::hasShadowControls):
* html/HTMLPictureElement.h:
* html/parser/HTMLConstructionSite.cpp:
(WebCore::HTMLConstructionSite::createHTMLElement):
* html/parser/HTMLPreloadScanner.cpp:
(WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):

Images that are built underneath a &lt;picture&gt; element are now connected
to that picture element via a setPictureNode call from the parser. This
ensures that the correct &lt;source&gt; elements are examined before checking the image.

This connection between images and their picture owners is handled using a static
HashMap in HTMLImageElement. This connection is made both from the parser and from
DOM insertions, and the map is queried now instead of looking directly at the
image's parentNode().

LayoutTests:

* fast/picture/image-picture-loads-1x-expected.txt: Added.
* fast/picture/image-picture-loads-1x.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorTestExpectations">trunk/LayoutTests/platform/ios-simulator/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLImageElementcpp">trunk/Source/WebCore/html/HTMLImageElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLImageElementh">trunk/Source/WebCore/html/HTMLImageElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLPictureElementh">trunk/Source/WebCore/html/HTMLPictureElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlparserHTMLConstructionSitecpp">trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlparserHTMLPreloadScannercpp">trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastpicturehidpiimagepictureloadsexpectedtxt">trunk/LayoutTests/fast/picture/hidpi-image-picture-loads-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastpicturehidpiimagepictureloadshtml">trunk/LayoutTests/fast/picture/hidpi-image-picture-loads.html</a></li>
<li><a href="#trunkLayoutTestsplatformmacyosemiteTestExpectations">trunk/LayoutTests/platform/mac-yosemite/TestExpectations</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/LayoutTests/ChangeLog        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-01-14  Dave Hyatt  &lt;hyatt@apple.com&gt;
+
+        Avoid downloading the wrong image for &lt;picture&gt; elements.
+        https://bugs.webkit.org/show_bug.cgi?id=153027
+
+        Reviewed by Dean Jackson.
+
+        * fast/picture/image-picture-loads-1x-expected.txt: Added.
+        * fast/picture/image-picture-loads-1x.html: Added.
+
</ins><span class="cx"> 2016-01-14  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
</span><span class="cx"> 
</span><span class="cx">         Move streams/webkitGetUserMedia-shadowing-then.html to fast/mediastream
</span></span></pre></div>
<a id="trunkLayoutTestsfastpicturehidpiimagepictureloadsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/picture/hidpi-image-picture-loads-expected.txt (0 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/picture/hidpi-image-picture-loads-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/picture/hidpi-image-picture-loads-expected.txt        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+resources/image-set-4x.png - willSendRequest &lt;NSURLRequest URL resources/image-set-4x.png, main document URL hidpi-image-picture-loads.html, http method GET&gt; redirectResponse (null)
+resources/image-set-4x.png - willSendRequest &lt;NSURLRequest URL resources/image-set-4x.png, main document URL hidpi-image-picture-loads.html, http method GET&gt; redirectResponse (null)
+data:,b - willSendRequest &lt;NSURLRequest URL data:,b, main document URL hidpi-image-picture-loads.html, http method GET&gt; redirectResponse (null)
+hidpi-image-picture-loads.html - didFinishLoading
+resources/image-set-4x.png - didReceiveResponse &lt;NSURLResponse resources/image-set-4x.png, http status code 0&gt;
+resources/image-set-4x.png - didFinishLoading
+resources/image-set-4x.png - didReceiveResponse &lt;NSURLResponse resources/image-set-4x.png, http status code 0&gt;
+resources/image-set-4x.png - didFinishLoading
+data:,b - didReceiveResponse &lt;NSURLResponse data:,b, http status code 0&gt;
+data:,b - didFinishLoading
+   
+some text
+         
</ins></span></pre></div>
<a id="trunkLayoutTestsfastpicturehidpiimagepictureloadshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/picture/hidpi-image-picture-loads.html (0 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/picture/hidpi-image-picture-loads.html                                (rev 0)
+++ trunk/LayoutTests/fast/picture/hidpi-image-picture-loads.html        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -0,0 +1,108 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+        &lt;script&gt;
+        if (window.testRunner) {
+                testRunner.dumpAsText();
+            testRunner.dumpResourceLoadCallbacks();
+        }
+        &lt;/script&gt;
+        &lt;!-- simple picture construct --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;simple&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- Multiple img elements --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+            &lt;img id=&quot;multiple&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- non-source children - should be ignored--&gt;
+        &lt;picture&gt;
+            &lt;div&gt;some text&lt;/div&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;other_children&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- source with unknown type - should be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; type=&quot;image/nonsense&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;unknown_type&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- SVG source - should not be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; type=&quot;image/svg+xml&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;svg_type&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- Empty type - should not be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; type=&quot;&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;empty_type&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- whitespace type - should not be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; type=&quot; &quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;whitespace_type&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- parameter type - should not be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; type=&quot;image/png;bla=bla&quot; sizes=&quot;800px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10002 400w, ../hidpi/resources/image-set-2x.png?10002 800w,
+                resources/image-set-4x.png?10002 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;parameter_type&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- source with empty srcset - should be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; sizes=&quot;800px&quot; srcset=&quot;, ,  &quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;empty_srcset&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+        &lt;!-- source with no srcset - should be ignored --&gt;
+        &lt;picture&gt;
+            &lt;source media=&quot;(max-width: 400px)&quot; sizes=&quot;400px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10001 400w, ../hidpi/resources/image-set-2x.png?10001 800w,
+                resources/image-set-4x.png?10001 1600w&quot;&gt;
+            &lt;source media=&quot;(max-width: 800px)&quot; sizes=&quot;800px&quot;&gt;
+            &lt;source media=&quot;(max-width: 1600px)&quot; sizes=&quot;1600px&quot; srcset=&quot;../hidpi/resources/image-set-1x.png?10003 400w, ../hidpi/resources/image-set-2x.png?10003 800w,
+                resources/image-set-4x.png?10003 1600w&quot;&gt;
+            &lt;img id=&quot;no_srcset&quot; src=&quot;resources/blue_rect.jpg?1&quot;&gt;
+        &lt;/picture&gt;
+    &lt;picture&gt;&lt;source srcset=&quot;data:,b&quot;&gt;&lt;img src=&quot;resources/blue_rect.jpg?1&quot;&gt;&lt;/picture&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/TestExpectations        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -2839,7 +2839,6 @@
</span><span class="cx"> webkit.org/b/152141 fast/picture/image-picture-1x.html [ Skip ]
</span><span class="cx"> webkit.org/b/152141 fast/picture/image-picture-invalid.html [ Skip ]
</span><span class="cx"> webkit.org/b/152141 fast/picture/image-picture-nested.html [ Skip ]
</span><del>-webkit.org/b/153043 fast/picture/image-picture-loads-1x.html [ Skip ]
</del><span class="cx"> webkit.org/b/152992 http/tests/loading/preload-picture-invalid.html [ Skip ]
</span><span class="cx"> webkit.org/b/152992 http/tests/loading/preload-picture-nested.html [ Skip ]
</span><span class="cx"> webkit.org/b/152992 http/tests/loading/preload-picture-sizes.html [ Skip ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacyosemiteTestExpectations"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/platform/mac-yosemite/TestExpectations (0 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-yosemite/TestExpectations                                (rev 0)
+++ trunk/LayoutTests/platform/mac-yosemite/TestExpectations        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+webkit.org/b/153027 fast/picture/hidpi-image-picture-loads.html [ Skip ]
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/Source/WebCore/ChangeLog        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2016-01-14  Dave Hyatt  &lt;hyatt@apple.com&gt;
+
+        Avoid downloading the wrong image for &lt;picture&gt; elements.
+        https://bugs.webkit.org/show_bug.cgi?id=153027
+
+        Reviewed by Dean Jackson.
+
+        Added test in fast/picture.
+
+        * html/HTMLImageElement.cpp:
+        (WebCore::HTMLImageElement::HTMLImageElement):
+        (WebCore::HTMLImageElement::~HTMLImageElement):
+        (WebCore::HTMLImageElement::createForJSConstructor):
+        (WebCore::HTMLImageElement::bestFitSourceFromPictureElement):
+        (WebCore::HTMLImageElement::insertedInto):
+        (WebCore::HTMLImageElement::removedFrom):
+        (WebCore::HTMLImageElement::pictureElement):
+        (WebCore::HTMLImageElement::setPictureElement):
+        (WebCore::HTMLImageElement::width):
+        * html/HTMLImageElement.h:
+        (WebCore::HTMLImageElement::hasShadowControls):
+        * html/HTMLPictureElement.h:
+        * html/parser/HTMLConstructionSite.cpp:
+        (WebCore::HTMLConstructionSite::createHTMLElement):
+        * html/parser/HTMLPreloadScanner.cpp:
+        (WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):
+
+        Images that are built underneath a &lt;picture&gt; element are now connected
+        to that picture element via a setPictureNode call from the parser. This
+        ensures that the correct &lt;source&gt; elements are examined before checking the image.
+
+        This connection between images and their picture owners is handled using a static
+        HashMap in HTMLImageElement. This connection is made both from the parser and from
+        DOM insertions, and the map is queried now instead of looking directly at the
+        image's parentNode().
+
</ins><span class="cx"> 2016-01-14  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r195002.
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLImageElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLImageElement.cpp (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLImageElement.cpp        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/Source/WebCore/html/HTMLImageElement.cpp        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -53,6 +53,9 @@
</span><span class="cx"> 
</span><span class="cx"> using namespace HTMLNames;
</span><span class="cx"> 
</span><ins>+typedef HashMap&lt;const HTMLImageElement*, WeakPtr&lt;HTMLPictureElement&gt;&gt; PictureOwnerMap;
+static PictureOwnerMap* gPictureOwnerMap = nullptr;
+
</ins><span class="cx"> HTMLImageElement::HTMLImageElement(const QualifiedName&amp; tagName, Document&amp; document, HTMLFormElement* form)
</span><span class="cx">     : HTMLElement(tagName, document)
</span><span class="cx">     , m_imageLoader(*this)
</span><span class="lines">@@ -82,6 +85,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (m_form)
</span><span class="cx">         m_form-&gt;removeImgElement(this);
</span><ins>+    setPictureElement(nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;HTMLImageElement&gt; HTMLImageElement::createForJSConstructor(Document&amp; document, const int* optionalWidth, const int* optionalHeight)
</span><span class="lines">@@ -140,13 +144,12 @@
</span><span class="cx"> 
</span><span class="cx"> ImageCandidate HTMLImageElement::bestFitSourceFromPictureElement()
</span><span class="cx"> {
</span><del>-    auto* parent = parentNode();
-    if (!is&lt;HTMLPictureElement&gt;(parent))
</del><ins>+    auto* picture = pictureElement();
+    if (!picture)
</ins><span class="cx">         return { };
</span><del>-    auto* picture = downcast&lt;HTMLPictureElement&gt;(parent);
</del><span class="cx">     picture-&gt;clearViewportDependentResults();
</span><span class="cx">     document().removeViewportDependentPicture(*picture);
</span><del>-    for (Node* child = parent-&gt;firstChild(); child &amp;&amp; child != this; child = child-&gt;nextSibling()) {
</del><ins>+    for (Node* child = picture-&gt;firstChild(); child &amp;&amp; child != this; child = child-&gt;nextSibling()) {
</ins><span class="cx">         if (!is&lt;HTMLSourceElement&gt;(*child))
</span><span class="cx">             continue;
</span><span class="cx">         auto&amp; source = downcast&lt;HTMLSourceElement&gt;(*child);
</span><span class="lines">@@ -163,7 +166,7 @@
</span><span class="cx">             if (!type.isEmpty() &amp;&amp; !MIMETypeRegistry::isSupportedImageMIMEType(type) &amp;&amp; type != &quot;image/svg+xml&quot;)
</span><span class="cx">                 continue;
</span><span class="cx">         }
</span><del>-        MediaQueryEvaluator evaluator(document().printing() ? &quot;print&quot; : &quot;screen&quot;, document().frame(), computedStyle());
</del><ins>+        MediaQueryEvaluator evaluator(document().printing() ? &quot;print&quot; : &quot;screen&quot;, document().frame(), document().documentElement() ? document().documentElement()-&gt;computedStyle() : nullptr);
</ins><span class="cx">         bool evaluation = evaluator.evalCheckingViewportDependentResults(source.mediaQuerySet(), picture-&gt;viewportDependentResults());
</span><span class="cx">         if (picture-&gt;hasViewportDependentResults())
</span><span class="cx">             document().addViewportDependentPicture(*picture);
</span><span class="lines">@@ -313,8 +316,10 @@
</span><span class="cx">     if (insertionPoint.inDocument() &amp;&amp; !m_lowercasedUsemap.isNull())
</span><span class="cx">         document().addImageElementByLowercasedUsemap(*m_lowercasedUsemap.impl(), *this);
</span><span class="cx"> 
</span><del>-    if (is&lt;HTMLPictureElement&gt;(parentNode()))
</del><ins>+    if (is&lt;HTMLPictureElement&gt;(parentNode())) {
+        setPictureElement(&amp;downcast&lt;HTMLPictureElement&gt;(*parentNode()));
</ins><span class="cx">         selectImageSource();
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     // If we have been inserted from a renderer-less document,
</span><span class="cx">     // our loader may have not fetched the image, so do it now.
</span><span class="lines">@@ -331,11 +336,37 @@
</span><span class="cx"> 
</span><span class="cx">     if (insertionPoint.inDocument() &amp;&amp; !m_lowercasedUsemap.isNull())
</span><span class="cx">         document().removeImageElementByLowercasedUsemap(*m_lowercasedUsemap.impl(), *this);
</span><del>-
</del><ins>+    
+    if (is&lt;HTMLPictureElement&gt;(parentNode()))
+        setPictureElement(nullptr);
+    
</ins><span class="cx">     m_form = nullptr;
</span><span class="cx">     HTMLElement::removedFrom(insertionPoint);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+HTMLPictureElement* HTMLImageElement::pictureElement() const
+{
+    if (!gPictureOwnerMap || !gPictureOwnerMap-&gt;contains(this))
+        return nullptr;
+    HTMLPictureElement* result = gPictureOwnerMap-&gt;get(this).get();
+    if (!result)
+        gPictureOwnerMap-&gt;remove(this);
+    return result;
+}
+    
+void HTMLImageElement::setPictureElement(HTMLPictureElement* pictureElement)
+{
+    if (!pictureElement) {
+        if (gPictureOwnerMap)
+            gPictureOwnerMap-&gt;remove(this);
+        return;
+    }
+    
+    if (!gPictureOwnerMap)
+        gPictureOwnerMap = new PictureOwnerMap();
+    gPictureOwnerMap-&gt;add(this, pictureElement-&gt;createWeakPtr());
+}
+    
</ins><span class="cx"> int HTMLImageElement::width(bool ignorePendingStylesheets)
</span><span class="cx"> {
</span><span class="cx">     if (!renderer()) {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLImageElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLImageElement.h (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLImageElement.h        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/Source/WebCore/html/HTMLImageElement.h        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -87,6 +87,9 @@
</span><span class="cx">     virtual const AtomicString&amp; imageSourceURL() const override;
</span><span class="cx"> 
</span><span class="cx">     bool hasShadowControls() const { return m_experimentalImageMenuEnabled; }
</span><ins>+    
+    HTMLPictureElement* pictureElement() const;
+    void setPictureElement(HTMLPictureElement*);
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     HTMLImageElement(const QualifiedName&amp;, Document&amp;, HTMLFormElement* = 0);
</span><span class="lines">@@ -127,6 +130,7 @@
</span><span class="cx">     HTMLImageLoader m_imageLoader;
</span><span class="cx">     HTMLFormElement* m_form;
</span><span class="cx">     HTMLFormElement* m_formSetByParser;
</span><ins>+
</ins><span class="cx">     CompositeOperator m_compositeOperator;
</span><span class="cx">     AtomicString m_bestFitImageURL;
</span><span class="cx">     AtomicString m_currentSrc;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLPictureElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLPictureElement.h (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLPictureElement.h        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/Source/WebCore/html/HTMLPictureElement.h        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -46,9 +46,12 @@
</span><span class="cx">     
</span><span class="cx">     bool viewportChangeAffectedPicture();
</span><span class="cx"> 
</span><ins>+    WeakPtr&lt;HTMLPictureElement&gt; createWeakPtr() { return m_weakFactory.createWeakPtr(); }
+
</ins><span class="cx"> private:
</span><span class="cx">     HTMLPictureElement(const QualifiedName&amp;, Document&amp;);
</span><span class="cx">     
</span><ins>+    WeakPtrFactory&lt;HTMLPictureElement&gt; m_weakFactory { this };
</ins><span class="cx">     Vector&lt;std::unique_ptr&lt;MediaQueryResult&gt;&gt; m_viewportDependentMediaQueryResults;
</span><span class="cx"> 
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlparserHTMLConstructionSitecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -36,9 +36,11 @@
</span><span class="cx"> #include &quot;HTMLElementFactory.h&quot;
</span><span class="cx"> #include &quot;HTMLFormElement.h&quot;
</span><span class="cx"> #include &quot;HTMLHtmlElement.h&quot;
</span><ins>+#include &quot;HTMLImageElement.h&quot;
</ins><span class="cx"> #include &quot;HTMLOptGroupElement.h&quot;
</span><span class="cx"> #include &quot;HTMLOptionElement.h&quot;
</span><span class="cx"> #include &quot;HTMLParserIdioms.h&quot;
</span><ins>+#include &quot;HTMLPictureElement.h&quot;
</ins><span class="cx"> #include &quot;HTMLScriptElement.h&quot;
</span><span class="cx"> #include &quot;HTMLTemplateElement.h&quot;
</span><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="lines">@@ -640,6 +642,13 @@
</span><span class="cx">     Document&amp; ownerDocument = ownerDocumentForCurrentNode();
</span><span class="cx">     bool insideTemplateElement = !ownerDocument.frame();
</span><span class="cx">     RefPtr&lt;Element&gt; element = HTMLElementFactory::createElement(tagName, ownerDocument, insideTemplateElement ? nullptr : form(), true);
</span><ins>+    
+    // FIXME: This is a hack to connect images to pictures before the image has
+    // been inserted into the document. It can be removed once asynchronous image
+    // loading is working.
+    if (is&lt;HTMLPictureElement&gt;(currentNode()) &amp;&amp; is&lt;HTMLImageElement&gt;(*element.get()))
+        downcast&lt;HTMLImageElement&gt;(*element.get()).setPictureElement(&amp;downcast&lt;HTMLPictureElement&gt;(currentNode()));
+
</ins><span class="cx">     setAttributes(element.get(), token, m_parserContentPolicy);
</span><span class="cx">     ASSERT(element-&gt;isHTMLElement());
</span><span class="cx">     return element.release();
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlparserHTMLPreloadScannercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp (195063 => 195064)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp        2016-01-14 19:05:07 UTC (rev 195063)
+++ trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp        2016-01-14 19:13:26 UTC (rev 195064)
</span><span class="lines">@@ -208,7 +208,7 @@
</span><span class="cx">                 m_mediaAttribute = attributeValue;
</span><span class="cx">                 Ref&lt;MediaQuerySet&gt; mediaSet = MediaQuerySet::createAllowingDescriptionSyntax(attributeValue);
</span><span class="cx">                 Vector&lt;std::unique_ptr&lt;MediaQueryResult&gt;&gt; viewportDependentMediaQueryResults;
</span><del>-                MediaQueryEvaluator evaluator(document.printing() ? &quot;print&quot; : &quot;screen&quot;, document.frame(), document.documentElement()-&gt;computedStyle());
</del><ins>+                MediaQueryEvaluator evaluator(document.printing() ? &quot;print&quot; : &quot;screen&quot;, document.frame(), document.documentElement() ? document.documentElement()-&gt;computedStyle() : nullptr);
</ins><span class="cx">                 m_mediaMatched = evaluator.evalCheckingViewportDependentResults(mediaSet.ptr(), viewportDependentMediaQueryResults);
</span><span class="cx">             }
</span><span class="cx">             break;
</span></span></pre>
</div>
</div>

</body>
</html>