Home | History | Annotate | Download | only in wince
      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 
     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 
     60 WebMediaPlayerProxy::~WebMediaPlayerProxy()
     61 {
     62     m_instance.release();
     63 }
     64 
     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 
     82 void WebMediaPlayerProxy::load(const String& url)
     83 {
     84     if (!m_init)
     85         initEngine();
     86     if (m_init)
     87         invokeMethod("play");
     88 }
     89 
     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 
    117 HTMLMediaElement* WebMediaPlayerProxy::element()
    118 {
    119     return static_cast<HTMLMediaElement*>(m_mediaPlayer->mediaPlayerClient());
    120 
    121 }
    122 
    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