15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin_delegate_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
1258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process_handle.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_instance.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_lib.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_stream_url.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webkit_glue.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCursorInfo;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPluginDelegateImpl* WebPluginDelegateImpl::Create(
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& filename,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginLib> plugin_lib(PluginLib::CreatePluginLib(filename));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_lib.get() == NULL)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPError err = plugin_lib->NP_Initialize();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (err != NPERR_NO_ERROR)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginInstance> instance(plugin_lib->CreateInstance(mime_type));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new WebPluginDelegateImpl(instance.get());
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::PluginDestroyed() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle_event_depth_) {
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebPluginDelegateImpl::Initialize(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& arg_names,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& arg_values,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebPlugin* plugin,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool load_manually) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_ = plugin;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->set_web_plugin(plugin_);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (quirks_ & PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginLib* plugin_lib = instance()->plugin_lib();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plugin_lib->instance_count() > 1) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc = 0;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char*[]> argn(new char*[arg_names.size()]);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char*[]> argv(new char*[arg_names.size()]);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arg_names.size(); ++i) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (quirks_ & PLUGIN_QUIRK_NO_WINDOWLESS &&
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LowerCaseEqualsASCII(arg_names[i], "windowlessvideo")) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    argn[argc] = const_cast<char*>(arg_names[i].c_str());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    argv[argc] = const_cast<char*>(arg_values[i].c_str());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    argc++;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  creation_succeeded_ = instance_->Start(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url, argn.get(), argv.get(), argc, load_manually);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!creation_succeeded_) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Couldn't start plug-in instance";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  windowless_ = instance_->windowless();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!windowless_) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!WindowedCreatePlugin()) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "Couldn't create windowed plug-in";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_load = PlatformInitialize();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_url_ = url.spec();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return should_load;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::DestroyInstance() {
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (instance_.get() && (instance_->npp()->ndata != NULL)) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shutdown all streams before destroying so that
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // no streams are left "in progress".  Need to do
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this before calling set_web_plugin(NULL) because the
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // instance uses the helper to do the download.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_->CloseStreams();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.window = NULL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (creation_succeeded_ &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !(quirks_ & PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY)) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_->NPP_SetWindow(&window_);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_->NPP_Destroy();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_->set_web_plugin(NULL);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlatformDestroyInstance();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_ = 0;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::UpdateGeometry(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& window_rect,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& clip_rect) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_set_window_call_) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_set_window_call_ = false;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Plugins like media player on Windows have a bug where in they handle the
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // first geometry update and ignore the rest resulting in painting issues.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This quirk basically ignores the first set window call sequence for
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // these plugins and has been tested for Windows plugins only.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (quirks_ & PLUGIN_QUIRK_IGNORE_FIRST_SETWINDOW_CALL)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (windowless_) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowlessUpdateGeometry(window_rect, clip_rect);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowedUpdateGeometry(window_rect, clip_rect);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::SetFocus(bool focused) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(windowless_);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is called when internal WebKit focus (the focused element on the page)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changes, but plugins need to know about OS-level focus, so we have an extra
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // layer of focus tracking.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Windows, historically browsers did not set focus events to windowless
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugins when the toplevel window focus changes. Sending such focus events
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // breaks full screen mode in Flash because it will come out of full screen
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode when it loses focus, and its full screen window causes the browser to
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lose focus.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_webkit_focus_ = focused;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_WIN)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (containing_view_has_focus_)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetPluginHasFocus(focused);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPluginHasFocus(focused);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::SetPluginHasFocus(bool focused) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focused == plugin_has_focus_)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (PlatformSetPluginHasFocus(focused))
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin_has_focus_ = focused;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::SetContentAreaHasFocus(bool has_focus) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  containing_view_has_focus_ = has_focus;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!windowless_)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_WIN)  // See SetFocus above.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPluginHasFocus(containing_view_has_focus_ && has_webkit_focus_);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NPObject* WebPluginDelegateImpl::GetPluginScriptableObject() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance_->GetPluginScriptableObject();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NPP WebPluginDelegateImpl::GetPluginNPP() {
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return instance_->npp();
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool WebPluginDelegateImpl::GetFormValue(base::string16* value) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance_->GetFormValue(value);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::DidFinishLoadWithReason(const GURL& url,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    NPReason reason,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    int notify_id) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (quirks_ & PLUGIN_QUIRK_ALWAYS_NOTIFY_SUCCESS &&
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reason == NPRES_NETWORK_ERR) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Flash needs this or otherwise it unloads the launching swf object.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reason = NPRES_DONE;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance()->DidFinishLoadWithReason(url, reason, notify_id);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebPluginDelegateImpl::GetProcessId() {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are in process, so the plugin pid is this current process pid.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::GetCurrentProcId();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::SendJavaScriptStream(const GURL& url,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const std::string& result,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 bool success,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int notify_id) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance()->SendJavaScriptStream(url, result, success, notify_id);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::DidReceiveManualResponse(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url, const std::string& mime_type,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& headers, uint32 expected_length, uint32 last_modified) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!windowless_) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Calling NPP_WriteReady before NPP_SetWindow causes movies to not load in
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Flash.  See http://b/issue?id=892174.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(windowed_did_set_window_);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance()->DidReceiveManualResponse(url, mime_type, headers,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       expected_length, last_modified);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::DidReceiveManualData(const char* buffer,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int length) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance()->DidReceiveManualData(buffer, length);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::DidFinishManualLoading() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance()->DidFinishManualLoading();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::DidManualLoadFail() {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance()->DidManualLoadFail();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath WebPluginDelegateImpl::GetPluginPath() {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance()->plugin_lib()->plugin_info().path;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebPluginDelegateImpl::WindowedUpdateGeometry(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& window_rect,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& clip_rect) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (WindowedReposition(window_rect, clip_rect) ||
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !windowed_did_set_window_) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Let the plugin know that it has been moved
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowedSetWindow();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool WebPluginDelegateImpl::HandleInputEvent(
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const WebInputEvent& event,
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    WebCursor::CursorInfo* cursor_info) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(windowless_) << "events should only be received in windowless mode";
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pop_user_gesture = false;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsUserGesture(event)) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pop_user_gesture = true;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance()->PushPopupsEnabledState(true);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = PlatformHandleInputEvent(event, cursor_info);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pop_user_gesture) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance()->PopPopupsEnabledState();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebPluginDelegateImpl::IsUserGesture(const WebInputEvent& event) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event.type) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseDown:
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::MouseUp:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::KeyDown:
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WebInputEvent::KeyUp:
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPluginResourceClient* WebPluginDelegateImpl::CreateResourceClient(
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long resource_id, const GURL& url, int notify_id) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance()->CreateStream(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_id, url, std::string(), notify_id);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebPluginResourceClient* WebPluginDelegateImpl::CreateSeekableResourceClient(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long resource_id, int range_request_id) {
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WebPluginResourceClient* resource_client = instance()->GetRangeRequest(
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      range_request_id);
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (resource_client)
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    resource_client->AddRangeRequestResourceId(resource_id);
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return resource_client;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace content
305