1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved.
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  This library is free software; you can redistribute it and/or
5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  modify it under the terms of the GNU Library General Public
6231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  License as published by the Free Software Foundation; either
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  version 2 of the License, or (at your option) any later version.
8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
9231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  This library is distributed in the hope that it will be useful,
10231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  Library General Public License for more details.
13231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
14231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  You should have received a copy of the GNU Library General Public License
15231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  along with this library; see the file COPYING.LIB.  If not, write to
16231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *  Boston, MA 02110-1301, USA.
18231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block */
19231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
20231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(VIDEO)
21231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
22231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "config.h"
23231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "MediaPlayerProxy.h"
24231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2553733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#include "BridgeJSC.h"
26231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "DocumentLoader.h"
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLPlugInElement.h"
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLVideoElement.h"
29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSDOMBinding.h"
30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSPluginElementFunctions.h"
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "MediaPlayer.h"
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Node.h"
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PlatformString.h"
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PluginView.h"
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "RenderPartObject.h"
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "RenderWidget.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Widget.h"
381325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "c_class.h"
391325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "c_instance.h"
401325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "c_runtime.h"
411325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "npruntime_impl.h"
421325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <runtime/Identifier.h>
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace JSC;
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace Bindings;
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace HTMLNames;
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebMediaPlayerProxy::WebMediaPlayerProxy(MediaPlayer* player)
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : m_mediaPlayer(player)
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_init(false)
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_hasSentResponseToPlugin(false)
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_init)
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        initEngine();
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockWebMediaPlayerProxy::~WebMediaPlayerProxy()
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_instance.release();
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockScriptInstance WebMediaPlayerProxy::pluginInstance()
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_instance) {
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        RenderObject* r = element()->renderer();
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!r || !r->isWidget())
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return 0;
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        Frame* frame = element()->document()->frame();
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        RenderWidget* renderWidget = static_cast<RenderWidget*>(element()->renderer());
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (renderWidget && renderWidget->widget())
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_instance = frame->script()->createScriptInstanceForWidget(renderWidget->widget());
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return m_instance;
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid WebMediaPlayerProxy::load(const String& url)
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_init)
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        initEngine();
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_init)
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        invokeMethod("play");
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid WebMediaPlayerProxy::initEngine()
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    HTMLMediaElement* element = static_cast<HTMLMediaElement*>(m_mediaPlayer->mediaPlayerClient());
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String url = element->initialURL();
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (url.isEmpty())
96231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Frame* frame = element->document()->frame();
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Vector<String> paramNames;
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Vector<String> paramValues;
101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String serviceType;
102231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // add all attributes set on the embed object
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (NamedNodeMap* attributes = element->attributes()) {
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (unsigned i = 0; i < attributes->length(); ++i) {
106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            Attribute* it = attributes->attributeItem(i);
107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            paramNames.append(it->name().localName().string());
108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            paramValues.append(it->value().string());
109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
111231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    serviceType = "application/x-mplayer2";
11206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    frame->loader()->subframeLoader()->requestObject(static_cast<RenderPartObject*>(element->renderer()), url, nullAtom, serviceType, paramNames, paramValues);
113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_init = true;
114231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
115231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
116231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockHTMLMediaElement* WebMediaPlayerProxy::element()
118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return static_cast<HTMLMediaElement*>(m_mediaPlayer->mediaPlayerClient());
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid WebMediaPlayerProxy::invokeMethod(const String& methodName)
124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Frame* frame = element()->document()->frame();
126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RootObject *root = frame->script()->bindingRootObject();
127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!root)
128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ExecState *exec = root->globalObject()->globalExec();
130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Instance* instance = pluginInstance().get();
131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!instance)
132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    instance->begin();
135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Class *aClass = instance->getClass();
136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Identifier iden(exec, methodName);
137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MethodList methodList = aClass->methodsNamed(iden, instance);
138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ArgList args;
139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    instance->invokeMethod(exec, methodList , args);
140231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    instance->end();
141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
146