Diff
Modified: releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/LayoutTests/ChangeLog 2017-02-27 07:43:27 UTC (rev 213029)
@@ -1,3 +1,14 @@
+2017-02-20 Zalan Bujtas <[email protected]>
+
+ Simple line layout: Implement absoluteQuadsForRange.
+ https://bugs.webkit.org/show_bug.cgi?id=168613
+ <rdar://problem/30614618>
+
+ Reviewed by Simon Fraser.
+
+ * fast/dom/Range/simple-line-layout-getclientrects-expected.html: Added.
+ * fast/dom/Range/simple-line-layout-getclientrects.html: Added.
+
2017-02-20 Carlos Garcia Campos <[email protected]>
Unreviewed GTK+ gardening. Fix tests reporting missing results.
Added: releases/WebKitGTK/webkit-2.16/LayoutTests/fast/dom/Range/simple-line-layout-getclientrects-expected.html (0 => 213029)
--- releases/WebKitGTK/webkit-2.16/LayoutTests/fast/dom/Range/simple-line-layout-getclientrects-expected.html (rev 0)
+++ releases/WebKitGTK/webkit-2.16/LayoutTests/fast/dom/Range/simple-line-layout-getclientrects-expected.html 2017-02-27 07:43:27 UTC (rev 213029)
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<head>
+<title>This tests that simple and normal line layout produce the same getClientRects result.</title>
+<style>
+.rangeBox {
+ position:absolute;
+ outline: 5px solid green;
+}
+
+.box {
+ width: 400px;
+ line-height: 40px;
+}
+
+.outer {
+ outline: 2px solid green;
+}
+
+#test8 {
+ -webkit-transform: translate(50px, 100px) rotate(50deg);
+}
+</style>
+</head>
+<body>
+<div class="box" id="test1">1 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test2">2 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test3">3 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test4">4 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do <div class="outer">eiusmod tempor</div> incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test5">5 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do <div class="outer">eiusmod tempor</div> incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test6">6 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test7">7 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test8">8 <div>Lorem ipsum dolor sit amet,</div> consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test9">9 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test10">10 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<script>
+ if (window.internals)
+ internals.settings.setSimpleLineLayoutEnabled(false);
+
+ function visualizeClientRects(range) {
+ var rects = range.getClientRects();
+ for (var i = 0; i < rects.length; ++i) {
+ var rect = rects[i];
+ rangeBox = document.createElement('div');
+ rangeBox.className = "rangeBox";
+ var style = "";
+ style += "left: " + rect.left + "px;";
+ style += "top: " + rect.top + "px;";
+ style += "width: " + (rect.right - rect.left) + "px;";
+ style += "height: " + (rect.bottom - rect.top) + "px;";
+ rangeBox.setAttribute("style", style);
+ document.documentElement.appendChild(rangeBox);
+ }
+ }
+
+ var range = document.createRange();
+ range.selectNode(document.getElementById('test1'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test2').firstChild, 10);
+ range.selectNodeContents(document.getElementById('test2'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test3').firstChild, 11);
+ range.setEnd(document.getElementById('test3').lastChild, 200);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.selectNode(document.getElementById('test4'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.selectNodeContents(document.getElementById('test5'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test6').firstChild, 11);
+ range.setEnd(document.getElementById('test6').lastChild, 0);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test7'), 0);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test8').firstChild, 0);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStartBefore(document.getElementById('test9'));
+ range.setEndAfter(document.getElementById('test9').firstChild);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStartBefore(document.getElementById('test10'));
+ range.setEndBefore(document.getElementById('test10').firstChild);
+ visualizeClientRects(range);
+</script>
+</body>
+</html>
Added: releases/WebKitGTK/webkit-2.16/LayoutTests/fast/dom/Range/simple-line-layout-getclientrects.html (0 => 213029)
--- releases/WebKitGTK/webkit-2.16/LayoutTests/fast/dom/Range/simple-line-layout-getclientrects.html (rev 0)
+++ releases/WebKitGTK/webkit-2.16/LayoutTests/fast/dom/Range/simple-line-layout-getclientrects.html 2017-02-27 07:43:27 UTC (rev 213029)
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<head>
+<title>This tests that simple and normal line layout produce the same getClientRects result.</title>
+<style>
+.rangeBox {
+ position:absolute;
+ outline: 5px solid green;
+}
+
+.box {
+ width: 400px;
+ line-height: 40px;
+}
+
+.outer {
+ outline: 2px solid green;
+}
+
+#test8 {
+ -webkit-transform: translate(50px, 100px) rotate(50deg);
+}
+</style>
+</head>
+<body>
+<div class="box" id="test1">1 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test2">2 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test3">3 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test4">4 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do <div class="outer">eiusmod tempor</div> incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test5">5 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do <div class="outer">eiusmod tempor</div> incididunt ut labore etdolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test6">6 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test7">7 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test8">8 <div>Lorem ipsum dolor sit amet,</div> consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test9">9 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<div class="box" id="test10">10 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
+<script>
+ function visualizeClientRects(range) {
+ var rects = range.getClientRects();
+ for (var i = 0; i < rects.length; ++i) {
+ var rect = rects[i];
+ rangeBox = document.createElement('div');
+ rangeBox.className = "rangeBox";
+ var style = "";
+ style += "left: " + rect.left + "px;";
+ style += "top: " + rect.top + "px;";
+ style += "width: " + (rect.right - rect.left) + "px;";
+ style += "height: " + (rect.bottom - rect.top) + "px;";
+ rangeBox.setAttribute("style", style);
+ document.documentElement.appendChild(rangeBox);
+ }
+ }
+
+ var range = document.createRange();
+ range.selectNode(document.getElementById('test1'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test2').firstChild, 10);
+ range.selectNodeContents(document.getElementById('test2'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test3').firstChild, 11);
+ range.setEnd(document.getElementById('test3').lastChild, 200);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.selectNode(document.getElementById('test4'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.selectNodeContents(document.getElementById('test5'));
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test6').firstChild, 11);
+ range.setEnd(document.getElementById('test6').lastChild, 0);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test7'), 0);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStart(document.getElementById('test8').firstChild, 0);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStartBefore(document.getElementById('test9'));
+ range.setEndAfter(document.getElementById('test9').firstChild);
+ visualizeClientRects(range);
+
+ range = document.createRange();
+ range.setStartBefore(document.getElementById('test10'));
+ range.setEndBefore(document.getElementById('test10').firstChild);
+ visualizeClientRects(range);
+</script>
+</body>
+</html>
Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/ChangeLog 2017-02-27 07:43:27 UTC (rev 213029)
@@ -1,3 +1,25 @@
+2017-02-20 Zalan Bujtas <[email protected]>
+
+ Simple line layout: Implement absoluteQuadsForRange.
+ https://bugs.webkit.org/show_bug.cgi?id=168613
+ <rdar://problem/30614618>
+
+ Reviewed by Simon Fraser.
+
+ This patch ensures that the commonly used Range::getClientRects calls do not
+ throw us off of the simple line layout path.
+
+ Test: fast/dom/Range/simple-line-layout-getclientrects.html
+
+ * rendering/RenderText.cpp:
+ (WebCore::RenderText::absoluteQuadsForRange):
+ * rendering/SimpleLineLayoutFunctions.cpp:
+ (WebCore::SimpleLineLayout::collectAbsoluteQuadsForRange): Special case empty ranges with multiple empty runs.
+ * rendering/SimpleLineLayoutFunctions.h:
+ * rendering/SimpleLineLayoutResolver.cpp:
+ (WebCore::SimpleLineLayout::RunResolver::rangeForRendererWithOffsets):
+ * rendering/SimpleLineLayoutResolver.h:
+
2017-02-20 Brent Fulgham <[email protected]>
Nullptr dereferences when stopping a load
Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderText.cpp (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderText.cpp 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/RenderText.cpp 2017-02-27 07:43:27 UTC (rev 213029)
@@ -422,18 +422,18 @@
Vector<FloatQuad> RenderText::absoluteQuadsForRange(unsigned start, unsigned end, bool useSelectionHeight, bool* wasFixed) const
{
- const_cast<RenderText&>(*this).ensureLineBoxes();
-
// Work around signed/unsigned issues. This function takes unsigneds, and is often passed UINT_MAX
- // to mean "all the way to the end". InlineTextBox coordinates are unsigneds, so changing this
- // function to take ints causes various internal mismatches. But selectionRect takes ints, and
- // passing UINT_MAX to it causes trouble. Ideally we'd change selectionRect to take unsigneds, but
+ // to mean "all the way to the end". InlineTextBox coordinates are unsigneds, so changing this
+ // function to take ints causes various internal mismatches. But selectionRect takes ints, and
+ // passing UINT_MAX to it causes trouble. Ideally we'd change selectionRect to take unsigneds, but
// that would cause many ripple effects, so for now we'll just clamp our unsigned parameters to INT_MAX.
ASSERT(end == UINT_MAX || end <= INT_MAX);
ASSERT(start <= INT_MAX);
start = std::min(start, static_cast<unsigned>(INT_MAX));
end = std::min(end, static_cast<unsigned>(INT_MAX));
-
+ if (simpleLineLayout() && !useSelectionHeight)
+ return collectAbsoluteQuadsForRange(*this, start, end, *simpleLineLayout(), wasFixed);
+ const_cast<RenderText&>(*this).ensureLineBoxes();
return m_lineBoxes.absoluteQuadsForRange(*this, start, end, useSelectionHeight, wasFixed);
}
Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp 2017-02-27 07:43:27 UTC (rev 213029)
@@ -232,6 +232,37 @@
return run.start() + style.fontCascade().offsetForPosition(textRun, point.x() - run.logicalLeft(), true);
}
+Vector<FloatQuad> collectAbsoluteQuadsForRange(const RenderObject& renderer, unsigned start, unsigned end, const Layout& layout, bool* wasFixed)
+{
+ auto& style = downcast<RenderBlockFlow>(*renderer.parent()).style();
+ Vector<FloatQuad> quads;
+ auto resolver = runResolver(downcast<RenderBlockFlow>(*renderer.parent()), layout);
+ for (auto run : resolver.rangeForRendererWithOffsets(renderer, start, end)) {
+ // This run is fully contained.
+ if (start <= run.start() && end >= run.end()) {
+ quads.append(renderer.localToAbsoluteQuad(FloatQuad(run.rect()), UseTransforms, wasFixed));
+ continue;
+ }
+ // Partially contained run.
+ TextRun textRun(run.text(), run.logicalLeft(), run.expansion(), run.expansionBehavior());
+ textRun.setTabSize(!style.collapseWhiteSpace(), style.tabSize());
+ LayoutRect runRect(run.rect());
+ // Special case empty ranges.
+ if (start == end) {
+ runRect.setWidth(0);
+ quads.append(renderer.localToAbsoluteQuad(FloatQuad(runRect), UseTransforms, wasFixed));
+ continue;
+ }
+ ASSERT(start < run.end());
+ ASSERT(end > run.start());
+ auto localStart = std::max(run.start(), start) - run.start();
+ auto localEnd = std::min(run.end(), end) - run.start();
+ style.fontCascade().adjustSelectionRectForText(textRun, runRect, localStart, localEnd);
+ quads.append(renderer.localToAbsoluteQuad(FloatQuad(runRect), UseTransforms, wasFixed));
+ }
+ return quads;
+}
+
#if ENABLE(TREE_DEBUGGING)
static void printPrefix(int& printedCharacters, int depth)
{
Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutFunctions.h (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutFunctions.h 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutFunctions.h 2017-02-27 07:43:27 UTC (rev 213029)
@@ -58,6 +58,7 @@
Vector<IntRect> collectAbsoluteRects(const RenderObject&, const Layout&, const LayoutPoint& accumulatedOffset);
Vector<FloatQuad> collectAbsoluteQuads(const RenderObject&, const Layout&, bool* wasFixed);
unsigned textOffsetForPoint(const LayoutPoint&, const RenderText&, const Layout&);
+Vector<FloatQuad> collectAbsoluteQuadsForRange(const RenderObject&, unsigned start, unsigned end, const Layout&, bool* wasFixed);
LayoutUnit lineHeightFromFlow(const RenderBlockFlow&);
LayoutUnit baselineFromFlow(const RenderBlockFlow&);
Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp 2017-02-27 07:43:27 UTC (rev 213029)
@@ -219,6 +219,26 @@
return --it;
}
+Range<RunResolver::Iterator> RunResolver::rangeForRendererWithOffsets(const RenderObject& renderer, unsigned startOffset, unsigned endOffset) const
+{
+ ASSERT(startOffset <= endOffset);
+ auto range = rangeForRenderer(renderer);
+ auto it = range.begin();
+ // Advance to the firt run with the start offset inside.
+ while (it != range.end() && (*it).end() <= startOffset)
+ ++it;
+ if (it == range.end())
+ return { end(), end() };
+ auto rangeBegin = it;
+ // Special case empty ranges that start at the edge of the run. Apparently normal line layout include those.
+ if (endOffset == startOffset && (*it).start() == endOffset)
+ return { rangeBegin, ++it };
+ // Advance beyond the last run with the end offset.
+ while (it != range.end() && (*it).start() < endOffset)
+ ++it;
+ return { rangeBegin, it };
+}
+
LineResolver::Iterator::Iterator(RunResolver::Iterator runIterator)
: m_runIterator(runIterator)
{
Modified: releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutResolver.h (213028 => 213029)
--- releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutResolver.h 2017-02-27 07:43:14 UTC (rev 213028)
+++ releases/WebKitGTK/webkit-2.16/Source/WebCore/rendering/SimpleLineLayoutResolver.h 2017-02-27 07:43:27 UTC (rev 213029)
@@ -116,6 +116,7 @@
Range<Iterator> rangeForRect(const LayoutRect&) const;
Range<Iterator> rangeForRenderer(const RenderObject&) const;
Iterator runForPoint(const LayoutPoint&) const;
+ Range<Iterator> rangeForRendererWithOffsets(const RenderObject&, unsigned start, unsigned end) const;
private:
enum class IndexType { First, Last };