15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/chrome_views_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/accessibility/accessibility_event_router_views.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/ui_base_switches.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <dwmapi.h>
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/win/windows_version.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/app_icon_win.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/win/shell.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) && !defined(OS_CHROMEOS)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/ash_init.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/ash/ash_util.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the given window has a profile associated with it, use that profile's
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preference service. Otherwise, store and retrieve the data from Local State.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function may return NULL if the necessary pref service has not yet
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been initialized.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mirandac): This function will also separate windows by profile in a
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multi-profile environment.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* GetPrefsForWindow(const views::Widget* window) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = reinterpret_cast<Profile*>(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window->GetNativeWindowProperty(Profile::kProfileKey));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use local state for windows that have no explicit profile.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return g_browser_process->local_state();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile->GetPrefs();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromeViewsDelegate, views::ViewsDelegate implementation:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeViewsDelegate::SaveWindowPlacement(const views::Widget* window,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const std::string& window_name,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const gfx::Rect& bounds,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              ui::WindowShowState show_state) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = GetPrefsForWindow(window);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prefs)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs->FindPreference(window_name.c_str()));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryPrefUpdate update(prefs, window_name.c_str());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* window_preferences = update.Get();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("left", bounds.x());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("top", bounds.y());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("right", bounds.right());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("bottom", bounds.bottom());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetBoolean("maximized",
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 show_state == ui::SHOW_STATE_MAXIMIZED);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect work_area(gfx::Screen::GetScreenFor(window->GetNativeView())->
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      GetDisplayNearestWindow(window->GetNativeView()).work_area());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("work_area_left", work_area.x());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("work_area_top", work_area.y());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("work_area_right", work_area.right());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_preferences->SetInteger("work_area_bottom", work_area.bottom());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeViewsDelegate::GetSavedWindowPlacement(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& window_name,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect* bounds,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WindowShowState* show_state) const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prefs)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs->FindPreference(window_name.c_str()));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DictionaryValue* dictionary = prefs->GetDictionary(window_name.c_str());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int left, top, right, bottom;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dictionary || !dictionary->GetInteger("left", &left) ||
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !dictionary->GetInteger("top", &top) ||
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !dictionary->GetInteger("right", &right) ||
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !dictionary->GetInteger("bottom", &bottom))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds->SetRect(left, top, right - left, bottom - top);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool maximized = false;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dictionary)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dictionary->GetBoolean("maximized", &maximized);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *show_state = maximized ? ui::SHOW_STATE_MAXIMIZED : ui::SHOW_STATE_NORMAL;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeViewsDelegate::NotifyAccessibilityEvent(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View* view, ui::AccessibilityTypes::Event event_type) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AccessibilityEventRouterViews::GetInstance()->HandleAccessibilityEvent(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view, event_type);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeViewsDelegate::NotifyMenuItemFocused(const string16& menu_name,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const string16& menu_item_name,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int item_index,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int item_count,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool has_submenu) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AccessibilityEventRouterViews::GetInstance()->HandleMenuItemFocused(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      menu_name, menu_item_name, item_index, item_count, has_submenu);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HICON ChromeViewsDelegate::GetDefaultWindowIcon() const {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetAppIcon();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::NonClientFrameView* ChromeViewsDelegate::CreateDefaultNonClientFrameView(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::Widget* widget) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (chrome::IsNativeViewInAsh(widget->GetNativeView()))
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ash::Shell::GetInstance()->CreateDefaultNonClientFrameView(widget);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeViewsDelegate::UseTransparentWindows() const {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scottmg): http://crbug.com/133312. This needs context to determine
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if it's desktop or ash.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeViewsDelegate::AddRef() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->AddRefModule();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeViewsDelegate::ReleaseRef() {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_browser_process->ReleaseModule();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* ChromeViewsDelegate::CreateWebContents(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::BrowserContext* browser_context,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::SiteInstance* site_instance) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeViewsDelegate::OnBeforeWidgetInit(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget::InitParams* params,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::internal::NativeWidgetDelegate* delegate) {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we already have a native_widget, we don't have to try to come
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // up with one.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->native_widget)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_AURA) && !defined(OS_CHROMEOS)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_non_toplevel_window =
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      params->parent && params->type != views::Widget::InitParams::TYPE_MENU;
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN)
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // On desktop Linux Chrome must run in an environment that supports a variety
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // of window managers, some of which do not play nicely with parts of our UI
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // that have specific expectations about window sizing and placement. For this
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // reason windows opened as top level (params.top_level) are always
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // constrained by the browser frame, so we can position them correctly. This
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // has some negative side effects, like dialogs being clipped by the browser
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // frame, but the side effects are not as bad as the poor window manager
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // interactions. On Windows however these WM interactions are not an issue, so
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // we open windows requested as top_level as actual top level windows on the
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // desktop.
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  use_non_toplevel_window = use_non_toplevel_window &&
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      (!params->top_level ||
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       chrome::GetHostDesktopTypeForNativeView(params->parent) !=
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          chrome::HOST_DESKTOP_TYPE_NATIVE);
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!ui::win::IsAeroGlassEnabled()) {
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // If we don't have composition (either because Glass is not enabled or
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // because it was disabled at the command line), anything that requires
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // transparency will be broken with a toplevel window, so force the use of
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // a non toplevel window.
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (params->opacity == views::Widget::InitParams::TRANSLUCENT_WINDOW &&
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        params->type != views::Widget::InitParams::TYPE_MENU)
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      use_non_toplevel_window = true;
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // If we're on Vista+ with composition enabled, then we can use toplevel
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // windows for most things (they get blended via WS_EX_COMPOSITED, which
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // allows for animation effects, but also exceeding the bounds of the parent
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // window).
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (chrome::GetActiveDesktop() != chrome::HOST_DESKTOP_TYPE_ASH &&
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        params->parent &&
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        params->type != views::Widget::InitParams::TYPE_CONTROL &&
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        params->type != views::Widget::InitParams::TYPE_WINDOW) {
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // When we set this to false, we get a DesktopNativeWidgetAura from the
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // default case (not handled in this function).
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      use_non_toplevel_window = false;
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // OS_WIN
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // USE_AURA
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When we are doing straight chromeos builds, we still need to handle the
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // toplevel window case.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There may be a few remaining widgets in Chrome OS that are not top level,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but have neither a context nor a parent. Provide a fallback context so
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // users don't crash. Developers will hit the DCHECK and should provide a
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // context.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(params->parent || params->context || params->top_level)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << "Please provide a parent or context for this widget.";
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!params->parent && !params->context)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params->context = ash::Shell::GetPrimaryRootWindow();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(USE_AURA)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // While the majority of the time, context wasn't plumbed through due to the
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // existence of a global StackingClient, if this window is a toplevel, it's
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // possible that there is no contextual state that we can use.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->parent == NULL && params->context == NULL && params->top_level) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We need to make a decision about where to place this window based on the
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // desktop type.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (chrome::GetActiveDesktop()) {
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case chrome::HOST_DESKTOP_TYPE_NATIVE:
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If we're native, we should give this window its own toplevel desktop
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // widget.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params->native_widget = new views::DesktopNativeWidgetAura(delegate);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case chrome::HOST_DESKTOP_TYPE_ASH:
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If we're in ash, give this window the context of the main monitor.
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params->context = ash::Shell::GetPrimaryRootWindow();
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (use_non_toplevel_window) {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params->native_widget = new views::NativeWidgetAura(delegate);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (params->type != views::Widget::InitParams::TYPE_TOOLTIP) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(erg): Once we've threaded context to everywhere that needs it, we
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should remove this check here.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView to_check =
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params->context ? params->context : params->parent;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (chrome::GetHostDesktopTypeForNativeView(to_check) ==
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome::HOST_DESKTOP_TYPE_NATIVE) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params->native_widget = new views::DesktopNativeWidgetAura(delegate);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if !defined(OS_CHROMEOS)
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::TimeDelta
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ChromeViewsDelegate::GetDefaultTextfieldObscuredRevealDuration() {
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return base::TimeDelta();
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
287