| Index: views/controls/native/native_view_host_win.cc
 | 
| ===================================================================
 | 
| --- views/controls/native/native_view_host_win.cc	(revision 0)
 | 
| +++ views/controls/native/native_view_host_win.cc	(working copy)
 | 
| @@ -2,137 +2,134 @@
 | 
|  // Use of this source code is governed by a BSD-style license that can be
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
| -#include "views/controls/hwnd_view.h"
 | 
| +#include "views/controls/native/native_view_host_win.h"
 | 
|  
 | 
|  #include "app/gfx/canvas.h"
 | 
|  #include "base/logging.h"
 | 
| +#include "views/controls/native/native_view_host.h"
 | 
|  #include "views/focus/focus_manager.h"
 | 
|  #include "views/widget/widget.h"
 | 
|  
 | 
|  namespace views {
 | 
|  
 | 
| -static const char kViewClassName[] = "views/HWNDView";
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +// NativeViewHostWin, public:
 | 
|  
 | 
| -HWNDView::HWNDView() : NativeViewHost() {
 | 
| +NativeViewHostWin::NativeViewHostWin(NativeViewHost* host)
 | 
| +    : host_(host),
 | 
| +      installed_clip_(false) {
 | 
|  }
 | 
|  
 | 
| -HWNDView::~HWNDView() {
 | 
| +NativeViewHostWin::~NativeViewHostWin() {
 | 
|  }
 | 
|  
 | 
| -void HWNDView::Attach(HWND hwnd) {
 | 
| -  DCHECK(native_view() == NULL);
 | 
| -  DCHECK(hwnd) << "Impossible detatched tab case; See crbug.com/6316";
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +// NativeViewHostWin, NativeViewHostWrapper implementation:
 | 
|  
 | 
| -  set_native_view(hwnd);
 | 
| +void NativeViewHostWin::NativeViewAttached() {
 | 
| +  DCHECK(host_->native_view())
 | 
| +      << "Impossible detatched tab case; See crbug.com/6316";
 | 
|  
 | 
|    // First hide the new window. We don't want anything to draw (like sub-hwnd
 | 
|    // borders), when we change the parent below.
 | 
| -  ShowWindow(hwnd, SW_HIDE);
 | 
| +  ShowWindow(host_->native_view(), SW_HIDE);
 | 
|  
 | 
|    // Need to set the HWND's parent before changing its size to avoid flashing.
 | 
| -  ::SetParent(hwnd, GetWidget()->GetNativeView());
 | 
| -  Layout();
 | 
| +  SetParent(host_->native_view(), host_->GetWidget()->GetNativeView());
 | 
| +  host_->Layout();
 | 
|  
 | 
|    // Register with the focus manager so the associated view is focused when the
 | 
|    // native control gets the focus.
 | 
| -  FocusManager::InstallFocusSubclass(
 | 
| -      hwnd, associated_focus_view() ? associated_focus_view() : this);
 | 
| +  View* focus_view = host_->focus_view() ? host_->focus_view() : host_;
 | 
| +  FocusManager::InstallFocusSubclass(host_->native_view(), focus_view);
 | 
|  }
 | 
|  
 | 
| -void HWNDView::Detach() {
 | 
| -  DCHECK(native_view());
 | 
| -  FocusManager::UninstallFocusSubclass(native_view());
 | 
| -  set_native_view(NULL);
 | 
| -  set_installed_clip(false);
 | 
| +void NativeViewHostWin::NativeViewDetaching() {
 | 
| +  DCHECK(host_->native_view());
 | 
| +  FocusManager::UninstallFocusSubclass(host_->native_view());
 | 
| +  installed_clip_ = false;
 | 
|  }
 | 
|  
 | 
| -void HWNDView::Paint(gfx::Canvas* canvas) {
 | 
| -  // The area behind our window is black, so during a fast resize (where our
 | 
| -  // content doesn't draw over the full size of our HWND, and the HWND
 | 
| -  // background color doesn't show up), we need to cover that blackness with
 | 
| -  // something so that fast resizes don't result in black flash.
 | 
| -  //
 | 
| -  // It would be nice if this used some approximation of the page's
 | 
| -  // current background color.
 | 
| -  if (installed_clip())
 | 
| -    canvas->FillRectInt(SkColorSetRGB(255, 255, 255), 0, 0, width(), height());
 | 
| +void NativeViewHostWin::AddedToWidget() {
 | 
| +  HWND parent_hwnd = GetParent(host_->native_view());
 | 
| +  HWND widget_hwnd = host_->GetWidget()->GetNativeView();
 | 
| +  if (parent_hwnd != widget_hwnd)
 | 
| +    SetParent(host_->native_view(), widget_hwnd);
 | 
| +  if (host_->IsVisibleInRootView())
 | 
| +    ShowWindow(host_->native_view(), SW_SHOW);
 | 
| +  else
 | 
| +    ShowWindow(host_->native_view(), SW_HIDE);
 | 
| +  host_->Layout();
 | 
|  }
 | 
|  
 | 
| -std::string HWNDView::GetClassName() const {
 | 
| -  return kViewClassName;
 | 
| +void NativeViewHostWin::RemovedFromWidget() {
 | 
| +  ShowWindow(host_->native_view(), SW_HIDE);
 | 
| +  SetParent(host_->native_view(), NULL);
 | 
|  }
 | 
|  
 | 
| -void HWNDView::ViewHierarchyChanged(bool is_add, View *parent, View *child) {
 | 
| -  if (!native_view())
 | 
| -    return;
 | 
| -
 | 
| -  Widget* widget = GetWidget();
 | 
| -  if (is_add && widget) {
 | 
| -    HWND parent_hwnd = ::GetParent(native_view());
 | 
| -    HWND widget_hwnd = widget->GetNativeView();
 | 
| -    if (parent_hwnd != widget_hwnd)
 | 
| -      ::SetParent(native_view(), widget_hwnd);
 | 
| -    if (IsVisibleInRootView())
 | 
| -      ::ShowWindow(native_view(), SW_SHOW);
 | 
| -    else
 | 
| -      ::ShowWindow(native_view(), SW_HIDE);
 | 
| -    Layout();
 | 
| -  } else if (!is_add) {
 | 
| -    ::ShowWindow(native_view(), SW_HIDE);
 | 
| -    ::SetParent(native_view(), NULL);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void HWNDView::Focus() {
 | 
| -  ::SetFocus(native_view());
 | 
| -}
 | 
| -
 | 
| -void HWNDView::InstallClip(int x, int y, int w, int h) {
 | 
| +void NativeViewHostWin::InstallClip(int x, int y, int w, int h) {
 | 
|    HRGN clip_region = CreateRectRgn(x, y, x + w, y + h);
 | 
|    // NOTE: SetWindowRgn owns the region (as well as the deleting the
 | 
|    // current region), as such we don't delete the old region.
 | 
| -  SetWindowRgn(native_view(), clip_region, FALSE);
 | 
| +  SetWindowRgn(host_->native_view(), clip_region, FALSE);
 | 
| +  installed_clip_ = true;
 | 
|  }
 | 
|  
 | 
| -void HWNDView::UninstallClip() {
 | 
| -  SetWindowRgn(native_view(), 0, FALSE);
 | 
| +bool NativeViewHostWin::HasInstalledClip() {
 | 
| +  return installed_clip_;
 | 
|  }
 | 
|  
 | 
| -void HWNDView::ShowWidget(int x, int y, int w, int h) {
 | 
| +void NativeViewHostWin::UninstallClip() {
 | 
| +  SetWindowRgn(host_->native_view(), 0, FALSE);
 | 
| +  installed_clip_ = false;
 | 
| +}
 | 
| +
 | 
| +void NativeViewHostWin::ShowWidget(int x, int y, int w, int h) {
 | 
|    UINT swp_flags = SWP_DEFERERASE |
 | 
|                     SWP_NOACTIVATE |
 | 
|                     SWP_NOCOPYBITS |
 | 
|                     SWP_NOOWNERZORDER |
 | 
|                     SWP_NOZORDER;
 | 
|    // Only send the SHOWWINDOW flag if we're invisible, to avoid flashing.
 | 
| -  if (!::IsWindowVisible(native_view()))
 | 
| +  if (!IsWindowVisible(host_->native_view()))
 | 
|      swp_flags = (swp_flags | SWP_SHOWWINDOW) & ~SWP_NOREDRAW;
 | 
|  
 | 
| -  if (fast_resize()) {
 | 
| +  if (host_->fast_resize()) {
 | 
|      // In a fast resize, we move the window and clip it with SetWindowRgn.
 | 
|      RECT win_rect;
 | 
| -    GetWindowRect(native_view(), &win_rect);
 | 
| +    GetWindowRect(host_->native_view(), &win_rect);
 | 
|      gfx::Rect rect(win_rect);
 | 
| -    ::SetWindowPos(native_view(), 0, x, y, rect.width(), rect.height(),
 | 
| -                   swp_flags);
 | 
| +    SetWindowPos(host_->native_view(), 0, x, y, rect.width(), rect.height(),
 | 
| +                 swp_flags);
 | 
|  
 | 
| -    HRGN clip_region = CreateRectRgn(0, 0, w, h);
 | 
| -    SetWindowRgn(native_view(), clip_region, FALSE);
 | 
| -    set_installed_clip(true);
 | 
| +    InstallClip(0, 0, w, h);
 | 
|    } else {
 | 
| -    ::SetWindowPos(native_view(), 0, x, y, w, h, swp_flags);
 | 
| +    SetWindowPos(host_->native_view(), 0, x, y, w, h, swp_flags);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void HWNDView::HideWidget() {
 | 
| -  if (!::IsWindowVisible(native_view()))
 | 
| +void NativeViewHostWin::HideWidget() {
 | 
| +  if (!IsWindowVisible(host_->native_view()))
 | 
|      return;  // Currently not visible, nothing to do.
 | 
|  
 | 
|    // The window is currently visible, but its clipped by another view. Hide
 | 
|    // it.
 | 
| -  ::SetWindowPos(native_view(), 0, 0, 0, 0, 0,
 | 
| -                 SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
 | 
| -                 SWP_NOREDRAW | SWP_NOOWNERZORDER);
 | 
| +  SetWindowPos(host_->native_view(), 0, 0, 0, 0, 0,
 | 
| +               SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER |
 | 
| +               SWP_NOREDRAW | SWP_NOOWNERZORDER);
 | 
|  }
 | 
|  
 | 
| +void NativeViewHostWin::SetFocus() {
 | 
| +  ::SetFocus(host_->native_view());
 | 
| +}
 | 
| +
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +// NativeViewHostWrapper, public:
 | 
| +
 | 
| +// static
 | 
| +NativeViewHostWrapper* NativeViewHostWrapper::CreateWrapper(
 | 
| +    NativeViewHost* host) {
 | 
| +  return new NativeViewHostWin(host);
 | 
| +}
 | 
| +
 | 
|  }  // namespace views
 | 
| 
 |