| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef DocumentOrShadowRoot_h |
| #define DocumentOrShadowRoot_h |
| |
| #include "core/dom/Document.h" |
| #include "core/dom/shadow/ShadowRoot.h" |
| #include "core/frame/UseCounter.h" |
| |
| namespace blink { |
| |
| class DocumentOrShadowRoot { |
| public: |
| static Element* activeElement(Document& document) { |
| return document.activeElement(); |
| } |
| |
| static Element* activeElement(ShadowRoot& shadowRoot) { |
| return shadowRoot.activeElement(); |
| } |
| |
| static StyleSheetList* styleSheets(Document& document) { |
| return &document.styleSheets(); |
| } |
| |
| static StyleSheetList* styleSheets(ShadowRoot& shadowRoot) { |
| return &shadowRoot.styleSheets(); |
| } |
| |
| static DOMSelection* getSelection(TreeScope& treeScope) { |
| return treeScope.getSelection(); |
| } |
| |
| static Element* elementFromPoint(TreeScope& treeScope, int x, int y) { |
| return treeScope.elementFromPoint(x, y); |
| } |
| |
| static HeapVector<Member<Element>> elementsFromPoint(TreeScope& treeScope, |
| int x, |
| int y) { |
| return treeScope.elementsFromPoint(x, y); |
| } |
| |
| static Element* pointerLockElement(Document& document) { |
| UseCounter::count(document, UseCounter::DocumentPointerLockElement); |
| const Element* target = document.pointerLockElement(); |
| if (!target) |
| return nullptr; |
| // For Shadow DOM V0 compatibility: We allow returning an element in V0 |
| // shadow tree, even though it leaks the Shadow DOM. |
| // TODO(kochi): Once V0 code is removed, the following V0 check is |
| // unnecessary. |
| if (target && target->isInV0ShadowTree()) { |
| UseCounter::count(document, |
| UseCounter::DocumentPointerLockElementInV0Shadow); |
| return const_cast<Element*>(target); |
| } |
| return document.adjustedElement(*target); |
| } |
| |
| static Element* pointerLockElement(ShadowRoot& shadowRoot) { |
| // TODO(kochi): Once V0 code is removed, the following non-V1 check is |
| // unnecessary. After V0 code is removed, we can use the same logic for |
| // Document and ShadowRoot. |
| if (!shadowRoot.isV1()) |
| return nullptr; |
| UseCounter::count(shadowRoot.document(), |
| UseCounter::ShadowRootPointerLockElement); |
| const Element* target = shadowRoot.document().pointerLockElement(); |
| if (!target) |
| return nullptr; |
| return shadowRoot.adjustedElement(*target); |
| } |
| }; |
| |
| } // namespace blink |
| |
| #endif // DocumentOrShadowRoot_h |