Index: chrome/browser/renderer_host/render_widget_host_view_win.cc |
=================================================================== |
--- chrome/browser/renderer_host/render_widget_host_view_win.cc (revision 83102) |
+++ chrome/browser/renderer_host/render_widget_host_view_win.cc (working copy) |
@@ -319,11 +319,6 @@ |
ScreenToClient(&point); |
SetWindowPos(NULL, point.x, point.y, rect.width(), rect.height(), swp_flags); |
- if (compositor_host_window_) { |
- ::SetWindowPos(compositor_host_window_, NULL, point.x, point.y, |
- rect.width(), rect.height(), |
- SWP_NOSENDCHANGING | SWP_NOCOPYBITS | SWP_NOZORDER | SWP_NOACTIVATE); |
- } |
render_widget_host_->WasResized(); |
EnsureTooltip(); |
} |
@@ -462,14 +457,20 @@ |
if (!compositor_host_window_) |
return; |
- std::vector<HWND> all_child_windows; |
- ::EnumChildWindows(compositor_host_window_, AddChildWindowToVector, |
- reinterpret_cast<LPARAM>(&all_child_windows)); |
- if (all_child_windows.size()) { |
- DCHECK(all_child_windows.size() == 1); |
- ::ShowWindow(all_child_windows[0], SW_HIDE); |
- ::SetParent(all_child_windows[0], NULL); |
- } |
+ // Hide the compositor and parent it to the desktop rather than destroying |
+ // it immediately. The GPU process has a grace period to stop accessing the |
+ // window. TODO(apatrick): the GPU process should acknowledge that it has |
+ // finished with the window handle and the browser process should destroy it |
+ // at that point. |
+ ::ShowWindow(compositor_host_window_, SW_HIDE); |
+ ::SetParent(compositor_host_window_, NULL); |
+ |
+ BrowserThread::PostDelayedTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ NewRunnableFunction(::DestroyWindow, compositor_host_window_), |
+ 10000); |
jam
2011/04/27 20:45:22
nit: use constant
apatrick_chromium
2011/04/27 22:45:22
Done.
|
+ |
compositor_host_window_ = NULL; |
} |
@@ -1466,31 +1467,10 @@ |
browser_accessibility_manager_.reset(NULL); |
} |
-// Looks through the children windows of the CompositorHostWindow. If the |
-// compositor child window is found, its size is checked against the host |
-// window's size. If the child is smaller in either dimensions, we fill |
-// the host window with white to avoid unseemly cracks. |
static void PaintCompositorHostWindow(HWND hWnd) { |
PAINTSTRUCT paint; |
BeginPaint(hWnd, &paint); |
- std::vector<HWND> child_windows; |
- EnumChildWindows(hWnd, AddChildWindowToVector, |
- reinterpret_cast<LPARAM>(&child_windows)); |
- |
- if (child_windows.size()) { |
- HWND child = child_windows[0]; |
- |
- RECT host_rect, child_rect; |
- GetClientRect(hWnd, &host_rect); |
- if (GetClientRect(child, &child_rect)) { |
- if (child_rect.right < host_rect.right || |
- child_rect.bottom != host_rect.bottom) { |
- FillRect(paint.hdc, &host_rect, |
- static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH))); |
- } |
- } |
- } |
EndPaint(hWnd, &paint); |
} |
@@ -1562,12 +1542,7 @@ |
return; |
if (show) { |
- UINT flags = SWP_NOSENDCHANGING | SWP_NOCOPYBITS | SWP_NOZORDER | |
- SWP_NOACTIVATE | SWP_DEFERERASE | SWP_SHOWWINDOW; |
- gfx::Rect rect = GetViewBounds(); |
- ::SetWindowPos(compositor_host_window_, NULL, 0, 0, |
- rect.width(), rect.height(), |
- flags); |
+ ::ShowWindow(compositor_host_window_, SW_SHOW); |
// Get all the child windows of this view, including the compositor window. |
std::vector<HWND> all_child_windows; |