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