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