| Index: chrome/browser/ui/views/extensions/native_app_window_views.cc
|
| diff --git a/chrome/browser/ui/views/extensions/native_app_window_views.cc b/chrome/browser/ui/views/extensions/native_app_window_views.cc
|
| deleted file mode 100644
|
| index a7cc935ac4001fee27382a44941b748a229c88c1..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/views/extensions/native_app_window_views.cc
|
| +++ /dev/null
|
| @@ -1,757 +0,0 @@
|
| -// 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 "chrome/browser/ui/views/extensions/native_app_window_views.h"
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/file_util.h"
|
| -#include "base/path_service.h"
|
| -#include "base/threading/sequenced_worker_pool.h"
|
| -#include "chrome/app/chrome_command_ids.h"
|
| -#include "chrome/browser/extensions/extension_host.h"
|
| -#include "chrome/browser/favicon/favicon_tab_helper.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/views/extensions/extension_keybinding_registry_views.h"
|
| -#include "chrome/browser/ui/views/extensions/shell_window_frame_view.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/extensions/extension.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/render_view_host.h"
|
| -#include "content/public/browser/render_widget_host_view.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_contents_view.h"
|
| -#include "extensions/common/draggable_region.h"
|
| -#include "ui/views/controls/webview/webview.h"
|
| -#include "ui/views/widget/widget.h"
|
| -#include "ui/views/window/non_client_view.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/ui/web_applications/web_app_ui.h"
|
| -#include "chrome/browser/web_applications/web_app.h"
|
| -#include "chrome/browser/web_applications/web_app_win.h"
|
| -#include "ui/base/win/shell.h"
|
| -#include "ui/views/win/hwnd_util.h"
|
| -#endif
|
| -
|
| -#if defined(USE_ASH)
|
| -#include "ash/screen_ash.h"
|
| -#include "ash/shell.h"
|
| -#include "ash/wm/custom_frame_view_ash.h"
|
| -#include "ash/wm/panels/panel_frame_view.h"
|
| -#include "ash/wm/window_properties.h"
|
| -#include "chrome/browser/ui/ash/ash_util.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/aura/root_window.h"
|
| -#include "ui/aura/window.h"
|
| -#endif
|
| -
|
| -using apps::ShellWindow;
|
| -
|
| -namespace {
|
| -
|
| -const int kMinPanelWidth = 100;
|
| -const int kMinPanelHeight = 100;
|
| -const int kDefaultPanelWidth = 200;
|
| -const int kDefaultPanelHeight = 300;
|
| -const int kResizeInsideBoundsSize = 5;
|
| -
|
| -struct AcceleratorMapping {
|
| - ui::KeyboardCode keycode;
|
| - int modifiers;
|
| - int command_id;
|
| -};
|
| -const AcceleratorMapping kAppWindowAcceleratorMap[] = {
|
| - { ui::VKEY_W, ui::EF_CONTROL_DOWN, IDC_CLOSE_WINDOW },
|
| - { ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, IDC_CLOSE_WINDOW },
|
| - { ui::VKEY_F4, ui::EF_ALT_DOWN, IDC_CLOSE_WINDOW },
|
| -};
|
| -
|
| -const std::map<ui::Accelerator, int>& GetAcceleratorTable() {
|
| - typedef std::map<ui::Accelerator, int> AcceleratorMap;
|
| - CR_DEFINE_STATIC_LOCAL(AcceleratorMap, accelerators, ());
|
| - if (accelerators.empty()) {
|
| - for (size_t i = 0; i < arraysize(kAppWindowAcceleratorMap); ++i) {
|
| - ui::Accelerator accelerator(kAppWindowAcceleratorMap[i].keycode,
|
| - kAppWindowAcceleratorMap[i].modifiers);
|
| - accelerators[accelerator] = kAppWindowAcceleratorMap[i].command_id;
|
| - }
|
| - }
|
| - return accelerators;
|
| -}
|
| -
|
| -#if defined(OS_WIN)
|
| -void CreateIconAndSetRelaunchDetails(
|
| - const base::FilePath web_app_path,
|
| - const base::FilePath icon_file,
|
| - const ShellIntegration::ShortcutInfo& shortcut_info,
|
| - const HWND hwnd) {
|
| - DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
|
| -
|
| - // Set the relaunch data so "Pin this program to taskbar" has the app's
|
| - // information.
|
| - CommandLine command_line = ShellIntegration::CommandLineArgsForLauncher(
|
| - shortcut_info.url,
|
| - shortcut_info.extension_id,
|
| - shortcut_info.profile_path);
|
| -
|
| - // TODO(benwells): Change this to use app_host.exe.
|
| - base::FilePath chrome_exe;
|
| - if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| - command_line.SetProgram(chrome_exe);
|
| - ui::win::SetRelaunchDetailsForWindow(command_line.GetCommandLineString(),
|
| - shortcut_info.title, hwnd);
|
| -
|
| - if (!base::PathExists(web_app_path) &&
|
| - !file_util::CreateDirectory(web_app_path)) {
|
| - return;
|
| - }
|
| - ui::win::SetAppIconForWindow(icon_file.value(), hwnd);
|
| - web_app::internals::CheckAndSaveIcon(icon_file, shortcut_info.favicon);
|
| -}
|
| -#endif
|
| -
|
| -} // namespace
|
| -
|
| -NativeAppWindowViews::NativeAppWindowViews(
|
| - ShellWindow* shell_window,
|
| - const ShellWindow::CreateParams& create_params)
|
| - : shell_window_(shell_window),
|
| - web_view_(NULL),
|
| - window_(NULL),
|
| - is_fullscreen_(false),
|
| - frameless_(create_params.frame == ShellWindow::FRAME_NONE),
|
| - transparent_background_(create_params.transparent_background),
|
| - minimum_size_(create_params.minimum_size),
|
| - maximum_size_(create_params.maximum_size),
|
| - resizable_(create_params.resizable),
|
| - weak_ptr_factory_(this) {
|
| - Observe(web_contents());
|
| -
|
| - window_ = new views::Widget;
|
| - if (create_params.window_type == ShellWindow::WINDOW_TYPE_PANEL ||
|
| - create_params.window_type == ShellWindow::WINDOW_TYPE_V1_PANEL) {
|
| - InitializePanelWindow(create_params);
|
| - } else {
|
| - InitializeDefaultWindow(create_params);
|
| - }
|
| - extension_keybinding_registry_.reset(
|
| - new ExtensionKeybindingRegistryViews(
|
| - profile(),
|
| - window_->GetFocusManager(),
|
| - extensions::ExtensionKeybindingRegistry::PLATFORM_APPS_ONLY,
|
| - shell_window_));
|
| -
|
| - OnViewWasResized();
|
| - window_->AddObserver(this);
|
| -}
|
| -
|
| -NativeAppWindowViews::~NativeAppWindowViews() {
|
| - web_view_->SetWebContents(NULL);
|
| -}
|
| -
|
| -void NativeAppWindowViews::InitializeDefaultWindow(
|
| - const ShellWindow::CreateParams& create_params) {
|
| - views::Widget::InitParams init_params(views::Widget::InitParams::TYPE_WINDOW);
|
| - init_params.delegate = this;
|
| - init_params.remove_standard_frame = ShouldUseChromeStyleFrame();
|
| - init_params.use_system_default_icon = true;
|
| - // TODO(erg): Conceptually, these are toplevel windows, but we theoretically
|
| - // could plumb context through to here in some cases.
|
| - init_params.top_level = true;
|
| - gfx::Rect window_bounds = create_params.bounds;
|
| - bool position_specified =
|
| - window_bounds.x() != INT_MIN && window_bounds.y() != INT_MIN;
|
| - if (position_specified && !window_bounds.IsEmpty())
|
| - init_params.bounds = window_bounds;
|
| - window_->Init(init_params);
|
| -
|
| - gfx::Rect adjusted_bounds = window_bounds;
|
| - adjusted_bounds.Inset(-GetFrameInsets());
|
| - // Center window if no position was specified.
|
| - if (!position_specified)
|
| - window_->CenterWindow(adjusted_bounds.size());
|
| - else if (!adjusted_bounds.IsEmpty() && adjusted_bounds != window_bounds)
|
| - window_->SetBounds(adjusted_bounds);
|
| -
|
| - // Register accelarators supported by app windows.
|
| - // TODO(jeremya/stevenjb): should these be registered for panels too?
|
| - views::FocusManager* focus_manager = GetFocusManager();
|
| - const std::map<ui::Accelerator, int>& accelerator_table =
|
| - GetAcceleratorTable();
|
| - for (std::map<ui::Accelerator, int>::const_iterator iter =
|
| - accelerator_table.begin();
|
| - iter != accelerator_table.end(); ++iter) {
|
| - focus_manager->RegisterAccelerator(
|
| - iter->first, ui::AcceleratorManager::kNormalPriority, this);
|
| - }
|
| -
|
| -#if defined(OS_WIN)
|
| - string16 app_name = UTF8ToWide(
|
| - web_app::GenerateApplicationNameFromExtensionId(extension()->id()));
|
| - HWND hwnd = GetNativeAppWindowHWND();
|
| - ui::win::SetAppIdForWindow(ShellIntegration::GetAppModelIdForProfile(
|
| - app_name, profile()->GetPath()), hwnd);
|
| -
|
| - web_app::UpdateShortcutInfoAndIconForApp(
|
| - *extension(), profile(),
|
| - base::Bind(&NativeAppWindowViews::OnShortcutInfoLoaded,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -#endif
|
| -}
|
| -
|
| -#if defined(OS_WIN)
|
| -void NativeAppWindowViews::OnShortcutInfoLoaded(
|
| - const ShellIntegration::ShortcutInfo& shortcut_info) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| -
|
| - HWND hwnd = GetNativeAppWindowHWND();
|
| -
|
| - // Set window's icon to the one we're about to create/update in the web app
|
| - // path. The icon cache will refresh on icon creation.
|
| - base::FilePath web_app_path = web_app::GetWebAppDataDirectory(
|
| - shortcut_info.profile_path, shortcut_info.extension_id,
|
| - shortcut_info.url);
|
| - base::FilePath icon_file = web_app_path
|
| - .Append(web_app::internals::GetSanitizedFileName(shortcut_info.title))
|
| - .ReplaceExtension(FILE_PATH_LITERAL(".ico"));
|
| -
|
| - content::BrowserThread::PostBlockingPoolTask(
|
| - FROM_HERE,
|
| - base::Bind(&CreateIconAndSetRelaunchDetails,
|
| - web_app_path, icon_file, shortcut_info, hwnd));
|
| -}
|
| -
|
| -HWND NativeAppWindowViews::GetNativeAppWindowHWND() const {
|
| - return views::HWNDForWidget(GetWidget()->GetTopLevelWidget());
|
| -}
|
| -#endif
|
| -
|
| -void NativeAppWindowViews::InitializePanelWindow(
|
| - const ShellWindow::CreateParams& create_params) {
|
| - views::Widget::InitParams params(views::Widget::InitParams::TYPE_PANEL);
|
| - params.delegate = this;
|
| -
|
| - preferred_size_ = gfx::Size(create_params.bounds.width(),
|
| - create_params.bounds.height());
|
| - if (preferred_size_.width() == 0)
|
| - preferred_size_.set_width(kDefaultPanelWidth);
|
| - else if (preferred_size_.width() < kMinPanelWidth)
|
| - preferred_size_.set_width(kMinPanelWidth);
|
| -
|
| - if (preferred_size_.height() == 0)
|
| - preferred_size_.set_height(kDefaultPanelHeight);
|
| - else if (preferred_size_.height() < kMinPanelHeight)
|
| - preferred_size_.set_height(kMinPanelHeight);
|
| -#if defined(USE_ASH)
|
| - if (ash::Shell::HasInstance()) {
|
| - // Open a new panel on the active root window where
|
| - // a current active/focused window is on.
|
| - aura::RootWindow* active = ash::Shell::GetActiveRootWindow();
|
| - params.bounds = ash::ScreenAsh::ConvertRectToScreen(
|
| - active, gfx::Rect(preferred_size_));
|
| - } else {
|
| - params.bounds = gfx::Rect(preferred_size_);
|
| - }
|
| -#else
|
| - params.bounds = gfx::Rect(preferred_size_);
|
| -#endif
|
| - // TODO(erg): Conceptually, these are toplevel windows, but we theoretically
|
| - // could plumb context through to here in some cases.
|
| - params.top_level = true;
|
| - window_->Init(params);
|
| - window_->set_focus_on_creation(create_params.focused);
|
| -
|
| -#if defined(USE_ASH)
|
| - if (create_params.state == ui::SHOW_STATE_DETACHED) {
|
| - gfx::Rect window_bounds(create_params.bounds.x(),
|
| - create_params.bounds.y(),
|
| - preferred_size_.width(),
|
| - preferred_size_.height());
|
| - aura::Window* native_window = GetNativeWindow();
|
| - native_window->SetProperty(ash::internal::kPanelAttachedKey, false);
|
| - native_window->SetDefaultParentByRootWindow(
|
| - native_window->GetRootWindow(), native_window->GetBoundsInScreen());
|
| - window_->SetBounds(window_bounds);
|
| - }
|
| -#else
|
| - // TODO(stevenjb): NativeAppWindow panels need to be implemented for other
|
| - // platforms.
|
| -#endif
|
| -}
|
| -
|
| -// ui::BaseWindow implementation.
|
| -
|
| -bool NativeAppWindowViews::IsActive() const {
|
| - return window_->IsActive();
|
| -}
|
| -
|
| -bool NativeAppWindowViews::IsMaximized() const {
|
| - return window_->IsMaximized();
|
| -}
|
| -
|
| -bool NativeAppWindowViews::IsMinimized() const {
|
| - return window_->IsMinimized();
|
| -}
|
| -
|
| -bool NativeAppWindowViews::IsFullscreen() const {
|
| - return window_->IsFullscreen();
|
| -}
|
| -
|
| -gfx::NativeWindow NativeAppWindowViews::GetNativeWindow() {
|
| - return window_->GetNativeWindow();
|
| -}
|
| -
|
| -gfx::Rect NativeAppWindowViews::GetRestoredBounds() const {
|
| - return window_->GetRestoredBounds();
|
| -}
|
| -
|
| -ui::WindowShowState NativeAppWindowViews::GetRestoredState() const {
|
| - if (IsMaximized())
|
| - return ui::SHOW_STATE_MAXIMIZED;
|
| -#if defined(USE_ASH)
|
| - // On Ash, restore fullscreen.
|
| - if (IsFullscreen())
|
| - return ui::SHOW_STATE_FULLSCREEN;
|
| - // Use kRestoreShowStateKey in case a window is minimized/hidden.
|
| - ui::WindowShowState restore_state =
|
| - window_->GetNativeWindow()->GetProperty(
|
| - aura::client::kRestoreShowStateKey);
|
| - if (restore_state != ui::SHOW_STATE_MINIMIZED)
|
| - return restore_state;
|
| -#endif
|
| - return ui::SHOW_STATE_NORMAL;
|
| -}
|
| -
|
| -gfx::Rect NativeAppWindowViews::GetBounds() const {
|
| - return window_->GetWindowBoundsInScreen();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Show() {
|
| - if (window_->IsVisible()) {
|
| - window_->Activate();
|
| - return;
|
| - }
|
| -
|
| - window_->Show();
|
| -}
|
| -
|
| -void NativeAppWindowViews::ShowInactive() {
|
| - if (window_->IsVisible())
|
| - return;
|
| - window_->ShowInactive();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Hide() {
|
| - window_->Hide();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Close() {
|
| - window_->Close();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Activate() {
|
| - window_->Activate();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Deactivate() {
|
| - window_->Deactivate();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Maximize() {
|
| - window_->Maximize();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Minimize() {
|
| - window_->Minimize();
|
| -}
|
| -
|
| -void NativeAppWindowViews::Restore() {
|
| - window_->Restore();
|
| -}
|
| -
|
| -void NativeAppWindowViews::SetBounds(const gfx::Rect& bounds) {
|
| - GetWidget()->SetBounds(bounds);
|
| -}
|
| -
|
| -void NativeAppWindowViews::FlashFrame(bool flash) {
|
| - window_->FlashFrame(flash);
|
| -}
|
| -
|
| -bool NativeAppWindowViews::IsAlwaysOnTop() const {
|
| - if (!shell_window_->window_type_is_panel())
|
| - return false;
|
| -#if defined(USE_ASH)
|
| - return window_->GetNativeWindow()->GetProperty(
|
| - ash::internal::kPanelAttachedKey);
|
| -#else
|
| - return true;
|
| -#endif
|
| -}
|
| -
|
| -gfx::Insets NativeAppWindowViews::GetFrameInsets() const {
|
| - if (frameless())
|
| - return gfx::Insets();
|
| -
|
| - // The pretend client_bounds passed in need to be large enough to ensure that
|
| - // GetWindowBoundsForClientBounds() doesn't decide that it needs more than
|
| - // the specified amount of space to fit the window controls in, and return a
|
| - // number larger than the real frame insets. Most window controls are smaller
|
| - // than 1000x1000px, so this should be big enough.
|
| - gfx::Rect client_bounds = gfx::Rect(1000, 1000);
|
| - gfx::Rect window_bounds =
|
| - window_->non_client_view()->GetWindowBoundsForClientBounds(
|
| - client_bounds);
|
| - return window_bounds.InsetsFrom(client_bounds);
|
| -}
|
| -
|
| -gfx::NativeView NativeAppWindowViews::GetHostView() const {
|
| - return window_->GetNativeView();
|
| -}
|
| -
|
| -gfx::Point NativeAppWindowViews::GetDialogPosition(const gfx::Size& size) {
|
| - gfx::Size shell_window_size = window_->GetWindowBoundsInScreen().size();
|
| - return gfx::Point(shell_window_size.width() / 2 - size.width() / 2,
|
| - shell_window_size.height() / 2 - size.height() / 2);
|
| -}
|
| -
|
| -void NativeAppWindowViews::AddObserver(
|
| - web_modal::WebContentsModalDialogHostObserver* observer) {
|
| - observer_list_.AddObserver(observer);
|
| -}
|
| -void NativeAppWindowViews::RemoveObserver(
|
| - web_modal::WebContentsModalDialogHostObserver* observer) {
|
| - observer_list_.RemoveObserver(observer);
|
| -}
|
| -
|
| -// Private method. TODO(stevenjb): Move this below InitializePanelWindow()
|
| -// to match declaration order.
|
| -void NativeAppWindowViews::OnViewWasResized() {
|
| - // TODO(jeremya): this doesn't seem like a terribly elegant way to keep the
|
| - // window shape in sync.
|
| -#if defined(OS_WIN) && !defined(USE_AURA)
|
| - DCHECK(window_);
|
| - DCHECK(web_view_);
|
| - gfx::Size sz = web_view_->size();
|
| - int height = sz.height(), width = sz.width();
|
| - if (ShouldUseChromeStyleFrame()) {
|
| - // Set the window shape of the RWHV.
|
| - const int kCornerRadius = 1;
|
| - gfx::Path path;
|
| - if (window_->IsMaximized() || window_->IsFullscreen()) {
|
| - // Don't round the corners when the window is maximized or fullscreen.
|
| - path.addRect(0, 0, width, height);
|
| - } else {
|
| - if (frameless_) {
|
| - path.moveTo(0, kCornerRadius);
|
| - path.lineTo(kCornerRadius, 0);
|
| - path.lineTo(width - kCornerRadius, 0);
|
| - path.lineTo(width, kCornerRadius);
|
| - } else {
|
| - // Don't round the top corners in chrome-style frame mode.
|
| - path.moveTo(0, 0);
|
| - path.lineTo(width, 0);
|
| - }
|
| - path.lineTo(width, height - kCornerRadius - 1);
|
| - path.lineTo(width - kCornerRadius - 1, height);
|
| - path.lineTo(kCornerRadius + 1, height);
|
| - path.lineTo(0, height - kCornerRadius - 1);
|
| - path.close();
|
| - }
|
| - SetWindowRgn(web_contents()->GetView()->GetNativeView(),
|
| - path.CreateNativeRegion(), 1);
|
| - }
|
| -
|
| - SkRegion* rgn = new SkRegion;
|
| - if (!window_->IsFullscreen()) {
|
| - if (draggable_region())
|
| - rgn->op(*draggable_region(), SkRegion::kUnion_Op);
|
| - if (!window_->IsMaximized()) {
|
| - if (frameless_)
|
| - rgn->op(0, 0, width, kResizeInsideBoundsSize, SkRegion::kUnion_Op);
|
| - rgn->op(0, 0, kResizeInsideBoundsSize, height, SkRegion::kUnion_Op);
|
| - rgn->op(width - kResizeInsideBoundsSize, 0, width, height,
|
| - SkRegion::kUnion_Op);
|
| - rgn->op(0, height - kResizeInsideBoundsSize, width, height,
|
| - SkRegion::kUnion_Op);
|
| - }
|
| - }
|
| - if (web_contents()->GetRenderViewHost()->GetView())
|
| - web_contents()->GetRenderViewHost()->GetView()->SetClickthroughRegion(rgn);
|
| -#endif
|
| -
|
| - FOR_EACH_OBSERVER(web_modal::WebContentsModalDialogHostObserver,
|
| - observer_list_,
|
| - OnPositionRequiresUpdate());
|
| -}
|
| -
|
| -bool NativeAppWindowViews::ShouldUseChromeStyleFrame() const {
|
| - return !CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kAppsUseNativeFrame) || frameless_;
|
| -}
|
| -
|
| -// WidgetDelegate implementation.
|
| -
|
| -void NativeAppWindowViews::OnWidgetMove() {
|
| - shell_window_->OnNativeWindowChanged();
|
| -}
|
| -
|
| -views::View* NativeAppWindowViews::GetInitiallyFocusedView() {
|
| - return web_view_;
|
| -}
|
| -
|
| -bool NativeAppWindowViews::CanResize() const {
|
| - return resizable_ &&
|
| - (maximum_size_.IsEmpty() || minimum_size_ != maximum_size_);
|
| -}
|
| -
|
| -bool NativeAppWindowViews::CanMaximize() const {
|
| - return resizable_ && maximum_size_.IsEmpty();
|
| -}
|
| -
|
| -string16 NativeAppWindowViews::GetWindowTitle() const {
|
| - return shell_window_->GetTitle();
|
| -}
|
| -
|
| -bool NativeAppWindowViews::ShouldShowWindowTitle() const {
|
| - return shell_window_->window_type() == ShellWindow::WINDOW_TYPE_V1_PANEL;
|
| -}
|
| -
|
| -gfx::ImageSkia NativeAppWindowViews::GetWindowAppIcon() {
|
| - gfx::Image app_icon = shell_window_->app_icon();
|
| - if (app_icon.IsEmpty())
|
| - return GetWindowIcon();
|
| - else
|
| - return *app_icon.ToImageSkia();
|
| -}
|
| -
|
| -gfx::ImageSkia NativeAppWindowViews::GetWindowIcon() {
|
| - content::WebContents* web_contents = shell_window_->web_contents();
|
| - if (web_contents) {
|
| - FaviconTabHelper* favicon_tab_helper =
|
| - FaviconTabHelper::FromWebContents(web_contents);
|
| - gfx::Image app_icon = favicon_tab_helper->GetFavicon();
|
| - if (!app_icon.IsEmpty())
|
| - return *app_icon.ToImageSkia();
|
| - }
|
| - return gfx::ImageSkia();
|
| -}
|
| -
|
| -bool NativeAppWindowViews::ShouldShowWindowIcon() const {
|
| - return shell_window_->window_type() == ShellWindow::WINDOW_TYPE_V1_PANEL;
|
| -}
|
| -
|
| -void NativeAppWindowViews::SaveWindowPlacement(const gfx::Rect& bounds,
|
| - ui::WindowShowState show_state) {
|
| - views::WidgetDelegate::SaveWindowPlacement(bounds, show_state);
|
| - shell_window_->OnNativeWindowChanged();
|
| -}
|
| -
|
| -void NativeAppWindowViews::DeleteDelegate() {
|
| - window_->RemoveObserver(this);
|
| - shell_window_->OnNativeClose();
|
| -}
|
| -
|
| -views::Widget* NativeAppWindowViews::GetWidget() {
|
| - return window_;
|
| -}
|
| -
|
| -const views::Widget* NativeAppWindowViews::GetWidget() const {
|
| - return window_;
|
| -}
|
| -
|
| -views::NonClientFrameView* NativeAppWindowViews::CreateNonClientFrameView(
|
| - views::Widget* widget) {
|
| -#if defined(USE_ASH)
|
| - if (chrome::IsNativeViewInAsh(widget->GetNativeView())) {
|
| - if (shell_window_->window_type_is_panel()) {
|
| - ash::PanelFrameView::FrameType frame_type = frameless_ ?
|
| - ash::PanelFrameView::FRAME_NONE : ash::PanelFrameView::FRAME_ASH;
|
| - return new ash::PanelFrameView(widget, frame_type);
|
| - }
|
| - if (!frameless_) {
|
| - ash::CustomFrameViewAsh* frame = new ash::CustomFrameViewAsh();
|
| - frame->Init(widget);
|
| - return frame;
|
| - }
|
| - }
|
| -#endif
|
| - if (ShouldUseChromeStyleFrame()) {
|
| - ShellWindowFrameView* frame_view = new ShellWindowFrameView(this);
|
| - frame_view->Init(window_);
|
| - return frame_view;
|
| - }
|
| - return views::WidgetDelegateView::CreateNonClientFrameView(widget);
|
| -}
|
| -
|
| -bool NativeAppWindowViews::ShouldDescendIntoChildForEventHandling(
|
| - gfx::NativeView child,
|
| - const gfx::Point& location) {
|
| -#if defined(USE_AURA)
|
| - if (child == web_view_->web_contents()->GetView()->GetNativeView()) {
|
| - // Shell window should claim mouse events that fall within the draggable
|
| - // region.
|
| - return !draggable_region_.get() ||
|
| - !draggable_region_->contains(location.x(), location.y());
|
| - }
|
| -#endif
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// WidgetObserver implementation.
|
| -
|
| -void NativeAppWindowViews::OnWidgetVisibilityChanged(views::Widget* widget,
|
| - bool visible) {
|
| - shell_window_->OnNativeWindowChanged();
|
| -}
|
| -
|
| -void NativeAppWindowViews::OnWidgetActivationChanged(views::Widget* widget,
|
| - bool active) {
|
| - shell_window_->OnNativeWindowChanged();
|
| - if (active)
|
| - shell_window_->OnNativeWindowActivated();
|
| -}
|
| -
|
| -// WebContentsObserver implementation.
|
| -
|
| -void NativeAppWindowViews::RenderViewCreated(
|
| - content::RenderViewHost* render_view_host) {
|
| - if (transparent_background_) {
|
| - // Use a background with transparency to trigger transparency in Webkit.
|
| - SkBitmap background;
|
| - background.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
|
| - background.allocPixels();
|
| - background.eraseARGB(0x00, 0x00, 0x00, 0x00);
|
| -
|
| - content::RenderWidgetHostView* view = render_view_host->GetView();
|
| - DCHECK(view);
|
| - view->SetBackground(background);
|
| - }
|
| -}
|
| -
|
| -// views::View implementation.
|
| -
|
| -void NativeAppWindowViews::Layout() {
|
| - DCHECK(web_view_);
|
| - web_view_->SetBounds(0, 0, width(), height());
|
| - OnViewWasResized();
|
| -}
|
| -
|
| -void NativeAppWindowViews::ViewHierarchyChanged(
|
| - const ViewHierarchyChangedDetails& details) {
|
| - if (details.is_add && details.child == this) {
|
| - web_view_ = new views::WebView(NULL);
|
| - AddChildView(web_view_);
|
| - web_view_->SetWebContents(web_contents());
|
| - }
|
| -}
|
| -
|
| -gfx::Size NativeAppWindowViews::GetPreferredSize() {
|
| - if (!preferred_size_.IsEmpty())
|
| - return preferred_size_;
|
| - return views::View::GetPreferredSize();
|
| -}
|
| -
|
| -gfx::Size NativeAppWindowViews::GetMinimumSize() {
|
| - return minimum_size_;
|
| -}
|
| -
|
| -gfx::Size NativeAppWindowViews::GetMaximumSize() {
|
| - return maximum_size_;
|
| -}
|
| -
|
| -void NativeAppWindowViews::OnFocus() {
|
| - web_view_->RequestFocus();
|
| -}
|
| -
|
| -bool NativeAppWindowViews::AcceleratorPressed(
|
| - const ui::Accelerator& accelerator) {
|
| - const std::map<ui::Accelerator, int>& accelerator_table =
|
| - GetAcceleratorTable();
|
| - std::map<ui::Accelerator, int>::const_iterator iter =
|
| - accelerator_table.find(accelerator);
|
| - DCHECK(iter != accelerator_table.end());
|
| - int command_id = iter->second;
|
| - switch (command_id) {
|
| - case IDC_CLOSE_WINDOW:
|
| - Close();
|
| - return true;
|
| - default:
|
| - NOTREACHED() << "Unknown accelerator sent to app window.";
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// NativeAppWindow implementation.
|
| -
|
| -void NativeAppWindowViews::SetFullscreen(bool fullscreen) {
|
| - // Fullscreen not supported by panels.
|
| - if (shell_window_->window_type_is_panel())
|
| - return;
|
| - is_fullscreen_ = fullscreen;
|
| - window_->SetFullscreen(fullscreen);
|
| - // TODO(jeremya) we need to call RenderViewHost::ExitFullscreen() if we
|
| - // ever drop the window out of fullscreen in response to something that
|
| - // wasn't the app calling webkitCancelFullScreen().
|
| -}
|
| -
|
| -bool NativeAppWindowViews::IsFullscreenOrPending() const {
|
| - return is_fullscreen_;
|
| -}
|
| -
|
| -bool NativeAppWindowViews::IsDetached() const {
|
| - if (!shell_window_->window_type_is_panel())
|
| - return false;
|
| -#if defined(USE_ASH)
|
| - return !window_->GetNativeWindow()->GetProperty(
|
| - ash::internal::kPanelAttachedKey);
|
| -#else
|
| - return false;
|
| -#endif
|
| -}
|
| -
|
| -views::View* NativeAppWindowViews::GetContentsView() {
|
| - return this;
|
| -}
|
| -
|
| -void NativeAppWindowViews::UpdateWindowIcon() {
|
| - window_->UpdateWindowIcon();
|
| -}
|
| -
|
| -void NativeAppWindowViews::UpdateWindowTitle() {
|
| - window_->UpdateWindowTitle();
|
| -}
|
| -
|
| -void NativeAppWindowViews::UpdateDraggableRegions(
|
| - const std::vector<extensions::DraggableRegion>& regions) {
|
| - // Draggable region is not supported for non-frameless window.
|
| - if (!frameless_)
|
| - return;
|
| -
|
| - draggable_region_.reset(ShellWindow::RawDraggableRegionsToSkRegion(regions));
|
| - OnViewWasResized();
|
| -}
|
| -
|
| -void NativeAppWindowViews::HandleKeyboardEvent(
|
| - const content::NativeWebKeyboardEvent& event) {
|
| - unhandled_keyboard_event_handler_.HandleKeyboardEvent(event,
|
| - GetFocusManager());
|
| -}
|
| -
|
| -void NativeAppWindowViews::RenderViewHostChanged() {
|
| - OnViewWasResized();
|
| -}
|
| -
|
| -//------------------------------------------------------------------------------
|
| -// NativeAppWindow::Create
|
| -
|
| -// static
|
| -NativeAppWindow* NativeAppWindow::Create(
|
| - ShellWindow* shell_window, const ShellWindow::CreateParams& params) {
|
| - return new NativeAppWindowViews(shell_window, params);
|
| -}
|
|
|