Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index 73f20e044eff49f9a207fc7fc9b2a43e45470128..85193f46c6ddcd6d109459fa9f4f120fd9ab06e2 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -580,7 +580,7 @@ void Document::dispose() |
m_docType = 0; |
m_focusedElement = 0; |
m_hoverNode = 0; |
- m_activeElement = 0; |
+ m_activeHoverElement = 0; |
m_titleElement = 0; |
m_documentElement = 0; |
m_contextFeatures = ContextFeatures::defaultSwitch(); |
@@ -2051,7 +2051,7 @@ void Document::detach(const AttachContext& context) |
m_hoverNode = 0; |
m_focusedElement = 0; |
- m_activeElement = 0; |
+ m_activeHoverElement = 0; |
m_autofocusElement = 0; |
ContainerNode::detach(context); |
@@ -3270,14 +3270,14 @@ void Document::setHoverNode(PassRefPtr<Node> newHoverNode) |
m_hoverNode = newHoverNode; |
} |
-void Document::setActiveElement(PassRefPtr<Element> newActiveElement) |
+void Document::setActiveHoverElement(PassRefPtr<Element> newActiveElement) |
{ |
if (!newActiveElement) { |
- m_activeElement.clear(); |
+ m_activeHoverElement.clear(); |
return; |
} |
- m_activeElement = newActiveElement; |
+ m_activeHoverElement = newActiveElement; |
} |
void Document::removeFocusedElementOfSubtree(Node* node, bool amongChildrenOnly) |
@@ -3317,17 +3317,17 @@ void Document::hoveredNodeDetached(Node* node) |
void Document::activeChainNodeDetached(Node* node) |
{ |
- if (!m_activeElement) |
+ if (!m_activeHoverElement) |
return; |
- if (node != m_activeElement && (!m_activeElement->isTextNode() || node != NodeRenderingTraversal::parent(m_activeElement.get()))) |
+ if (node != m_activeHoverElement && (!m_activeHoverElement->isTextNode() || node != NodeRenderingTraversal::parent(m_activeHoverElement.get()))) |
return; |
Node* activeNode = NodeRenderingTraversal::parent(node); |
while (activeNode && activeNode->isElementNode() && !activeNode->renderer()) |
activeNode = NodeRenderingTraversal::parent(activeNode); |
- m_activeElement = activeNode && activeNode->isElementNode() ? toElement(activeNode) : 0; |
+ m_activeHoverElement = activeNode && activeNode->isElementNode() ? toElement(activeNode) : 0; |
} |
const Vector<AnnotatedRegionValue>& Document::annotatedRegions() const |
@@ -5073,7 +5073,7 @@ void Document::updateHoverActiveState(const HitTestRequest& request, Element* in |
innerElementInDocument = innerElementInDocument->document().ownerElement(); |
} |
- Element* oldActiveElement = activeElement(); |
+ Element* oldActiveElement = activeHoverElement(); |
if (oldActiveElement && !request.active()) { |
// We are clearing the :active chain because the mouse has been released. |
for (RenderObject* curr = oldActiveElement->renderer(); curr; curr = curr->parent()) { |
@@ -5083,7 +5083,7 @@ void Document::updateHoverActiveState(const HitTestRequest& request, Element* in |
m_userActionElements.setInActiveChain(curr->node(), false); |
} |
} |
- setActiveElement(0); |
+ setActiveHoverElement(0); |
} else { |
Element* newActiveElement = innerElementInDocument; |
if (!oldActiveElement && newActiveElement && request.active() && !request.touchMove()) { |
@@ -5094,12 +5094,12 @@ void Document::updateHoverActiveState(const HitTestRequest& request, Element* in |
m_userActionElements.setInActiveChain(curr->node(), true); |
} |
- setActiveElement(newActiveElement); |
+ setActiveHoverElement(newActiveElement); |
} |
} |
// If the mouse has just been pressed, set :active on the chain. Those (and only those) |
// nodes should remain :active until the mouse is released. |
- bool allowActiveChanges = !oldActiveElement && activeElement(); |
+ bool allowActiveChanges = !oldActiveElement && activeHoverElement(); |
// If the mouse is down and if this is a mouse move event, we want to restrict changes in |
// :hover/:active to only apply to elements that are in the :active chain that we froze |
@@ -5322,4 +5322,25 @@ void Document::setAutofocusElement(Element* element) |
m_taskRunner->postTask(AutofocusTask::create()); |
} |
+Element* Document::activeElement() const |
+{ |
+ if (Element* element = treeScope().adjustedFocusedElement()) |
+ return element; |
+ return body(); |
+} |
+ |
+bool Document::hasFocus() const |
+{ |
+ Page* page = this->page(); |
+ if (!page) |
+ return false; |
+ if (!page->focusController().isActive() || !page->focusController().isFocused()) |
+ return false; |
+ if (Frame* focusedFrame = page->focusController().focusedFrame()) { |
+ if (focusedFrame->tree().isDescendantOf(frame())) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
} // namespace WebCore |