1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// 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/Fullscreen.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);
}
static Element* fullscreenElement(TreeScope& scope) {
return Fullscreen::fullscreenElementForBindingFrom(scope);
}
};
} // namespace blink
#endif // DocumentOrShadowRoot_h
|