1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/base/win/hidden_window.h" 6 7 #include "ui/gfx/win/window_impl.h" 8 9 namespace ui { 10 11 namespace { 12 13 // We need to have a parent window for the compositing code to work correctly. 14 // 15 // A tab will not have a parent HWND whenever it is not active in its 16 // host window - for example at creation time and when it's in the 17 // background, so we provide a default widget to host them. 18 // 19 // It may be tempting to use GetDesktopWindow() instead, but this is 20 // problematic as the shell sends messages to children of the desktop 21 // window that interact poorly with us. 22 // 23 // See: http://crbug.com/16476 24 class TempParent : public gfx::WindowImpl { 25 public: Get()26 static TempParent* Get() { 27 static TempParent* g_temp_parent; 28 if (!g_temp_parent) { 29 g_temp_parent = new TempParent(); 30 31 g_temp_parent->set_window_style(WS_POPUP); 32 g_temp_parent->set_window_ex_style(WS_EX_TOOLWINDOW); 33 g_temp_parent->Init(GetDesktopWindow(), gfx::Rect()); 34 EnableWindow(g_temp_parent->hwnd(), FALSE); 35 } 36 return g_temp_parent; 37 } 38 39 private: 40 // Explicitly do nothing in Close. We do this as some external apps may get a 41 // handle to this window and attempt to close it. OnClose()42 void OnClose() { 43 } 44 45 CR_BEGIN_MSG_MAP_EX(WebContentsViewWin) 46 CR_MSG_WM_CLOSE(OnClose) 47 CR_END_MSG_MAP() 48 }; 49 50 } // namespace 51 GetHiddenWindow()52HWND GetHiddenWindow() { 53 return TempParent::Get()->hwnd(); 54 } 55 56 } // namespace ui 57