// Copyright (c) 2012 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 "ui/base/win/hidden_window.h" #include "ui/gfx/win/window_impl.h" namespace ui { namespace { // We need to have a parent window for the compositing code to work correctly. // // A tab will not have a parent HWND whenever it is not active in its // host window - for example at creation time and when it's in the // background, so we provide a default widget to host them. // // It may be tempting to use GetDesktopWindow() instead, but this is // problematic as the shell sends messages to children of the desktop // window that interact poorly with us. // // See: http://crbug.com/16476 class TempParent : public gfx::WindowImpl { public: static TempParent* Get() { static TempParent* g_temp_parent; if (!g_temp_parent) { g_temp_parent = new TempParent(); g_temp_parent->set_window_style(WS_POPUP); g_temp_parent->set_window_ex_style(WS_EX_TOOLWINDOW); g_temp_parent->Init(GetDesktopWindow(), gfx::Rect()); EnableWindow(g_temp_parent->hwnd(), FALSE); } return g_temp_parent; } private: // Explicitly do nothing in Close. We do this as some external apps may get a // handle to this window and attempt to close it. void OnClose() { } CR_BEGIN_MSG_MAP_EX(WebContentsViewWin) CR_MSG_WM_CLOSE(OnClose) CR_END_MSG_MAP() }; } // namespace HWND GetHiddenWindow() { return TempParent::Get()->hwnd(); } } // namespace ui