summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authorerikkay@chromium.org <erikkay@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-26 00:11:42 +0000
committererikkay@chromium.org <erikkay@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-26 00:11:42 +0000
commitbbc94554729407f821d4a60828c5758a112f042a (patch)
treefa92103aa16e6ff04e90206c6ac99710c3c2d7ca /chrome/browser/extensions
parent4289d9b66a1453aad1115f6ede0007faab22d6d4 (diff)
downloadchromium_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.cc54
-rw-r--r--chrome/browser/extensions/extension_host.h5
-rw-r--r--chrome/browser/extensions/extension_shelf_model.cc52
-rw-r--r--chrome/browser/extensions/extension_shelf_model.h16
-rw-r--r--chrome/browser/extensions/extensions_service_unittest.cc9
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());