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 "InjectedBundleNodeHandle.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFrame.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebFrameLoaderClient.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <JavaScriptCore/APICast.h>
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Document.h>
332bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/Frame.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLFrameElement.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLIFrameElement.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLInputElement.h>
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLNames.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLTableCellElement.h>
392bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <WebCore/HTMLTextAreaElement.h>
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/IntRect.h>
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/JSNode.h>
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Node.h>
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/HashMap.h>
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace HTMLNames;
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<Node*, InjectedBundleNodeHandle*> DOMHandleCache;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic DOMHandleCache& domHandleCache()
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DEFINE_STATIC_LOCAL(DOMHandleCache, cache, ());
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return cache;
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::getOrCreate(JSContextRef, JSObjectRef object)
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Node* node = toNode(toJS(object));
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return getOrCreate(node);
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::getOrCreate(Node* node)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!node)
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    std::pair<DOMHandleCache::iterator, bool> result = domHandleCache().add(node, 0);
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!result.second)
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return PassRefPtr<InjectedBundleNodeHandle>(result.first->second);
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<InjectedBundleNodeHandle> nodeHandle = InjectedBundleNodeHandle::create(node);
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    result.first->second = nodeHandle.get();
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return nodeHandle.release();
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::create(Node* node)
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return adoptRef(new InjectedBundleNodeHandle(node));
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochInjectedBundleNodeHandle::InjectedBundleNodeHandle(Node* node)
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_node(node)
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochInjectedBundleNodeHandle::~InjectedBundleNodeHandle()
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    domHandleCache().remove(m_node.get());
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNode* InjectedBundleNodeHandle::coreNode() const
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_node.get();
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::document()
10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return getOrCreate(m_node->document());
10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Additional DOM Operations
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Note: These should only be operations that are not exposed to JavaScript.
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochIntRect InjectedBundleNodeHandle::elementBounds() const
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->isElementNode())
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return IntRect();
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<Element*>(m_node.get())->boundsInWindowSpace();
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochIntRect InjectedBundleNodeHandle::renderRect(bool* isReplaced) const
116ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
117ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return m_node.get()->renderRect(isReplaced);
118ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InjectedBundleNodeHandle::setHTMLInputElementValueForUser(const String& value)
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->hasTagName(inputTag))
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static_cast<HTMLInputElement*>(m_node.get())->setValueForUser(value);
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool InjectedBundleNodeHandle::isHTMLInputElementAutofilled() const
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->hasTagName(inputTag))
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<HTMLInputElement*>(m_node.get())->isAutofilled();
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InjectedBundleNodeHandle::setHTMLInputElementAutofilled(bool filled)
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->hasTagName(inputTag))
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static_cast<HTMLInputElement*>(m_node.get())->setAutofilled(filled);
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1442bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool InjectedBundleNodeHandle::htmlInputElementLastChangeWasUserEdit()
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_node->hasTagName(inputTag))
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block
1492bde8e466a4451c7319e3a072d118917957d6554Steve Block    return static_cast<HTMLInputElement*>(m_node.get())->lastChangeWasUserEdit();
1502bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block
1522bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool InjectedBundleNodeHandle::htmlTextAreaElementLastChangeWasUserEdit()
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1542bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!m_node->hasTagName(textareaTag))
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    return static_cast<HTMLTextAreaElement*>(m_node.get())->lastChangeWasUserEdit();
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1592bde8e466a4451c7319e3a072d118917957d6554Steve Block
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::htmlTableCellElementCellAbove()
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->hasTagName(tdTag))
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return getOrCreate(static_cast<HTMLTableCellElement*>(m_node.get())->cellAbove());
1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::elementShadowRoot()
1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_node->isElementNode())
1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0;
1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return getOrCreate(static_cast<Element*>(m_node.get())->shadowRoot());
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::documentFrame()
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->isDocumentNode())
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* frame = static_cast<Document*>(m_node.get())->frame();
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!frame)
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::htmlFrameElementContentFrame()
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->hasTagName(frameTag))
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* frame = static_cast<HTMLFrameElement*>(m_node.get())->contentFrame();
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!frame)
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::htmlIFrameElementContentFrame()
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_node->hasTagName(iframeTag))
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* frame = static_cast<HTMLIFrameElement*>(m_node.get())->contentFrame();
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!frame)
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
213