InjectedBundleNodeHandle.cpp revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
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> 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLFrameElement.h> 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLIFrameElement.h> 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Frame.h> 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLInputElement.h> 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLNames.h> 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLTableCellElement.h> 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/IntRect.h> 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/JSNode.h> 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Node.h> 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/HashMap.h> 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h> 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace HTMLNames; 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<Node*, InjectedBundleNodeHandle*> DOMHandleCache; 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic DOMHandleCache& domHandleCache() 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DEFINE_STATIC_LOCAL(DOMHandleCache, cache, ()); 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return cache; 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::getOrCreate(JSContextRef, JSObjectRef object) 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Node* node = toNode(toJS(object)); 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return getOrCreate(node); 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::getOrCreate(Node* node) 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!node) 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch std::pair<DOMHandleCache::iterator, bool> result = domHandleCache().add(node, 0); 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!result.second) 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return PassRefPtr<InjectedBundleNodeHandle>(result.first->second); 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<InjectedBundleNodeHandle> nodeHandle = InjectedBundleNodeHandle::create(node); 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.first->second = nodeHandle.get(); 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nodeHandle.release(); 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::create(Node* node) 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return adoptRef(new InjectedBundleNodeHandle(node)); 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochInjectedBundleNodeHandle::InjectedBundleNodeHandle(Node* node) 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_node(node) 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochInjectedBundleNodeHandle::~InjectedBundleNodeHandle() 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch domHandleCache().remove(m_node.get()); 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNode* InjectedBundleNodeHandle::coreNode() const 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_node.get(); 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::document() 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return getOrCreate(m_node->document()); 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Additional DOM Operations 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Note: These should only be operations that are not exposed to JavaScript. 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochIntRect InjectedBundleNodeHandle::elementBounds() const 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->isElementNode()) 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return IntRect(); 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<Element*>(m_node.get())->boundsInWindowSpace(); 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 113ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochIntRect InjectedBundleNodeHandle::renderRect(bool* isReplaced) const 115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 116ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return m_node.get()->renderRect(isReplaced); 117ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InjectedBundleNodeHandle::setHTMLInputElementValueForUser(const String& value) 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(inputTag)) 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static_cast<HTMLInputElement*>(m_node.get())->setValueForUser(value); 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool InjectedBundleNodeHandle::isHTMLInputElementAutofilled() const 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(inputTag)) 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<HTMLInputElement*>(m_node.get())->isAutofilled(); 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 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 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::htmlTableCellElementCellAbove() 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(tdTag)) 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return getOrCreate(static_cast<HTMLTableCellElement*>(m_node.get())->cellAbove()); 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::documentFrame() 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->isDocumentNode()) 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = static_cast<Document*>(m_node.get())->frame(); 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::htmlFrameElementContentFrame() 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(frameTag)) 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = static_cast<HTMLFrameElement*>(m_node.get())->contentFrame(); 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::htmlIFrameElementContentFrame() 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(iframeTag)) 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = static_cast<HTMLIFrameElement*>(m_node.get())->contentFrame(); 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 Murdoch} // namespace WebKit 189