<!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>[185665] 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/185665">185665</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2015-06-17 14:06:58 -0700 (Wed, 17 Jun 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Selection cache produces invalid result when ancestor has float element.
https://bugs.webkit.org/show_bug.cgi?id=146042
rdar://problem/20604592
Reviewed by Ryosuke Niwa.
Selection cache already takes floats into account, however it's not enough to check current
block against floats. Any of the ancestor's float starting from the selection root block
can impact the selection offsets.
Source/WebCore:
Test: fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html
* rendering/LogicalSelectionOffsetCaches.h:
(WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::ContainingBlockInfo):
(WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::setBlock):
(WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::block):
(WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::cache):
(WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::hasFloatsOrFlowThreads):
(WebCore::LogicalSelectionOffsetCaches::LogicalSelectionOffsetCaches):
LayoutTests:
* fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float-expected.txt: Added.
* fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingLogicalSelectionOffsetCachesh">trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastblockselectioncacheisincorrectwhennondirectparenthasfloatexpectedtxt">trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastblockselectioncacheisincorrectwhennondirectparenthasfloathtml">trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (185664 => 185665)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-06-17 20:41:03 UTC (rev 185664)
+++ trunk/LayoutTests/ChangeLog        2015-06-17 21:06:58 UTC (rev 185665)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-06-17 Zalan Bujtas <zalan@apple.com>
+
+ Selection cache produces invalid result when ancestor has float element.
+ https://bugs.webkit.org/show_bug.cgi?id=146042
+ rdar://problem/20604592
+
+ Reviewed by Ryosuke Niwa.
+
+ Selection cache already takes floats into account, however it's not enough to check current
+ block against floats. Any of the ancestor's float starting from the selection root block
+ can impact the selection offsets.
+
+ * fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float-expected.txt: Added.
+ * fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html: Added.
+
</ins><span class="cx"> 2015-06-17 Joanmarie Diggs <jdiggs@igalia.com>
</span><span class="cx">
</span><span class="cx"> AX: [ATK] Expose element tag name as an object attribute
</span></span></pre></div>
<a id="trunkLayoutTestsfastblockselectioncacheisincorrectwhennondirectparenthasfloatexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float-expected.txt (0 => 185665)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float-expected.txt         (rev 0)
+++ trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float-expected.txt        2015-06-17 21:06:58 UTC (rev 185665)
</span><span class="lines">@@ -0,0 +1,2 @@
</span><ins>+Pass if no crash or assert in debug.
+bar
</ins></span></pre></div>
<a id="trunkLayoutTestsfastblockselectioncacheisincorrectwhennondirectparenthasfloathtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html (0 => 185665)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html         (rev 0)
+++ trunk/LayoutTests/fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html        2015-06-17 21:06:58 UTC (rev 185665)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<style>
+ ol {
+         margin: 0px;
+ }
+
+ .float {
+ float: left;
+ width: 100px;
+         height: 100px;
+ }
+</style>
+<script>
+ if (window.testRunner)
+ testRunner.dumpAsText();
+</script>
+</head>
+<body>
+ <ol><li>Pass if no crash or assert in debug.</li></ol>
+ <div class=float>bar</div>
+ <script>
+ document.designMode = "on";
+ document.execCommand("SelectAll");
+ </script>
+</body>
+</html>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (185664 => 185665)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-06-17 20:41:03 UTC (rev 185664)
+++ trunk/Source/WebCore/ChangeLog        2015-06-17 21:06:58 UTC (rev 185665)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-06-17 Zalan Bujtas <zalan@apple.com>
+
+ Selection cache produces invalid result when ancestor has float element.
+ https://bugs.webkit.org/show_bug.cgi?id=146042
+ rdar://problem/20604592
+
+ Reviewed by Ryosuke Niwa.
+
+ Selection cache already takes floats into account, however it's not enough to check current
+ block against floats. Any of the ancestor's float starting from the selection root block
+ can impact the selection offsets.
+
+ Test: fast/block/selection-cache-is-incorrect-when-non-direct-parent-has-float.html
+
+ * rendering/LogicalSelectionOffsetCaches.h:
+ (WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::ContainingBlockInfo):
+ (WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::setBlock):
+ (WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::block):
+ (WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::cache):
+ (WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::hasFloatsOrFlowThreads):
+ (WebCore::LogicalSelectionOffsetCaches::LogicalSelectionOffsetCaches):
+
</ins><span class="cx"> 2015-06-17 Joanmarie Diggs <jdiggs@igalia.com>
</span><span class="cx">
</span><span class="cx"> AX: [ATK] Expose element tag name as an object attribute
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingLogicalSelectionOffsetCachesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h (185664 => 185665)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h        2015-06-17 20:41:03 UTC (rev 185664)
+++ trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h        2015-06-17 21:06:58 UTC (rev 185665)
</span><span class="lines">@@ -30,25 +30,20 @@
</span><span class="cx"> class ContainingBlockInfo {
</span><span class="cx"> public:
</span><span class="cx"> ContainingBlockInfo()
</span><del>- : m_block(0)
- , m_cache(0)
- , m_hasFloatsOrFlowThreads(false)
</del><ins>+ : m_hasFloatsOrFlowThreads(false)
</ins><span class="cx"> , m_cachedLogicalLeftSelectionOffset(false)
</span><span class="cx"> , m_cachedLogicalRightSelectionOffset(false)
</span><span class="cx"> { }
</span><span class="cx">
</span><del>- void setBlock(RenderBlock* block, const LogicalSelectionOffsetCaches* cache)
</del><ins>+ void setBlock(RenderBlock* block, const LogicalSelectionOffsetCaches* cache, bool parentCacheHasFloatsOrFlowThreads = false)
</ins><span class="cx"> {
</span><span class="cx"> m_block = block;
</span><del>- m_hasFloatsOrFlowThreads = m_hasFloatsOrFlowThreads || m_block->containsFloats() || m_block->flowThreadContainingBlock();
</del><ins>+ m_hasFloatsOrFlowThreads = parentCacheHasFloatsOrFlowThreads || m_hasFloatsOrFlowThreads || m_block->containsFloats() || m_block->flowThreadContainingBlock();
</ins><span class="cx"> m_cache = cache;
</span><span class="cx"> m_cachedLogicalLeftSelectionOffset = false;
</span><span class="cx"> m_cachedLogicalRightSelectionOffset = false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- RenderBlock* block() const { return m_block; }
- const LogicalSelectionOffsetCaches* cache() const { return m_cache; }
-
</del><span class="cx"> LayoutUnit logicalLeftSelectionOffset(RenderBlock& rootBlock, LayoutUnit position) const
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_cache);
</span><span class="lines">@@ -71,9 +66,13 @@
</span><span class="cx"> return m_logicalRightSelectionOffset;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ RenderBlock* block() const { return m_block; }
+ const LogicalSelectionOffsetCaches* cache() const { return m_cache; }
+ bool hasFloatsOrFlowThreads() const { return m_hasFloatsOrFlowThreads; }
+
</ins><span class="cx"> private:
</span><del>- RenderBlock* m_block;
- const LogicalSelectionOffsetCaches* m_cache;
</del><ins>+ RenderBlock* m_block { nullptr };
+ const LogicalSelectionOffsetCaches* m_cache { nullptr };
</ins><span class="cx"> bool m_hasFloatsOrFlowThreads : 1;
</span><span class="cx"> mutable bool m_cachedLogicalLeftSelectionOffset : 1;
</span><span class="cx"> mutable bool m_cachedLogicalRightSelectionOffset : 1;
</span><span class="lines">@@ -102,12 +101,12 @@
</span><span class="cx"> , m_containingBlockForAbsolutePosition(cache.m_containingBlockForAbsolutePosition)
</span><span class="cx"> {
</span><span class="cx"> if (block.canContainFixedPositionObjects())
</span><del>- m_containingBlockForFixedPosition.setBlock(&block, &cache);
</del><ins>+ m_containingBlockForFixedPosition.setBlock(&block, &cache, cache.m_containingBlockForFixedPosition.hasFloatsOrFlowThreads());
</ins><span class="cx">
</span><span class="cx"> if (block.canContainAbsolutelyPositionedObjects() && !block.isRenderInline() && !block.isAnonymousBlock())
</span><del>- m_containingBlockForFixedPosition.setBlock(&block, &cache);
</del><ins>+ m_containingBlockForAbsolutePosition.setBlock(&block, &cache, cache.m_containingBlockForAbsolutePosition.hasFloatsOrFlowThreads());
</ins><span class="cx">
</span><del>- m_containingBlockForInflowPosition.setBlock(&block, &cache);
</del><ins>+ m_containingBlockForInflowPosition.setBlock(&block, &cache, cache.m_containingBlockForInflowPosition.hasFloatsOrFlowThreads());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const ContainingBlockInfo& containingBlockInfo(RenderBlock& block) const
</span></span></pre>
</div>
</div>
</body>
</html>