static inline bool shouldEventCrossShadowBoundary(Event& event, ShadowRoot& shadowRoot, EventTarget& target) { Node* targetNode = target.toNode(); #if ENABLE(FULLSCREEN_API) && ENABLE(VIDEO) // Video-only full screen is a mode where we use the shadow DOM as an implementation // detail that should not be detectable by the web content. if (targetNode) { if (Element* element = targetNode->document().webkitCurrentFullScreenElement()) { // FIXME: We assume that if the full screen element is a media element that it's // the video-only full screen. Both here and elsewhere. But that is probably wrong. if (element->isMediaElement() && shadowRoot.hostElement() == element) return false; } } #endif // WebKit never allowed selectstart event to cross the the shadow DOM boundary. // Changing this breaks existing sites. // See https://bugs.webkit.org/show_bug.cgi?id=52195 for details. const AtomicString& eventType = event.type(); bool targetIsInShadowRoot = targetNode && targetNode->treeScope().rootNode() == &shadowRoot; return !targetIsInShadowRoot || !(eventType == eventNames().abortEvent || eventType == eventNames().changeEvent || eventType == eventNames().errorEvent || eventType == eventNames().loadEvent || eventType == eventNames().resetEvent || eventType == eventNames().resizeEvent || eventType == eventNames().scrollEvent || eventType == eventNames().selectEvent || eventType == eventNames().selectstartEvent); }
void InsertionPoint::removedFrom(ContainerNode* insertionPoint) { ShadowRoot* root = containingShadowRoot(); if (!root) root = insertionPoint->containingShadowRoot(); if (root && root->hostElement()) { root->invalidateDistribution(); root->distributor().invalidateInsertionPointList(); } // Since this insertion point is no longer visible from the shadow subtree, it need to clean itself up. clearDistribution(); HTMLElement::removedFrom(insertionPoint); }