diff options
Diffstat (limited to 'WebCore/page/FrameTree.cpp')
-rw-r--r-- | WebCore/page/FrameTree.cpp | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/WebCore/page/FrameTree.cpp b/WebCore/page/FrameTree.cpp index 92e198d..c9b4172 100644 --- a/WebCore/page/FrameTree.cpp +++ b/WebCore/page/FrameTree.cpp @@ -1,4 +1,3 @@ -// -*- c-basic-offset: 4 -*- /* * Copyright (C) 2006 Apple Computer, Inc. * @@ -23,6 +22,7 @@ #include "Frame.h" #include "Page.h" +#include "PageGroup.h" #include <stdarg.h> #include <wtf/Platform.h> #include <wtf/StringExtras.h> @@ -48,6 +48,18 @@ void FrameTree::setName(const AtomicString& name) m_name = parent()->tree()->uniqueChildName(name); } +void FrameTree::clearName() +{ + m_name = AtomicString(); +} + +Frame* FrameTree::parent(bool checkForDisconnectedFrame) const +{ + if (checkForDisconnectedFrame && m_thisFrame->isDisconnected()) + return 0; + return m_parent; +} + void FrameTree::appendChild(PassRefPtr<Frame> child) { ASSERT(child->page() == m_thisFrame->page()); @@ -118,7 +130,7 @@ AtomicString FrameTree::uniqueChildName(const AtomicString& requestedName) const String name; name += framePathPrefix; if (frame) - name += frame->tree()->name().domString().substring(framePathPrefixLength, + name += frame->tree()->name().string().substring(framePathPrefixLength, frame->tree()->name().length() - framePathPrefixLength - framePathSuffixLength); for (int i = chain.size() - 1; i >= 0; --i) { frame = chain[i]; @@ -162,7 +174,7 @@ Frame* FrameTree::find(const AtomicString& name) const return m_thisFrame; if (name == "_top") - return m_thisFrame->page()->mainFrame(); + return top(); if (name == "_parent") return parent() ? parent() : m_thisFrame; @@ -178,20 +190,26 @@ Frame* FrameTree::find(const AtomicString& name) const // Search the entire tree for this page next. Page* page = m_thisFrame->page(); + + // The frame could have been detached from the page, so check it. + if (!page) + return 0; + for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) if (frame->tree()->name() == name) return frame; - // Search the entire tree for all other pages in this namespace. - const HashSet<Page*>* pages = page->frameNamespace(); - if (pages) { - HashSet<Page*>::const_iterator end = pages->end(); - for (HashSet<Page*>::const_iterator it = pages->begin(); it != end; ++it) { - Page* otherPage = *it; - if (otherPage != page) - for (Frame* frame = otherPage->mainFrame(); frame; frame = frame->tree()->traverseNext()) - if (frame->tree()->name() == name) - return frame; + // Search the entire tree of each of the other pages in this namespace. + // FIXME: Is random order OK? + const HashSet<Page*>& pages = page->group().pages(); + HashSet<Page*>::const_iterator end = pages.end(); + for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) { + Page* otherPage = *it; + if (otherPage != page) { + for (Frame* frame = otherPage->mainFrame(); frame; frame = frame->tree()->traverseNext()) { + if (frame->tree()->name() == name) + return frame; + } } } @@ -282,14 +300,14 @@ Frame* FrameTree::deepLastChild() const return result; } -Frame* FrameTree::top() const +Frame* FrameTree::top(bool checkForDisconnectedFrame) const { - if (Page* page = m_thisFrame->page()) - return page->mainFrame(); - Frame* frame = m_thisFrame; - while (Frame* parent = frame->tree()->parent()) + for (Frame* parent = m_thisFrame; parent; parent = parent->tree()->parent()) { frame = parent; + if (checkForDisconnectedFrame && frame->isDisconnected()) + return frame; + } return frame; } |