Index: content/child/npapi/webplugin_delegate_impl_win.cc |
diff --git a/content/child/npapi/webplugin_delegate_impl_win.cc b/content/child/npapi/webplugin_delegate_impl_win.cc |
deleted file mode 100644 |
index 70657052b54e87efceccbebca5a37be871eef25b..0000000000000000000000000000000000000000 |
--- a/content/child/npapi/webplugin_delegate_impl_win.cc |
+++ /dev/null |
@@ -1,369 +0,0 @@ |
-// Copyright (c) 2012 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 "content/child/npapi/webplugin_delegate_impl.h" |
- |
-#include <stdint.h> |
-#include <string.h> |
- |
-#include <map> |
-#include <set> |
-#include <string> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/compiler_specific.h" |
-#include "base/lazy_instance.h" |
-#include "base/macros.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/synchronization/lock.h" |
-#include "base/version.h" |
-#include "base/win/windows_version.h" |
-#include "content/child/npapi/plugin_instance.h" |
-#include "content/child/npapi/plugin_lib.h" |
-#include "content/child/npapi/webplugin.h" |
-#include "content/common/cursors/webcursor.h" |
-#include "content/common/plugin_constants_win.h" |
-#include "content/public/common/content_constants.h" |
-#include "skia/ext/platform_canvas.h" |
-#include "third_party/WebKit/public/web/WebInputEvent.h" |
-#include "ui/gfx/win/dpi.h" |
-#include "ui/gfx/win/hwnd_util.h" |
- |
-using blink::WebKeyboardEvent; |
-using blink::WebInputEvent; |
-using blink::WebMouseEvent; |
- |
-namespace content { |
- |
-namespace { |
- |
-// http://crbug.com/16114 |
-// Enforces providing a valid device context in NPWindow, so that NPP_SetWindow |
-// is never called with NPNWindoTypeDrawable and NPWindow set to NULL. |
-// Doing so allows removing NPP_SetWindow call during painting a windowless |
-// plugin, which otherwise could trigger layout change while painting by |
-// invoking NPN_Evaluate. Which would cause bad, bad crashes. Bad crashes. |
-// TODO(dglazkov): If this approach doesn't produce regressions, move class to |
-// webplugin_delegate_impl.h and implement for other platforms. |
-class DrawableContextEnforcer { |
- public: |
- explicit DrawableContextEnforcer(NPWindow* window) |
- : window_(window), |
- disposable_dc_(window && !window->window) { |
- // If NPWindow is NULL, create a device context with monochrome 1x1 surface |
- // and stuff it to NPWindow. |
- if (disposable_dc_) |
- window_->window = CreateCompatibleDC(NULL); |
- } |
- |
- ~DrawableContextEnforcer() { |
- if (!disposable_dc_) |
- return; |
- |
- DeleteDC(static_cast<HDC>(window_->window)); |
- window_->window = NULL; |
- } |
- |
- private: |
- NPWindow* window_; |
- bool disposable_dc_; |
-}; |
- |
-} // namespace |
- |
-WebPluginDelegateImpl::WebPluginDelegateImpl(WebPlugin* plugin, |
- PluginInstance* instance) |
- : plugin_(plugin), |
- instance_(instance), |
- quirks_(0), |
- handle_event_depth_(0), |
- first_set_window_call_(true), |
- plugin_has_focus_(false), |
- has_webkit_focus_(false), |
- containing_view_has_focus_(true), |
- creation_succeeded_(false), |
- user_gesture_msg_factory_(this) { |
- memset(&window_, 0, sizeof(window_)); |
-} |
- |
-WebPluginDelegateImpl::~WebPluginDelegateImpl() { |
- DestroyInstance(); |
-} |
- |
-bool WebPluginDelegateImpl::PlatformInitialize() { |
- return true; |
-} |
- |
-void WebPluginDelegateImpl::PlatformDestroyInstance() { |
-} |
- |
-void WebPluginDelegateImpl::Paint(SkCanvas* canvas, const gfx::Rect& rect) { |
- if (skia::SupportsPlatformPaint(canvas)) { |
- skia::ScopedPlatformPaint scoped_platform_paint(canvas); |
- HDC hdc = scoped_platform_paint.GetPlatformSurface(); |
- WindowlessPaint(hdc, rect); |
- } |
-} |
- |
-// Returns true if the message passed in corresponds to a user gesture. |
-static bool IsUserGestureMessage(unsigned int message) { |
- switch (message) { |
- case WM_LBUTTONDOWN: |
- case WM_LBUTTONUP: |
- case WM_RBUTTONDOWN: |
- case WM_RBUTTONUP: |
- case WM_MBUTTONDOWN: |
- case WM_MBUTTONUP: |
- case WM_KEYDOWN: |
- case WM_KEYUP: |
- return true; |
- |
- default: |
- break; |
- } |
- |
- return false; |
-} |
- |
-void WebPluginDelegateImpl::WindowlessUpdateGeometry( |
- const gfx::Rect& window_rect, |
- const gfx::Rect& clip_rect) { |
- bool window_rect_changed = (window_rect_ != window_rect); |
- // Only resend to the instance if the geometry has changed. |
- if (!window_rect_changed && clip_rect == clip_rect_) |
- return; |
- |
- clip_rect_ = clip_rect; |
- window_rect_ = window_rect; |
- |
- WindowlessSetWindow(); |
- |
- if (window_rect_changed) { |
- WINDOWPOS win_pos = {0}; |
- win_pos.x = window_rect_.x(); |
- win_pos.y = window_rect_.y(); |
- win_pos.cx = window_rect_.width(); |
- win_pos.cy = window_rect_.height(); |
- |
- NPEvent pos_changed_event; |
- pos_changed_event.event = WM_WINDOWPOSCHANGED; |
- pos_changed_event.wParam = 0; |
- pos_changed_event.lParam = reinterpret_cast<uintptr_t>(&win_pos); |
- |
- instance()->NPP_HandleEvent(&pos_changed_event); |
- } |
-} |
- |
-void WebPluginDelegateImpl::WindowlessPaint(HDC hdc, |
- const gfx::Rect& damage_rect) { |
- DCHECK(hdc); |
- |
- RECT damage_rect_win; |
- damage_rect_win.left = damage_rect.x(); // + window_rect_.x(); |
- damage_rect_win.top = damage_rect.y(); // + window_rect_.y(); |
- damage_rect_win.right = damage_rect_win.left + damage_rect.width(); |
- damage_rect_win.bottom = damage_rect_win.top + damage_rect.height(); |
- |
- // Save away the old HDC as this could be a nested invocation. |
- void* old_dc = window_.window; |
- window_.window = hdc; |
- |
- NPEvent paint_event; |
- paint_event.event = WM_PAINT; |
- paint_event.wParam = PtrToUlong(hdc); |
- paint_event.lParam = reinterpret_cast<uintptr_t>(&damage_rect_win); |
- instance()->NPP_HandleEvent(&paint_event); |
- window_.window = old_dc; |
-} |
- |
-void WebPluginDelegateImpl::WindowlessSetWindow() { |
- 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; |
- DrawableContextEnforcer enforcer(&window_); |
- |
- NPError err = instance()->NPP_SetWindow(&window_); |
- DCHECK(err == NPERR_NO_ERROR); |
-} |
- |
-bool WebPluginDelegateImpl::PlatformSetPluginHasFocus(bool focused) { |
- NPEvent focus_event; |
- focus_event.event = focused ? WM_SETFOCUS : WM_KILLFOCUS; |
- focus_event.wParam = 0; |
- focus_event.lParam = 0; |
- |
- instance()->NPP_HandleEvent(&focus_event); |
- return true; |
-} |
- |
-static bool NPEventFromWebMouseEvent(const WebMouseEvent& event, |
- NPEvent* np_event) { |
- np_event->lParam = |
- static_cast<uint32_t>(MAKELPARAM(event.windowX, event.windowY)); |
- np_event->wParam = 0; |
- |
- if (event.modifiers & WebInputEvent::ControlKey) |
- np_event->wParam |= MK_CONTROL; |
- if (event.modifiers & WebInputEvent::ShiftKey) |
- np_event->wParam |= MK_SHIFT; |
- if (event.modifiers & WebInputEvent::LeftButtonDown) |
- np_event->wParam |= MK_LBUTTON; |
- if (event.modifiers & WebInputEvent::MiddleButtonDown) |
- np_event->wParam |= MK_MBUTTON; |
- if (event.modifiers & WebInputEvent::RightButtonDown) |
- np_event->wParam |= MK_RBUTTON; |
- |
- switch (event.type) { |
- case WebInputEvent::MouseMove: |
- case WebInputEvent::MouseLeave: |
- case WebInputEvent::MouseEnter: |
- np_event->event = WM_MOUSEMOVE; |
- return true; |
- case WebInputEvent::MouseDown: |
- switch (event.button) { |
- case WebMouseEvent::ButtonLeft: |
- np_event->event = WM_LBUTTONDOWN; |
- break; |
- case WebMouseEvent::ButtonMiddle: |
- np_event->event = WM_MBUTTONDOWN; |
- break; |
- case WebMouseEvent::ButtonRight: |
- np_event->event = WM_RBUTTONDOWN; |
- break; |
- case WebMouseEvent::ButtonNone: |
- break; |
- } |
- return true; |
- case WebInputEvent::MouseUp: |
- switch (event.button) { |
- case WebMouseEvent::ButtonLeft: |
- np_event->event = WM_LBUTTONUP; |
- break; |
- case WebMouseEvent::ButtonMiddle: |
- np_event->event = WM_MBUTTONUP; |
- break; |
- case WebMouseEvent::ButtonRight: |
- np_event->event = WM_RBUTTONUP; |
- break; |
- case WebMouseEvent::ButtonNone: |
- break; |
- } |
- return true; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-static bool NPEventFromWebKeyboardEvent(const WebKeyboardEvent& event, |
- NPEvent* np_event) { |
- np_event->wParam = event.windowsKeyCode; |
- |
- switch (event.type) { |
- case WebInputEvent::KeyDown: |
- np_event->event = WM_KEYDOWN; |
- np_event->lParam = 0; |
- return true; |
- case WebInputEvent::Char: |
- np_event->event = WM_CHAR; |
- np_event->lParam = 0; |
- return true; |
- case WebInputEvent::KeyUp: |
- np_event->event = WM_KEYUP; |
- np_event->lParam = 0x8000; |
- return true; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-static bool NPEventFromWebInputEvent(const WebInputEvent& event, |
- NPEvent* np_event) { |
- switch (event.type) { |
- case WebInputEvent::MouseMove: |
- case WebInputEvent::MouseLeave: |
- case WebInputEvent::MouseEnter: |
- case WebInputEvent::MouseDown: |
- case WebInputEvent::MouseUp: |
- if (event.size < sizeof(WebMouseEvent)) { |
- NOTREACHED(); |
- return false; |
- } |
- return NPEventFromWebMouseEvent( |
- *static_cast<const WebMouseEvent*>(&event), np_event); |
- case WebInputEvent::KeyDown: |
- case WebInputEvent::Char: |
- case WebInputEvent::KeyUp: |
- if (event.size < sizeof(WebKeyboardEvent)) { |
- NOTREACHED(); |
- return false; |
- } |
- return NPEventFromWebKeyboardEvent( |
- *static_cast<const WebKeyboardEvent*>(&event), np_event); |
- default: |
- return false; |
- } |
-} |
- |
-bool WebPluginDelegateImpl::PlatformHandleInputEvent( |
- const WebInputEvent& event, WebCursor::CursorInfo* cursor_info) { |
- DCHECK(cursor_info != NULL); |
- |
- NPEvent np_event; |
- if (!NPEventFromWebInputEvent(event, &np_event)) { |
- return false; |
- } |
- |
- handle_event_depth_++; |
- |
- bool popups_enabled = false; |
- |
- if (IsUserGestureMessage(np_event.event)) { |
- instance()->PushPopupsEnabledState(true); |
- popups_enabled = true; |
- } |
- |
- bool ret = instance()->NPP_HandleEvent(&np_event) != 0; |
- |
- if (popups_enabled) { |
- instance()->PopPopupsEnabledState(); |
- } |
- |
- // Flash and SilverLight always return false, even when they swallow the |
- // event. Flash does this because it passes the event to its window proc, |
- // which is supposed to return 0 if an event was handled. There are few |
- // exceptions, such as IME, where it sometimes returns true. |
- ret = true; |
- |
- if (np_event.event == WM_MOUSEMOVE) { |
- current_windowless_cursor_.InitFromExternalCursor(GetCursor()); |
- // Snag a reference to the current cursor ASAP in case the plugin modified |
- // it. There is a nasty race condition here with the multiprocess browser |
- // as someone might be setting the cursor in the main process as well. |
- current_windowless_cursor_.GetCursorInfo(cursor_info); |
- } |
- |
- handle_event_depth_--; |
- |
- return ret; |
-} |
- |
-} // namespace content |