summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-08 23:03:58 +0000
committerjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-08 23:03:58 +0000
commit7788bd158adb2af989e3dbaf7db5368451c00041 (patch)
tree031e115a881125ceba6a168d7485ae158cc3c62a
parentaa4d6e87f9c9b2a6053c19f108c1cdccf5319bd1 (diff)
downloadchromium_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.cc7
-rw-r--r--chrome/browser/ui/panels/panel.h6
-rw-r--r--chrome/browser/ui/panels/panel_browser_frame_view.cc130
-rw-r--r--chrome/browser/ui/panels/panel_browser_frame_view.h49
-rw-r--r--chrome/browser/ui/panels/panel_browser_view_browsertest.cc82
-rw-r--r--chrome/browser/ui/panels/panel_browsertest.cc83
-rw-r--r--chrome/browser/ui/panels/panel_manager.cc6
-rw-r--r--chrome/browser/ui/panels/panel_settings_menu_model.cc119
-rw-r--r--chrome/browser/ui/panels/panel_settings_menu_model.h51
-rw-r--r--chrome/chrome_browser.gypi2
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',