• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Library General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Library General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Library General Public License
15  *  along with this library; see the file COPYING.LIB.  If not, write to
16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  *  Boston, MA 02110-1301, USA.
18  */
19 
20 #if ENABLE(VIDEO)
21 
22 #include "config.h"
23 #include "MediaPlayerProxy.h"
24 
25 #include "BridgeJSC.h"
26 #include "DocumentLoader.h"
27 #include "HTMLPlugInElement.h"
28 #include "HTMLVideoElement.h"
29 #include "JSDOMBinding.h"
30 #include "JSPluginElementFunctions.h"
31 #include "MediaPlayer.h"
32 #include "Node.h"
33 #include "PlatformString.h"
34 #include "PluginView.h"
35 #include "RenderPartObject.h"
36 #include "RenderWidget.h"
37 #include "Widget.h"
38 #include "c_class.h"
39 #include "c_instance.h"
40 #include "c_runtime.h"
41 #include "npruntime_impl.h"
42 #include <runtime/Identifier.h>
43 
44 using namespace JSC;
45 
46 namespace WebCore {
47 
48 using namespace Bindings;
49 using namespace HTMLNames;
50 
WebMediaPlayerProxy(MediaPlayer * player)51 WebMediaPlayerProxy::WebMediaPlayerProxy(MediaPlayer* player)
52     : m_mediaPlayer(player)
53     , m_init(false)
54     , m_hasSentResponseToPlugin(false)
55 {
56     if (!m_init)
57         initEngine();
58 }
59 
~WebMediaPlayerProxy()60 WebMediaPlayerProxy::~WebMediaPlayerProxy()
61 {
62     m_instance.release();
63 }
64 
pluginInstance()65 ScriptInstance WebMediaPlayerProxy::pluginInstance()
66 {
67     if (!m_instance) {
68         RenderObject* r = element()->renderer();
69         if (!r || !r->isWidget())
70             return 0;
71 
72         Frame* frame = element()->document()->frame();
73 
74         RenderWidget* renderWidget = static_cast<RenderWidget*>(element()->renderer());
75         if (renderWidget && renderWidget->widget())
76             m_instance = frame->script()->createScriptInstanceForWidget(renderWidget->widget());
77     }
78 
79     return m_instance;
80 }
81 
load(const String & url)82 void WebMediaPlayerProxy::load(const String& url)
83 {
84     if (!m_init)
85         initEngine();
86     if (m_init)
87         invokeMethod("play");
88 }
89 
initEngine()90 void WebMediaPlayerProxy::initEngine()
91 {
92     HTMLMediaElement* element = static_cast<HTMLMediaElement*>(m_mediaPlayer->mediaPlayerClient());
93     String url = element->initialURL();
94 
95     if (url.isEmpty())
96         return;
97 
98     Frame* frame = element->document()->frame();
99     Vector<String> paramNames;
100     Vector<String> paramValues;
101     String serviceType;
102 
103     // add all attributes set on the embed object
104     if (NamedNodeMap* attributes = element->attributes()) {
105         for (unsigned i = 0; i < attributes->length(); ++i) {
106             Attribute* it = attributes->attributeItem(i);
107             paramNames.append(it->name().localName().string());
108             paramValues.append(it->value().string());
109         }
110     }
111     serviceType = "application/x-mplayer2";
112     frame->loader()->subframeLoader()->requestObject(static_cast<RenderPartObject*>(element->renderer()), url, nullAtom, serviceType, paramNames, paramValues);
113     m_init = true;
114 
115 }
116 
element()117 HTMLMediaElement* WebMediaPlayerProxy::element()
118 {
119     return static_cast<HTMLMediaElement*>(m_mediaPlayer->mediaPlayerClient());
120 
121 }
122 
invokeMethod(const String & methodName)123 void WebMediaPlayerProxy::invokeMethod(const String& methodName)
124 {
125     Frame* frame = element()->document()->frame();
126     RootObject *root = frame->script()->bindingRootObject();
127     if (!root)
128         return;
129     ExecState *exec = root->globalObject()->globalExec();
130     Instance* instance = pluginInstance().get();
131     if (!instance)
132         return;
133 
134     instance->begin();
135     Class *aClass = instance->getClass();
136     Identifier iden(exec, methodName);
137     MethodList methodList = aClass->methodsNamed(iden, instance);
138     ArgList args;
139     instance->invokeMethod(exec, methodList , args);
140     instance->end();
141 }
142 
143 }
144 
145 #endif
146