15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Stefan Schimanski (1Stein@gmx.de)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLPlugInElement.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSPropertyNames.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptController.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/npruntime_impl.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Event.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/Widget.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/plugins/PluginView.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderEmbeddedObject.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/UnusedParam.h"
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLPlugInElement::HTMLPlugInElement(const QualifiedName& tagName, Document* doc)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : HTMLFrameOwnerElement(tagName, doc)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_NPObject(0)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isCapturingMouseEvents(false)
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_inBeforeLoadEventHandler(false)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_displayState(Playing)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLPlugInElement::~HTMLPlugInElement()
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_instance); // cleared in detach()
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_NPObject) {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        _NPN_ReleaseObject(m_NPObject);
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_NPObject = 0;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLPlugInElement::canProcessDrag() const
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    const PluginView* plugin = pluginWidget() && pluginWidget()->isPluginView() ? static_cast<const PluginView*>(pluginWidget()) : 0;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return plugin ? plugin->canProcessDrag() : false;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLPlugInElement::willRespondToMouseClickEvents()
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isDisabledFormControl())
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* r = renderer();
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!r)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!r->isEmbeddedObject() && !r->isWidget())
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLPlugInElement::detach(const AttachContext& context)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instance.clear();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isCapturingMouseEvents) {
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Frame* frame = document()->frame())
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            frame->eventHandler()->setCapturingMouseEventsNode(0);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_isCapturingMouseEvents = false;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_NPObject) {
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        _NPN_ReleaseObject(m_NPObject);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_NPObject = 0;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HTMLFrameOwnerElement::detach(context);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLPlugInElement::resetInstance()
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instance.clear();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassScriptInstance HTMLPlugInElement::getInstance()
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Frame* frame = document()->frame();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the host dynamically turns off JavaScript (or Java) we will still return
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the cached allocated Bindings::Instance.  Not supporting this edge-case is OK.
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_instance)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_instance;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Widget* widget = pluginWidget())
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_instance = frame->script()->createScriptInstanceForWidget(widget);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_instance;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool HTMLPlugInElement::dispatchBeforeLoadEvent(const String& sourceURL)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Our current plug-in loading design can't guarantee the following
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // assertion is true, since plug-in loading can be initiated during layout,
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and synchronous layout can be initiated in a beforeload event handler!
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // See <http://webkit.org/b/71264>.
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ASSERT(!m_inBeforeLoadEventHandler);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inBeforeLoadEventHandler = true;
13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool beforeLoadAllowedLoad = HTMLFrameOwnerElement::dispatchBeforeLoadEvent(sourceURL);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inBeforeLoadEventHandler = false;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return beforeLoadAllowedLoad;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Widget* HTMLPlugInElement::pluginWidget() const
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inBeforeLoadEventHandler) {
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The plug-in hasn't loaded yet, and it makes no sense to try to load if beforeload handler happened to touch the plug-in element.
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // That would recursively call beforeload for the same element.
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderWidget* renderWidget = renderWidgetForJSBindings();
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderWidget)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return renderWidget->widget();
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLPlugInElement::isPresentationAttribute(const QualifiedName& name) const
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == widthAttr || name == heightAttr || name == vspaceAttr || name == hspaceAttr || name == alignAttr)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLFrameOwnerElement::isPresentationAttribute(name);
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLPlugInElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == widthAttr)
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyWidth, value);
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == heightAttr)
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyHeight, value);
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == vspaceAttr) {
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginTop, value);
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginBottom, value);
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == hspaceAttr) {
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginLeft, value);
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginRight, value);
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == alignAttr)
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        applyAlignmentAttributeToStyle(value, style);
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLFrameOwnerElement::collectStyleForPresentationAttribute(name, value, style);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLPlugInElement::defaultEventHandler(Event* event)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Firefox seems to use a fake event listener to dispatch events to plug-in (tested with mouse events only).
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is observable via different order of events - in Firefox, event listeners specified in HTML attributes fires first, then an event
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // gets dispatched to plug-in, and only then other event listeners fire. Hopefully, this difference does not matter in practice.
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Mouse down and scroll events are passed down to plug-in via custom code in EventHandler; these code paths should be united.
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* r = renderer();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (r && r->isEmbeddedObject()) {
18581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (toRenderEmbeddedObject(r)->showsUnavailablePluginIndicator())
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (displayState() < Playing)
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!r || !r->isWidget())
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Widget> widget = toRenderWidget(r)->widget();
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!widget)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    widget->handleEvent(event);
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->defaultHandled())
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLFrameOwnerElement::defaultEventHandler(event);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
203f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool HTMLPlugInElement::isKeyboardFocusable() const
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document()->page())
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    const PluginView* plugin = pluginWidget() && pluginWidget()->isPluginView() ? static_cast<const PluginView*>(pluginWidget()) : 0;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (plugin)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return plugin->supportsKeyboardFocus();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLPlugInElement::isPluginElement() const
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
220521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)bool HTMLPlugInElement::rendererIsFocusable() const
22153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
222521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (HTMLFrameOwnerElement::supportsFocus() && HTMLFrameOwnerElement::rendererIsFocusable())
22353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
22453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
22553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (useFallbackContent() || !renderer() || !renderer()->isEmbeddedObject())
22653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
22753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return !toRenderEmbeddedObject(renderer())->showsUnavailablePluginIndicator();
22853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NPObject* HTMLPlugInElement::getNPObject()
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(document()->frame());
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_NPObject)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_NPObject = document()->frame()->script()->createScriptObjectForPluginElement(this);
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_NPObject;
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
239