InjectedBundleNodeHandle.cpp revision 2fc2651226baac27029e38c9d6ef883fa32084db
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 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Additional DOM Operations 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Note: These should only be operations that are not exposed to JavaScript. 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochIntRect InjectedBundleNodeHandle::elementBounds() const 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->isElementNode()) 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return IntRect(); 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<Element*>(m_node.get())->boundsInWindowSpace(); 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 108ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochIntRect InjectedBundleNodeHandle::renderRect(bool* isReplaced) const 110ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 111ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return m_node.get()->renderRect(isReplaced); 112ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InjectedBundleNodeHandle::setHTMLInputElementValueForUser(const String& value) 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(inputTag)) 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static_cast<HTMLInputElement*>(m_node.get())->setValueForUser(value); 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool InjectedBundleNodeHandle::isHTMLInputElementAutofilled() const 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(inputTag)) 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<HTMLInputElement*>(m_node.get())->isAutofilled(); 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InjectedBundleNodeHandle::setHTMLInputElementAutofilled(bool filled) 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(inputTag)) 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static_cast<HTMLInputElement*>(m_node.get())->setAutofilled(filled); 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<InjectedBundleNodeHandle> InjectedBundleNodeHandle::htmlTableCellElementCellAbove() 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(tdTag)) 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return getOrCreate(static_cast<HTMLTableCellElement*>(m_node.get())->cellAbove()); 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::documentFrame() 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->isDocumentNode()) 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = static_cast<Document*>(m_node.get())->frame(); 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::htmlFrameElementContentFrame() 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(frameTag)) 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = static_cast<HTMLFrameElement*>(m_node.get())->contentFrame(); 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebFrame> InjectedBundleNodeHandle::htmlIFrameElementContentFrame() 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_node->hasTagName(iframeTag)) 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = static_cast<HTMLIFrameElement*>(m_node.get())->contentFrame(); 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 184