165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFrameProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCertificateInfo.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContext.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFormSubmissionListenerProxy.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFramePolicyListenerProxy.h"
33ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "WebPageMessages.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxy.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/DOMImplementation.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Image.h>
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace std;
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebFrameProxy::WebFrameProxy(WebPageProxy* page, uint64_t frameID)
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_page(page)
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_parentFrame(0)
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_nextSibling(0)
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_previousSibling(0)
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_firstChild(0)
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_lastChild(0)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_loadState(LoadStateFinished)
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_isFrameSet(false)
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_frameID(frameID)
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebContext::statistics().wkFrameCount++;
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebFrameProxy::~WebFrameProxy()
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebContext::statistics().wkFrameCount--;
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::disconnect()
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page = 0;
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_parentFrame = 0;
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_nextSibling = 0;
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_previousSibling = 0;
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_firstChild = 0;
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_lastChild = 0;
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_activeListener) {
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_activeListener->invalidate();
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_activeListener = 0;
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebFrameProxy::isMainFrame() const
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page)
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return this == m_page->mainFrame();
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
86ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WebFrameProxy::stopLoading() const
87ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
88ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_page)
89ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
90ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
91ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_page->isValid())
92ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
93ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
94ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_page->process()->send(Messages::WebPage::StopLoadingFrame(m_frameID), m_page->pageID());
95ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
96ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebFrameProxy::canProvideSource() const
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return isDisplayingMarkupDocument();
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebFrameProxy::canShowMIMEType(const String& mimeType) const
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page)
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_page->canShowMIMEType(mimeType))
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // On Mac, we can show PDFs in the main frame.
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (isMainFrame() && !mimeType.isEmpty())
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return WebContext::pdfAndPostScriptMIMETypes().contains(mimeType);
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebFrameProxy::isDisplayingStandaloneImageDocument() const
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return Image::supportsType(m_MIMEType);
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebFrameProxy::isDisplayingMarkupDocument() const
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: This check should be moved to somewhere in WebCore.
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: This returns false when displaying a web archive.
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_MIMEType == "text/html" || m_MIMEType == "image/svg+xml" || DOMImplementation::isXMLMIMEType(m_MIMEType);
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didStartProvisionalLoad(const String& url)
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_loadState == LoadStateFinished);
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_provisionalURL.isEmpty());
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_loadState = LoadStateProvisional;
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_provisionalURL = url;
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didReceiveServerRedirectForProvisionalLoad(const String& url)
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_loadState == LoadStateProvisional);
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_provisionalURL = url;
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didFailProvisionalLoad()
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_loadState == LoadStateProvisional);
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_loadState = LoadStateFinished;
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_provisionalURL = String();
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didCommitLoad(const String& contentType, const PlatformCertificateInfo& certificateInfo)
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_loadState == LoadStateProvisional);
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_loadState = LoadStateCommitted;
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_url = m_provisionalURL;
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_provisionalURL = String();
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_title = String();
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_MIMEType = contentType;
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_isFrameSet = false;
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_certificateInfo = WebCertificateInfo::create(certificateInfo);
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didFinishLoad()
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_loadState == LoadStateCommitted);
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_provisionalURL.isEmpty());
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_loadState = LoadStateFinished;
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didFailLoad()
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_loadState == LoadStateCommitted);
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_provisionalURL.isEmpty());
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_loadState = LoadStateFinished;
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_title = String();
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didSameDocumentNavigation(const String& url)
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_url = url;
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didChangeTitle(const String& title)
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_title = title;
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::appendChild(WebFrameProxy* child)
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(child->page() == page());
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!child->m_parentFrame);
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!child->m_nextSibling);
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!child->m_previousSibling);
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    child->m_parentFrame = this;
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebFrameProxy* oldLast = m_lastChild;
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_lastChild = child;
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (oldLast) {
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!oldLast->m_nextSibling);
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        child->m_previousSibling = oldLast;
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        oldLast->m_nextSibling = child;
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_firstChild = child;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::removeChild(WebFrameProxy* child)
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    child->m_parentFrame = 0;
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebFrameProxy*& newLocationForNext = m_firstChild == child ? m_firstChild : child->m_previousSibling->m_nextSibling;
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebFrameProxy*& newLocationForPrevious = m_lastChild == child ? m_lastChild : child->m_nextSibling->m_previousSibling;
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    swap(newLocationForNext, child->m_nextSibling);
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    swap(newLocationForPrevious, child->m_previousSibling);
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    child->m_previousSibling = 0;
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    child->m_nextSibling = 0;
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebFrameProxy::isDescendantOf(const WebFrameProxy* ancestor) const
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!ancestor)
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_page != ancestor->m_page)
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (const WebFrameProxy* frame = this; frame; frame = frame->m_parentFrame) {
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (frame == ancestor)
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return true;
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::dumpFrameTreeToSTDOUT(unsigned indent)
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!indent && m_parentFrame)
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        printf("NOTE: Printing subtree.\n");
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (unsigned i = 0; i < indent; ++i)
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        printf(" ");
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    printf("| FRAME %d %s\n", (int)m_frameID, m_url.utf8().data());
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (WebFrameProxy* child = m_firstChild; child; child = child->m_nextSibling)
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        child->dumpFrameTreeToSTDOUT(indent + 4);
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::didRemoveFromHierarchy()
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_parentFrame)
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_parentFrame->removeChild(this);
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<ImmutableArray> WebFrameProxy::childFrames()
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_firstChild)
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return ImmutableArray::create();
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<RefPtr<APIObject> > vector;
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (WebFrameProxy* child = m_firstChild; child; child = child->m_nextSibling)
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        vector.append(child);
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ImmutableArray::adopt(vector);
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::receivedPolicyDecision(WebCore::PolicyAction action, uint64_t listenerID)
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page)
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_activeListener);
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_activeListener->listenerID() == listenerID);
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->receivedPolicyDecision(action, this, listenerID);
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebFramePolicyListenerProxy* WebFrameProxy::setUpPolicyListenerProxy(uint64_t listenerID)
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_activeListener)
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_activeListener->invalidate();
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_activeListener = WebFramePolicyListenerProxy::create(this, listenerID);
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<WebFramePolicyListenerProxy*>(m_activeListener.get());
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebFormSubmissionListenerProxy* WebFrameProxy::setUpFormSubmissionListenerProxy(uint64_t listenerID)
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_activeListener)
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_activeListener->invalidate();
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_activeListener = WebFormSubmissionListenerProxy::create(this, listenerID);
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<WebFormSubmissionListenerProxy*>(m_activeListener.get());
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::getWebArchive(PassRefPtr<DataCallback> callback)
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page) {
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        callback->invalidate();
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->getWebArchiveOfFrame(this, callback);
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebFrameProxy::getMainResourceData(PassRefPtr<DataCallback> callback)
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_page) {
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        callback->invalidate();
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_page->getMainResourceDataOfFrame(this, callback);
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
314ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid WebFrameProxy::getResourceData(WebURL* resourceURL, PassRefPtr<DataCallback> callback)
315ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
316ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_page) {
317ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        callback->invalidate();
318ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
319ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
320ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
321ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_page->getResourceDataFromFrame(this, resourceURL, callback);
322ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
323ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
325