diff options
Diffstat (limited to 'Source/WebCore/dom/TreeScope.cpp')
-rw-r--r-- | Source/WebCore/dom/TreeScope.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Source/WebCore/dom/TreeScope.cpp b/Source/WebCore/dom/TreeScope.cpp index 71384462e..a75bd24ee 100644 --- a/Source/WebCore/dom/TreeScope.cpp +++ b/Source/WebCore/dom/TreeScope.cpp @@ -29,9 +29,13 @@ #include "ContainerNode.h" #include "Document.h" #include "Element.h" +#include "FocusController.h" +#include "Frame.h" #include "HTMLAnchorElement.h" +#include "HTMLFrameOwnerElement.h" #include "HTMLMapElement.h" #include "HTMLNames.h" +#include "Page.h" #include "TreeScopeAdopter.h" #include <wtf/text/AtomicString.h> #include <wtf/text/CString.h> @@ -151,5 +155,35 @@ void TreeScope::adoptIfNeeded(Node* node) adopter.execute(); } +static Node* focusedFrameOwnerElement(Frame* focusedFrame, Frame* currentFrame) +{ + for (; focusedFrame; focusedFrame = focusedFrame->tree()->parent()) { + if (focusedFrame->tree()->parent() == currentFrame) + return focusedFrame->ownerElement(); + } + return 0; +} + +Element* TreeScope::activeElement() +{ + Document* document = rootNode()->document(); + Node* node = document->focusedNode(); + if (!node && document->page()) + node = focusedFrameOwnerElement(document->page()->focusController()->focusedFrame(), document->frame()); + if (!node) + return document->body(); + + TreeScope* treeScope = node->treeScope(); + + while (treeScope != this && treeScope != document) { + node = treeScope->rootNode()->shadowHost(); + treeScope = node->treeScope(); + } + + if (node->isElementNode()) + return toElement(node); + return 0; +} + } // namespace WebCore |