| Index: webkit/glue/plugins/webplugin_delegate_pepper_impl.cc
|
| ===================================================================
|
| --- webkit/glue/plugins/webplugin_delegate_pepper_impl.cc (revision 29377)
|
| +++ webkit/glue/plugins/webplugin_delegate_pepper_impl.cc (working copy)
|
| @@ -1,395 +0,0 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#define PEPPER_APIS_ENABLED 1
|
| -
|
| -#include "webkit/glue/plugins/webplugin_delegate_pepper_impl.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/process_util.h"
|
| -#include "base/scoped_ptr.h"
|
| -#include "base/stats_counters.h"
|
| -#include "base/string_util.h"
|
| -#include "webkit/api/public/WebInputEvent.h"
|
| -#include "webkit/glue/glue_util.h"
|
| -#include "webkit/glue/plugins/plugin_constants_win.h"
|
| -#include "webkit/glue/plugins/plugin_instance.h"
|
| -#include "webkit/glue/plugins/plugin_lib.h"
|
| -#include "webkit/glue/plugins/plugin_list.h"
|
| -#include "webkit/glue/plugins/plugin_stream_url.h"
|
| -#include "webkit/glue/webkit_glue.h"
|
| -
|
| -using webkit_glue::WebPlugin;
|
| -using webkit_glue::WebPluginDelegate;
|
| -using webkit_glue::WebPluginResourceClient;
|
| -using WebKit::WebCursorInfo;
|
| -using WebKit::WebKeyboardEvent;
|
| -using WebKit::WebInputEvent;
|
| -using WebKit::WebMouseEvent;
|
| -using WebKit::WebMouseWheelEvent;
|
| -
|
| -
|
| -WebPluginDelegatePepperImpl* WebPluginDelegatePepperImpl::Create(
|
| - const FilePath& filename,
|
| - const std::string& mime_type,
|
| - gfx::PluginWindowHandle containing_view) {
|
| - scoped_refptr<NPAPI::PluginLib> plugin_lib =
|
| - NPAPI::PluginLib::CreatePluginLib(filename);
|
| - if (plugin_lib.get() == NULL)
|
| - return NULL;
|
| -
|
| - NPError err = plugin_lib->NP_Initialize();
|
| - if (err != NPERR_NO_ERROR)
|
| - return NULL;
|
| -
|
| - scoped_refptr<NPAPI::PluginInstance> instance =
|
| - plugin_lib->CreateInstance(mime_type);
|
| - return new WebPluginDelegatePepperImpl(containing_view, instance.get());
|
| -}
|
| -
|
| -bool WebPluginDelegatePepperImpl::Initialize(
|
| - const GURL& url,
|
| - const std::vector<std::string>& arg_names,
|
| - const std::vector<std::string>& arg_values,
|
| - WebPlugin* plugin,
|
| - bool load_manually) {
|
| - plugin_ = plugin;
|
| -
|
| - instance_->set_web_plugin(plugin_);
|
| - int argc = 0;
|
| - scoped_array<char*> argn(new char*[arg_names.size()]);
|
| - scoped_array<char*> argv(new char*[arg_names.size()]);
|
| - for (size_t i = 0; i < arg_names.size(); ++i) {
|
| - argn[argc] = const_cast<char*>(arg_names[i].c_str());
|
| - argv[argc] = const_cast<char*>(arg_values[i].c_str());
|
| - argc++;
|
| - }
|
| -
|
| - bool start_result = instance_->Start(
|
| - url, argn.get(), argv.get(), argc, load_manually);
|
| - if (!start_result)
|
| - return false;
|
| -
|
| - // For windowless plugins we should set the containing window handle
|
| - // as the instance window handle. This is what Safari does. Not having
|
| - // a valid window handle causes subtle bugs with plugins which retreive
|
| - // the window handle and validate the same. The window handle can be
|
| - // retreived via NPN_GetValue of NPNVnetscapeWindow.
|
| - instance_->set_window_handle(parent_);
|
| -
|
| - plugin_url_ = url.spec();
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::DestroyInstance() {
|
| - if (instance_ && (instance_->npp()->ndata != NULL)) {
|
| - // Shutdown all streams before destroying so that
|
| - // no streams are left "in progress". Need to do
|
| - // this before calling set_web_plugin(NULL) because the
|
| - // instance uses the helper to do the download.
|
| - instance_->CloseStreams();
|
| -
|
| - window_.window = NULL;
|
| - instance_->NPP_SetWindow(&window_);
|
| -
|
| - instance_->NPP_Destroy();
|
| -
|
| - instance_->set_web_plugin(NULL);
|
| -
|
| - instance_ = 0;
|
| - }
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::UpdateGeometry(
|
| - const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect) {
|
| - WindowlessUpdateGeometry(window_rect, clip_rect);
|
| -}
|
| -
|
| -NPObject* WebPluginDelegatePepperImpl::GetPluginScriptableObject() {
|
| - return instance_->GetPluginScriptableObject();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::DidFinishLoadWithReason(
|
| - const GURL& url,
|
| - NPReason reason,
|
| - intptr_t notify_data) {
|
| - instance()->DidFinishLoadWithReason(
|
| - url, reason, reinterpret_cast<void*>(notify_data));
|
| -}
|
| -
|
| -int WebPluginDelegatePepperImpl::GetProcessId() {
|
| - // We are in process, so the plugin pid is this current process pid.
|
| - return base::GetCurrentProcId();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::SendJavaScriptStream(
|
| - const GURL& url,
|
| - const std::string& result,
|
| - bool success,
|
| - bool notify_needed,
|
| - intptr_t notify_data) {
|
| - instance()->SendJavaScriptStream(url, result, success, notify_needed,
|
| - notify_data);
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::DidReceiveManualResponse(
|
| - const GURL& url, const std::string& mime_type,
|
| - const std::string& headers, uint32 expected_length, uint32 last_modified) {
|
| - instance()->DidReceiveManualResponse(url, mime_type, headers,
|
| - expected_length, last_modified);
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::DidReceiveManualData(const char* buffer,
|
| - int length) {
|
| - instance()->DidReceiveManualData(buffer, length);
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::DidFinishManualLoading() {
|
| - instance()->DidFinishManualLoading();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::DidManualLoadFail() {
|
| - instance()->DidManualLoadFail();
|
| -}
|
| -
|
| -FilePath WebPluginDelegatePepperImpl::GetPluginPath() {
|
| - return instance()->plugin_lib()->plugin_info().path;
|
| -}
|
| -
|
| -WebPluginResourceClient* WebPluginDelegatePepperImpl::CreateResourceClient(
|
| - int resource_id, const GURL& url, bool notify_needed,
|
| - intptr_t notify_data, intptr_t existing_stream) {
|
| - // Stream already exists. This typically happens for range requests
|
| - // initiated via NPN_RequestRead.
|
| - if (existing_stream) {
|
| - NPAPI::PluginStream* plugin_stream =
|
| - reinterpret_cast<NPAPI::PluginStream*>(existing_stream);
|
| -
|
| - return plugin_stream->AsResourceClient();
|
| - }
|
| -
|
| - std::string mime_type;
|
| - NPAPI::PluginStreamUrl *stream = instance()->CreateStream(
|
| - resource_id, url, mime_type, notify_needed,
|
| - reinterpret_cast<void*>(notify_data));
|
| - return stream;
|
| -}
|
| -
|
| -bool WebPluginDelegatePepperImpl::IsPluginDelegateWindow(
|
| - gfx::NativeWindow window) {
|
| - return false;
|
| -}
|
| -
|
| -bool WebPluginDelegatePepperImpl::GetPluginNameFromWindow(
|
| - gfx::NativeWindow window, std::wstring *plugin_name) {
|
| - return false;
|
| -}
|
| -
|
| -bool WebPluginDelegatePepperImpl::IsDummyActivationWindow(
|
| - gfx::NativeWindow window) {
|
| - return false;
|
| -}
|
| -
|
| -WebPluginDelegatePepperImpl::WebPluginDelegatePepperImpl(
|
| - gfx::PluginWindowHandle containing_view,
|
| - NPAPI::PluginInstance *instance)
|
| - : plugin_(NULL),
|
| - instance_(instance),
|
| - parent_(containing_view) {
|
| - memset(&window_, 0, sizeof(window_));
|
| -}
|
| -
|
| -WebPluginDelegatePepperImpl::~WebPluginDelegatePepperImpl() {
|
| - DestroyInstance();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::PluginDestroyed() {
|
| - delete this;
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::Paint(gfx::NativeDrawingContext context, const gfx::Rect& rect) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::Print(gfx::NativeDrawingContext context) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::InstallMissingPlugin() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::WindowlessUpdateGeometry(
|
| - const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect) {
|
| - // Only resend to the instance if the geometry has changed.
|
| - if (window_rect == window_rect_ && clip_rect == clip_rect_)
|
| - return;
|
| -
|
| - // We will inform the instance of this change when we call NPP_SetWindow.
|
| - clip_rect_ = clip_rect;
|
| - cutout_rects_.clear();
|
| -
|
| - if (window_rect_ != window_rect) {
|
| - window_rect_ = window_rect;
|
| - WindowlessSetWindow(true);
|
| - // TODO(sehr): update the context here?
|
| - }
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::WindowlessPaint(
|
| - gfx::NativeDrawingContext context,
|
| - const gfx::Rect& damage_rect) {
|
| - static StatsRate plugin_paint("Plugin.Paint");
|
| - StatsScope<StatsRate> scope(plugin_paint);
|
| - // TODO(sehr): save the context here?
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::WindowlessSetWindow(bool force_set_window) {
|
| - if (!instance())
|
| - return;
|
| -
|
| - if (window_rect_.IsEmpty()) // wait for geometry to be set.
|
| - return;
|
| -
|
| - window_.clipRect.top = clip_rect_.y();
|
| - window_.clipRect.left = clip_rect_.x();
|
| - window_.clipRect.bottom = clip_rect_.y() + clip_rect_.height();
|
| - window_.clipRect.right = clip_rect_.x() + clip_rect_.width();
|
| - window_.height = window_rect_.height();
|
| - window_.width = window_rect_.width();
|
| - window_.x = window_rect_.x();
|
| - window_.y = window_rect_.y();
|
| - window_.type = NPWindowTypeDrawable;
|
| -
|
| - NPError err = instance()->NPP_SetWindow(&window_);
|
| - DCHECK(err == NPERR_NO_ERROR);
|
| -}
|
| -
|
| -void WebPluginDelegatePepperImpl::SetFocus() {
|
| - NPEvent npevent;
|
| -
|
| - npevent.type = NPEventType_Focus;
|
| - npevent.size = sizeof(NPEvent);
|
| - // TODO(sehr): what timestamp should this have?
|
| - npevent.timeStampSeconds = 0.0;
|
| - // Currently this API only supports gaining focus.
|
| - npevent.u.focus.value = 1;
|
| - instance()->NPP_HandleEvent(&npevent);
|
| -}
|
| -
|
| -// Anonymous namespace for functions converting WebInputEvents to NPAPI types.
|
| -namespace {
|
| -NPEventTypes ConvertEventTypes(WebInputEvent::Type wetype) {
|
| - switch (wetype) {
|
| - case WebInputEvent::MouseDown:
|
| - return NPEventType_MouseDown;
|
| - case WebInputEvent::MouseUp:
|
| - return NPEventType_MouseUp;
|
| - case WebInputEvent::MouseMove:
|
| - return NPEventType_MouseMove;
|
| - case WebInputEvent::MouseEnter:
|
| - return NPEventType_MouseEnter;
|
| - case WebInputEvent::MouseLeave:
|
| - return NPEventType_MouseLeave;
|
| - case WebInputEvent::MouseWheel:
|
| - return NPEventType_MouseWheel;
|
| - case WebInputEvent::RawKeyDown:
|
| - return NPEventType_RawKeyDown;
|
| - case WebInputEvent::KeyDown:
|
| - return NPEventType_KeyDown;
|
| - case WebInputEvent::KeyUp:
|
| - return NPEventType_KeyUp;
|
| - case WebInputEvent::Char:
|
| - return NPEventType_Char;
|
| - case WebInputEvent::Undefined:
|
| - default:
|
| - return NPEventType_Undefined;
|
| - }
|
| -}
|
| -
|
| -void BuildKeyEvent(const WebInputEvent* event, NPEvent* npevent) {
|
| - const WebKeyboardEvent* key_event =
|
| - reinterpret_cast<const WebKeyboardEvent*>(event);
|
| - npevent->u.key.modifier = key_event->modifiers;
|
| - npevent->u.key.normalizedKeyCode = key_event->windowsKeyCode;
|
| -}
|
| -
|
| -void BuildCharEvent(const WebInputEvent* event, NPEvent* npevent) {
|
| - const WebKeyboardEvent* key_event =
|
| - reinterpret_cast<const WebKeyboardEvent*>(event);
|
| - npevent->u.character.modifier = key_event->modifiers;
|
| - // For consistency, check that the sizes of the texts agree.
|
| - DCHECK(sizeof(npevent->u.character.text) == sizeof(key_event->text));
|
| - DCHECK(sizeof(npevent->u.character.unmodifiedText) ==
|
| - sizeof(key_event->unmodifiedText));
|
| - for (size_t i = 0; i < WebKeyboardEvent::textLengthCap; ++i) {
|
| - npevent->u.character.text[i] = key_event->text[i];
|
| - npevent->u.character.unmodifiedText[i] = key_event->unmodifiedText[i];
|
| - }
|
| -}
|
| -
|
| -void BuildMouseEvent(const WebInputEvent* event, NPEvent* npevent) {
|
| - const WebMouseEvent* mouse_event =
|
| - reinterpret_cast<const WebMouseEvent*>(event);
|
| - npevent->u.mouse.modifier = mouse_event->modifiers;
|
| - npevent->u.mouse.button = mouse_event->button;
|
| - npevent->u.mouse.x = mouse_event->x;
|
| - npevent->u.mouse.y = mouse_event->y;
|
| - npevent->u.mouse.clickCount = mouse_event->clickCount;
|
| -}
|
| -
|
| -void BuildMouseWheelEvent(const WebInputEvent* event, NPEvent* npevent) {
|
| - const WebMouseWheelEvent* mouse_wheel_event =
|
| - reinterpret_cast<const WebMouseWheelEvent*>(event);
|
| - npevent->u.wheel.modifier = mouse_wheel_event->modifiers;
|
| - npevent->u.wheel.deltaX = mouse_wheel_event->deltaX;
|
| - npevent->u.wheel.deltaY = mouse_wheel_event->deltaY;
|
| - npevent->u.wheel.wheelTicksX = mouse_wheel_event->wheelTicksX;
|
| - npevent->u.wheel.wheelTicksY = mouse_wheel_event->wheelTicksY;
|
| - npevent->u.wheel.scrollByPage = mouse_wheel_event->scrollByPage;
|
| -}
|
| -} // namespace
|
| -
|
| -bool WebPluginDelegatePepperImpl::HandleInputEvent(const WebInputEvent& event,
|
| - WebCursorInfo* cursor_info) {
|
| - NPEvent npevent;
|
| -
|
| - npevent.type = ConvertEventTypes(event.type);
|
| - npevent.size = sizeof(NPEvent);
|
| - npevent.timeStampSeconds = event.timeStampSeconds;
|
| - switch (npevent.type) {
|
| - case NPEventType_Undefined:
|
| - return false;
|
| - case NPEventType_MouseDown:
|
| - case NPEventType_MouseUp:
|
| - case NPEventType_MouseMove:
|
| - case NPEventType_MouseEnter:
|
| - case NPEventType_MouseLeave:
|
| - BuildMouseEvent(&event, &npevent);
|
| - break;
|
| - case NPEventType_MouseWheel:
|
| - BuildMouseWheelEvent(&event, &npevent);
|
| - break;
|
| - case NPEventType_RawKeyDown:
|
| - case NPEventType_KeyDown:
|
| - case NPEventType_KeyUp:
|
| - BuildKeyEvent(&event, &npevent);
|
| - case NPEventType_Char:
|
| - BuildCharEvent(&event, &npevent);
|
| - break;
|
| - case NPEventType_Minimize:
|
| - case NPEventType_Focus:
|
| - case NPEventType_Device:
|
| - NOTIMPLEMENTED();
|
| - break;
|
| - }
|
| - return instance()->NPP_HandleEvent(&npevent) != 0;
|
| -}
|
|
|