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