Index: webkit/tools/test_shell/webwidget_host_win.cc |
diff --git a/webkit/tools/test_shell/webwidget_host_win.cc b/webkit/tools/test_shell/webwidget_host_win.cc |
deleted file mode 100644 |
index 4df7da00e33fd48d3baa833f30524215472a3671..0000000000000000000000000000000000000000 |
--- a/webkit/tools/test_shell/webwidget_host_win.cc |
+++ /dev/null |
@@ -1,381 +0,0 @@ |
-// Copyright (c) 2011 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/tools/test_shell/webwidget_host.h" |
- |
-#include "base/logging.h" |
-#include "skia/ext/platform_canvas.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebScreenInfoFactory.h" |
-#include "ui/base/win/hwnd_util.h" |
-#include "ui/gfx/rect.h" |
-#include "webkit/tools/test_shell/test_shell.h" |
- |
-using WebKit::WebInputEvent; |
-using WebKit::WebInputEventFactory; |
-using WebKit::WebKeyboardEvent; |
-using WebKit::WebMouseEvent; |
-using WebKit::WebMouseWheelEvent; |
-using WebKit::WebPopupMenu; |
-using WebKit::WebScreenInfo; |
-using WebKit::WebScreenInfoFactory; |
-using WebKit::WebSize; |
-using WebKit::WebWidget; |
-using WebKit::WebWidgetClient; |
- |
-static const wchar_t kWindowClassName[] = L"WebWidgetHost"; |
- |
-/*static*/ |
-WebWidgetHost* WebWidgetHost::Create(HWND parent_view, |
- WebWidgetClient* client) { |
- WebWidgetHost* host = new WebWidgetHost(); |
- |
- static bool registered_class = false; |
- if (!registered_class) { |
- WNDCLASSEX wcex = {0}; |
- wcex.cbSize = sizeof(wcex); |
- wcex.style = CS_DBLCLKS; |
- wcex.lpfnWndProc = WebWidgetHost::WndProc; |
- wcex.hInstance = GetModuleHandle(NULL); |
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
- wcex.lpszClassName = kWindowClassName; |
- RegisterClassEx(&wcex); |
- registered_class = true; |
- } |
- |
- host->view_ = CreateWindowEx(WS_EX_TOOLWINDOW, |
- kWindowClassName, kWindowClassName, WS_POPUP, |
- 0, 0, 0, 0, |
- parent_view, NULL, GetModuleHandle(NULL), NULL); |
- ui::SetWindowUserData(host->view_, host); |
- |
- host->webwidget_ = WebPopupMenu::create(client); |
- |
- return host; |
-} |
- |
-static WebWidgetHost* FromWindow(HWND view) { |
- return reinterpret_cast<WebWidgetHost*>(ui::GetWindowUserData(view)); |
-} |
- |
-/*static*/ |
-LRESULT CALLBACK WebWidgetHost::WndProc(HWND hwnd, UINT message, WPARAM wparam, |
- LPARAM lparam) { |
- WebWidgetHost* host = FromWindow(hwnd); |
- if (host && !host->WndProc(message, wparam, lparam)) { |
- switch (message) { |
- case WM_DESTROY: |
- delete host; |
- break; |
- |
- case WM_PAINT: { |
- RECT rect; |
- if (GetUpdateRect(hwnd, &rect, FALSE)) { |
- host->UpdatePaintRect(gfx::Rect(rect)); |
- } |
- host->Paint(); |
- return 0; |
- } |
- |
- case WM_ERASEBKGND: |
- // Do nothing here to avoid flashing, the background will be erased |
- // during painting. |
- return 0; |
- |
- case WM_SIZE: |
- host->Resize(lparam); |
- return 0; |
- |
- case WM_MOUSEMOVE: |
- case WM_MOUSELEAVE: |
- case WM_LBUTTONDOWN: |
- case WM_MBUTTONDOWN: |
- case WM_RBUTTONDOWN: |
- case WM_LBUTTONUP: |
- case WM_MBUTTONUP: |
- case WM_RBUTTONUP: |
- case WM_LBUTTONDBLCLK: |
- case WM_MBUTTONDBLCLK: |
- case WM_RBUTTONDBLCLK: |
- host->MouseEvent(message, wparam, lparam); |
- break; |
- |
- case WM_MOUSEWHEEL: |
- host->WheelEvent(wparam, lparam); |
- break; |
- |
- case WM_CAPTURECHANGED: |
- case WM_CANCELMODE: |
- host->CaptureLostEvent(); |
- break; |
- |
- // TODO(darin): add WM_SYSKEY{DOWN/UP} to capture ALT key actions |
- case WM_KEYDOWN: |
- case WM_KEYUP: |
- case WM_SYSKEYDOWN: |
- case WM_SYSKEYUP: |
- case WM_CHAR: |
- case WM_SYSCHAR: |
- host->KeyEvent(message, wparam, lparam); |
- break; |
- |
- case WM_SETFOCUS: |
- host->SetFocus(true); |
- break; |
- |
- case WM_KILLFOCUS: |
- host->SetFocus(false); |
- break; |
- } |
- } |
- |
- return DefWindowProc(hwnd, message, wparam, lparam);; |
-} |
- |
-void WebWidgetHost::DidInvalidateRect(const gfx::Rect& damaged_rect) { |
- DLOG_IF(WARNING, painting_) << "unexpected invalidation while painting"; |
- |
- // If this invalidate overlaps with a pending scroll, then we have to |
- // downgrade to invalidating the scroll rect. |
- if (damaged_rect.Intersects(scroll_rect_)) { |
- paint_rect_.Union(scroll_rect_); |
- ResetScrollRect(); |
- } |
- paint_rect_.Union(damaged_rect); |
- |
- RECT r = damaged_rect.ToRECT(); |
- InvalidateRect(view_, &r, FALSE); |
-} |
- |
-void WebWidgetHost::DidScrollRect(int dx, int dy, const gfx::Rect& clip_rect) { |
- if (dx != 0 && dy != 0) { |
- // We only support uni-directional scroll |
- DidScrollRect(0, dy, clip_rect); |
- dy = 0; |
- } |
- |
- // If we already have a pending scroll operation or if this scroll operation |
- // intersects the existing paint region, then just failover to invalidating. |
- if (!scroll_rect_.IsEmpty() || paint_rect_.Intersects(clip_rect)) { |
- paint_rect_.Union(scroll_rect_); |
- ResetScrollRect(); |
- paint_rect_.Union(clip_rect); |
- } |
- |
- // We will perform scrolling lazily, when requested to actually paint. |
- scroll_rect_ = clip_rect; |
- scroll_dx_ = dx; |
- scroll_dy_ = dy; |
- |
- RECT r = clip_rect.ToRECT(); |
- InvalidateRect(view_, &r, FALSE); |
-} |
- |
-void WebWidgetHost::ScheduleComposite() { |
- if (!webwidget_) |
- return; |
- WebSize size = webwidget_->size(); |
- gfx::Rect rect(0, 0, size.width, size.height); |
- RECT r = rect.ToRECT(); |
- InvalidateRect(view_, &r, FALSE); |
-} |
- |
-void WebWidgetHost::SetCursor(HCURSOR cursor) { |
- SetClassLongPtr(view_, GCLP_HCURSOR, reinterpret_cast<LONG_PTR>(cursor)); |
- ::SetCursor(cursor); |
-} |
- |
-void WebWidgetHost::DiscardBackingStore() { |
- canvas_.reset(); |
-} |
- |
-WebWidgetHost::WebWidgetHost() |
- : view_(NULL), |
- webwidget_(NULL), |
- track_mouse_leave_(false), |
- scroll_dx_(0), |
- scroll_dy_(0), |
- weak_factory_(this) { |
- set_painting(false); |
-} |
- |
-WebWidgetHost::~WebWidgetHost() { |
- ui::SetWindowUserData(view_, 0); |
- |
- TrackMouseLeave(false); |
- |
- webwidget_->close(); |
-} |
- |
-bool WebWidgetHost::WndProc(UINT message, WPARAM wparam, LPARAM lparam) { |
- switch (message) { |
- case WM_ACTIVATE: |
- if (wparam == WA_INACTIVE) { |
- PostMessage(view_, WM_CLOSE, 0, 0); |
- return true; |
- } |
- break; |
- } |
- |
- return false; |
-} |
- |
-void WebWidgetHost::UpdatePaintRect(const gfx::Rect& rect) { |
- paint_rect_.Union(rect); |
-} |
- |
-void WebWidgetHost::Paint() { |
- RECT r; |
- GetClientRect(view_, &r); |
- gfx::Rect client_rect(r); |
- |
- // Allocate a canvas if necessary |
- if (!canvas_.get()) { |
- ResetScrollRect(); |
- paint_rect_ = client_rect; |
- canvas_.reset(skia::CreatePlatformCanvas( |
- paint_rect_.width(), paint_rect_.height(), true)); |
- } |
- |
- webwidget_->animate(0.0); |
- |
- // This may result in more invalidation |
- webwidget_->layout(); |
- |
- // Scroll the canvas if necessary |
- scroll_rect_.Intersect(client_rect); |
- if (!scroll_rect_.IsEmpty()) { |
- skia::ScopedPlatformPaint scoped_platform_paint(canvas_.get()); |
- HDC hdc = scoped_platform_paint.GetPlatformSurface(); |
- |
- RECT damaged_rect, r = scroll_rect_.ToRECT(); |
- ScrollDC(hdc, scroll_dx_, scroll_dy_, NULL, &r, NULL, &damaged_rect); |
- |
- PaintRect(gfx::Rect(damaged_rect)); |
- } |
- ResetScrollRect(); |
- |
- // Paint the canvas if necessary. Allow painting to generate extra rects the |
- // first time we call it. This is necessary because some WebCore rendering |
- // objects update their layout only when painted. |
- for (int i = 0; i < 2; ++i) { |
- paint_rect_.Intersect(client_rect); |
- if (!paint_rect_.IsEmpty()) { |
- gfx::Rect rect(paint_rect_); |
- paint_rect_ = gfx::Rect(); |
- |
- DLOG_IF(WARNING, i == 1) << "painting caused additional invalidations"; |
- PaintRect(rect); |
- } |
- } |
- DCHECK(paint_rect_.IsEmpty()); |
- |
- // Paint to the screen |
- PAINTSTRUCT ps; |
- BeginPaint(view_, &ps); |
- skia::DrawToNativeContext(canvas_.get(), ps.hdc, ps.rcPaint.left, |
- ps.rcPaint.top, &ps.rcPaint); |
- EndPaint(view_, &ps); |
- |
- // Draw children |
- UpdateWindow(view_); |
-} |
- |
-WebScreenInfo WebWidgetHost::GetScreenInfo() { |
- return WebScreenInfoFactory::screenInfo(view_); |
-} |
- |
-void WebWidgetHost::Resize(LPARAM lparam) { |
- // Force an entire re-paint. TODO(darin): Maybe reuse this memory buffer. |
- DiscardBackingStore(); |
- |
- webwidget_->resize(WebSize(LOWORD(lparam), HIWORD(lparam))); |
-} |
- |
-void WebWidgetHost::MouseEvent(UINT message, WPARAM wparam, LPARAM lparam) { |
- const WebMouseEvent& event = WebInputEventFactory::mouseEvent( |
- view_, message, wparam, lparam); |
- webwidget_->handleInputEvent(event); |
- switch (event.type) { |
- case WebInputEvent::MouseMove: |
- TrackMouseLeave(true); |
- break; |
- case WebInputEvent::MouseLeave: |
- TrackMouseLeave(false); |
- break; |
- case WebInputEvent::MouseDown: |
- SetCapture(view_); |
- // This mimics a temporary workaround in RenderWidgetHostViewWin for bug |
- // 765011 to get focus when the mouse is clicked. This happens after the |
- // mouse down event is sent to the renderer because normally Windows does |
- // a WM_SETFOCUS after WM_LBUTTONDOWN. |
- ::SetFocus(view_); |
- break; |
- case WebInputEvent::MouseUp: |
- if (GetCapture() == view_) |
- ReleaseCapture(); |
- break; |
- } |
-} |
- |
-void WebWidgetHost::WheelEvent(WPARAM wparam, LPARAM lparam) { |
- const WebMouseWheelEvent& event = WebInputEventFactory::mouseWheelEvent( |
- view_, WM_MOUSEWHEEL, wparam, lparam); |
- webwidget_->handleInputEvent(event); |
-} |
- |
-void WebWidgetHost::KeyEvent(UINT message, WPARAM wparam, LPARAM lparam) { |
- const WebKeyboardEvent& event = WebInputEventFactory::keyboardEvent( |
- view_, message, wparam, lparam); |
- webwidget_->handleInputEvent(event); |
-} |
- |
-void WebWidgetHost::CaptureLostEvent() { |
- webwidget_->mouseCaptureLost(); |
-} |
- |
-void WebWidgetHost::SetFocus(bool enable) { |
- // Ignore focus calls in layout test mode so that tests don't mess with each |
- // other's focus when running in parallel. |
- if (!TestShell::layout_test_mode()) |
- webwidget_->setFocus(enable); |
-} |
- |
-void WebWidgetHost::TrackMouseLeave(bool track) { |
- if (track == track_mouse_leave_) |
- return; |
- track_mouse_leave_ = track; |
- |
- DCHECK(view_); |
- |
- TRACKMOUSEEVENT tme; |
- tme.cbSize = sizeof(TRACKMOUSEEVENT); |
- tme.dwFlags = TME_LEAVE; |
- if (!track_mouse_leave_) |
- tme.dwFlags |= TME_CANCEL; |
- tme.hwndTrack = view_; |
- |
- TrackMouseEvent(&tme); |
-} |
- |
-void WebWidgetHost::ResetScrollRect() { |
- scroll_rect_ = gfx::Rect(); |
- scroll_dx_ = 0; |
- scroll_dy_ = 0; |
-} |
- |
-void WebWidgetHost::PaintRect(const gfx::Rect& rect) { |
-#ifndef NDEBUG |
- DCHECK(!painting_); |
-#endif |
- DCHECK(canvas_.get()); |
- |
- set_painting(true); |
- webwidget_->paint(canvas_.get(), rect); |
- set_painting(false); |
-} |