diff options
author | erikkay@chromium.org <erikkay@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-26 00:11:42 +0000 |
---|---|---|
committer | erikkay@chromium.org <erikkay@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-26 00:11:42 +0000 |
commit | bbc94554729407f821d4a60828c5758a112f042a (patch) | |
tree | fa92103aa16e6ff04e90206c6ac99710c3c2d7ca /chrome/browser/extensions | |
parent | 4289d9b66a1453aad1115f6ede0007faab22d6d4 (diff) | |
download | chromium_src-bbc94554729407f821d4a60828c5758a112f042a.zip chromium_src-bbc94554729407f821d4a60828c5758a112f042a.tar.gz chromium_src-bbc94554729407f821d4a60828c5758a112f042a.tar.bz2 |
add mole info to toolstrip definition and enable moles
Review URL: http://codereview.chromium.org/159202
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21621 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 54 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.h | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_shelf_model.cc | 52 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_shelf_model.h | 16 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service_unittest.cc | 9 |
5 files changed, 93 insertions, 43 deletions
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 21acf4f..276a432 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -25,6 +25,7 @@ #include "chrome/common/notification_service.h" #include "chrome/common/pref_names.h" #include "chrome/common/pref_service.h" +#include "chrome/common/render_messages.h" #include "grit/browser_resources.h" #include "grit/generated_resources.h" @@ -139,6 +140,11 @@ void ExtensionHost::CreateRenderView(RenderWidgetHostView* host_view) { Details<ExtensionHost>(this)); } +void ExtensionHost::NavigateToURL(const GURL& url) { + url_ = url; + render_view_host_->NavigateToURL(url_); +} + void ExtensionHost::RecoverCrashedExtension() { DCHECK(!IsRenderViewLive()); #if defined(TOOLKIT_VIEWS) @@ -177,13 +183,41 @@ void ExtensionHost::RenderViewGone(RenderViewHost* render_view_host) { Details<ExtensionHost>(this)); } +void ExtensionHost::DidNavigate(RenderViewHost* render_view_host, + const ViewHostMsg_FrameNavigate_Params& params) { + // We only care when the outer frame changes. + switch (params.transition) { + case PageTransition::AUTO_SUBFRAME: + case PageTransition::MANUAL_SUBFRAME: + return; + } + + url_ = params.url; + extension_function_dispatcher_.reset( + new ExtensionFunctionDispatcher(render_view_host_, this, url_)); +} + void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) { - // TODO(aa): This is toolstrip-specific and should probably not be here. - // ExtensionToolstrip in bookmark_bar_view.cc? - static const StringPiece toolstrip_css( - ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_EXTENSIONS_TOOLSTRIP_CSS)); - render_view_host->InsertCSSInWebFrame(L"", toolstrip_css.as_string()); +#if defined(TOOLKIT_VIEWS) + ExtensionView* view = view_.get(); + if (view) { + // TODO(erikkay) this injection should really happen in the renderer. + // When the Jerry's view type change lands, investigate moving this there. + + // As a toolstrip, inject our toolstrip CSS to make it easier for toolstrips + // to blend in with the chrome UI. + if (view->is_toolstrip()) { + static const StringPiece toolstrip_css( + ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_EXTENSIONS_TOOLSTRIP_CSS)); + render_view_host->InsertCSSInWebFrame(L"", toolstrip_css.as_string()); + } else { + // No CSS injecting currently, but call SetDidInsertCSS to tell the view + // that it's OK to display. + view->SetDidInsertCSS(true); + } + } +#endif did_stop_loading_ = true; } @@ -222,11 +256,6 @@ void ExtensionHost::DidInsertCSS() { } RenderViewHostDelegate::View* ExtensionHost::GetViewDelegate() { - // TODO(erikkay) this is unfortunate. The interface declares that this method - // must be const (no good reason for it as far as I can tell) which means you - // can't return self without doing this const_cast. Either we need to change - // the interface, or we need to split out the view delegate into another - // object (which is how TabContents works). return this; } @@ -253,7 +282,6 @@ void ExtensionHost::ShowCreatedWindow(int route_id, DCHECK(browser); if (!browser) return; - // TODO(erikkay) is it safe to pass in NULL as source? browser->AddTabContents(contents, disposition, initial_pos, user_gesture); } @@ -324,6 +352,4 @@ Browser* ExtensionHost::GetBrowser() { } void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) { - extension_function_dispatcher_.reset( - new ExtensionFunctionDispatcher(render_view_host_, this, url_)); } diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h index e94648a..66290e3 100644 --- a/chrome/browser/extensions/extension_host.h +++ b/chrome/browser/extensions/extension_host.h @@ -61,6 +61,9 @@ class ExtensionHost : public RenderViewHostDelegate, // NULL). void CreateRenderView(RenderWidgetHostView* host_view); + // Sets |url_| and navigates |render_view_host_|. + void NavigateToURL(const GURL& url); + // Restarts extension's renderer process. Can be called only if the renderer // process crashed. void RecoverCrashedExtension(); @@ -70,6 +73,8 @@ class ExtensionHost : public RenderViewHostDelegate, virtual const GURL& GetURL() const { return url_; } virtual void RenderViewCreated(RenderViewHost* render_view_host); virtual void RenderViewGone(RenderViewHost* render_view_host); + virtual void DidNavigate(RenderViewHost* render_view_host, + const ViewHostMsg_FrameNavigate_Params& params); virtual void DidStopLoading(RenderViewHost* render_view_host); virtual WebPreferences GetWebkitPrefs(); virtual void ProcessDOMUIMessage(const std::string& message, diff --git a/chrome/browser/extensions/extension_shelf_model.cc b/chrome/browser/extensions/extension_shelf_model.cc index 05f848a..1449d97 100644 --- a/chrome/browser/extensions/extension_shelf_model.cc +++ b/chrome/browser/extensions/extension_shelf_model.cc @@ -42,7 +42,9 @@ ExtensionShelfModel::~ExtensionShelfModel() { while (observers_.size()) observers_.RemoveObserver(observers_.GetElementAt(0)); - STLDeleteContainerPairFirstPointers(toolstrips_.begin(), toolstrips_.end()); + ExtensionToolstrips::iterator t; + for (t = toolstrips_.begin(); t != toolstrips_.end(); ++t) + delete t->host; toolstrips_.clear(); } @@ -55,27 +57,25 @@ void ExtensionShelfModel::RemoveObserver( observers_.RemoveObserver(observer); } -void ExtensionShelfModel::AppendToolstrip(ExtensionHost* toolstrip) { - InsertToolstripAt(count(), toolstrip, NULL); +void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { + InsertToolstripAt(count(), toolstrip); } void ExtensionShelfModel::InsertToolstripAt(int index, - ExtensionHost* toolstrip, - void* data) { - toolstrips_.insert(toolstrips_.begin() + index, - ToolstripItem(toolstrip, data)); + const ToolstripItem& toolstrip) { + toolstrips_.insert(toolstrips_.begin() + index, toolstrip); if (ready_) { FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, - ToolstripInsertedAt(toolstrip, index)); + ToolstripInsertedAt(toolstrip.host, index)); } } void ExtensionShelfModel::RemoveToolstripAt(int index) { - ExtensionHost* toolstrip = ToolstripAt(index); + ExtensionHost* host = ToolstripAt(index); FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, - ToolstripRemovingAt(toolstrip, index)); + ToolstripRemovingAt(host, index)); toolstrips_.erase(toolstrips_.begin() + index); - delete toolstrip; + delete host; } void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { @@ -89,7 +89,7 @@ void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, - ToolstripMoved(toolstrip.first, index, to_index)); + ToolstripMoved(toolstrip.host, index, to_index)); UpdatePrefs(); } @@ -97,7 +97,7 @@ void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) { ExtensionToolstrips::iterator i; for (i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { - if (i->first == toolstrip) + if (i->host == toolstrip) return i - toolstrips_.begin(); } return -1; @@ -105,17 +105,22 @@ int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) { ExtensionHost* ExtensionShelfModel::ToolstripAt(int index) { DCHECK(index >= 0); - return toolstrips_[index].first; + return toolstrips_[index].host; +} + +Extension::ToolstripInfo& ExtensionShelfModel::ToolstripInfoAt(int index) { + DCHECK(index >= 0); + return toolstrips_[index].info; } void* ExtensionShelfModel::ToolstripDataAt(int index) { DCHECK(index >= 0); - return toolstrips_[index].second; + return toolstrips_[index].data; } void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { DCHECK(index >= 0); - toolstrips_[index].second = data; + toolstrips_[index].data = data; } void ExtensionShelfModel::Observe(NotificationType type, @@ -154,12 +159,15 @@ void ExtensionShelfModel::AddExtension(Extension* extension) { if (!manager) return; - for (std::vector<std::string>::const_iterator toolstrip_path = + for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = extension->toolstrips().begin(); - toolstrip_path != extension->toolstrips().end(); ++toolstrip_path) { - GURL url = extension->GetResourceURL(*toolstrip_path); - ExtensionHost* host = manager->CreateView(extension, url, browser_); - AppendToolstrip(host); + toolstrip != extension->toolstrips().end(); ++toolstrip) { + GURL url = toolstrip->toolstrip; + ToolstripItem item; + item.host = manager->CreateView(extension, url, browser_); + item.info = *toolstrip; + item.data = NULL; + AppendToolstrip(item); } } @@ -215,7 +223,7 @@ void ExtensionShelfModel::SortToolstrips() { GURL& url = urls[i]; for (ExtensionToolstrips::iterator toolstrip = copy.begin(); toolstrip != copy.end(); ++toolstrip) { - if (url == (*toolstrip).first->GetURL()) { + if (url == toolstrip->host->GetURL()) { // Note that it's technically possible for the same URL to appear in // multiple toolstrips, so we don't do any testing for uniqueness. toolstrips_.push_back(*toolstrip); diff --git a/chrome/browser/extensions/extension_shelf_model.h b/chrome/browser/extensions/extension_shelf_model.h index ab2af06..28fb00b 100644 --- a/chrome/browser/extensions/extension_shelf_model.h +++ b/chrome/browser/extensions/extension_shelf_model.h @@ -56,6 +56,12 @@ class ExtensionShelfModel : public NotificationObserver { ExtensionShelfModel(Browser* browser); virtual ~ExtensionShelfModel(); + struct ToolstripItem { + ExtensionHost* host; + Extension::ToolstripInfo info; + void* data; + }; + // Add and remove observers to changes within this ExtensionShelfModel. void AddObserver(ExtensionShelfModelObserver* observer); void RemoveObserver(ExtensionShelfModelObserver* observer); @@ -65,10 +71,10 @@ class ExtensionShelfModel : public NotificationObserver { bool empty() const { return toolstrips_.empty(); } // Add |toolstrip| to the end of the shelf. - void AppendToolstrip(ExtensionHost* toolstrip); + void AppendToolstrip(const ToolstripItem& toolstrip); // Insert |toolstrip| and |data| at |index|. - void InsertToolstripAt(int index, ExtensionHost* toolstrip, void* data); + void InsertToolstripAt(int index, const ToolstripItem& toolstrip); // Remove the toolstrip at |index|. void RemoveToolstripAt(int index); @@ -79,9 +85,12 @@ class ExtensionShelfModel : public NotificationObserver { // Lookup the index of |toolstrip|. Returns -1 if not present. int IndexOfToolstrip(ExtensionHost* toolstrip); - // Return the toolstrip at |index|. Returns NULL if index is out of range. + // Return the toolstrip at |index|. ExtensionHost* ToolstripAt(int index); + // Return the ToolstripInfo at |index|. + Extension::ToolstripInfo& ToolstripInfoAt(int index); + // Get/Set some arbitrary data associated with a particular toolstrip. void SetToolstripDataAt(int index, void* data); void* ToolstripDataAt(int index); @@ -117,7 +126,6 @@ class ExtensionShelfModel : public NotificationObserver { NotificationRegistrar registrar_; // The Toolstrips loaded in this model. The model owns these objects. - typedef std::pair<ExtensionHost*, void*> ToolstripItem; typedef std::vector<ToolstripItem> ExtensionToolstrips; ExtensionToolstrips toolstrips_; diff --git a/chrome/browser/extensions/extensions_service_unittest.cc b/chrome/browser/extensions/extensions_service_unittest.cc index 57799fa..99e43ea 100644 --- a/chrome/browser/extensions/extensions_service_unittest.cc +++ b/chrome/browser/extensions/extensions_service_unittest.cc @@ -531,7 +531,8 @@ TEST_F(ExtensionsServiceTest, LoadAllExtensionsFromDirectorySuccess) { Extension* extension = loaded_[0]; const UserScriptList& scripts = extension->content_scripts(); - const std::vector<std::string>& toolstrips = extension->toolstrips(); + const std::vector<Extension::ToolstripInfo>& toolstrips = + extension->toolstrips(); ASSERT_EQ(2u, scripts.size()); EXPECT_EQ(3u, scripts[0].url_patterns().size()); EXPECT_EQ("file://*", @@ -561,8 +562,10 @@ TEST_F(ExtensionsServiceTest, LoadAllExtensionsFromDirectorySuccess) { EXPECT_EQ("http://*.google.com/*", permissions[0].GetAsString()); EXPECT_EQ("https://*.google.com/*", permissions[1].GetAsString()); ASSERT_EQ(2u, toolstrips.size()); - EXPECT_EQ("toolstrip1.html", toolstrips[0]); - EXPECT_EQ("toolstrip2.html", toolstrips[1]); + EXPECT_EQ(extension->GetResourceURL("toolstrip1.html"), + toolstrips[0].toolstrip); + EXPECT_EQ(extension->GetResourceURL("toolstrip2.html"), + toolstrips[1].toolstrip); EXPECT_EQ(std::string(good1), loaded_[1]->id()); EXPECT_EQ(std::string("My extension 2"), loaded_[1]->name()); |