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