| Index: webkit/glue/plugins/pepper_plugin_instance.cc
|
| ===================================================================
|
| --- webkit/glue/plugins/pepper_plugin_instance.cc (revision 0)
|
| +++ webkit/glue/plugins/pepper_plugin_instance.cc (revision 0)
|
| @@ -0,0 +1,231 @@
|
| +// Copyright (c) 2010 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.
|
| +
|
| +#include "webkit/glue/plugins/pepper_plugin_instance.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "gfx/rect.h"
|
| +#include "third_party/ppapi/c/pp_instance.h"
|
| +#include "third_party/ppapi/c/pp_event.h"
|
| +#include "third_party/ppapi/c/pp_rect.h"
|
| +#include "third_party/ppapi/c/pp_resource.h"
|
| +#include "third_party/ppapi/c/ppb_instance.h"
|
| +#include "third_party/ppapi/c/ppp_instance.h"
|
| +#include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h"
|
| +#include "webkit/glue/plugins/pepper_device_context_2d.h"
|
| +#include "webkit/glue/plugins/pepper_plugin_module.h"
|
| +#include "webkit/glue/plugins/pepper_resource_tracker.h"
|
| +
|
| +using WebKit::WebInputEvent;
|
| +
|
| +namespace pepper {
|
| +
|
| +namespace {
|
| +
|
| +void RectToPPRect(const gfx::Rect& input, PP_Rect* output) {
|
| + output->left = input.x();
|
| + output->top = input.y();
|
| + output->right = input.right();
|
| + output->bottom = input.bottom();
|
| +}
|
| +
|
| +PP_Event_Type ConvertEventTypes(WebInputEvent::Type wetype) {
|
| + switch (wetype) {
|
| + case WebInputEvent::MouseDown:
|
| + return PP_Event_Type_MouseDown;
|
| + case WebInputEvent::MouseUp:
|
| + return PP_Event_Type_MouseUp;
|
| + case WebInputEvent::MouseMove:
|
| + return PP_Event_Type_MouseMove;
|
| + case WebInputEvent::MouseEnter:
|
| + return PP_Event_Type_MouseEnter;
|
| + case WebInputEvent::MouseLeave:
|
| + return PP_Event_Type_MouseLeave;
|
| + case WebInputEvent::MouseWheel:
|
| + return PP_Event_Type_MouseWheel;
|
| + case WebInputEvent::RawKeyDown:
|
| + return PP_Event_Type_RawKeyDown;
|
| + case WebInputEvent::KeyDown:
|
| + return PP_Event_Type_KeyDown;
|
| + case WebInputEvent::KeyUp:
|
| + return PP_Event_Type_KeyUp;
|
| + case WebInputEvent::Char:
|
| + return PP_Event_Type_Char;
|
| + case WebInputEvent::Undefined:
|
| + default:
|
| + return PP_Event_Type_Undefined;
|
| + }
|
| +}
|
| +
|
| +void BuildKeyEvent(const WebInputEvent* event, PP_Event* pp_event) {
|
| + const WebKit::WebKeyboardEvent* key_event =
|
| + reinterpret_cast<const WebKit::WebKeyboardEvent*>(event);
|
| + pp_event->u.key.modifier = key_event->modifiers;
|
| + pp_event->u.key.normalizedKeyCode = key_event->windowsKeyCode;
|
| +}
|
| +
|
| +void BuildCharEvent(const WebInputEvent* event, PP_Event* pp_event) {
|
| + const WebKit::WebKeyboardEvent* key_event =
|
| + reinterpret_cast<const WebKit::WebKeyboardEvent*>(event);
|
| + pp_event->u.character.modifier = key_event->modifiers;
|
| + // For consistency, check that the sizes of the texts agree.
|
| + DCHECK(sizeof(pp_event->u.character.text) == sizeof(key_event->text));
|
| + DCHECK(sizeof(pp_event->u.character.unmodifiedText) ==
|
| + sizeof(key_event->unmodifiedText));
|
| + for (size_t i = 0; i < WebKit::WebKeyboardEvent::textLengthCap; ++i) {
|
| + pp_event->u.character.text[i] = key_event->text[i];
|
| + pp_event->u.character.unmodifiedText[i] = key_event->unmodifiedText[i];
|
| + }
|
| +}
|
| +
|
| +void BuildMouseEvent(const WebInputEvent* event, PP_Event* pp_event) {
|
| + const WebKit::WebMouseEvent* mouse_event =
|
| + reinterpret_cast<const WebKit::WebMouseEvent*>(event);
|
| + pp_event->u.mouse.modifier = mouse_event->modifiers;
|
| + pp_event->u.mouse.button = mouse_event->button;
|
| + pp_event->u.mouse.x = mouse_event->x;
|
| + pp_event->u.mouse.y = mouse_event->y;
|
| + pp_event->u.mouse.clickCount = mouse_event->clickCount;
|
| +}
|
| +
|
| +void BuildMouseWheelEvent(const WebInputEvent* event, PP_Event* pp_event) {
|
| + const WebKit::WebMouseWheelEvent* mouse_wheel_event =
|
| + reinterpret_cast<const WebKit::WebMouseWheelEvent*>(event);
|
| + pp_event->u.wheel.modifier = mouse_wheel_event->modifiers;
|
| + pp_event->u.wheel.deltaX = mouse_wheel_event->deltaX;
|
| + pp_event->u.wheel.deltaY = mouse_wheel_event->deltaY;
|
| + pp_event->u.wheel.wheelTicksX = mouse_wheel_event->wheelTicksX;
|
| + pp_event->u.wheel.wheelTicksY = mouse_wheel_event->wheelTicksY;
|
| + pp_event->u.wheel.scrollByPage = mouse_wheel_event->scrollByPage;
|
| +}
|
| +
|
| +bool BindGraphicsDeviceContext(PP_Instance instance_id, PP_Resource device_id) {
|
| + PluginInstance* instance = PluginInstance::FromPPInstance(instance_id);
|
| + if (!instance)
|
| + return false;
|
| + return instance->BindGraphicsDeviceContext(device_id);
|
| +}
|
| +
|
| +const PPB_Instance ppb_instance = {
|
| + &BindGraphicsDeviceContext,
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +PluginInstance::PluginInstance(PluginDelegate* delegate,
|
| + PluginModule* module,
|
| + const PPP_Instance* instance_interface)
|
| + : delegate_(delegate),
|
| + module_(module),
|
| + instance_interface_(instance_interface) {
|
| + DCHECK(delegate);
|
| + module_->InstanceCreated(this);
|
| +}
|
| +
|
| +PluginInstance::~PluginInstance() {
|
| + module_->InstanceDeleted(this);
|
| +}
|
| +
|
| +// static
|
| +const PPB_Instance* PluginInstance::GetInterface() {
|
| + return &ppb_instance;
|
| +}
|
| +
|
| +// static
|
| +PluginInstance* PluginInstance::FromPPInstance(PP_Instance instance) {
|
| + return reinterpret_cast<PluginInstance*>(instance.id);
|
| +}
|
| +
|
| +PP_Instance PluginInstance::GetPPInstance() {
|
| + PP_Instance ret;
|
| + ret.id = reinterpret_cast<intptr_t>(this);
|
| + return ret;
|
| +}
|
| +
|
| +void PluginInstance::Paint(WebKit::WebCanvas* canvas,
|
| + const gfx::Rect& plugin_rect,
|
| + const gfx::Rect& paint_rect) {
|
| + if (device_context_2d_)
|
| + device_context_2d_->Paint(canvas, plugin_rect, paint_rect);
|
| +}
|
| +
|
| +bool PluginInstance::BindGraphicsDeviceContext(PP_Resource device_id) {
|
| + scoped_refptr<Resource> device_resource =
|
| + ResourceTracker::Get()->GetResource(device_id);
|
| + if (!device_resource.get())
|
| + return false;
|
| +
|
| + DeviceContext2D* device_2d = device_resource->AsDeviceContext2D();
|
| + if (device_2d) {
|
| + device_context_2d_ = device_2d;
|
| + // TODO(brettw) repaint the plugin.
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void PluginInstance::Delete() {
|
| + instance_interface_->Delete(GetPPInstance());
|
| +}
|
| +
|
| +bool PluginInstance::Initialize(const std::vector<std::string>& arg_names,
|
| + const std::vector<std::string>& arg_values) {
|
| + if (!instance_interface_->New(GetPPInstance()))
|
| + return false;
|
| +
|
| + size_t argc = 0;
|
| + scoped_array<const char*> argn(new const char*[arg_names.size()]);
|
| + scoped_array<const char*> argv(new const char*[arg_names.size()]);
|
| + for (size_t i = 0; i < arg_names.size(); ++i) {
|
| + argn[argc] = arg_names[i].c_str();
|
| + argv[argc] = arg_values[i].c_str();
|
| + argc++;
|
| + }
|
| +
|
| + return instance_interface_->Initialize(GetPPInstance(),
|
| + argc, argn.get(), argv.get());
|
| +}
|
| +
|
| +bool PluginInstance::HandleInputEvent(const WebKit::WebInputEvent& event,
|
| + WebKit::WebCursorInfo* cursor_info) {
|
| + PP_Event pp_event;
|
| +
|
| + pp_event.type = ConvertEventTypes(event.type);
|
| + pp_event.size = sizeof(pp_event);
|
| + pp_event.time_stamp_seconds = event.timeStampSeconds;
|
| + switch (pp_event.type) {
|
| + case PP_Event_Type_Undefined:
|
| + return false;
|
| + case PP_Event_Type_MouseDown:
|
| + case PP_Event_Type_MouseUp:
|
| + case PP_Event_Type_MouseMove:
|
| + case PP_Event_Type_MouseEnter:
|
| + case PP_Event_Type_MouseLeave:
|
| + BuildMouseEvent(&event, &pp_event);
|
| + break;
|
| + case PP_Event_Type_MouseWheel:
|
| + BuildMouseWheelEvent(&event, &pp_event);
|
| + break;
|
| + case PP_Event_Type_RawKeyDown:
|
| + case PP_Event_Type_KeyDown:
|
| + case PP_Event_Type_KeyUp:
|
| + BuildKeyEvent(&event, &pp_event);
|
| + break;
|
| + case PP_Event_Type_Char:
|
| + BuildCharEvent(&event, &pp_event);
|
| + break;
|
| + }
|
| + return instance_interface_->HandleEvent(GetPPInstance(), &pp_event);
|
| +}
|
| +
|
| +void PluginInstance::ViewChanged(const gfx::Rect& position,
|
| + const gfx::Rect& clip) {
|
| + PP_Rect pp_position, pp_clip;
|
| + RectToPPRect(position, &pp_position);
|
| + RectToPPRect(clip, &pp_clip);
|
| + instance_interface_->ViewChanged(GetPPInstance(), &pp_position, &pp_clip);
|
| +}
|
| +
|
| +} // namespace pepper
|
|
|
| Property changes on: webkit/glue/plugins/pepper_plugin_instance.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|