diff options
Diffstat (limited to 'dom/base/nsDocument.cpp')
-rw-r--r-- | dom/base/nsDocument.cpp | 102 |
1 files changed, 1 insertions, 101 deletions
diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 562d9e1735..cbb71feaed 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -3120,106 +3120,6 @@ nsDocument::ElementFromPoint(float aX, float aY, nsIDOMElement** aReturn) return NS_OK; } -Element* -nsIDocument::ElementFromPoint(float aX, float aY) -{ - return ElementFromPointHelper(aX, aY, false, true); -} - -void -nsIDocument::ElementsFromPoint(float aX, float aY, - nsTArray<RefPtr<Element>>& aElements) -{ - ElementsFromPointHelper(aX, aY, nsIDocument::FLUSH_LAYOUT, aElements); -} - -Element* -nsDocument::ElementFromPointHelper(float aX, float aY, - bool aIgnoreRootScrollFrame, - bool aFlushLayout) -{ - AutoTArray<RefPtr<Element>, 1> elementArray; - ElementsFromPointHelper(aX, aY, - ((aIgnoreRootScrollFrame ? nsIDocument::IGNORE_ROOT_SCROLL_FRAME : 0) | - (aFlushLayout ? nsIDocument::FLUSH_LAYOUT : 0) | - nsIDocument::IS_ELEMENT_FROM_POINT), - elementArray); - if (elementArray.IsEmpty()) { - return nullptr; - } - return elementArray[0]; -} - -void -nsDocument::ElementsFromPointHelper(float aX, float aY, - uint32_t aFlags, - nsTArray<RefPtr<mozilla::dom::Element>>& aElements) -{ - // As per the the spec, we return null if either coord is negative - if (!(aFlags & nsIDocument::IGNORE_ROOT_SCROLL_FRAME) && (aX < 0 || aY < 0)) { - return; - } - - nscoord x = nsPresContext::CSSPixelsToAppUnits(aX); - nscoord y = nsPresContext::CSSPixelsToAppUnits(aY); - nsPoint pt(x, y); - - // Make sure the layout information we get is up-to-date, and - // ensure we get a root frame (for everything but XUL) - if (aFlags & nsIDocument::FLUSH_LAYOUT) { - FlushPendingNotifications(Flush_Layout); - } - - nsIPresShell *ps = GetShell(); - if (!ps) { - return; - } - nsIFrame *rootFrame = ps->GetRootFrame(); - - // XUL docs, unlike HTML, have no frame tree until everything's done loading - if (!rootFrame) { - return; // return null to premature XUL callers as a reminder to wait - } - - nsTArray<nsIFrame*> outFrames; - // Emulate what GetFrameAtPoint does, since we want all the frames under our - // point. - nsLayoutUtils::GetFramesForArea(rootFrame, nsRect(pt, nsSize(1, 1)), outFrames, - nsLayoutUtils::IGNORE_PAINT_SUPPRESSION | nsLayoutUtils::IGNORE_CROSS_DOC | - ((aFlags & nsIDocument::IGNORE_ROOT_SCROLL_FRAME) ? nsLayoutUtils::IGNORE_ROOT_SCROLL_FRAME : 0)); - - // Dunno when this would ever happen, as we should at least have a root frame under us? - if (outFrames.IsEmpty()) { - return; - } - - // Used to filter out repeated elements in sequence. - nsIContent* lastAdded = nullptr; - - for (uint32_t i = 0; i < outFrames.Length(); i++) { - nsIContent* node = GetContentInThisDocument(outFrames[i]); - - if (!node || !node->IsElement()) { - // If this helper is called via ElementsFromPoint, we need to make sure - // our frame is an element. Otherwise return whatever the top frame is - // even if it isn't the top-painted element. - if (!(aFlags & nsIDocument::IS_ELEMENT_FROM_POINT)) { - continue; - } - node = node->GetParent(); - } - if (node && node != lastAdded) { - aElements.AppendElement(node->AsElement()); - lastAdded = node; - // If this helper is called via ElementFromPoint, just return the first - // element we find. - if (aFlags & nsIDocument::IS_ELEMENT_FROM_POINT) { - return; - } - } - } -} - nsresult nsDocument::NodesFromRectHelper(float aX, float aY, float aTopSize, float aRightSize, @@ -8387,7 +8287,7 @@ nsDocument::DoUnblockOnload() } nsIContent* -nsDocument::GetContentInThisDocument(nsIFrame* aFrame) const +nsIDocument::GetContentInThisDocument(nsIFrame* aFrame) const { for (nsIFrame* f = aFrame; f; f = nsLayoutUtils::GetParentOrPlaceholderForCrossDoc(f)) { |