diff options
author | jianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-08 23:03:58 +0000 |
---|---|---|
committer | jianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-08 23:03:58 +0000 |
commit | 7788bd158adb2af989e3dbaf7db5368451c00041 (patch) | |
tree | 031e115a881125ceba6a168d7485ae158cc3c62a | |
parent | aa4d6e87f9c9b2a6053c19f108c1cdccf5319bd1 (diff) | |
download | chromium_src-7788bd158adb2af989e3dbaf7db5368451c00041.zip chromium_src-7788bd158adb2af989e3dbaf7db5368451c00041.tar.gz chromium_src-7788bd158adb2af989e3dbaf7db5368451c00041.tar.bz2 |
Refactor panel settings menu to pull out platform-independent part into separate class so that it can be shared by all platforms.
BUG=none
TEST=existing browser tests
Review URL: http://codereview.chromium.org/7845025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100293 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/panels/panel.cc | 7 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel.h | 6 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browser_frame_view.cc | 130 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browser_frame_view.h | 49 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browser_view_browsertest.cc | 82 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browsertest.cc | 83 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_manager.cc | 6 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_settings_menu_model.cc | 119 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_settings_menu_model.h | 51 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 |
10 files changed, 301 insertions, 234 deletions
diff --git a/chrome/browser/ui/panels/panel.cc b/chrome/browser/ui/panels/panel.cc index 7195e30..7c0d663 100644 --- a/chrome/browser/ui/panels/panel.cc +++ b/chrome/browser/ui/panels/panel.cc @@ -21,7 +21,7 @@ #include "ui/gfx/rect.h" // static -const Extension* Panel::GetExtension(Browser* browser) { +const Extension* Panel::GetExtensionFromBrowser(Browser* browser) { // Find the extension. When we create a panel from an extension, the extension // ID is passed as the app name to the Browser. ExtensionService* extension_service = @@ -50,6 +50,11 @@ PanelManager* Panel::manager() const { return PanelManager::GetInstance(); } + +const Extension* Panel::GetExtension() const { + return GetExtensionFromBrowser(browser()); +} + void Panel::SetPanelBounds(const gfx::Rect& bounds) { native_panel_->SetPanelBounds(bounds); } diff --git a/chrome/browser/ui/panels/panel.h b/chrome/browser/ui/panels/panel.h index bdf3c2d..3fae8f0 100644 --- a/chrome/browser/ui/panels/panel.h +++ b/chrome/browser/ui/panels/panel.h @@ -43,6 +43,10 @@ class Panel : public BrowserWindow, public NotificationObserver { // Returns the PanelManager associated with this panel. PanelManager* manager() const; + // Gets the extension that a panel is created from. + // Returns NULL if it cannot be found. + const Extension* GetExtension() const; + void SetExpansionState(ExpansionState new_expansion_state); bool ShouldBringUpTitlebar(int mouse_x, int mouse_y) const; @@ -170,7 +174,7 @@ class Panel : public BrowserWindow, public NotificationObserver { // Gets the extension from the browser that a panel is created from. // Returns NULL if it cannot be found. - static const Extension* GetExtension(Browser* browser); + static const Extension* GetExtensionFromBrowser(Browser* browser); NativePanel* native_panel() { return native_panel_; } Browser* browser() const; diff --git a/chrome/browser/ui/panels/panel_browser_frame_view.cc b/chrome/browser/ui/panels/panel_browser_frame_view.cc index 302d94a..d713dff 100644 --- a/chrome/browser/ui/panels/panel_browser_frame_view.cc +++ b/chrome/browser/ui/panels/panel_browser_frame_view.cc @@ -4,14 +4,12 @@ #include "chrome/browser/ui/panels/panel_browser_frame_view.h" -#include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/ui/panels/panel.h" #include "chrome/browser/ui/panels/panel_browser_view.h" #include "chrome/browser/ui/panels/panel_manager.h" +#include "chrome/browser/ui/panels/panel_settings_menu_model.h" #include "chrome/common/extensions/extension.h" -#include "chrome/common/url_constants.h" #include "content/browser/tab_contents/tab_contents.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" @@ -25,6 +23,9 @@ #include "ui/gfx/screen.h" #include "views/controls/button/image_button.h" #include "views/controls/button/menu_button.h" +#include "views/controls/menu/menu_item_view.h" +#include "views/controls/menu/menu_model_adapter.h" +#include "views/controls/menu/menu_runner.h" #include "views/controls/label.h" #include "views/painter.h" #include "views/widget/widget_delegate.h" @@ -211,11 +212,7 @@ PanelBrowserFrameView::PanelBrowserFrameView(BrowserFrame* frame, is_settings_button_visible_(false), close_button_(NULL), title_icon_(NULL), - title_label_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST(settings_menu_contents_(this)), - settings_menu_adapter_(&settings_menu_contents_), - settings_menu_(new views::MenuItemView(&settings_menu_adapter_)), - settings_menu_runner_(settings_menu_) { + title_label_(NULL) { EnsureResourcesInitialized(); frame_->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); @@ -444,88 +441,13 @@ void PanelBrowserFrameView::RunMenu(View* source, const gfx::Point& pt) { DCHECK_EQ(settings_button_, source); gfx::Point screen_point; views::View::ConvertPointToScreen(source, &screen_point); - if (settings_menu_runner_.RunMenuAt(source->GetWidget(), + if (settings_menu_runner_->RunMenuAt(source->GetWidget(), settings_button_, gfx::Rect(screen_point, source->size()), views::MenuItemView::TOPRIGHT, views::MenuRunner::HAS_MNEMONICS) == views::MenuRunner::MENU_DELETED) return; } -bool PanelBrowserFrameView::IsCommandIdChecked(int command_id) const { - // Nothing in the menu is checked. - return false; -} - -bool PanelBrowserFrameView::IsCommandIdEnabled(int command_id) const { - const Extension* extension = GetExtension(); - if (!extension) - return false; - - switch (command_id) { - case COMMAND_NAME: - // The NAME links to the Homepage URL. If the extension doesn't have a - // homepage, we just disable this menu item. - return extension->GetHomepageURL().is_valid(); - case COMMAND_CONFIGURE: - return extension->options_url().spec().length() > 0; - case COMMAND_DISABLE: - case COMMAND_UNINSTALL: - // Some extension types can not be disabled or uninstalled. - return Extension::UserMayDisable(extension->location()); - case COMMAND_MANAGE: - return true; - default: - NOTREACHED(); - return false; - } -} - -bool PanelBrowserFrameView::GetAcceleratorForCommandId( - int command_id, ui::Accelerator* accelerator) { - return false; -} - -void PanelBrowserFrameView::ExecuteCommand(int command_id) { - const Extension* extension = GetExtension(); - if (!extension) - return; - - Browser* browser = browser_view_->browser(); - switch (command_id) { - case COMMAND_NAME: - browser->OpenURL(extension->GetHomepageURL(), - GURL(), - NEW_FOREGROUND_TAB, - PageTransition::LINK); - break; - case COMMAND_CONFIGURE: - DCHECK(!extension->options_url().is_empty()); - browser->GetProfile()->GetExtensionProcessManager()->OpenOptionsPage( - extension, browser); - break; - case COMMAND_DISABLE: - browser->GetProfile()->GetExtensionService()->DisableExtension( - extension->id()); - break; - case COMMAND_UNINSTALL: - // TODO(jianli): Need to handle the case that the extension API requests - // the panel to be closed when the uninstall dialog is still showing. - extension_uninstall_dialog_.reset(new ExtensionUninstallDialog( - browser->GetProfile())); - extension_uninstall_dialog_->ConfirmUninstall(this, extension); - break; - case COMMAND_MANAGE: - browser->OpenURL(GURL(chrome::kChromeUIExtensionsURL), - GURL(), - SINGLETON_TAB, - PageTransition::LINK); - break; - default: - NOTREACHED(); - break; - } -} - bool PanelBrowserFrameView::ShouldTabIconViewAnimate() const { // This function is queried during the creation of the window as the // TabIconView we host is initialized, so we need to NULL check the selected @@ -538,17 +460,6 @@ SkBitmap PanelBrowserFrameView::GetFaviconForTabIconView() { return frame_->widget_delegate()->GetWindowIcon(); } -void PanelBrowserFrameView::ExtensionDialogAccepted() { - const Extension* extension = GetExtension(); - if (extension) { - browser_view_->browser()->GetProfile()->GetExtensionService()-> - UninstallExtension(extension->id(), false, NULL); - } -} - -void PanelBrowserFrameView::ExtensionDialogCanceled() { -} - int PanelBrowserFrameView::NonClientBorderThickness() const { return kFrameBorderThickness + kClientEdgeThickness; } @@ -734,31 +645,20 @@ void PanelBrowserFrameView::UpdateSettingsButtonVisibility( settings_button_->SetVisible(is_settings_button_visible_); } -const Extension* PanelBrowserFrameView::GetExtension() const { - return Panel::GetExtension(browser_view_->browser()); -} - bool PanelBrowserFrameView::EnsureSettingsMenuCreated() { - if (settings_menu_contents_.GetItemCount()) + if (settings_menu_runner_.get()) return true; - const Extension* extension = GetExtension(); + const Extension* extension = browser_view_->panel()->GetExtension(); if (!extension) return false; - settings_menu_contents_.AddItem( - COMMAND_NAME, UTF8ToUTF16(extension->name())); - settings_menu_contents_.AddSeparator(); - settings_menu_contents_.AddItem( - COMMAND_CONFIGURE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS)); - settings_menu_contents_.AddItem( - COMMAND_DISABLE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE)); - settings_menu_contents_.AddItem( - COMMAND_UNINSTALL, l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL)); - settings_menu_contents_.AddSeparator(); - settings_menu_contents_.AddItem( - COMMAND_MANAGE, l10n_util::GetStringUTF16(IDS_MANAGE_EXTENSIONS)); - - settings_menu_adapter_.BuildMenu(settings_menu_); + settings_menu_model_.reset( + new PanelSettingsMenuModel(browser_view_->panel())); + settings_menu_adapter_.reset( + new views::MenuModelAdapter(settings_menu_model_.get())); + settings_menu_ = new views::MenuItemView(settings_menu_adapter_.get()); + settings_menu_adapter_->BuildMenu(settings_menu_); + settings_menu_runner_.reset(new views::MenuRunner(settings_menu_)); return true; } diff --git a/chrome/browser/ui/panels/panel_browser_frame_view.h b/chrome/browser/ui/panels/panel_browser_frame_view.h index 9b2eebd..5cf4252 100644 --- a/chrome/browser/ui/panels/panel_browser_frame_view.h +++ b/chrome/browser/ui/panels/panel_browser_frame_view.h @@ -9,30 +9,31 @@ #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" -#include "chrome/browser/extensions/extension_uninstall_dialog.h" #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" #include "chrome/browser/ui/views/tab_icon_view.h" -#include "ui/base/models/simple_menu_model.h" #include "views/controls/button/button.h" -#include "views/controls/menu/menu_item_view.h" -#include "views/controls/menu/menu_model_adapter.h" -#include "views/controls/menu/menu_runner.h" #include "views/controls/menu/view_menu_delegate.h" class Extension; +class ExtensionUninstallDialog; class PanelBrowserView; +class PanelSettingsMenuModel; +namespace gfx { +class Font; +} namespace views { class ImageButton; class Label; class MenuButton; +class MenuItemView; +class MenuModelAdapter; +class MenuRunner; } class PanelBrowserFrameView : public BrowserNonClientFrameView, public views::ButtonListener, public views::ViewMenuDelegate, - public ui::SimpleMenuModel::Delegate, - public TabIconView::TabIconViewModel, - public ExtensionUninstallDialog::Delegate { + public TabIconView::TabIconViewModel { public: PanelBrowserFrameView(BrowserFrame* frame, PanelBrowserView* browser_view); virtual ~PanelBrowserFrameView(); @@ -86,21 +87,10 @@ class PanelBrowserFrameView : public BrowserNonClientFrameView, // Overridden from views::ViewMenuDelegate: virtual void RunMenu(View* source, const gfx::Point& pt) OVERRIDE; - // Overridden from ui::SimpleMenuModel::Delegate: - virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; - virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; - virtual bool GetAcceleratorForCommandId( - int command_id, ui::Accelerator* accelerator) OVERRIDE; - virtual void ExecuteCommand(int command_id) OVERRIDE; - // Overridden from TabIconView::TabIconViewModel: virtual bool ShouldTabIconViewAnimate() const OVERRIDE; virtual SkBitmap GetFaviconForTabIconView() OVERRIDE; - // ExtensionUninstallDialog::Delegate: - virtual void ExtensionDialogAccepted() OVERRIDE; - virtual void ExtensionDialogCanceled() OVERRIDE; - private: friend class PanelBrowserViewTest; FRIEND_TEST_ALL_PREFIXES(PanelBrowserViewTest, CreatePanel); @@ -113,14 +103,6 @@ class PanelBrowserFrameView : public BrowserNonClientFrameView, PAINT_FOR_ATTENTION }; - enum { - COMMAND_NAME = 0, - COMMAND_CONFIGURE, - COMMAND_DISABLE, - COMMAND_UNINSTALL, - COMMAND_MANAGE - }; - class MouseWatcher : public MessageLoopForUI::Observer { public: explicit MouseWatcher(PanelBrowserFrameView* view); @@ -174,6 +156,10 @@ class PanelBrowserFrameView : public BrowserNonClientFrameView, bool EnsureSettingsMenuCreated(); #ifdef UNIT_TEST + PanelSettingsMenuModel* settings_menu_model() const { + return settings_menu_model_.get(); + } + void set_mouse_watcher(MouseWatcher* mouse_watcher) { mouse_watcher_.reset(mouse_watcher); } @@ -196,11 +182,10 @@ class PanelBrowserFrameView : public BrowserNonClientFrameView, views::Label* title_label_; gfx::Rect client_view_bounds_; scoped_ptr<MouseWatcher> mouse_watcher_; - ui::SimpleMenuModel settings_menu_contents_; - views::MenuModelAdapter settings_menu_adapter_; - // Owned by |settings_menu_runner_|. - views::MenuItemView* settings_menu_; - views::MenuRunner settings_menu_runner_; + scoped_ptr<PanelSettingsMenuModel> settings_menu_model_; + scoped_ptr<views::MenuModelAdapter> settings_menu_adapter_; + views::MenuItemView* settings_menu_; // Owned by |settings_menu_runner_|. + scoped_ptr<views::MenuRunner> settings_menu_runner_; scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_; DISALLOW_COPY_AND_ASSIGN(PanelBrowserFrameView); diff --git a/chrome/browser/ui/panels/panel_browser_view_browsertest.cc b/chrome/browser/ui/panels/panel_browser_view_browsertest.cc index d48f107..0b57d91 100644 --- a/chrome/browser/ui/panels/panel_browser_view_browsertest.cc +++ b/chrome/browser/ui/panels/panel_browser_view_browsertest.cc @@ -38,11 +38,6 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { PanelBrowserViewTest() : BasePanelBrowserTest() { } protected: - struct MenuItem { - int id; - bool enabled; - }; - class MockMouseWatcher : public PanelBrowserFrameView::MouseWatcher { public: explicit MockMouseWatcher(PanelBrowserFrameView* view) @@ -84,74 +79,6 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { } } - void ValidateSettingsMenuItems(ui::SimpleMenuModel* settings_menu_contents, - size_t num_expected_menu_items, - const MenuItem* expected_menu_items) { - ASSERT_TRUE(settings_menu_contents); - EXPECT_EQ(static_cast<int>(num_expected_menu_items), - settings_menu_contents->GetItemCount()); - for (size_t i = 0; i < num_expected_menu_items; ++i) { - if (expected_menu_items[i].id == -1) { - EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, - settings_menu_contents->GetTypeAt(i)); - } else { - EXPECT_EQ(expected_menu_items[i].id, - settings_menu_contents->GetCommandIdAt(i)); - EXPECT_EQ(expected_menu_items[i].enabled, - settings_menu_contents->IsEnabledAt(i)); - } - } - } - - void TestCreateSettingsMenuForExtension(const FilePath::StringType& path, - Extension::Location location, - const std::string& homepage_url, - const std::string& options_page) { - // Creates a testing extension. - DictionaryValue extra_value; - if (!homepage_url.empty()) { - extra_value.SetString(extension_manifest_keys::kHomepageURL, - homepage_url); - } - if (!options_page.empty()) { - extra_value.SetString(extension_manifest_keys::kOptionsPage, - options_page); - } - scoped_refptr<Extension> extension = CreateExtension( - path, location, extra_value); - - // Creates a panel with the app name that comes from the extension ID. - Panel* panel = CreatePanel( - web_app::GenerateApplicationNameFromExtensionId(extension->id())); - PanelBrowserFrameView* frame_view = GetBrowserView(panel)->GetFrameView(); - - frame_view->EnsureSettingsMenuCreated(); - - // Validates the settings menu items. - MenuItem expected_panel_menu_items[] = { - { PanelBrowserFrameView::COMMAND_NAME, false }, - { -1, false }, // Separator - { PanelBrowserFrameView::COMMAND_CONFIGURE, false }, - { PanelBrowserFrameView::COMMAND_DISABLE, false }, - { PanelBrowserFrameView::COMMAND_UNINSTALL, false }, - { -1, false }, // Separator - { PanelBrowserFrameView::COMMAND_MANAGE, true } - }; - if (!homepage_url.empty()) - expected_panel_menu_items[0].enabled = true; - if (!options_page.empty()) - expected_panel_menu_items[2].enabled = true; - if (location != Extension::EXTERNAL_POLICY_DOWNLOAD) { - expected_panel_menu_items[3].enabled = true; - expected_panel_menu_items[4].enabled = true; - } - ValidateSettingsMenuItems(&frame_view->settings_menu_contents_, - arraysize(expected_panel_menu_items), - expected_panel_menu_items); - - panel->Close(); - } - void TestShowPanelActiveOrInactive() { CreatePanelParams params1("PanelTest1", gfx::Rect(), SHOW_AS_ACTIVE); Panel* panel1 = CreatePanelWithParams(params1); @@ -565,15 +492,6 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, SetBoundsAnimation) { panel->Close(); } -IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreateSettingsMenu) { - TestCreateSettingsMenuForExtension( - FILE_PATH_LITERAL("extension1"), Extension::EXTERNAL_POLICY_DOWNLOAD, - "", ""); - TestCreateSettingsMenuForExtension( - FILE_PATH_LITERAL("extension2"), Extension::INVALID, - "http://home", "options.html"); -} - IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, MinimizeAndRestoreOnNormalTaskBar) { TestMinimizeAndRestore(false); diff --git a/chrome/browser/ui/panels/panel_browsertest.cc b/chrome/browser/ui/panels/panel_browsertest.cc index 025aa79..5d59ffd 100644 --- a/chrome/browser/ui/panels/panel_browsertest.cc +++ b/chrome/browser/ui/panels/panel_browsertest.cc @@ -12,6 +12,7 @@ #include "chrome/browser/ui/panels/native_panel.h" #include "chrome/browser/ui/panels/panel.h" #include "chrome/browser/ui/panels/panel_manager.h" +#include "chrome/browser/ui/panels/panel_settings_menu_model.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/pref_names.h" @@ -220,6 +221,79 @@ class PanelBrowserTest : public BasePanelBrowserTest { expected_delta_x_after_finish); } } + + struct MenuItem { + int id; + bool enabled; + }; + + void ValidateSettingsMenuItems(ui::SimpleMenuModel* settings_menu_contents, + size_t num_expected_menu_items, + const MenuItem* expected_menu_items) { + ASSERT_TRUE(settings_menu_contents); + EXPECT_EQ(static_cast<int>(num_expected_menu_items), + settings_menu_contents->GetItemCount()); + for (size_t i = 0; i < num_expected_menu_items; ++i) { + if (expected_menu_items[i].id == -1) { + EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, + settings_menu_contents->GetTypeAt(i)); + } else { + EXPECT_EQ(expected_menu_items[i].id, + settings_menu_contents->GetCommandIdAt(i)); + EXPECT_EQ(expected_menu_items[i].enabled, + settings_menu_contents->IsEnabledAt(i)); + } + } + } + + void TestCreateSettingsMenuForExtension(const FilePath::StringType& path, + Extension::Location location, + const std::string& homepage_url, + const std::string& options_page) { + // Creates a testing extension. + DictionaryValue extra_value; + if (!homepage_url.empty()) { + extra_value.SetString(extension_manifest_keys::kHomepageURL, + homepage_url); + } + if (!options_page.empty()) { + extra_value.SetString(extension_manifest_keys::kOptionsPage, + options_page); + } + scoped_refptr<Extension> extension = CreateExtension( + path, location, extra_value); + + // Creates a panel with the app name that comes from the extension ID. + Panel* panel = CreatePanel( + web_app::GenerateApplicationNameFromExtensionId(extension->id())); + + scoped_ptr<PanelSettingsMenuModel> settings_menu_model( + new PanelSettingsMenuModel(panel)); + + // Validates the settings menu items. + MenuItem expected_panel_menu_items[] = { + { PanelSettingsMenuModel::COMMAND_NAME, false }, + { -1, false }, // Separator + { PanelSettingsMenuModel::COMMAND_CONFIGURE, false }, + { PanelSettingsMenuModel::COMMAND_DISABLE, false }, + { PanelSettingsMenuModel::COMMAND_UNINSTALL, false }, + { -1, false }, // Separator + { PanelSettingsMenuModel::COMMAND_MANAGE, true } + }; + if (!homepage_url.empty()) + expected_panel_menu_items[0].enabled = true; + if (!options_page.empty()) + expected_panel_menu_items[2].enabled = true; + if (location != Extension::EXTERNAL_POLICY_DOWNLOAD) { + expected_panel_menu_items[3].enabled = true; + expected_panel_menu_items[4].enabled = true; + } + ValidateSettingsMenuItems(settings_menu_model.get(), + arraysize(expected_panel_menu_items), + expected_panel_menu_items); + + panel->Close(); + } }; IN_PROC_BROWSER_TEST_F(PanelBrowserTest, CreatePanel) { @@ -546,6 +620,15 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_DragPanels) { PanelManager::GetInstance()->RemoveAll(); } +IN_PROC_BROWSER_TEST_F(PanelBrowserTest, CreateSettingsMenu) { + TestCreateSettingsMenuForExtension( + FILE_PATH_LITERAL("extension1"), Extension::EXTERNAL_POLICY_DOWNLOAD, + "", ""); + TestCreateSettingsMenuForExtension( + FILE_PATH_LITERAL("extension2"), Extension::INVALID, + "http://home", "options.html"); +} + class PanelDownloadTest : public PanelBrowserTest { public: PanelDownloadTest() : PanelBrowserTest() { } diff --git a/chrome/browser/ui/panels/panel_manager.cc b/chrome/browser/ui/panels/panel_manager.cc index ee0d5f9..7a60030 100644 --- a/chrome/browser/ui/panels/panel_manager.cc +++ b/chrome/browser/ui/panels/panel_manager.cc @@ -87,7 +87,7 @@ void PanelManager::FindAndClosePanelOnOverflow(const Extension* extension) { // it. for (Panels::reverse_iterator iter = panels_.rbegin(); iter != panels_.rend(); ++iter) { - if (extension == Panel::GetExtension((*iter)->browser())) { + if (extension == (*iter)->GetExtension()) { panel_to_close = *iter; break; } @@ -132,7 +132,7 @@ Panel* PanelManager::CreatePanel(Browser* browser) { while ((x = GetRightMostAvaialblePosition() - width) < adjusted_work_area_.x() ) { if (!extension) - extension = Panel::GetExtension(browser); + extension = Panel::GetExtensionFromBrowser(browser); FindAndClosePanelOnOverflow(extension); } @@ -558,7 +558,7 @@ void PanelManager::UpdateMaxSizeForAllPanels() { for (Panels::const_iterator iter = panels_.begin(); iter != panels_.end(); ++iter) { Panel* panel = *iter; - // A panel can at most grow to take over all the avaialble space that is + // A panel can at most grow to take over all the available space that is // returned by GetRightMostAvaialblePosition. int width_can_grow_to = panel->GetBounds().width() + GetRightMostAvaialblePosition(); diff --git a/chrome/browser/ui/panels/panel_settings_menu_model.cc b/chrome/browser/ui/panels/panel_settings_menu_model.cc new file mode 100644 index 0000000..ed9f552 --- /dev/null +++ b/chrome/browser/ui/panels/panel_settings_menu_model.cc @@ -0,0 +1,119 @@ +// Copyright (c) 2011 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_settings_menu_model.h" + +#include "base/logging.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/panels/panel.h" +#include "chrome/common/extensions/extension.h" +#include "chrome/common/url_constants.h" +#include "grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" + +PanelSettingsMenuModel::PanelSettingsMenuModel(Panel* panel) + : ALLOW_THIS_IN_INITIALIZER_LIST(ui::SimpleMenuModel(this)), + panel_(panel) { + const Extension* extension = panel_->GetExtension(); + DCHECK(extension); + + AddItem(COMMAND_NAME, UTF8ToUTF16(extension->name())); + AddSeparator(); + AddItem(COMMAND_CONFIGURE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS)); + AddItem(COMMAND_DISABLE, l10n_util::GetStringUTF16(IDS_EXTENSIONS_DISABLE)); + AddItem(COMMAND_UNINSTALL, + l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL)); + AddSeparator(); + AddItem(COMMAND_MANAGE, l10n_util::GetStringUTF16(IDS_MANAGE_EXTENSIONS)); +} + +PanelSettingsMenuModel::~PanelSettingsMenuModel() { +} + +bool PanelSettingsMenuModel::IsCommandIdChecked(int command_id) const { + // Nothing in the menu is checked. + return false; +} + +bool PanelSettingsMenuModel::IsCommandIdEnabled(int command_id) const { + const Extension* extension = panel_->GetExtension(); + DCHECK(extension); + + switch (command_id) { + case COMMAND_NAME: + // The NAME links to the Homepage URL. If the extension doesn't have a + // homepage, we just disable this menu item. + return extension->GetHomepageURL().is_valid(); + case COMMAND_CONFIGURE: + return extension->options_url().spec().length() > 0; + case COMMAND_DISABLE: + case COMMAND_UNINSTALL: + // Some extension types can not be disabled or uninstalled. + return Extension::UserMayDisable(extension->location()); + case COMMAND_MANAGE: + return true; + default: + NOTREACHED(); + return false; + } +} + +bool PanelSettingsMenuModel::GetAcceleratorForCommandId( + int command_id, ui::Accelerator* accelerator) { + return false; +} + +void PanelSettingsMenuModel::ExecuteCommand(int command_id) { + const Extension* extension = panel_->GetExtension(); + DCHECK(extension); + + Browser* browser = panel_->browser(); + switch (command_id) { + case COMMAND_NAME: + browser->OpenURL(extension->GetHomepageURL(), + GURL(), + NEW_FOREGROUND_TAB, + PageTransition::LINK); + break; + case COMMAND_CONFIGURE: + DCHECK(!extension->options_url().is_empty()); + browser->GetProfile()->GetExtensionProcessManager()->OpenOptionsPage( + extension, browser); + break; + case COMMAND_DISABLE: + browser->GetProfile()->GetExtensionService()->DisableExtension( + extension->id()); + break; + case COMMAND_UNINSTALL: + // TODO(jianli): Need to handle the case that the extension API requests + // the panel to be closed when the uninstall dialog is still showing. + extension_uninstall_dialog_.reset(new ExtensionUninstallDialog( + browser->GetProfile())); + extension_uninstall_dialog_->ConfirmUninstall(this, extension); + break; + case COMMAND_MANAGE: + browser->OpenURL(GURL(chrome::kChromeUIExtensionsURL), + GURL(), + SINGLETON_TAB, + PageTransition::LINK); + break; + default: + NOTREACHED(); + break; + } +} + +void PanelSettingsMenuModel::ExtensionDialogAccepted() { + const Extension* extension = panel_->GetExtension(); + DCHECK(extension); + + panel_->browser()->GetProfile()->GetExtensionService()-> + UninstallExtension(extension->id(), false, NULL); +} + +void PanelSettingsMenuModel::ExtensionDialogCanceled() { +} diff --git a/chrome/browser/ui/panels/panel_settings_menu_model.h b/chrome/browser/ui/panels/panel_settings_menu_model.h new file mode 100644 index 0000000..1e344bc --- /dev/null +++ b/chrome/browser/ui/panels/panel_settings_menu_model.h @@ -0,0 +1,51 @@ +// Copyright (c) 2011 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. + +#ifndef CHROME_BROWSER_UI_PANELS_PANEL_SETTINGS_MENU_MODEL_H_ +#define CHROME_BROWSER_UI_PANELS_PANEL_SETTINGS_MENU_MODEL_H_ +#pragma once + +#include "chrome/browser/extensions/extension_uninstall_dialog.h" +#include "ui/base/models/simple_menu_model.h" + +class Extension; +class Panel; + +class PanelSettingsMenuModel : public ui::SimpleMenuModel, + public ui::SimpleMenuModel::Delegate, + public ExtensionUninstallDialog::Delegate { + public: + explicit PanelSettingsMenuModel(Panel* panel); + virtual ~PanelSettingsMenuModel(); + + private: + // Overridden from ui::SimpleMenuModel::Delegate: + virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; + virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; + virtual bool GetAcceleratorForCommandId( + int command_id, ui::Accelerator* accelerator) OVERRIDE; + virtual void ExecuteCommand(int command_id) OVERRIDE; + + // ExtensionUninstallDialog::Delegate: + virtual void ExtensionDialogAccepted() OVERRIDE; + virtual void ExtensionDialogCanceled() OVERRIDE; + + private: + friend class PanelBrowserTest; + + enum { + COMMAND_NAME = 0, + COMMAND_CONFIGURE, + COMMAND_DISABLE, + COMMAND_UNINSTALL, + COMMAND_MANAGE + }; + + Panel* panel_; + scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_; + + DISALLOW_COPY_AND_ASSIGN(PanelSettingsMenuModel); +}; + +#endif // CHROME_BROWSER_UI_PANELS_PANEL_SETTINGS_MENU_MODEL_H_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 53f4bf4..2f0454f 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -3034,6 +3034,8 @@ 'browser/ui/panels/panel_manager.h', 'browser/ui/panels/panel_mouse_watcher_win.cc', 'browser/ui/panels/panel_mouse_watcher_win.h', + 'browser/ui/panels/panel_settings_menu_model.cc', + 'browser/ui/panels/panel_settings_menu_model.h', 'browser/ui/panels/panel_titlebar_view_cocoa.h', 'browser/ui/panels/panel_titlebar_view_cocoa.mm', 'browser/ui/panels/panel_window_controller_cocoa.h', |