| 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);
 | 
| -}
 | 
| 
 |