COMMIT_MESSAGE

 1Extend HitTestResult to support not "discarding" shadow content in favor of its DOM ancestor
 2https://bugs.webkit.org/show_bug.cgi?id=80847
 3
 4Reviewed by NOBODY (OOPS!).
 5Patch by Antonio Gomes <agomes@rim.com>
 6
 7.:
 8
 9Exporting Internals::nodesFromRect symbols for the Gtk build.
 10
 11* Source/autotools/symbols.filter:
 12
 13Source/WebCore:
 14
 15In order to improve touch precision on shadow tree content, patch
 16extends the rect-hittest'ing system to allow shadow content
 17to be stored as the rect-hittest result node list.
 18
 19Primary use cases are for this extension is making it easier to
 20improve the clickability of default controls of <video> and <audio>
 21elements.
 22
 23For the callee site, the use is simple: if shadow content in the rect-hittest
 24result is desired, just add an extra 'AllowShadowContent' parameter at the creation
 25of the HitTestResult object.
 26
 27Test: fast/dom/nodesFromRect-shadowContent.html
 28
 29* dom/Document.cpp:
 30(WebCore::Document::nodesFromRect):
 31* dom/Document.h:
 32(Document):
 33* page/EventHandler.cpp:
 34(WebCore::EventHandler::hitTestResultAtPoint):
 35* rendering/HitTestResult.cpp:
 36(WebCore::HitTestResult::HitTestResult):
 37(WebCore::HitTestResult::addNodeToRectBasedTestResult):
 38* rendering/HitTestResult.h:
 39(HitTestResult):
 40(WebCore::HitTestResult::shadowContentFilterPolicy):
 41* rendering/RenderImage.cpp:
 42(WebCore::RenderImage::nodeAtPoint):
 43* rendering/RenderLayer.cpp:
 44(WebCore::RenderLayer::hitTestLayer):
 45(WebCore::RenderLayer::hitTestList):
 46* testing/Internals.cpp:
 47(WebCore::Internals::nodesFromRect):
 48* testing/Internals.h:
 49(Internals):
 50* testing/Internals.idl:
 51
 52LayoutTests:
 53
 54Adds a test that rect-hittest's a element known to have a shadow
 55tree (<video> with built-in controls), and check if its return type
 56contains its clickable shadow nodes.
 57
 58* fast/dom/nodesFromRect-shadowContent-expected.txt: Added.
 59* fast/dom/nodesFromRect-shadowContent.html: Added.
 60* fast/dom/resources/nodesFromRect.js:
 61(check):
 62(checkShadowContent):

ChangeLog

 12012-03-14 Antonio Gomes <agomes@rim.com>
 2
 3 Extend HitTestResult to support not "discarding" shadow content in favor of its DOM ancestor
 4 https://bugs.webkit.org/show_bug.cgi?id=80847
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Exporting Internals::nodesFromRect symbols for the Gtk build.
 9
 10 * Source/autotools/symbols.filter:
 11
1122012-04-02 Balazs Kelemen <kbalazs@webkit.org>
213
314 [Qt][WK2] Set up plugin process on Unix

LayoutTests/ChangeLog

 12012-03-14 Antonio Gomes <agomes@rim.com>
 2
 3 Extend HitTestResult to support not "discarding" shadow content in favor of its DOM ancestor
 4 https://bugs.webkit.org/show_bug.cgi?id=80847
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Adds a test that rect-hittest's a element known to have a shadow
 9 tree (<video> with built-in controls), and check if its return type
 10 contains its clickable shadow nodes.
 11
 12 * fast/dom/nodesFromRect-shadowContent-expected.txt: Added.
 13 * fast/dom/nodesFromRect-shadowContent.html: Added.
 14 * fast/dom/resources/nodesFromRect.js:
 15 (check):
 16 (checkShadowContent):
 17
1182012-03-11 Antonio Gomes <agomes@rim.com>
219
320 Be more restrictive when adding ScrollableArea's to FrameView's ScrollableArea's map

LayoutTests/fast/dom/nodesFromRect-shadowContent-expected.txt

 1PASS All correct nodes found for rect
 2PASS All correct nodes found for rect
 3This test only runs in DRT!
 4
 5EXPECTED (video.controls != 'null') OK
 6

LayoutTests/fast/dom/nodesFromRect-shadowContent.html

 1<html>
 2<head>
 3 <title>Document::nodesFromRect shadow content access - bug 80847 </title>
 4 <style type="text/css" media="screen">
 5 video {
 6 margin: 50px;
 7 }
 8 </style>
 9 <script src=../../media/media-file.js></script>
 10 <script src=../../media/media-controls.js></script>
 11 <script src="../js/resources/js-test-pre.js"></script>
 12 <script src="resources/nodesFromRect.js"></script>
 13 <script type="text/javascript" charset="utf-8">
 14 function runTest()
 15 {
 16 if (window.layoutTestController) {
 17 layoutTestController.dumpAsText();
 18 layoutTestController.waitUntilDone();
 19 }
 20
 21 var e = {};
 22
 23 // Set up shortcut access to elements
 24 e['html'] = document.getElementsByTagName("html")[0];
 25 ['v1', 'body'].forEach(function(a) {
 26 e[a] = document.getElementById(a);
 27 });
 28
 29 window.scrollTo(0, 0);
 30
 31 var playCoords;
 32 try {
 33 playCoords = mediaControlsButtonCoordinates(video, "play-button");
 34 } catch (exception) {
 35 failTest(exception.description);
 36 return;
 37 }
 38 var clickX = playCoords[0];
 39 var clickY = playCoords[1];
 40
 41 check(clickX, clickY, 10, 10, 20, 20, [e.v1, e.body]);
 42
 43 var shadow =['-webkit-media-controls-timeline-container', '-webkit-media-controls-play-button', '-webkit-media-controls-panel', '-webkit-media-controls'];
 44 checkShadowContent(clickX, clickY, 10, 10, 20, 20, shadow);
 45
 46 if (window.layoutTestController)
 47 layoutTestController.notifyDone();
 48 }
 49
 50 window.onload = runTest;
 51 </script>
 52</head>
 53<body id="body">
 54 <video id="v1" controls></video>
 55 <p>This test only runs in DRT!</p>
 56 <script src=../../media/video-test.js></script>
 57 <script>
 58 testExpected("video.controls", null, '!=');
 59 video.src = findMediaFile("video", "content/test");
 60 </script>
 61</body>
 62</html>

LayoutTests/fast/dom/resources/nodesFromRect.js

@@function check(x, y, topPadding, rightPadding, bottomPadding, leftPadding, list,
1111 if (!doc)
1212 doc = document;
1313
14  var nodes = internals.nodesFromRect(doc, x, y, topPadding, rightPadding, bottomPadding, leftPadding, true /* ignoreClipping */);
 14 var nodes = internals.nodesFromRect(doc, x, y, topPadding, rightPadding, bottomPadding, leftPadding, true /* ignoreClipping */, false /* allow shadow content */);
1515 if (!nodes)
1616 return;
1717

@@function check(x, y, topPadding, rightPadding, bottomPadding, leftPadding, list,
3737 testPassed("All correct nodes found for rect");
3838}
3939
 40function checkShadowContent(x, y, topPadding, rightPadding, bottomPadding, leftPadding, shadowContent, doc)
 41{
 42 if (!window.internals)
 43 return;
 44
 45 if (!doc)
 46 doc = document;
 47
 48 var nodes = internals.nodesFromRect(doc, x, y, topPadding, rightPadding, bottomPadding, leftPadding, true /* ignoreClipping */, true /* allowShadowContent */);
 49 if (!nodes)
 50 return;
 51
 52 for (var j = 0; j < shadowContent.length; j++) {
 53 var found = false;
 54 for (var i = 0; i < nodes.length; i++) {
 55 if (internals.shadowPseudoId(nodes[i]) == shadowContent[j]) {
 56 found = true;
 57 break;
 58 }
 59 }
 60
 61 if (!found) {
 62 testFailed("Pseudo Id not found: " + shadowContent[j]);
 63 return;
 64 }
 65 }
 66
 67 testPassed("All correct nodes found for rect");
 68}
 69
4070function getCenterFor(element)
4171{
4272 var rect = element.getBoundingClientRect();

LayoutTests/platform/chromium/test_expectations.txt

@@BUGCR58936 : fast/js/numeric-escapes-in-string-literals.html = TEXT
23162316BUGWK46600 SKIP : fast/dom/nodesFromRect-links-and-text.html = TEXT
23172317BUGWK46600 SKIP : fast/dom/nodesFromRect-inner-documents.html = TEXT
23182318
 2319// For some reason it seems to not properly rect hit-tests elements in shadow
 2320// content of <video> elements.
 2321BUGWK46600 SKIP : fast/dom/nodesFromRect-shadowContent.html = TEXT
 2322
23192323BUGCR59671 LINUX : svg/custom/convolution-crash.svg = PASS TEXT
23202324
23212325BUGJAMESR LINUX WIN : fast/text/international/vertical-text-glyph-test.html = IMAGE+TEXT

Source/WebCore/ChangeLog

 12012-03-14 Antonio Gomes <agomes@rim.com>
 2
 3 Extend HitTestResult to support not "discarding" shadow content in favor of its DOM ancestor
 4 https://bugs.webkit.org/show_bug.cgi?id=80847
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 In order to improve touch precision on shadow tree content, patch
 9 extends the rect-hittest'ing system to allow shadow content
 10 to be stored as the rect-hittest result node list.
 11
 12 Primary use cases are for this extension is making it easier to
 13 improve the clickability of default controls of <video> and <audio>
 14 elements.
 15
 16 For the callee site, the use is simple: if shadow content in the rect-hittest
 17 result is desired, just add an extra 'AllowShadowContent' parameter at the creation
 18 of the HitTestResult object.
 19
 20 Test: fast/dom/nodesFromRect-shadowContent.html
 21
 22 * dom/Document.cpp:
 23 (WebCore::Document::nodesFromRect):
 24 * dom/Document.h:
 25 (Document):
 26 * page/EventHandler.cpp:
 27 (WebCore::EventHandler::hitTestResultAtPoint):
 28 * rendering/HitTestResult.cpp:
 29 (WebCore::HitTestResult::HitTestResult):
 30 (WebCore::HitTestResult::addNodeToRectBasedTestResult):
 31 * rendering/HitTestResult.h:
 32 (HitTestResult):
 33 (WebCore::HitTestResult::shadowContentFilterPolicy):
 34 * rendering/RenderImage.cpp:
 35 (WebCore::RenderImage::nodeAtPoint):
 36 * rendering/RenderLayer.cpp:
 37 (WebCore::RenderLayer::hitTestLayer):
 38 (WebCore::RenderLayer::hitTestList):
 39 * testing/Internals.cpp:
 40 (WebCore::Internals::nodesFromRect):
 41 * testing/Internals.h:
 42 (Internals):
 43 * testing/Internals.idl:
 44
1452012-03-11 Antonio Gomes <agomes@rim.com>
246
347 Be more restrictive when adding ScrollableArea's to FrameView's ScrollableArea's map

Source/WebCore/WebCore.exp.in

@@__ZNK7WebCore7RunLoop9TimerBase8isActiveEv
14801480__ZNK7WebCore8Document10renderViewEv
14811481__ZNK7WebCore8Document11completeURLERKN3WTF6StringE
14821482__ZNK7WebCore8Document13axObjectCacheEv
1483 __ZNK7WebCore8Document13nodesFromRectEiijjjjb
 1483__ZNK7WebCore8Document13nodesFromRectEiijjjjbb
14841484__ZNK7WebCore8Document14getElementByIdERKN3WTF12AtomicStringE
14851485__ZNK7WebCore8Document16dashboardRegionsEv
14861486__ZNK7WebCore8Document31displayStringModifiedByEncodingERKN3WTF6StringE

Source/WebCore/dom/Document.cpp

@@String Document::suggestedMIMEType() const
12391239// * making it receive a rect as parameter, i.e. nodesFromRect(x, y, w, h);
12401240// * making it receive the expading size of each direction separately,
12411241// i.e. nodesFromRect(x, y, topSize, rightSize, bottomSize, leftSize);
1242 PassRefPtr<NodeList> Document::nodesFromRect(int centerX, int centerY, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping) const
 1242PassRefPtr<NodeList> Document::nodesFromRect(int centerX, int centerY, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent) const
12431243{
12441244 // FIXME: Share code between this, elementFromPoint and caretRangeFromPoint.
12451245 if (!renderer())

@@PassRefPtr<NodeList> Document::nodesFromRect(int centerX, int centerY, unsigned
12711271 return handleZeroPadding(request, result);
12721272 }
12731273
1274  HitTestResult result(point, topPadding, rightPadding, bottomPadding, leftPadding);
 1274 enum ShadowContentFilterPolicy shadowContentFilterPolicy = allowShadowContent ? AllowShadowContent : DoNotAllowShadowContent;
 1275 HitTestResult result(point, topPadding, rightPadding, bottomPadding, leftPadding, shadowContentFilterPolicy);
12751276 renderView()->layer()->hitTest(request, result);
12761277
12771278 return StaticHashSetNodeList::adopt(result.rectBasedTestResult());

Source/WebCore/dom/Document.h

@@public:
370370 * If false, this method returns null for coordinates outside of the viewport.
371371 */
372372 PassRefPtr<NodeList> nodesFromRect(int centerX, int centerY, unsigned topPadding, unsigned rightPadding,
373  unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping) const;
 373 unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent) const;
374374 Element* elementFromPoint(int x, int y) const;
375375 PassRefPtr<Range> caretRangeFromPoint(int x, int y);
376376

Source/WebCore/page/EventHandler.cpp

@@DragSourceAction EventHandler::updateDragSourceActionsAllowed() const
10401040
10411041HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, bool allowShadowContent, bool ignoreClipping, HitTestScrollbars testScrollbars, HitTestRequest::HitTestRequestType hitType, const LayoutSize& padding)
10421042{
1043  HitTestResult result(point, padding.height(), padding.width(), padding.height(), padding.width());
 1043 enum ShadowContentFilterPolicy shadowContentFilterPolicy = allowShadowContent ? AllowShadowContent : DoNotAllowShadowContent;
 1044 HitTestResult result(point, padding.height(), padding.width(), padding.height(), padding.width(), shadowContentFilterPolicy);
 1045
10441046 if (!m_frame->contentRenderer())
10451047 return result;
10461048 if (ignoreClipping)

@@HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, bool
10611063 FrameView* view = static_cast<FrameView*>(widget);
10621064 LayoutPoint widgetPoint(result.localPoint().x() + view->scrollX() - renderWidget->borderLeft() - renderWidget->paddingLeft(),
10631065 result.localPoint().y() + view->scrollY() - renderWidget->borderTop() - renderWidget->paddingTop());
1064  HitTestResult widgetHitTestResult(widgetPoint, padding.height(), padding.width(), padding.height(), padding.width());
 1066 HitTestResult widgetHitTestResult(widgetPoint, padding.height(), padding.width(), padding.height(), padding.width(), shadowContentFilterPolicy);
10651067 frame->contentRenderer()->layer()->hitTest(HitTestRequest(hitType), widgetHitTestResult);
10661068 result = widgetHitTestResult;
10671069

Source/WebCore/rendering/HitTestResult.cpp

@@HitTestResult::HitTestResult()
5454 , m_rightPadding(0)
5555 , m_bottomPadding(0)
5656 , m_leftPadding(0)
 57 , m_shadowContentFilterPolicy(DoNotAllowShadowContent)
5758 , m_region(0)
5859{
5960}

@@HitTestResult::HitTestResult(const LayoutPoint& point)
6667 , m_rightPadding(0)
6768 , m_bottomPadding(0)
6869 , m_leftPadding(0)
 70 , m_shadowContentFilterPolicy(DoNotAllowShadowContent)
6971 , m_region(0)
7072{
7173}
7274
73 HitTestResult::HitTestResult(const LayoutPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding)
 75HitTestResult::HitTestResult(const LayoutPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding, ShadowContentFilterPolicy allowShadowContent)
7476 : m_point(centerPoint)
7577 , m_isOverWidget(false)
7678 , m_topPadding(topPadding)
7779 , m_rightPadding(rightPadding)
7880 , m_bottomPadding(bottomPadding)
7981 , m_leftPadding(leftPadding)
 82 , m_shadowContentFilterPolicy(allowShadowContent)
8083 , m_region(0)
8184{
8285 // If all padding values passed in are zero then it is not a rect based hit test.

@@HitTestResult::HitTestResult(const HitTestResult& other)
9598 , m_innerURLElement(other.URLElement())
9699 , m_scrollbar(other.scrollbar())
97100 , m_isOverWidget(other.isOverWidget())
 101 , m_shadowContentFilterPolicy(other.shadowContentFilterPolicy())
98102 , m_region(other.region())
99103{
100104 // Only copy the padding and NodeSet in case of rect hit test.

@@bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const LayoutPoint&
572576 if (!node)
573577 return true;
574578
575  node = node->shadowAncestorNode();
 579 if (m_shadowContentFilterPolicy == DoNotAllowShadowContent)
 580 node = node->shadowAncestorNode();
 581
576582 mutableRectBasedTestResult().add(node);
577583
578584 if (node->renderer()->isInline()) {

@@bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const LayoutPoint&
603609 if (!node)
604610 return true;
605611
606  node = node->shadowAncestorNode();
 612 if (m_shadowContentFilterPolicy == DoNotAllowShadowContent)
 613 node = node->shadowAncestorNode();
 614
607615 mutableRectBasedTestResult().add(node);
608616
609617 if (node->renderer()->isInline()) {

Source/WebCore/rendering/HitTestResult.h

@@class Node;
4242class RenderRegion;
4343class Scrollbar;
4444
 45enum ShadowContentFilterPolicy { DoNotAllowShadowContent, AllowShadowContent };
 46
4547class HitTestResult {
4648public:
4749 typedef ListHashSet<RefPtr<Node> > NodeSet;

@@public:
4951 HitTestResult();
5052 HitTestResult(const LayoutPoint&);
5153 // Pass non-negative padding values to perform a rect-based hit test.
52  HitTestResult(const LayoutPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding);
 54 HitTestResult(const LayoutPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding, ShadowContentFilterPolicy);
5355 HitTestResult(const HitTestResult&);
5456 ~HitTestResult();
5557 HitTestResult& operator=(const HitTestResult&);

@@public:
6870
6971 void setToNonShadowAncestor();
7072
 73 ShadowContentFilterPolicy shadowContentFilterPolicy() const { return m_shadowContentFilterPolicy; }
 74
7175 void setInnerNode(Node*);
7276 void setInnerNonSharedNode(Node*);
7377 void setPoint(const LayoutPoint& p) { m_point = p; }

@@private:
146150 int m_rightPadding;
147151 int m_bottomPadding;
148152 int m_leftPadding;
 153 ShadowContentFilterPolicy m_shadowContentFilterPolicy;
149154
150155 RenderRegion* m_region; // The region we're inside.
151156

Source/WebCore/rendering/RenderImage.cpp

@@HTMLMapElement* RenderImage::imageMap() const
471471
472472bool RenderImage::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
473473{
474  HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding());
 474 HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding(), result.shadowContentFilterPolicy());
475475 bool inside = RenderReplaced::nodeAtPoint(request, tempResult, pointInContainer, accumulatedOffset, hitTestAction);
476476
477477 if (tempResult.innerNode() && node()) {

Source/WebCore/rendering/RenderLayer.cpp

@@RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* cont
35153515 // Next we want to see if the mouse pos is inside the child RenderObjects of the layer.
35163516 if (fgRect.intersects(hitTestArea) && isSelfPaintingLayer()) {
35173517 // Hit test with a temporary HitTestResult, because we only want to commit to 'result' if we know we're frontmost.
3518  HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding());
 3518 HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding(), result.shadowContentFilterPolicy());
35193519 if (hitTestContents(request, tempResult, layerBounds, hitTestPoint, HitTestDescendants) &&
35203520 isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTransformState.get())) {
35213521 if (result.isRectBasedTest())

@@RenderLayer* RenderLayer::hitTestLayer(RenderLayer* rootLayer, RenderLayer* cont
35443544 return candidateLayer;
35453545
35463546 if (bgRect.intersects(hitTestArea) && isSelfPaintingLayer()) {
3547  HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding());
 3547 HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding(), result.shadowContentFilterPolicy());
35483548 if (hitTestContents(request, tempResult, layerBounds, hitTestPoint, HitTestSelf) &&
35493549 isHitCandidate(this, false, zOffsetForContentsPtr, unflattenedTransformState.get())) {
35503550 if (result.isRectBasedTest())

@@RenderLayer* RenderLayer::hitTestList(Vector<RenderLayer*>* list, RenderLayer* r
36003600 for (int i = list->size() - 1; i >= 0; --i) {
36013601 RenderLayer* childLayer = list->at(i);
36023602 RenderLayer* hitLayer = 0;
3603  HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding());
 3603 HitTestResult tempResult(result.point(), result.topPadding(), result.rightPadding(), result.bottomPadding(), result.leftPadding(), result.shadowContentFilterPolicy());
36043604 if (childLayer->isPaginated())
36053605 hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, request, tempResult, hitTestRect, hitTestPoint, transformState, zOffsetForDescendants);
36063606 else

Source/WebCore/testing/Internals.cpp

@@unsigned Internals::touchEventHandlerCount(Document* document, ExceptionCode& ec
849849}
850850
851851PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int x, int y, unsigned topPadding, unsigned rightPadding,
852  unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, ExceptionCode& ec) const
 852 unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent, ExceptionCode& ec) const
853853{
854854 if (!document || !document->frame() || !document->frame()->view()) {
855855 ec = INVALID_ACCESS_ERR;
856856 return 0;
857857 }
858858
859  return document->nodesFromRect(x, y, topPadding, rightPadding, bottomPadding, leftPadding, ignoreClipping);
 859 return document->nodesFromRect(x, y, topPadding, rightPadding, bottomPadding, leftPadding, ignoreClipping, allowShadowContent);
860860}
861861
862862void Internals::emitInspectorDidBeginFrame()

Source/WebCore/testing/Internals.h

@@public:
146146 unsigned touchEventHandlerCount(Document*, ExceptionCode&);
147147
148148 PassRefPtr<NodeList> nodesFromRect(Document*, int x, int y, unsigned topPadding, unsigned rightPadding,
149  unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, ExceptionCode&) const;
 149 unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent, ExceptionCode&) const;
150150
151151 void emitInspectorDidBeginFrame();
152152 void emitInspectorDidCancelFrame();

Source/WebCore/testing/Internals.idl

@@module window {
121121
122122 NodeList nodesFromRect(in Document document, in long x, in long y,
123123 in unsigned long topPadding, in unsigned long rightPadding, in unsigned long bottomPadding, in unsigned long leftPadding,
124  in boolean ignoreClipping) raises (DOMException);
 124 in boolean ignoreClipping, in boolean allowShadowContent) raises (DOMException);
125125
126126 void emitInspectorDidBeginFrame();
127127 void emitInspectorDidCancelFrame();

Source/WebKit/qt/Api/qwebpage.cpp

@@IntPoint QWebPagePrivate::TouchAdjuster::findCandidatePointForTouch(const IntPoi
15671567 int x = touchPoint.x();
15681568 int y = touchPoint.y();
15691569
1570  RefPtr<NodeList> intersectedNodes = document->nodesFromRect(x, y, m_topPadding, m_rightPadding, m_bottomPadding, m_leftPadding, false);
 1570 RefPtr<NodeList> intersectedNodes = document->nodesFromRect(x, y, m_topPadding, m_rightPadding, m_bottomPadding, m_leftPadding, false /*ignoreClipping*/, false /*allowShadowContent*/);
15711571 if (!intersectedNodes)
15721572 return IntPoint();
15731573

Source/WebKit2/win/WebKit2.def

@@EXPORTS
243243 ?utf8@String@WTF@@QBE?AVCString@2@_N@Z
244244 ?view@Document@WebCore@@QBEPAVFrameView@2@XZ
245245 ?willDetachPage@FrameDestructionObserver@WebCore@@UAEXXZ
246  ?nodesFromRect@Document@WebCore@@QBE?AV?$PassRefPtr@VNodeList@WebCore@@@WTF@@HHIIII_N@Z
 246 ?nodesFromRect@Document@WebCore@@QBE?AV?$PassRefPtr@VNodeList@WebCore@@@WTF@@HHIIII_N0@Z
247247 ?selectionStartHasMarkerFor@Editor@WebCore@@QBE_NW4MarkerType@DocumentMarker@2@HH@Z

Source/autotools/symbols.filter

@@_ZN7WebCore24FrameDestructionObserver14willDetachPageEv;
132132_ZN7WebCore22RuntimeEnabledFeatures31isMultipleShadowSubtreesEnabledE;
133133_ZN7WebCore22RuntimeEnabledFeatures32setMultipleShadowSubtreesEnabledEb;
134134_ZN7WebCore22RuntimeEnabledFeatures18isShadowDOMEnabledE;
135 _ZNK7WebCore8Document13nodesFromRectEiijjjjb;
 135_ZNK7WebCore8Document13nodesFromRectEiijjjjbb;
136136_ZN7WebCore4toJSEPN3JSC9ExecStateEPNS_17JSDOMGlobalObjectEPNS_8NodeListE;
137137_ZNK7WebCore6Editor26selectionStartHasMarkerForENS_14DocumentMarker10MarkerTypeEii;
138138local: