Index: chrome/browser/ui/panels/panel.cc |
diff --git a/chrome/browser/ui/panels/panel.cc b/chrome/browser/ui/panels/panel.cc |
deleted file mode 100644 |
index aa82c37d1402b692a52aca67dc59e61aeb3fd41d..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/panels/panel.cc |
+++ /dev/null |
@@ -1,910 +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/panels/panel.h" |
- |
-#include <stddef.h> |
- |
-#include <memory> |
- |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/app/chrome_command_ids.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/devtools/devtools_window.h" |
-#include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
-#include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" |
-#include "chrome/browser/extensions/api/tabs/windows_event_router.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/extensions/extension_tab_util.h" |
-#include "chrome/browser/extensions/window_controller.h" |
-#include "chrome/browser/extensions/window_controller_list.h" |
-#include "chrome/browser/lifetime/application_lifetime.h" |
-#include "chrome/browser/lifetime/keep_alive_types.h" |
-#include "chrome/browser/lifetime/scoped_keep_alive.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/sessions/session_tab_helper.h" |
-#include "chrome/browser/task_manager/web_contents_tags.h" |
-#include "chrome/browser/themes/theme_service.h" |
-#include "chrome/browser/themes/theme_service_factory.h" |
-#include "chrome/browser/ui/panels/native_panel.h" |
-#include "chrome/browser/ui/panels/panel_collection.h" |
-#include "chrome/browser/ui/panels/panel_host.h" |
-#include "chrome/browser/ui/panels/panel_manager.h" |
-#include "chrome/browser/ui/panels/stacked_panel_collection.h" |
-#include "chrome/browser/web_applications/web_app.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/user_metrics.h" |
-#include "content/public/browser/web_contents.h" |
-#include "extensions/browser/extension_registry.h" |
-#include "extensions/browser/extension_system.h" |
-#include "extensions/browser/image_loader.h" |
-#include "extensions/common/constants.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/manifest_handlers/icons_handler.h" |
-#include "ui/gfx/geometry/rect.h" |
-#include "ui/gfx/image/image.h" |
- |
-using base::UserMetricsAction; |
-using content::RenderViewHost; |
- |
-namespace panel_internal { |
- |
-class PanelExtensionWindowController : public extensions::WindowController { |
- public: |
- PanelExtensionWindowController(Panel* panel, Profile* profile); |
- ~PanelExtensionWindowController() override; |
- |
- // Overridden from extensions::WindowController. |
- int GetWindowId() const override; |
- std::string GetWindowTypeText() const override; |
- std::unique_ptr<base::DictionaryValue> CreateWindowValueWithTabs( |
- const extensions::Extension* extension) const override; |
- base::DictionaryValue* CreateTabValue(const extensions::Extension* extension, |
- int tab_index) const override; |
- std::unique_ptr<extensions::api::tabs::Tab> CreateTabObject( |
- const extensions::Extension* extension, |
- int tab_index) const override; |
- bool CanClose(Reason* reason) const override; |
- void SetFullscreenMode(bool is_fullscreen, |
- const GURL& extension_url) const override; |
- bool IsVisibleToExtension( |
- const extensions::Extension* extension) const override; |
- |
- private: |
- Panel* panel_; // Weak pointer. Owns us. |
- DISALLOW_COPY_AND_ASSIGN(PanelExtensionWindowController); |
-}; |
- |
-PanelExtensionWindowController::PanelExtensionWindowController( |
- Panel* panel, Profile* profile) |
- : extensions::WindowController(panel, profile), |
- panel_(panel) { |
- extensions::WindowControllerList::GetInstance()->AddExtensionWindow(this); |
-} |
- |
-PanelExtensionWindowController::~PanelExtensionWindowController() { |
- extensions::WindowControllerList::GetInstance()->RemoveExtensionWindow(this); |
-} |
- |
-int PanelExtensionWindowController::GetWindowId() const { |
- return static_cast<int>(panel_->session_id().id()); |
-} |
- |
-std::string PanelExtensionWindowController::GetWindowTypeText() const { |
- return extensions::tabs_constants::kWindowTypeValuePanel; |
-} |
- |
-std::unique_ptr<base::DictionaryValue> |
-PanelExtensionWindowController::CreateWindowValueWithTabs( |
- const extensions::Extension* extension) const { |
- std::unique_ptr<base::DictionaryValue> result = CreateWindowValue(); |
- |
- base::DictionaryValue* tab_value = CreateTabValue(extension, 0); |
- if (tab_value) { |
- base::ListValue* tab_list = new base::ListValue(); |
- tab_list->Append(tab_value); |
- result->Set(extensions::tabs_constants::kTabsKey, tab_list); |
- } |
- return result; |
-} |
- |
-base::DictionaryValue* PanelExtensionWindowController::CreateTabValue( |
- const extensions::Extension* extension, int tab_index) const { |
- return CreateTabObject(extension, tab_index)->ToValue().release(); |
-} |
- |
-std::unique_ptr<extensions::api::tabs::Tab> |
-PanelExtensionWindowController::CreateTabObject( |
- const extensions::Extension* extension, |
- int tab_index) const { |
- if (tab_index > 0) |
- return nullptr; |
- |
- content::WebContents* web_contents = panel_->GetWebContents(); |
- if (!web_contents) |
- return nullptr; |
- |
- std::unique_ptr<extensions::api::tabs::Tab> tab_object( |
- new extensions::api::tabs::Tab); |
- tab_object->id.reset(new int(SessionTabHelper::IdForTab(web_contents))); |
- tab_object->index = 0; |
- tab_object->window_id = |
- SessionTabHelper::IdForWindowContainingTab(web_contents); |
- tab_object->url.reset(new std::string(web_contents->GetURL().spec())); |
- tab_object->status.reset( |
- new std::string(extensions::ExtensionTabUtil::GetTabStatusText( |
- web_contents->IsLoading()))); |
- tab_object->active = panel_->IsActive(); |
- tab_object->selected = true; |
- tab_object->highlighted = true; |
- tab_object->pinned = false; |
- tab_object->title.reset( |
- new std::string(base::UTF16ToUTF8(web_contents->GetTitle()))); |
- tab_object->incognito = web_contents->GetBrowserContext()->IsOffTheRecord(); |
- return tab_object; |
-} |
- |
-bool PanelExtensionWindowController::CanClose(Reason* reason) const { |
- return true; |
-} |
- |
-void PanelExtensionWindowController::SetFullscreenMode( |
- bool is_fullscreen, const GURL& extension_url) const { |
- // Do nothing. Panels cannot be fullscreen. |
-} |
- |
-bool PanelExtensionWindowController::IsVisibleToExtension( |
- const extensions::Extension* extension) const { |
- DCHECK(extension); |
- return extension->id() == panel_->extension_id(); |
-} |
- |
-} // namespace panel_internal |
- |
-Panel::~Panel() { |
- DCHECK(!collection_); |
-} |
- |
-PanelManager* Panel::manager() const { |
- return PanelManager::GetInstance(); |
-} |
- |
-const std::string Panel::extension_id() const { |
- return web_app::GetExtensionIdFromApplicationName(app_name_); |
-} |
- |
-CommandUpdater* Panel::command_updater() { |
- return &command_updater_; |
-} |
- |
-Profile* Panel::profile() const { |
- return profile_; |
-} |
- |
-const extensions::Extension* Panel::GetExtension() const { |
- ExtensionService* extension_service = |
- extensions::ExtensionSystem::Get(profile())->extension_service(); |
- if (!extension_service || !extension_service->is_ready()) |
- return NULL; |
- return extension_service->GetExtensionById(extension_id(), false); |
-} |
- |
-content::WebContents* Panel::GetWebContents() const { |
- return panel_host_.get() ? panel_host_->web_contents() : NULL; |
-} |
- |
-void Panel::SetExpansionState(ExpansionState new_state) { |
- if (expansion_state_ == new_state) |
- return; |
- native_panel_->PanelExpansionStateChanging(expansion_state_, new_state); |
- expansion_state_ = new_state; |
- |
- manager()->OnPanelExpansionStateChanged(this); |
- |
- DCHECK(initialized_ && collection_ != NULL); |
- native_panel_->PreventActivationByOS(collection_->IsPanelMinimized(this)); |
- UpdateMinimizeRestoreButtonVisibility(); |
- |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PANEL_CHANGED_EXPANSION_STATE, |
- content::Source<Panel>(this), |
- content::NotificationService::NoDetails()); |
-} |
- |
-bool Panel::IsDrawingAttention() const { |
- return native_panel_->IsDrawingAttention(); |
-} |
- |
-void Panel::FullScreenModeChanged(bool is_full_screen) { |
- native_panel_->FullScreenModeChanged(is_full_screen); |
-} |
- |
-int Panel::TitleOnlyHeight() const { |
- return native_panel_->TitleOnlyHeight(); |
-} |
- |
-bool Panel::CanShowMinimizeButton() const { |
- return collection_ && collection_->CanShowMinimizeButton(this); |
-} |
- |
-bool Panel::CanShowRestoreButton() const { |
- return collection_ && collection_->CanShowRestoreButton(this); |
-} |
- |
-bool Panel::IsActive() const { |
- return native_panel_->IsPanelActive(); |
-} |
- |
-bool Panel::IsMaximized() const { |
- // Size of panels is managed by PanelManager, they are never 'zoomed'. |
- return false; |
-} |
- |
-bool Panel::IsMinimized() const { |
- return !collection_ || collection_->IsPanelMinimized(this); |
-} |
- |
-bool Panel::IsFullscreen() const { |
- return false; |
-} |
- |
-gfx::NativeWindow Panel::GetNativeWindow() const { |
- return native_panel_->GetNativePanelWindow(); |
-} |
- |
-gfx::Rect Panel::GetRestoredBounds() const { |
- gfx::Rect bounds = native_panel_->GetPanelBounds(); |
- bounds.set_y(bounds.bottom() - full_size_.height()); |
- bounds.set_x(bounds.right() - full_size_.width()); |
- bounds.set_size(full_size_); |
- return bounds; |
-} |
- |
-ui::WindowShowState Panel::GetRestoredState() const { |
- return ui::SHOW_STATE_NORMAL; |
-} |
- |
-gfx::Rect Panel::GetBounds() const { |
- return native_panel_->GetPanelBounds(); |
-} |
- |
-void Panel::Show() { |
- if (manager()->display_settings_provider()->is_full_screen() || !collection_) |
- return; |
- |
- native_panel_->ShowPanel(); |
-} |
- |
-void Panel::Hide() { |
- // Not implemented. |
-} |
- |
-void Panel::ShowInactive() { |
- if (manager()->display_settings_provider()->is_full_screen() || !collection_) |
- return; |
- |
- native_panel_->ShowPanelInactive(); |
-} |
- |
-// Close() may be called multiple times if the panel window is not ready to |
-// close on the first attempt. |
-void Panel::Close() { |
- native_panel_->ClosePanel(); |
-} |
- |
-void Panel::Activate() { |
- if (!collection_) |
- return; |
- |
- collection_->ActivatePanel(this); |
- native_panel_->ActivatePanel(); |
-} |
- |
-void Panel::Deactivate() { |
- native_panel_->DeactivatePanel(); |
-} |
- |
-void Panel::Maximize() { |
- Restore(); |
-} |
- |
-void Panel::Minimize() { |
- if (collection_) |
- collection_->MinimizePanel(this); |
-} |
- |
-bool Panel::IsMinimizedBySystem() const { |
- return native_panel_->IsPanelMinimizedBySystem(); |
-} |
- |
-bool Panel::IsShownOnActiveDesktop() const { |
- return native_panel_->IsPanelShownOnActiveDesktop(); |
-} |
- |
-void Panel::ShowShadow(bool show) { |
- native_panel_->ShowShadow(show); |
-} |
- |
-void Panel::Restore() { |
- if (collection_) |
- collection_->RestorePanel(this); |
-} |
- |
-void Panel::SetBounds(const gfx::Rect& bounds) { |
- // Ignore bounds position as the panel manager controls all positioning. |
- if (!collection_) |
- return; |
- collection_->ResizePanelWindow(this, bounds.size()); |
- SetAutoResizable(false); |
-} |
- |
-void Panel::FlashFrame(bool draw_attention) { |
- if (IsDrawingAttention() == draw_attention || !collection_) |
- return; |
- |
- // Don't draw attention for an active panel. |
- if (draw_attention && IsActive()) |
- return; |
- |
- // Invoking native panel to draw attention must be done before informing the |
- // panel collection because it needs to check internal state of the panel to |
- // determine if the panel has been drawing attention. |
- native_panel_->DrawAttention(draw_attention); |
- collection_->OnPanelAttentionStateChanged(this); |
-} |
- |
-bool Panel::IsAlwaysOnTop() const { |
- return native_panel_->IsPanelAlwaysOnTop(); |
-} |
- |
-void Panel::SetAlwaysOnTop(bool on_top) { |
- native_panel_->SetPanelAlwaysOnTop(on_top); |
-} |
- |
-void Panel::ExecuteCommandWithDisposition(int id, |
- WindowOpenDisposition disposition) { |
- DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command " |
- << id; |
- |
- if (!GetWebContents()) |
- return; |
- |
- switch (id) { |
- // Navigation |
- case IDC_RELOAD: |
- panel_host_->Reload(); |
- break; |
- case IDC_RELOAD_BYPASSING_CACHE: |
- panel_host_->ReloadBypassingCache(); |
- break; |
- case IDC_STOP: |
- panel_host_->StopLoading(); |
- break; |
- |
- // Window management |
- case IDC_CLOSE_WINDOW: |
- content::RecordAction(UserMetricsAction("CloseWindow")); |
- Close(); |
- break; |
- case IDC_EXIT: |
- content::RecordAction(UserMetricsAction("Exit")); |
- chrome::AttemptUserExit(); |
- break; |
- |
- // Clipboard |
- case IDC_COPY: |
- content::RecordAction(UserMetricsAction("Copy")); |
- native_panel_->PanelCopy(); |
- break; |
- case IDC_CUT: |
- content::RecordAction(UserMetricsAction("Cut")); |
- native_panel_->PanelCut(); |
- break; |
- case IDC_PASTE: |
- content::RecordAction(UserMetricsAction("Paste")); |
- native_panel_->PanelPaste(); |
- break; |
- |
- // Zoom |
- case IDC_ZOOM_PLUS: |
- panel_host_->Zoom(content::PAGE_ZOOM_IN); |
- break; |
- case IDC_ZOOM_NORMAL: |
- panel_host_->Zoom(content::PAGE_ZOOM_RESET); |
- break; |
- case IDC_ZOOM_MINUS: |
- panel_host_->Zoom(content::PAGE_ZOOM_OUT); |
- break; |
- |
- // DevTools |
- case IDC_DEV_TOOLS: |
- content::RecordAction(UserMetricsAction("DevTools_ToggleWindow")); |
- DevToolsWindow::OpenDevToolsWindow(GetWebContents(), |
- DevToolsToggleAction::Show()); |
- break; |
- case IDC_DEV_TOOLS_CONSOLE: |
- content::RecordAction(UserMetricsAction("DevTools_ToggleConsole")); |
- DevToolsWindow::OpenDevToolsWindow(GetWebContents(), |
- DevToolsToggleAction::ShowConsole()); |
- break; |
- |
- default: |
- LOG(WARNING) << "Received unimplemented command: " << id; |
- break; |
- } |
-} |
- |
-void Panel::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type); |
- Close(); |
-} |
- |
-void Panel::RenderViewHostChanged(content::RenderViewHost* old_host, |
- content::RenderViewHost* new_host) { |
- ConfigureAutoResize(web_contents()); |
-} |
- |
-void Panel::OnExtensionUnloaded( |
- content::BrowserContext* browser_context, |
- const extensions::Extension* extension, |
- extensions::UnloadedExtensionInfo::Reason reason) { |
- if (extension->id() == extension_id()) |
- Close(); |
-} |
-void Panel::OnTitlebarClicked(panel::ClickModifier modifier) { |
- if (collection_) |
- collection_->OnPanelTitlebarClicked(this, modifier); |
- |
- // Normally the system activates a window when the titlebar is clicked. |
- // However, we prevent system activation of minimized panels, thus the |
- // activation may not have occurred. Also, some OSes (Windows) will |
- // activate a minimized panel on mouse-down regardless of our attempts to |
- // prevent system activation. Attention state is not cleared in that case. |
- // See Panel::OnActiveStateChanged(). |
- // Therefore, we ensure activation and clearing of attention state if the |
- // panel has been expanded. If the panel is in a stack, the titlebar click |
- // might minimize the panel and we do not want to activate it to make it |
- // expand again. |
- // These are no-ops if no changes are needed. |
- if (IsMinimized()) |
- return; |
- Activate(); |
- FlashFrame(false); |
-} |
- |
-void Panel::OnMinimizeButtonClicked(panel::ClickModifier modifier) { |
- if (collection_) |
- collection_->OnMinimizeButtonClicked(this, modifier); |
-} |
- |
-void Panel::OnRestoreButtonClicked(panel::ClickModifier modifier) { |
- // Clicking the restore button has the same behavior as clicking the titlebar. |
- OnTitlebarClicked(modifier); |
-} |
- |
-void Panel::OnWindowSizeAvailable() { |
- ConfigureAutoResize(GetWebContents()); |
-} |
- |
-void Panel::OnNativePanelClosed() { |
- // Ensure previously enqueued OnImageLoaded callbacks are ignored. |
- image_loader_ptr_factory_.InvalidateWeakPtrs(); |
- registrar_.RemoveAll(); |
- extension_registry_->RemoveObserver(this); |
- manager()->OnPanelClosed(this); |
- DCHECK(!collection_); |
-} |
- |
-StackedPanelCollection* Panel::stack() const { |
- return collection_ && collection_->type() == PanelCollection::STACKED ? |
- static_cast<StackedPanelCollection*>(collection_) : NULL; |
-} |
- |
-panel::Resizability Panel::CanResizeByMouse() const { |
- if (!collection_) |
- return panel::NOT_RESIZABLE; |
- |
- return collection_->GetPanelResizability(this); |
-} |
- |
-void Panel::Initialize(const GURL& url, |
- content::SiteInstance* source_site_instance, |
- const gfx::Rect& bounds, |
- bool always_on_top) { |
- DCHECK(!initialized_); |
- DCHECK(!collection_); // Cannot be added to a collection until fully created. |
- DCHECK_EQ(EXPANDED, expansion_state_); |
- DCHECK(!bounds.IsEmpty()); |
- initialized_ = true; |
- full_size_ = bounds.size(); |
- native_panel_ = CreateNativePanel(this, bounds, always_on_top); |
- |
- extension_window_controller_.reset( |
- new panel_internal::PanelExtensionWindowController(this, profile_)); |
- |
- InitCommandState(); |
- |
- // Set up hosting for web contents. |
- panel_host_.reset(new PanelHost(this, profile_)); |
- panel_host_->Init(url, source_site_instance); |
- content::WebContents* web_contents = GetWebContents(); |
- // The contents might be NULL for most of our tests. |
- if (web_contents) { |
- native_panel_->AttachWebContents(web_contents); |
- |
- // Make the panel show up in the task manager. |
- task_manager::WebContentsTags::CreateForPanel(web_contents, this); |
- } |
- |
- // Close when the extension is unloaded or the browser is exiting. |
- extension_registry_->AddObserver(this); |
- registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, |
- content::NotificationService::AllSources()); |
- registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
- content::Source<ThemeService>( |
- ThemeServiceFactory::GetForProfile(profile_))); |
- |
-// TODO(dgn): Should keep_alive be always registered regardless of the platform |
-// here? (https://crbug.com/590173) |
-#if !defined(USE_AURA) |
- // Keep alive for AURA has been moved to panel_view. |
- // Prevent the browser process from shutting down while this window is open. |
- keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::PANEL, |
- KeepAliveRestartOption::DISABLED)); |
-#endif |
- |
- UpdateAppIcon(); |
-} |
- |
-void Panel::SetPanelBounds(const gfx::Rect& bounds) { |
- if (bounds != native_panel_->GetPanelBounds()) |
- native_panel_->SetPanelBounds(bounds); |
-} |
- |
-void Panel::SetPanelBoundsInstantly(const gfx::Rect& bounds) { |
- native_panel_->SetPanelBoundsInstantly(bounds); |
-} |
- |
-void Panel::LimitSizeToWorkArea(const gfx::Rect& work_area) { |
- int max_width = manager()->GetMaxPanelWidth(work_area); |
- int max_height = manager()->GetMaxPanelHeight(work_area); |
- |
- // If the custom max size is used, ensure that it does not exceed the display |
- // area. |
- if (max_size_policy_ == CUSTOM_MAX_SIZE) { |
- int current_max_width = max_size_.width(); |
- if (current_max_width > max_width) |
- max_width = std::min(current_max_width, work_area.width()); |
- int current_max_height = max_size_.height(); |
- if (current_max_height > max_height) |
- max_height = std::min(current_max_height, work_area.height()); |
- } |
- |
- SetSizeRange(min_size_, gfx::Size(max_width, max_height)); |
- |
- // Ensure that full size does not exceed max size. |
- full_size_ = ClampSize(full_size_); |
-} |
- |
-void Panel::SetAutoResizable(bool resizable) { |
- if (auto_resizable_ == resizable) |
- return; |
- |
- auto_resizable_ = resizable; |
- content::WebContents* web_contents = GetWebContents(); |
- if (auto_resizable_) { |
- if (web_contents) |
- EnableWebContentsAutoResize(web_contents); |
- } else { |
- if (web_contents) { |
- content::WebContentsObserver::Observe(nullptr); |
- |
- // NULL might be returned if the tab has not been added. |
- RenderViewHost* render_view_host = web_contents->GetRenderViewHost(); |
- if (render_view_host) |
- render_view_host->DisableAutoResize(full_size_); |
- } |
- } |
-} |
- |
-void Panel::EnableWebContentsAutoResize(content::WebContents* web_contents) { |
- DCHECK(web_contents); |
- ConfigureAutoResize(web_contents); |
- |
- // We also need to know when the render view host changes in order |
- // to turn on auto-resize notifications in the new render view host. |
- content::WebContentsObserver::Observe(web_contents); |
-} |
- |
-void Panel::OnContentsAutoResized(const gfx::Size& new_content_size) { |
- DCHECK(auto_resizable_); |
- if (!collection_) |
- return; |
- |
- gfx::Size new_window_size = |
- native_panel_->WindowSizeFromContentSize(new_content_size); |
- |
- // Ignore content auto resizes until window frame size is known. |
- // This reduces extra resizes when panel is first shown. |
- // After window frame size is known, it will trigger another content |
- // auto resize. |
- if (new_content_size == new_window_size) |
- return; |
- |
- collection_->ResizePanelWindow(this, new_window_size); |
-} |
- |
-void Panel::OnWindowResizedByMouse(const gfx::Rect& new_bounds) { |
- if (collection_) |
- collection_->OnPanelResizedByMouse(this, new_bounds); |
-} |
- |
-void Panel::SetSizeRange(const gfx::Size& min_size, const gfx::Size& max_size) { |
- if (min_size == min_size_ && max_size == max_size_) |
- return; |
- |
- DCHECK(min_size.width() <= max_size.width()); |
- DCHECK(min_size.height() <= max_size.height()); |
- min_size_ = min_size; |
- max_size_ = max_size; |
- |
- ConfigureAutoResize(GetWebContents()); |
-} |
- |
-void Panel::IncreaseMaxSize(const gfx::Size& desired_panel_size) { |
- gfx::Size new_max_size = max_size_; |
- if (new_max_size.width() < desired_panel_size.width()) |
- new_max_size.set_width(desired_panel_size.width()); |
- if (new_max_size.height() < desired_panel_size.height()) |
- new_max_size.set_height(desired_panel_size.height()); |
- |
- SetSizeRange(min_size_, new_max_size); |
-} |
- |
-void Panel::HandleKeyboardEvent(const content::NativeWebKeyboardEvent& event) { |
- native_panel_->HandlePanelKeyboardEvent(event); |
-} |
- |
-void Panel::SetPreviewMode(bool in_preview) { |
- DCHECK_NE(in_preview_mode_, in_preview); |
- in_preview_mode_ = in_preview; |
-} |
- |
-void Panel::UpdateMinimizeRestoreButtonVisibility() { |
- native_panel_->UpdatePanelMinimizeRestoreButtonVisibility(); |
-} |
- |
-gfx::Size Panel::ClampSize(const gfx::Size& size) const { |
- // The panel width: |
- // * cannot grow or shrink to go beyond [min_width, max_width] |
- int new_width = size.width(); |
- if (new_width > max_size_.width()) |
- new_width = max_size_.width(); |
- if (new_width < min_size_.width()) |
- new_width = min_size_.width(); |
- |
- // The panel height: |
- // * cannot grow or shrink to go beyond [min_height, max_height] |
- int new_height = size.height(); |
- if (new_height > max_size_.height()) |
- new_height = max_size_.height(); |
- if (new_height < min_size_.height()) |
- new_height = min_size_.height(); |
- |
- return gfx::Size(new_width, new_height); |
-} |
- |
-void Panel::OnActiveStateChanged(bool active) { |
- // Clear attention state when an expanded panel becomes active. |
- // On some systems (e.g. Win), mouse-down activates a panel regardless of |
- // its expansion state. However, we don't want to clear draw attention if |
- // contents are not visible. In that scenario, if the mouse-down results |
- // in a mouse-click, draw attention will be cleared then. |
- // See Panel::OnTitlebarClicked(). |
- if (active && IsDrawingAttention() && !IsMinimized()) |
- FlashFrame(false); |
- |
- if (collection_) |
- collection_->OnPanelActiveStateChanged(this); |
- |
- // Send extension event about window changing active state. |
- extensions::TabsWindowsAPI* tabs_windows_api = |
- extensions::TabsWindowsAPI::Get(profile()); |
- if (tabs_windows_api) { |
- tabs_windows_api->windows_event_router()->OnActiveWindowChanged( |
- active ? extension_window_controller_.get() : NULL); |
- } |
- |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PANEL_CHANGED_ACTIVE_STATUS, |
- content::Source<Panel>(this), |
- content::NotificationService::NoDetails()); |
-} |
- |
-void Panel::OnPanelStartUserResizing() { |
- SetAutoResizable(false); |
- SetPreviewMode(true); |
- max_size_policy_ = CUSTOM_MAX_SIZE; |
-} |
- |
-void Panel::OnPanelEndUserResizing() { |
- SetPreviewMode(false); |
-} |
- |
-bool Panel::ShouldCloseWindow() { |
- return true; |
-} |
- |
-void Panel::OnWindowClosing() { |
- if (GetWebContents()) { |
- native_panel_->DetachWebContents(GetWebContents()); |
- panel_host_->DestroyWebContents(); |
- } |
-} |
- |
-bool Panel::ExecuteCommandIfEnabled(int id) { |
- if (command_updater()->SupportsCommand(id) && |
- command_updater()->IsCommandEnabled(id)) { |
- ExecuteCommandWithDisposition(id, CURRENT_TAB); |
- return true; |
- } |
- return false; |
-} |
- |
-base::string16 Panel::GetWindowTitle() const { |
- content::WebContents* contents = GetWebContents(); |
- base::string16 title; |
- |
- // |contents| can be NULL during the window's creation. |
- if (contents) { |
- title = contents->GetTitle(); |
- FormatTitleForDisplay(&title); |
- } |
- |
- if (title.empty()) |
- title = base::UTF8ToUTF16(app_name()); |
- |
- return title; |
-} |
- |
-gfx::Image Panel::GetCurrentPageIcon() const { |
- return panel_host_.get() ? panel_host_->GetPageIcon() : gfx::Image(); |
-} |
- |
-void Panel::UpdateTitleBar() { |
- native_panel_->UpdatePanelTitleBar(); |
-} |
- |
-void Panel::LoadingStateChanged(bool is_loading) { |
- command_updater_.UpdateCommandEnabled(IDC_STOP, is_loading); |
- native_panel_->UpdatePanelLoadingAnimations(is_loading); |
- UpdateTitleBar(); |
-} |
- |
-void Panel::MoveByInstantly(const gfx::Vector2d& delta_origin) { |
- gfx::Rect bounds = GetBounds(); |
- bounds.Offset(delta_origin); |
- SetPanelBoundsInstantly(bounds); |
-} |
- |
-void Panel::SetWindowCornerStyle(panel::CornerStyle corner_style) { |
- native_panel_->SetWindowCornerStyle(corner_style); |
-} |
- |
-void Panel::MinimizeBySystem() { |
- native_panel_->MinimizePanelBySystem(); |
-} |
- |
-Panel::Panel(Profile* profile, |
- const std::string& app_name, |
- const gfx::Size& min_size, |
- const gfx::Size& max_size) |
- : app_name_(app_name), |
- profile_(profile), |
- collection_(NULL), |
- initialized_(false), |
- min_size_(min_size), |
- max_size_(max_size), |
- max_size_policy_(DEFAULT_MAX_SIZE), |
- auto_resizable_(false), |
- in_preview_mode_(false), |
- native_panel_(NULL), |
- attention_mode_(USE_PANEL_ATTENTION), |
- expansion_state_(EXPANDED), |
- command_updater_(this), |
- extension_registry_(extensions::ExtensionRegistry::Get(profile_)), |
- image_loader_ptr_factory_(this) { |
-} |
- |
-void Panel::OnImageLoaded(const gfx::Image& image) { |
- if (!image.IsEmpty()) { |
- app_icon_ = image; |
- native_panel_->UpdatePanelTitleBar(); |
- } |
- |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PANEL_APP_ICON_LOADED, |
- content::Source<Panel>(this), |
- content::NotificationService::NoDetails()); |
-} |
- |
-void Panel::InitCommandState() { |
- // All supported commands whose state isn't set automagically some other way |
- // (like Stop during a page load) must have their state initialized here, |
- // otherwise they will be forever disabled. |
- |
- // Navigation commands |
- command_updater_.UpdateCommandEnabled(IDC_RELOAD, true); |
- command_updater_.UpdateCommandEnabled(IDC_RELOAD_BYPASSING_CACHE, true); |
- |
- // Window management commands |
- command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true); |
- command_updater_.UpdateCommandEnabled(IDC_EXIT, true); |
- |
- // Zoom |
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_MENU, true); |
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_PLUS, true); |
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_NORMAL, true); |
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS, true); |
- |
- // Clipboard |
- command_updater_.UpdateCommandEnabled(IDC_COPY, true); |
- command_updater_.UpdateCommandEnabled(IDC_CUT, true); |
- command_updater_.UpdateCommandEnabled(IDC_PASTE, true); |
- |
- // DevTools |
- command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS, true); |
- command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_CONSOLE, true); |
-} |
- |
-void Panel::ConfigureAutoResize(content::WebContents* web_contents) { |
- if (!auto_resizable_ || !web_contents) |
- return; |
- |
- // NULL might be returned if the tab has not been added. |
- RenderViewHost* render_view_host = web_contents->GetRenderViewHost(); |
- if (!render_view_host) |
- return; |
- |
- render_view_host->EnableAutoResize( |
- min_size_, |
- native_panel_->ContentSizeFromWindowSize(max_size_)); |
-} |
- |
-void Panel::UpdateAppIcon() { |
- const extensions::Extension* extension = GetExtension(); |
- if (!extension) |
- return; |
- |
- extensions::ImageLoader* loader = extensions::ImageLoader::Get(profile()); |
- loader->LoadImageAsync( |
- extension, |
- extensions::IconsInfo::GetIconResource( |
- extension, |
- extension_misc::EXTENSION_ICON_SMALL, |
- ExtensionIconSet::MATCH_BIGGER), |
- gfx::Size(extension_misc::EXTENSION_ICON_SMALL, |
- extension_misc::EXTENSION_ICON_SMALL), |
- base::Bind(&Panel::OnImageLoaded, |
- image_loader_ptr_factory_.GetWeakPtr())); |
-} |
- |
-// static |
-void Panel::FormatTitleForDisplay(base::string16* title) { |
- size_t current_index = 0; |
- size_t match_index; |
- while ((match_index = title->find(L'\n', current_index)) != |
- base::string16::npos) { |
- title->replace(match_index, 1, base::string16()); |
- current_index = match_index; |
- } |
-} |