• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()52 HWND GetHiddenWindow() {
53   return TempParent::Get()->hwnd();
54 }
55 
56 }  // namespace ui
57