summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/browser_resources.grd3
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc6
-rw-r--r--chrome/browser/extensions/extension_host.cc34
-rw-r--r--chrome/browser/extensions/extension_host.h3
-rw-r--r--chrome/browser/extensions/extension_infobar_delegate.cc60
-rw-r--r--chrome/browser/extensions/extension_infobar_delegate.h59
-rw-r--r--chrome/browser/extensions/extension_infobar_module.cc61
-rw-r--r--chrome/browser/extensions/extension_infobar_module.h16
-rw-r--r--chrome/browser/extensions/extension_infobar_module_constants.cc15
-rw-r--r--chrome/browser/extensions/extension_infobar_module_constants.h22
-rw-r--r--chrome/browser/extensions/extension_process_manager.cc13
-rw-r--r--chrome/browser/extensions/extension_process_manager.h7
-rw-r--r--chrome/browser/resources/extensions_infobar.css13
-rw-r--r--chrome/browser/tab_contents/infobar_delegate.h9
-rw-r--r--chrome/browser/views/infobars/extension_infobar.cc143
-rw-r--r--chrome/browser/views/infobars/extension_infobar.h57
-rw-r--r--chrome/browser/views/infobars/infobars.cc14
-rw-r--r--chrome/browser/views/infobars/infobars.h13
-rwxr-xr-xchrome/chrome_browser.gypi8
-rwxr-xr-xchrome/common/extensions/api/extension_api.json38
-rw-r--r--chrome/common/extensions/docs/experimental.html2
-rw-r--r--chrome/common/extensions/docs/experimental.infoBar.html634
-rw-r--r--chrome/common/extensions/extension.cc16
-rw-r--r--chrome/common/extensions/extension.h7
-rw-r--r--chrome/common/extensions/extension_action.h4
-rw-r--r--chrome/common/view_types.cc3
-rw-r--r--chrome/common/view_types.h4
-rw-r--r--chrome/renderer/resources/renderer_extension_bindings.js1
28 files changed, 1238 insertions, 27 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index fcf35ba..ce10283 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This comment is only here because changes to resources are not picked up
-without changes to the corresponding grd file. tet -->
+without changes to the corresponding grd file. fbt1 -->
<grit latest_public_release="0" current_release="1">
<outputs>
<output filename="grit/browser_resources.h" type="rc_header">
@@ -50,6 +50,7 @@ without changes to the corresponding grd file. tet -->
<include name="IDR_DOM_UI_CSS" file="resources\dom_ui.css" flattenhtml="true" type="BINDATA" />
<include name="IDR_EXTENSIONS_UI_HTML" file="resources\extensions_ui.html" flattenhtml="true" type="BINDATA" />
<include name="IDR_EXTENSION_DEFAULT_ICON" file="resources\extension_default_icon.png" type="BINDATA" />
+ <include name="IDR_EXTENSIONS_INFOBAR_CSS" file="resources\extensions_infobar.css" flattenhtml="true" type="BINDATA" />
<include name="IDR_EXTENSIONS_TOOLSTRIP_THEME_CSS" file="resources\extensions_toolstrip.css" flattenhtml="true" type="BINDATA" />
<include name="IDR_PRINT_TAB_HTML" file="resources\print_tab.html" flattenhtml="true" type="BINDATA" />
<include name="IDR_PRINT_TAB_CSS" file="resources\print_tab.css" type="BINDATA" />
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 6d47016..1e6bee1 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -20,6 +20,7 @@
#include "chrome/browser/extensions/extension_history_api.h"
#include "chrome/browser/extensions/extension_idle_api.h"
#include "chrome/browser/extensions/extension_i18n_api.h"
+#include "chrome/browser/extensions/extension_infobar_module.h"
#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/extension_metrics_module.h"
#include "chrome/browser/extensions/extension_page_actions_module.h"
@@ -138,6 +139,9 @@ void FactoryRegistry::ResetFunctions() {
RegisterFunction<MoveBookmarkFunction>();
RegisterFunction<UpdateBookmarkFunction>();
+ // Infobars.
+ RegisterFunction<ShowInfoBarFunction>();
+
// BookmarkManager
RegisterFunction<CopyBookmarkManagerFunction>();
RegisterFunction<CutBookmarkManagerFunction>();
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index e2d86da..2470969 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -326,6 +326,17 @@ void ExtensionHost::DidNavigate(RenderViewHost* render_view_host,
new ExtensionFunctionDispatcher(render_view_host_, this, url_));
}
+void ExtensionHost::InsertInfobarCSS() {
+ DCHECK(!is_background_page());
+
+ static const base::StringPiece css(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_EXTENSIONS_INFOBAR_CSS));
+
+ render_view_host()->InsertCSSInWebFrame(
+ L"", css.as_string(), "InfobarThemeCSS");
+}
+
void ExtensionHost::InsertThemeCSS() {
DCHECK(!is_background_page());
@@ -367,7 +378,8 @@ void ExtensionHost::DidStopLoading() {
did_stop_loading_ = true;
if (extension_host_type_ == ViewType::EXTENSION_TOOLSTRIP ||
extension_host_type_ == ViewType::EXTENSION_MOLE ||
- extension_host_type_ == ViewType::EXTENSION_POPUP) {
+ extension_host_type_ == ViewType::EXTENSION_POPUP ||
+ extension_host_type_ == ViewType::EXTENSION_INFOBAR) {
#if defined(TOOLKIT_VIEWS)
if (view_.get())
view_->DidStopLoading();
@@ -388,6 +400,9 @@ void ExtensionHost::DidStopLoading() {
} else if (extension_host_type_ == ViewType::EXTENSION_TOOLSTRIP) {
UMA_HISTOGRAM_TIMES("Extensions.ToolstripLoadTime",
since_created_.Elapsed());
+ } else if (extension_host_type_ == ViewType::EXTENSION_INFOBAR) {
+ UMA_HISTOGRAM_TIMES("Extensions.InfobarLoadTime",
+ since_created_.Elapsed());
}
}
}
@@ -402,7 +417,10 @@ void ExtensionHost::DocumentAvailableInMainFrame(RenderViewHost* rvh) {
if (is_background_page()) {
extension_->SetBackgroundPageReady();
} else {
- InsertThemeCSS();
+ if (extension_host_type_ == ViewType::EXTENSION_INFOBAR)
+ InsertInfobarCSS();
+ else
+ InsertThemeCSS();
// Listen for browser changes so we can resend the CSS.
registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
@@ -464,7 +482,8 @@ void ExtensionHost::OnMessageBoxClosed(IPC::Message* reply_msg,
}
void ExtensionHost::Close(RenderViewHost* render_view_host) {
- if (extension_host_type_ == ViewType::EXTENSION_POPUP) {
+ if (extension_host_type_ == ViewType::EXTENSION_POPUP ||
+ extension_host_type_ == ViewType::EXTENSION_INFOBAR) {
NotificationService::current()->Notify(
NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE,
Source<Profile>(profile_),
@@ -483,7 +502,8 @@ WebPreferences ExtensionHost::GetWebkitPrefs() {
const bool kIsDomUI = true;
WebPreferences webkit_prefs =
RenderViewHostDelegateHelper::GetWebkitPrefs(profile, kIsDomUI);
- if (extension_host_type_ == ViewType::EXTENSION_POPUP)
+ if (extension_host_type_ == ViewType::EXTENSION_POPUP ||
+ extension_host_type_ == ViewType::EXTENSION_INFOBAR)
webkit_prefs.allow_scripts_to_close_windows = true;
return webkit_prefs;
}
@@ -685,7 +705,8 @@ void ExtensionHost::RenderViewCreated(RenderViewHost* render_view_host) {
if (extension_host_type_ == ViewType::EXTENSION_TOOLSTRIP ||
extension_host_type_ == ViewType::EXTENSION_MOLE ||
- extension_host_type_ == ViewType::EXTENSION_POPUP) {
+ extension_host_type_ == ViewType::EXTENSION_POPUP ||
+ extension_host_type_ == ViewType::EXTENSION_INFOBAR) {
render_view_host->Send(new ViewMsg_EnablePreferredSizeChangedMode(
render_view_host->routing_id()));
}
@@ -697,7 +718,8 @@ int ExtensionHost::GetBrowserWindowID() const {
int window_id = -1;
if (extension_host_type_ == ViewType::EXTENSION_TOOLSTRIP ||
extension_host_type_ == ViewType::EXTENSION_MOLE ||
- extension_host_type_ == ViewType::EXTENSION_POPUP) {
+ extension_host_type_ == ViewType::EXTENSION_POPUP ||
+ extension_host_type_ == ViewType::EXTENSION_INFOBAR) {
// If the host is bound to a browser, then extract its window id.
// Extensions hosted in ExternalTabContainer objects may not have
// an associated browser.
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index 4cdc8cf..6d442fa 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -97,6 +97,9 @@ class ExtensionHost : public ExtensionPopupHost::PopupDelegate,
// Sets |url_| and navigates |render_view_host_|.
void NavigateToURL(const GURL& url);
+ // Insert a default style sheet for Extension InfoBars.
+ void InsertInfobarCSS();
+
// Insert the theme CSS for a toolstrip/mole.
void InsertThemeCSS();
diff --git a/chrome/browser/extensions/extension_infobar_delegate.cc b/chrome/browser/extensions/extension_infobar_delegate.cc
new file mode 100644
index 0000000..0c7323a
--- /dev/null
+++ b/chrome/browser/extensions/extension_infobar_delegate.cc
@@ -0,0 +1,60 @@
+// Copyright (c) 2010 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/extensions/extension_infobar_delegate.h"
+
+#include "chrome/browser/browser.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/extensions/extension_host.h"
+#include "chrome/browser/extensions/extension_process_manager.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/notification_details.h"
+#include "chrome/common/notification_source.h"
+#include "chrome/common/notification_type.h"
+
+ExtensionInfoBarDelegate::ExtensionInfoBarDelegate(Browser* browser,
+ TabContents* tab_contents,
+ Extension* extension,
+ const GURL& url)
+ : InfoBarDelegate(tab_contents),
+ extension_(extension),
+ tab_contents_(tab_contents) {
+ ExtensionProcessManager* manager =
+ browser->profile()->GetExtensionProcessManager();
+ extension_host_.reset(manager->CreateInfobar(url, browser));
+
+ registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE,
+ Source<Profile>(browser->profile()));
+}
+
+ExtensionInfoBarDelegate::~ExtensionInfoBarDelegate() {
+}
+
+bool ExtensionInfoBarDelegate::EqualsDelegate(InfoBarDelegate* delegate) const {
+ ExtensionInfoBarDelegate* extension_delegate =
+ delegate->AsExtensionInfoBarDelegate();
+ // Only allow one InfoBar at a time per extension.
+ return extension_delegate->extension_host()->extension() ==
+ extension_host_->extension();
+}
+
+void ExtensionInfoBarDelegate::InfoBarClosed() {
+ delete this;
+}
+
+#if !defined(TOOLKIT_VIEWS)
+InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() {
+ NOTIMPLEMENTED();
+ return NULL;
+}
+#endif // !TOOLKIT_VIEWS
+
+void ExtensionInfoBarDelegate::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(type == NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE);
+ const ExtensionHost* result = Details<ExtensionHost>(details).ptr();
+ if (extension_host_.get() == result)
+ tab_contents_->RemoveInfoBar(this);
+}
diff --git a/chrome/browser/extensions/extension_infobar_delegate.h b/chrome/browser/extensions/extension_infobar_delegate.h
new file mode 100644
index 0000000..485b288
--- /dev/null
+++ b/chrome/browser/extensions/extension_infobar_delegate.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2010 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_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_
+
+#include "chrome/browser/tab_contents/infobar_delegate.h"
+
+class Browser;
+class Extension;
+class ExtensionHost;
+class TabContents;
+
+// An interface derived from InfoBarDelegate to form the base interface for
+// extension InfoBars.
+class ExtensionInfoBarDelegate : public InfoBarDelegate,
+ public NotificationObserver {
+ public:
+ ExtensionInfoBarDelegate(Browser* browser, TabContents* contents,
+ Extension* extension, const GURL& url);
+ ~ExtensionInfoBarDelegate();
+
+ Extension* extension() { return extension_; }
+ ExtensionHost* extension_host() { return extension_host_.get(); }
+
+ // Overridden from InfoBarDelegate:
+ virtual bool EqualsDelegate(InfoBarDelegate* delegate) const;
+ virtual void InfoBarClosed();
+ virtual InfoBar* CreateInfoBar();
+ virtual ExtensionInfoBarDelegate* AsExtensionInfoBarDelegate() {
+ return this;
+ }
+ virtual Type GetInfoBarType() {
+ return PAGE_ACTION_TYPE;
+ }
+
+ // Overridden from NotificationObserver:
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ private:
+ // The extension host we are showing the InfoBar for. The delegate needs to
+ // own this since the InfoBar gets deleted and recreated when you switch tabs
+ // and come back (and we don't want the user's interaction with the InfoBar to
+ // get lost at that point.
+ scoped_ptr<ExtensionHost> extension_host_;
+
+ Extension* extension_;
+
+ TabContents* tab_contents_;
+
+ NotificationRegistrar registrar_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionInfoBarDelegate);
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_DELEGATE_H_
diff --git a/chrome/browser/extensions/extension_infobar_module.cc b/chrome/browser/extensions/extension_infobar_module.cc
new file mode 100644
index 0000000..491b278
--- /dev/null
+++ b/chrome/browser/extensions/extension_infobar_module.cc
@@ -0,0 +1,61 @@
+// Copyright (c) 2010 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/extensions/extension_infobar_module.h"
+
+#include "app/l10n_util.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/extensions/extension_infobar_module_constants.h"
+#include "chrome/browser/extensions/extension_infobar_delegate.h"
+#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tabs_module_constants.h"
+#include "chrome/browser/tab_contents/infobar_delegate.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/url_constants.h"
+#include "grit/generated_resources.h"
+
+namespace keys = extension_infobar_module_constants;
+
+bool ShowInfoBarFunction::RunImpl() {
+ EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
+ const DictionaryValue* args = args_as_dictionary();
+
+ std::string html_path;
+ EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kHtmlPath, &html_path));
+
+ GURL url = GURL(std::string(chrome::kExtensionScheme) +
+ chrome::kStandardSchemeSeparator +
+ extension_id() + "/" + html_path);
+
+ Browser* browser = dispatcher()->GetBrowser(true);
+ if (!browser) {
+ error_ = keys::kNoCurrentWindowError;
+ return false;
+ }
+
+ TabContents* tab_contents = NULL;
+ if (args->HasKey(keys::kTabId)) {
+ int tab_id = -1;
+ EXTENSION_FUNCTION_VALIDATE(args->GetInteger(keys::kTabId, &tab_id));
+
+ EXTENSION_FUNCTION_VALIDATE(ExtensionTabUtil::GetTabById(
+ tab_id, browser->profile(), false, // No incognito.
+ NULL, NULL, &tab_contents, NULL));
+ } else {
+ tab_contents = browser->GetSelectedTabContents();
+ }
+
+ if (!tab_contents) {
+ error_ = keys::kTabNotFoundError;
+ return false;
+ }
+
+ tab_contents->AddInfoBar(
+ new ExtensionInfoBarDelegate(browser, tab_contents, GetExtension(), url));
+
+ // TODO(finnur): Return the actual DOMWindow object. Bug 26463.
+ result_.reset(ExtensionTabUtil::CreateWindowValue(browser, false));
+
+ return true;
+}
diff --git a/chrome/browser/extensions/extension_infobar_module.h b/chrome/browser/extensions/extension_infobar_module.h
new file mode 100644
index 0000000..3414b19
--- /dev/null
+++ b/chrome/browser/extensions/extension_infobar_module.h
@@ -0,0 +1,16 @@
+// Copyright (c) 2010 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_EXTENSIONS_EXTENSION_INFOBAR_MODULE_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_MODULE_H_
+
+#include "chrome/browser/extensions/extension_function.h"
+
+class ShowInfoBarFunction : public SyncExtensionFunction {
+ ~ShowInfoBarFunction() {}
+ virtual bool RunImpl();
+ DECLARE_EXTENSION_FUNCTION_NAME("experimental.infoBar.show")
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_MODULE_H_
diff --git a/chrome/browser/extensions/extension_infobar_module_constants.cc b/chrome/browser/extensions/extension_infobar_module_constants.cc
new file mode 100644
index 0000000..d628c48
--- /dev/null
+++ b/chrome/browser/extensions/extension_infobar_module_constants.cc
@@ -0,0 +1,15 @@
+// Copyright (c) 2010 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/extensions/extension_infobar_module_constants.h"
+
+namespace extension_infobar_module_constants {
+
+const wchar_t kHtmlPath[] = L"htmlPath";
+const wchar_t kTabId[] = L"tabId";
+
+const char kNoCurrentWindowError[] = "No current browser window was found";
+const char kTabNotFoundError[] = "Specified tab (or default tab) not found";
+
+} // namespace extension_infobar_module_constants
diff --git a/chrome/browser/extensions/extension_infobar_module_constants.h b/chrome/browser/extensions/extension_infobar_module_constants.h
new file mode 100644
index 0000000..4af86b8
--- /dev/null
+++ b/chrome/browser/extensions/extension_infobar_module_constants.h
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 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.
+
+// Constants used for the InfoBar API.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_MODULE_CONSTANTS_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_MODULE_CONSTANTS_H_
+
+namespace extension_infobar_module_constants {
+
+// Keys.
+extern const wchar_t kHtmlPath[];
+extern const wchar_t kTabId[];
+
+// Errors.
+extern const char kNoCurrentWindowError[];
+extern const char kTabNotFoundError[];
+
+}; // namespace extension_infobar_module_constants
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INFOBAR_MODULE_CONSTANTS_H_
diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc
index 410165f..7432102 100644
--- a/chrome/browser/extensions/extension_process_manager.cc
+++ b/chrome/browser/extensions/extension_process_manager.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -119,6 +119,17 @@ ExtensionHost* ExtensionProcessManager::CreatePopup(const GURL& url,
return CreateView(url, browser, ViewType::EXTENSION_POPUP);
}
+ExtensionHost* ExtensionProcessManager::CreateInfobar(Extension* extension,
+ const GURL& url,
+ Browser* browser) {
+ return CreateView(extension, url, browser, ViewType::EXTENSION_INFOBAR);
+}
+
+ExtensionHost* ExtensionProcessManager::CreateInfobar(const GURL& url,
+ Browser* browser) {
+ return CreateView(url, browser, ViewType::EXTENSION_INFOBAR);
+}
+
ExtensionHost* ExtensionProcessManager::CreateBackgroundHost(
Extension* extension, const GURL& url) {
ExtensionHost* host =
diff --git a/chrome/browser/extensions/extension_process_manager.h b/chrome/browser/extensions/extension_process_manager.h
index d002cb9..64061c0 100644
--- a/chrome/browser/extensions/extension_process_manager.h
+++ b/chrome/browser/extensions/extension_process_manager.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -50,6 +50,11 @@ class ExtensionProcessManager : public NotificationObserver {
const GURL& url,
Browser* browser);
ExtensionHost* CreatePopup(const GURL& url, Browser* browser);
+ ExtensionHost* CreateInfobar(Extension* extension,
+ const GURL& url,
+ Browser* browser);
+ ExtensionHost* CreateInfobar(const GURL& url,
+ Browser* browser);
// Creates a new UI-less extension instance. Like CreateView, but not
// displayed anywhere.
diff --git a/chrome/browser/resources/extensions_infobar.css b/chrome/browser/resources/extensions_infobar.css
new file mode 100644
index 0000000..dcf4303
--- /dev/null
+++ b/chrome/browser/resources/extensions_infobar.css
@@ -0,0 +1,13 @@
+/**
+ * The following style rules affect Extension Infobars.
+ */
+
+body {
+ background: -webkit-gradient(linear, left top, left bottom,
+ from(#DAE7F9), to(#B5CBE8));
+ font-family: Segoe UI, Tahoma;
+ font-size: 11px;
+ height: 36px; /* Infobars are limited to 36-72px */
+ margin: 0px;
+ overflow: hidden;
+}
diff --git a/chrome/browser/tab_contents/infobar_delegate.h b/chrome/browser/tab_contents/infobar_delegate.h
index fcaa621..41e09ce 100644
--- a/chrome/browser/tab_contents/infobar_delegate.h
+++ b/chrome/browser/tab_contents/infobar_delegate.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -14,6 +14,7 @@
class AlertInfoBarDelegate;
class ConfirmInfoBarDelegate;
class CrashedExtensionInfoBarDelegate;
+class ExtensionInfoBarDelegate;
class TranslateInfoBarDelegate;
class InfoBar;
class LinkInfoBarDelegate;
@@ -111,6 +112,12 @@ class InfoBarDelegate {
return NULL;
}
+ // Returns a pointer to the ExtensionInfoBarDelegate interface, if
+ // implemented.
+ virtual ExtensionInfoBarDelegate* AsExtensionInfoBarDelegate() {
+ return NULL;
+ }
+
// Returns a pointer to the CrashedExtensionInfoBarDelegate interface, if
// implemented.
virtual CrashedExtensionInfoBarDelegate* AsCrashedExtensionInfoBarDelegate() {
diff --git a/chrome/browser/views/infobars/extension_infobar.cc b/chrome/browser/views/infobars/extension_infobar.cc
new file mode 100644
index 0000000..70f3f7f
--- /dev/null
+++ b/chrome/browser/views/infobars/extension_infobar.cc
@@ -0,0 +1,143 @@
+// Copyright (c) 2010 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/views/infobars/extension_infobar.h"
+
+#include "app/gfx/canvas.h"
+#include "app/resource_bundle.h"
+#include "app/slide_animation.h"
+#include "chrome/browser/extensions/extension_action_context_menu_model.h"
+#include "chrome/browser/extensions/extension_infobar_delegate.h"
+#include "chrome/browser/extensions/extension_host.h"
+#include "chrome/common/extensions/extension.h"
+#include "grit/browser_resources.h"
+#include "grit/theme_resources.h"
+#include "views/controls/button/menu_button.h"
+#include "views/controls/menu/menu_2.h"
+
+// The horizontal margin between the menu and the Extension (HTML) view.
+static const int kMenuHorizontalMargin = 1;
+
+// The amount of space to the right of the Extension (HTML) view (to avoid
+// overlapping the close button for the InfoBar).
+static const int kFarRightMargin = 30;
+
+// The margin between the extension icon and the drop-down arrow bitmap.
+static const int kDropArrowLeftMargin = 3;
+
+ExtensionInfoBar::ExtensionInfoBar(ExtensionInfoBarDelegate* delegate)
+ : InfoBar(delegate),
+ delegate_(delegate) {
+ ExtensionHost* extension_host = delegate_->extension_host();
+
+ // We set the target height for the InfoBar to be the height of the
+ // ExtensionView it contains (plus 1 because the view should not overlap the
+ // separator line at the bottom). When the InfoBar is first created, however,
+ // this value is 0 but becomes positive after the InfoBar has been shown. See
+ // function: OnExtensionPreferredSizeChanged.
+ gfx::Size sz = extension_host->view()->GetPreferredSize();
+ if (sz.height() > 0)
+ sz.set_height(sz.height() + 1);
+ set_target_height(sz.height());
+
+ // Setup the extension icon and its associated drop down menu.
+ SetupIconAndMenu();
+
+ // Get notified of resize events for the ExtensionView.
+ extension_host->view()->SetContainer(this);
+ // We show the ExtensionView, but we don't want it deleted when we get
+ // destroyed, which happens on tab switching (for example).
+ extension_host->view()->set_parent_owned(false);
+ AddChildView(extension_host->view());
+}
+
+ExtensionInfoBar::~ExtensionInfoBar() {
+}
+
+void ExtensionInfoBar::OnExtensionPreferredSizeChanged(ExtensionView* view) {
+ DCHECK(view == delegate_->extension_host()->view());
+ delegate_->extension_host()->view()->SetVisible(true);
+
+ gfx::Size sz = view->GetPreferredSize();
+ // Clamp height to a min and a max size of between 1 and 2 InfoBars.
+ int default_height = static_cast<int>(InfoBar::kDefaultTargetHeight);
+ sz.set_height(std::max(default_height, sz.height()));
+ sz.set_height(std::min(2 * default_height, sz.height()));
+
+ if (height() == 0)
+ animation()->Reset(0.0);
+ set_target_height(sz.height());
+ animation()->Show();
+}
+
+void ExtensionInfoBar::Layout() {
+ // Layout the close button and the background.
+ InfoBar::Layout();
+
+ // Layout the extension icon + drop down menu.
+ int x = 0;
+ gfx::Size sz = menu_->GetPreferredSize();
+ menu_->SetBounds(x,
+ (height() - sz.height()) / 2,
+ sz.width(), sz.height());
+ x += sz.width() + kMenuHorizontalMargin;
+
+ // Layout the ExtensionView, showing the HTML InfoBar.
+ ExtensionView* view = delegate_->extension_host()->view();
+ view->SetBounds(x, 0, width() - x - kFarRightMargin - 1, height() - 1);
+}
+
+void ExtensionInfoBar::RunMenu(View* source, const gfx::Point& pt) {
+ if (!options_menu_contents_.get()) {
+ options_menu_contents_.reset(new ExtensionActionContextMenuModel(
+ delegate_->extension_host()->extension()));
+ }
+ options_menu_menu_.reset(new views::Menu2(options_menu_contents_.get()));
+ options_menu_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPLEFT);
+}
+
+void ExtensionInfoBar::SetupIconAndMenu() {
+ SkBitmap icon;
+
+ ExtensionResource icon_resource;
+ Extension::Icons size = delegate_->extension_host()->extension()->
+ GetIconPathAllowLargerSize(&icon_resource,
+ Extension::EXTENSION_ICON_BITTY);
+ if (!icon_resource.GetFilePath().empty()) {
+ scoped_ptr<SkBitmap> bitmap;
+ Extension::DecodeIconFromPath(icon_resource.GetFilePath(), size, &bitmap);
+ if (bitmap.get())
+ icon = *bitmap.release();
+ }
+
+ // Failure to get the path or failure to decode it causes fall-back to the
+ // default extension icon.
+ if (icon.empty()) {
+ icon = *ResourceBundle::GetSharedInstance().GetBitmapNamed(
+ IDR_EXTENSION_DEFAULT_ICON);
+ }
+
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ SkBitmap* drop_image = rb.GetBitmapNamed(IDR_APP_DROPARROW);
+ menu_ = new views::MenuButton(NULL, std::wstring(), this, false);
+
+ int image_size = Extension::EXTENSION_ICON_BITTY;
+ scoped_ptr<gfx::Canvas> canvas(
+ new gfx::Canvas(image_size + kDropArrowLeftMargin + drop_image->width(),
+ image_size, false));
+ canvas->DrawBitmapInt(icon,
+ 0, 0, icon.width(), icon.height(),
+ 0, 0, image_size, image_size,
+ false);
+ canvas->DrawBitmapInt(*drop_image,
+ image_size + kDropArrowLeftMargin,
+ image_size / 2);
+ menu_->SetIcon(canvas->ExtractBitmap());
+
+ AddChildView(menu_);
+}
+
+InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() {
+ return new ExtensionInfoBar(this);
+}
diff --git a/chrome/browser/views/infobars/extension_infobar.h b/chrome/browser/views/infobars/extension_infobar.h
new file mode 100644
index 0000000..0f0a64c
--- /dev/null
+++ b/chrome/browser/views/infobars/extension_infobar.h
@@ -0,0 +1,57 @@
+// Copyright (c) 2010 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_VIEWS_INFOBARS_EXTENSION_INFOBAR_H_
+#define CHROME_BROWSER_VIEWS_INFOBARS_EXTENSION_INFOBAR_H_
+
+#include "chrome/browser/views/infobars/infobars.h"
+
+#include "chrome/browser/views/extensions/extension_view.h"
+#include "views/controls/menu/view_menu_delegate.h"
+
+class ExtensionActionContextMenuModel;
+class ExtensionInfoBarDelegate;
+
+namespace views {
+ class MenuButton;
+ class Menu2;
+}
+
+// This class implements InfoBars for Extensions.
+class ExtensionInfoBar : public InfoBar,
+ public ExtensionView::Container,
+ public views::ViewMenuDelegate {
+ public:
+ explicit ExtensionInfoBar(ExtensionInfoBarDelegate* delegate);
+ virtual ~ExtensionInfoBar();
+
+ // Overridden from ExtensionView::Container:
+ virtual void OnExtensionMouseEvent(ExtensionView* view) {}
+ virtual void OnExtensionMouseLeave(ExtensionView* view) {}
+ virtual void OnExtensionPreferredSizeChanged(ExtensionView* view);
+
+ // Overridden from views::View:
+ virtual void Layout();
+
+ // Overridden from views::ViewMenuDelegate:
+ virtual void RunMenu(View* source, const gfx::Point& pt);
+
+ private:
+ // Setup the menu button showing the small extension icon and its dropdown
+ // menu.
+ void SetupIconAndMenu();
+
+ NotificationRegistrar notification_registrar_;
+
+ ExtensionInfoBarDelegate* delegate_;
+
+ // The dropdown menu for accessing the contextual extension actions.
+ scoped_ptr<ExtensionActionContextMenuModel> options_menu_contents_;
+ scoped_ptr<views::Menu2> options_menu_menu_;
+ views::MenuButton* menu_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionInfoBar);
+};
+
+#endif // CHROME_BROWSER_VIEWS_INFOBARS_EXTENSION_INFOBAR_H_
diff --git a/chrome/browser/views/infobars/infobars.cc b/chrome/browser/views/infobars/infobars.cc
index f70288e..6ddffc3 100644
--- a/chrome/browser/views/infobars/infobars.cc
+++ b/chrome/browser/views/infobars/infobars.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -25,7 +25,7 @@
#include "views/widget/widget.h"
// static
-const double InfoBar::kTargetHeight = 36.0;
+const double InfoBar::kDefaultTargetHeight = 36.0;
const int InfoBar::kHorizontalPadding = 6;
const int InfoBar::kIconLabelSpacing = 6;
const int InfoBar::kButtonButtonSpacing = 10;
@@ -107,7 +107,8 @@ InfoBar::InfoBar(InfoBarDelegate* delegate)
: delegate_(delegate),
ALLOW_THIS_IN_INITIALIZER_LIST(
close_button_(new views::ImageButton(this))),
- ALLOW_THIS_IN_INITIALIZER_LIST(delete_factory_(this)) {
+ ALLOW_THIS_IN_INITIALIZER_LIST(delete_factory_(this)),
+ target_height_(kDefaultTargetHeight) {
// We delete ourselves when we're removed from the view hierarchy.
set_parent_owned(false);
@@ -167,7 +168,7 @@ void InfoBar::Close() {
// InfoBar, views::View overrides: ---------------------------------------------
gfx::Size InfoBar::GetPreferredSize() {
- int height = static_cast<int>(kTargetHeight * animation_->GetCurrentValue());
+ int height = static_cast<int>(target_height_ * animation_->GetCurrentValue());
return gfx::Size(0, height);
}
@@ -200,13 +201,13 @@ void InfoBar::RemoveInfoBar() const {
}
int InfoBar::CenterY(const gfx::Size prefsize) {
- return std::max((static_cast<int>(InfoBar::kTargetHeight) -
+ return std::max((static_cast<int>(target_height_) -
prefsize.height()) / 2, 0);
}
int InfoBar::OffsetY(views::View* parent, const gfx::Size prefsize) {
return CenterY(prefsize) -
- (static_cast<int>(InfoBar::kTargetHeight) - parent->height());
+ (static_cast<int>(target_height_) - parent->height());
}
// InfoBar, views::ButtonListener implementation: ------------------
@@ -295,7 +296,6 @@ AlertInfoBar::AlertInfoBar(AlertInfoBarDelegate* delegate)
}
AlertInfoBar::~AlertInfoBar() {
-
}
// AlertInfoBar, views::View overrides: ----------------------------------------
diff --git a/chrome/browser/views/infobars/infobars.h b/chrome/browser/views/infobars/infobars.h
index 970b1ab..7d04904 100644
--- a/chrome/browser/views/infobars/infobars.h
+++ b/chrome/browser/views/infobars/infobars.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -52,9 +52,9 @@ class InfoBar : public views::View,
// is called.
void Close();
- // The target height of the infobar, regardless of what its current height
+ // The target height of the InfoBar, regardless of what its current height
// is (due to animation).
- static const double kTargetHeight;
+ static const double kDefaultTargetHeight;
static const int kHorizontalPadding;
static const int kIconLabelSpacing;
@@ -81,6 +81,10 @@ class InfoBar : public views::View,
// (Will lead to this InfoBar being closed).
void RemoveInfoBar() const;
+ void set_target_height(double height) { target_height_ = height; }
+
+ SlideAnimation* animation() { return animation_.get(); }
+
// Returns a centered y-position of a control of height specified in
// |prefsize| within the standard InfoBar height. Stable during an animation.
int CenterY(const gfx::Size prefsize);
@@ -132,6 +136,9 @@ class InfoBar : public views::View,
// Used to delete this object after a return to the message loop.
ScopedRunnableMethodFactory<InfoBar> delete_factory_;
+ // The target height for the InfoBar.
+ double target_height_;
+
DISALLOW_COPY_AND_ASSIGN(InfoBar);
};
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index f3058c9..7b80752 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -940,6 +940,12 @@
'browser/extensions/extension_idle_api_constants.h',
'browser/extensions/extension_i18n_api.cc',
'browser/extensions/extension_i18n_api.h',
+ 'browser/extensions/extension_infobar_module.cc',
+ 'browser/extensions/extension_infobar_module.h',
+ 'browser/extensions/extension_infobar_module_constants.cc',
+ 'browser/extensions/extension_infobar_module_constants.h',
+ 'browser/extensions/extension_infobar_delegate.cc',
+ 'browser/extensions/extension_infobar_delegate.h',
'browser/extensions/extension_install_ui.cc',
'browser/extensions/extension_install_ui.h',
'browser/extensions/extension_message_service.cc',
@@ -2150,6 +2156,8 @@
'browser/views/importing_progress_view.h',
'browser/views/info_bubble.cc',
'browser/views/info_bubble.h',
+ 'browser/views/infobars/extension_infobar.cc',
+ 'browser/views/infobars/extension_infobar.h',
'browser/views/infobars/infobar_container.cc',
'browser/views/infobars/infobar_container.h',
'browser/views/infobars/infobars.cc',
diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json
index c53700d..afdfc24 100755
--- a/chrome/common/extensions/api/extension_api.json
+++ b/chrome/common/extensions/api/extension_api.json
@@ -1392,6 +1392,44 @@
]
},
{
+ "namespace": "experimental.infoBar",
+ "types": [],
+ "functions": [
+ {
+ "name": "show",
+ "type": "function",
+ "description": "Shows an infobar in the specified tab.",
+ "parameters": [
+ {
+ "name": "details",
+ "type": "object",
+ "properties": {
+ "tabId": {
+ "type": "integer",
+ "description": "The tab id for the tab to display the infobar in. If not specified the current tab will be used.",
+ "optional": true
+ },
+ "htmlPath": {
+ "type": "string",
+ "description": "The html file that contains the infobar."
+ }
+ }
+ },
+ {
+ "type": "function",
+ "name": "callback",
+ "parameters": [
+ {
+ "name": "window", "$ref": "Window", "description": "Contains details about the window in which the infobar was created.",
+ "optional": true
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
"namespace": "bookmarks",
"types": [
{
diff --git a/chrome/common/extensions/docs/experimental.html b/chrome/common/extensions/docs/experimental.html
index a79f3b0..e24fd23 100644
--- a/chrome/common/extensions/docs/experimental.html
+++ b/chrome/common/extensions/docs/experimental.html
@@ -253,7 +253,7 @@ on the following experimental APIs:
</p>
<ul>
- <li><a href="experimental.history.html" js="">experimental.history</a></li><li><a href="experimental.processes.html" js="">experimental.processes</a></li>
+ <li><a href="experimental.history.html" js="">experimental.history</a></li><li><a href="experimental.infoBar.html" js="">experimental.infoBar</a></li><li><a href="experimental.processes.html" js="">experimental.processes</a></li>
</ul>
<p class="caution">
diff --git a/chrome/common/extensions/docs/experimental.infoBar.html b/chrome/common/extensions/docs/experimental.infoBar.html
new file mode 100644
index 0000000..02a86cb
--- /dev/null
+++ b/chrome/common/extensions/docs/experimental.infoBar.html
@@ -0,0 +1,634 @@
+<!DOCTYPE html><!-- This page is a placeholder for generated extensions api doc. Note:
+ 1) The <head> information in this page is significant, should be uniform
+ across api docs and should be edited only with knowledge of the
+ templating mechanism.
+ 3) All <body>.innerHTML is genereated as an rendering step. If viewed in a
+ browser, it will be re-generated from the template, json schema and
+ authored overview content.
+ 4) The <body>.innerHTML is also generated by an offline step so that this
+ page may easily be indexed by search engines.
+--><html xmlns="http://www.w3.org/1999/xhtml"><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link href="css/ApiRefStyles.css" rel="stylesheet" type="text/css">
+ <link href="css/print.css" rel="stylesheet" type="text/css" media="print">
+ <script type="text/javascript" src="../../../third_party/jstemplate/jstemplate_compiled.js">
+ </script>
+ <script type="text/javascript" src="js/api_page_generator.js"></script>
+ <script type="text/javascript" src="js/bootstrap.js"></script>
+ <title>chrome.experimental.infoBar - Google Chrome Extensions - Google Code</title></head><body> <div id="gc-container" class="labs">
+ <!-- SUBTEMPLATES: DO NOT MOVE FROM THIS LOCATION -->
+ <!-- In particular, sub-templates that recurse, must be used by allowing
+ jstemplate to make a copy of the template in this section which
+ are not operated on by way of the jsskip="true" -->
+ <div style="display:none">
+
+ <!-- VALUE -->
+ <div id="valueTemplate">
+ <dt>
+ <var>paramName</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span id="typeTemplate">
+ <span>
+ <a> Type</a>
+ </span>
+ <span>
+ <span>
+ array of <span><span></span></span>
+ </span>
+ <span>paramType</span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo">
+ Undocumented.
+ </dd>
+ <dd>
+ Description of this parameter from the json schema.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd>
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+ </div> <!-- /VALUE -->
+
+ </div> <!-- /SUBTEMPLATES -->
+
+ <a id="top"></a>
+ <div id="skipto">
+ <a href="#gc-pagecontent">Skip to page content</a>
+ <a href="#gc-toc">Skip to main navigation</a>
+ </div>
+ <!-- API HEADER -->
+ <table id="header" width="100%" cellspacing="0" border="0">
+ <tbody><tr>
+ <td valign="middle"><a href="http://code.google.com/"><img src="images/code_labs_logo.gif" height="43" width="161" alt="Google Code Labs" style="border:0; margin:0;"></a></td>
+ <td valign="middle" width="100%" style="padding-left:0.6em;">
+ <form action="http://www.google.com/cse" id="cse" style="margin-top:0.5em">
+ <div id="gsc-search-box">
+ <input type="hidden" name="cx" value="002967670403910741006:61_cvzfqtno">
+ <input type="hidden" name="ie" value="UTF-8">
+ <input type="text" name="q" value="" size="55">
+ <input class="gsc-search-button" type="submit" name="sa" value="Search">
+ <br>
+ <span class="greytext">e.g. "page action" or "tabs"</span>
+ </div>
+ </form>
+
+ <script type="text/javascript" src="http://www.google.com/jsapi"></script>
+ <script type="text/javascript">google.load("elements", "1", {packages: "transliteration"});</script>
+ <script type="text/javascript" src="http://www.google.com/coop/cse/t13n?form=cse&amp;t13n_langs=en"></script>
+ <script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse&amp;lang=en"></script>
+ </td>
+ </tr>
+ </tbody></table>
+
+ <div id="codesiteContent" class="">
+
+ <a id="gc-topnav-anchor"></a>
+ <div id="gc-topnav">
+ <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</h1>
+ <ul id="home" class="gc-topnav-tabs">
+ <li id="home_link">
+ <a href="index.html" title="Google Chrome Extensions home page">Home</a>
+ </li>
+ <li id="docs_link">
+ <a href="docs.html" title="Official Google Chrome Extensions documentation">Docs</a>
+ </li>
+ <li id="faq_link">
+ <a href="faq.html" title="Answers to frequently asked questions about Google Chrome Extensions">FAQ</a>
+ </li>
+ <li id="samples_link">
+ <a href="samples.html" title="Sample extensions (with source code)">Samples</a>
+ </li>
+ <li id="group_link">
+ <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions" title="Google Chrome Extensions developer forum">Group</a>
+ </li>
+ </ul>
+ </div> <!-- end gc-topnav -->
+
+ <div class="g-section g-tpl-170">
+ <!-- SIDENAV -->
+ <div class="g-unit g-first" id="gc-toc">
+ <ul>
+ <li><a href="getstarted.html">Getting Started</a></li>
+ <li><a href="overview.html">Overview</a></li>
+ <li><h2><a href="devguide.html">Developer's Guide</a></h2>
+ <ul>
+ <li>Browser UI
+ <ul>
+ <li><a href="browserAction.html">Browser Actions</a></li>
+ <li><a href="options.html">Options Pages</a></li>
+ <li><a href="override.html">Override Pages</a></li>
+ <li><a href="pageAction.html">Page Actions</a></li>
+ <li><a href="themes.html">Themes</a></li>
+ </ul>
+ </li>
+ <li>Browser Interaction
+ <ul>
+ <li><a href="bookmarks.html">Bookmarks</a></li>
+ <li><a href="events.html">Events</a></li>
+ <li><a href="tabs.html">Tabs</a></li>
+ <li><a href="windows.html">Windows</a></li>
+ </ul>
+ </li>
+ <li>Implementation
+ <ul>
+ <li><a href="background_pages.html">Background Pages</a></li>
+ <li><a href="content_scripts.html">Content Scripts</a></li>
+ <li><a href="xhr.html">Cross-Origin XHR</a></li>
+ <li><a href="i18n.html">Internationalization</a></li>
+ <li><a href="messaging.html">Message Passing</a></li>
+ <li><a href="npapi.html">NPAPI Plugins</a></li>
+ </ul>
+ </li>
+ <li>Finishing
+ <ul>
+ <li><a href="autoupdate.html">Autoupdating</a></li>
+ <li><a href="packaging.html">Packaging</a></li>
+ <li><a href="external_extensions.html">External Extensions</a></li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li><h2><a href="tutorials.html">Tutorials</a></h2>
+ <ul>
+ <li><a href="tut_debugging.html">Debugging</a></li>
+ </ul>
+ </li>
+ <li><h2>Reference</h2>
+ <ul>
+ <li>Formats
+ <ul>
+ <li><a href="manifest.html">Manifest Files</a></li>
+ <li><a href="match_patterns.html">Match Patterns</a></li>
+ <!-- <li>Packages (.crx)</li> -->
+ </ul>
+ </li>
+ <li><a href="api_index.html">chrome.* APIs</a></li>
+ <li><a href="api_other.html">Other APIs</a></li>
+ </ul>
+ </li>
+ <li><h2><a href="samples.html">Samples</a></h2></li>
+ </ul>
+ </div>
+
+ <div class="g-unit" id="gc-pagecontent">
+ <div id="pageTitle">
+ <h1 class="page_title">chrome.experimental.infoBar</h1>
+ </div>
+ <!-- TABLE OF CONTENTS -->
+ <div id="toc">
+ <h2>Contents</h2>
+ <ol>
+ <li style="display: none; ">
+ <a>h2Name</a>
+ <ol>
+ <li>
+ <a>h3Name</a>
+ </li>
+ </ol>
+ </li>
+ <li>
+ <a href="#apiReference">API reference: chrome.experimental.infoBar</a>
+ <ol>
+ <li style="display: none; ">
+ <a href="#properties">Properties</a>
+ <ol>
+ <li>
+ <a href="#property-anchor">propertyName</a>
+ </li>
+ </ol>
+ </li>
+ <li>
+ <a href="#methods">Methods</a>
+ <ol>
+ <li>
+ <a href="#method-show">show</a>
+ </li>
+ </ol>
+ </li>
+ <li style="display: none; ">
+ <a href="#events">Events</a>
+ <ol>
+ <li>
+ <a href="#event-anchor">eventName</a>
+ </li>
+ </ol>
+ </li>
+ <li style="display: none; ">
+ <a href="#types">Types</a>
+ <ol>
+ <li>
+ <a href="#id-anchor">id</a>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </li>
+ </ol>
+ </div>
+ <!-- /TABLE OF CONTENTS -->
+
+ <!-- STATIC CONTENT PLACEHOLDER -->
+ <div id="static"></div>
+
+ <!-- API PAGE -->
+ <div class="apiPage">
+ <a name="apiReference"></a>
+ <h2>API reference: chrome.experimental.infoBar</h2>
+
+ <!-- PROPERTIES -->
+ <div class="apiGroup" style="display: none; ">
+ <a name="properties"></a>
+ <h3 id="properties">Properties</h3>
+
+ <div>
+ <a></a>
+ <h4>getLastError</h4>
+ <div class="summary">
+ <!-- Note: intentionally longer 80 columns -->
+ <span>chrome.extension</span><span>lastError</span>
+ </div>
+ <div>
+ </div>
+ </div>
+
+ </div> <!-- /apiGroup -->
+
+ <!-- METHODS -->
+ <div class="apiGroup" id="methods">
+ <a name="methods"></a>
+ <h3>Methods</h3>
+
+ <!-- iterates over all functions -->
+ <div class="apiItem">
+ <a name="method-show"></a> <!-- method-anchor -->
+ <h4>show</h4>
+
+ <div class="summary"><span style="display: none; ">void</span>
+ <!-- Note: intentionally longer 80 columns -->
+ <span>chrome.experimental.infoBar.show</span>(<span class="null"><span style="display: none; ">, </span><span>object</span>
+ <var><span>details</span></var></span><span class="null"><span>, </span><span>function</span>
+ <var><span>callback</span></var></span>)</div>
+
+ <div class="description">
+ <p class="todo" style="display: none; ">Undocumented.</p>
+ <p>Shows an infobar in the specified tab.</p>
+
+ <!-- PARAMETERS -->
+ <h4>Parameters</h4>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>details</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional" style="display: none; ">optional</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>object</span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo">
+ Undocumented.
+ </dd>
+ <dd style="display: none; ">
+ Description of this parameter from the json schema.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>tabId</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>integer</span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>The tab id for the tab to display the infobar in. If not specified the current tab will be used.</dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+ </div>
+ </div><div>
+ <div>
+ <dt>
+ <var>htmlPath</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional" style="display: none; ">optional</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>string</span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>The html file that contains the infobar.</dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+ </div>
+ </div>
+ </dl>
+ </dd>
+ </div>
+ </div><div>
+ <div>
+ <dt>
+ <var>callback</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional" style="display: none; ">optional</span>
+ <span id="typeTemplate">
+ <span style="display: none; ">
+ <a> Type</a>
+ </span>
+ <span>
+ <span style="display: none; ">
+ array of <span><span></span></span>
+ </span>
+ <span>function</span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo">
+ Undocumented.
+ </dd>
+ <dd style="display: none; ">
+ Description of this parameter from the json schema.
+ </dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+ </div>
+ </div>
+ </dl>
+
+ <!-- RETURNS -->
+ <h4 style="display: none; ">Returns</h4>
+ <dl>
+ <div style="display: none; ">
+ <div>
+ </div>
+ </div>
+ </dl>
+
+ <!-- CALLBACK -->
+ <div>
+ <div>
+ <h4>Callback function</h4>
+ <p>
+ The callback <em>parameter</em> should specify a function
+ that looks like this:
+ </p>
+ <p style="display: none; ">
+ If you specify the <em>callback</em> parameter, it should
+ specify a function that looks like this:
+ </p>
+
+ <!-- Note: intentionally longer 80 columns -->
+ <pre>function(<span>Window window</span>) <span class="subdued">{...}</span>);</pre>
+ <dl>
+ <div>
+ <div>
+ <dt>
+ <var>window</var>
+ <em>
+
+ <!-- TYPE -->
+ <div style="display:inline">
+ (
+ <span class="optional">optional</span>
+ <span id="typeTemplate">
+ <span>
+ <a href="windows.html#type-Window">Window</a>
+ </span>
+ <span style="display: none; ">
+ <span>
+ array of <span><span></span></span>
+ </span>
+ <span>paramType</span>
+ </span>
+ </span>
+ )
+ </div>
+
+ </em>
+ </dt>
+ <dd class="todo" style="display: none; ">
+ Undocumented.
+ </dd>
+ <dd>Contains details about the window in which the infobar was created.</dd>
+
+ <!-- OBJECT PROPERTIES -->
+ <dd style="display: none; ">
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+ </dd>
+ </div>
+ </div>
+ </dl>
+ </div>
+ </div>
+
+ </div> <!-- /description -->
+
+ </div> <!-- /apiItem -->
+
+ </div> <!-- /apiGroup -->
+
+ <!-- EVENTS -->
+ <div class="apiGroup" style="display: none; ">
+ <a name="events"></a>
+ <h3 id="events">Events</h3>
+
+ <!-- iterates over all events -->
+ <div class="apiItem">
+ <a></a>
+ <h4>event name</h4>
+
+ <div class="summary">
+ <!-- Note: intentionally longer 80 columns -->
+ <span class="subdued">chrome.bookmarks</span><span>onEvent</span><span class="subdued">.addListener</span>(function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>);
+ </div>
+
+ <div class="description">
+ <p class="todo">Undocumented.</p>
+ <p>
+ A description from the json schema def of the event goes here.
+ </p>
+
+ <!-- PARAMETERS -->
+ <h4>Parameters</h4>
+ <dl>
+ <div>
+ <div>
+ </div>
+ </div>
+ </dl>
+
+ </div> <!-- /decription -->
+
+ </div> <!-- /apiItem -->
+
+ </div> <!-- /apiGroup -->
+
+ <!-- TYPES -->
+ <div class="apiGroup" style="display: none; ">
+ <a name="types.sort(sortByName)"></a>
+ <h3 id="types">Types</h3>
+
+ <!-- iterates over all types -->
+ <div class="apiItem">
+ <a></a>
+ <h4>type name</h4>
+
+ <div>
+ </div>
+
+ </div> <!-- /apiItem -->
+
+ </div> <!-- /apiGroup -->
+
+ </div> <!-- /apiPage -->
+ </div> <!-- /gc-pagecontent -->
+ </div> <!-- /g-section -->
+ </div> <!-- /codesiteContent -->
+ <div id="gc-footer" --="">
+ <div class="text">
+ <p>
+ Except as otherwise <a href="http://code.google.com/policies.html#restrictions">noted</a>,
+ the content of this page is licensed under the <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons
+ Attribution 3.0 License</a>, and code samples are licensed under the
+ <a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
+ </p>
+ <p>
+ ©2009 Google
+ </p>
+
+<!-- begin analytics -->
+<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
+
+<script type="text/javascript">
+ // chrome doc tracking
+ try {
+ var engdocs = _gat._getTracker("YT-10763712-2");
+ engdocs._trackPageview();
+ } catch(err) {}
+
+ // code.google.com site-wide tracking
+ try {
+ _uacct="UA-18071-1";
+ _uanchor=1;
+ _uff=0;
+ urchinTracker();
+ }
+ catch(e) {/* urchinTracker not available. */}
+</script>
+<!-- end analytics -->
+ </div>
+ </div> <!-- /gc-footer -->
+ </div> <!-- /gc-container -->
+</body></html>
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index a15669d..b12c764 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -1380,6 +1380,20 @@ ExtensionResource Extension::GetIconPath(Icons icon) {
return GetResource(iter->second);
}
+Extension::Icons Extension::GetIconPathAllowLargerSize(
+ ExtensionResource* resource, Icons icon) {
+ *resource = GetIconPath(icon);
+ if (!resource->GetFilePath().empty())
+ return icon;
+ if (icon == EXTENSION_ICON_BITTY)
+ return GetIconPathAllowLargerSize(resource, EXTENSION_ICON_SMALL);
+ if (icon == EXTENSION_ICON_SMALL)
+ return GetIconPathAllowLargerSize(resource, EXTENSION_ICON_MEDIUM);
+ if (icon == EXTENSION_ICON_MEDIUM)
+ return GetIconPathAllowLargerSize(resource, EXTENSION_ICON_LARGE);
+ return EXTENSION_ICON_LARGE;
+}
+
bool Extension::CanExecuteScriptOnHost(const GURL& url,
std::string* error) const {
// No extensions are allowed to execute script on the gallery because that
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h
index 51d6931..50fe957 100644
--- a/chrome/common/extensions/extension.h
+++ b/chrome/common/extensions/extension.h
@@ -270,6 +270,13 @@ class Extension {
// an empty FilePath if the extension does not have that icon.
ExtensionResource GetIconPath(Icons icon);
+ // Looks for an extension icon of dimension |icon|. If not found, checks if
+ // the next larger size exists (until one is found or the end is reached). If
+ // an icon is found, the path is returned in |resource| and the dimension
+ // found is returned to the caller (as function return value).
+ // NOTE: |resource| is not guaranteed to be non-empty.
+ Icons GetIconPathAllowLargerSize(ExtensionResource* resource, Icons icon);
+
const DictionaryValue* manifest_value() const {
return manifest_value_.get();
}
diff --git a/chrome/common/extensions/extension_action.h b/chrome/common/extensions/extension_action.h
index 9fbbff4..6658724 100644
--- a/chrome/common/extensions/extension_action.h
+++ b/chrome/common/extensions/extension_action.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -132,7 +132,7 @@ class ExtensionAction {
void SetBadgeBackgroundColor(int tab_id, const SkColor& color) {
SetValue(&badge_background_color_, tab_id, color);
}
- // Get the badge backround color for a tab, or the default if no color
+ // Get the badge background color for a tab, or the default if no color
// was set.
SkColor GetBadgeBackgroundColor(int tab_id) {
return GetValue(&badge_background_color_, tab_id);
diff --git a/chrome/common/view_types.cc b/chrome/common/view_types.cc
index 8d212ca..5dff5b0 100644
--- a/chrome/common/view_types.cc
+++ b/chrome/common/view_types.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -9,6 +9,7 @@ const char* ViewType::kToolstrip = "TOOLSTRIP";
const char* ViewType::kMole = "MOLE";
const char* ViewType::kBackgroundPage = "BACKGROUND";
const char* ViewType::kPopup = "POPUP";
+const char* ViewType::kInfobar = "INFOBAR";
const char* ViewType::kAll = "ALL";
bool ViewType::ShouldAutoResize(ViewType::Type view_type) {
diff --git a/chrome/common/view_types.h b/chrome/common/view_types.h
index fd94a69..6db4161 100644
--- a/chrome/common/view_types.h
+++ b/chrome/common/view_types.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -17,6 +17,7 @@ class ViewType {
EXTENSION_MOLE,
EXTENSION_BACKGROUND_PAGE,
EXTENSION_POPUP,
+ EXTENSION_INFOBAR,
DEV_TOOLS_UI,
INTERSTITIAL_PAGE,
};
@@ -28,6 +29,7 @@ class ViewType {
static const char* kMole;
static const char* kBackgroundPage;
static const char* kPopup;
+ static const char* kInfobar;
static const char* kAll;
// Return true if a view type should automatically resize to fit its contents.
diff --git a/chrome/renderer/resources/renderer_extension_bindings.js b/chrome/renderer/resources/renderer_extension_bindings.js
index ba6f314..ac487c5 100644
--- a/chrome/renderer/resources/renderer_extension_bindings.js
+++ b/chrome/renderer/resources/renderer_extension_bindings.js
@@ -249,6 +249,7 @@ var chrome = chrome || {};
"experimental.extension",
"experimental.idle",
"experimental.history",
+ "experimental.infoBar",
"experimental.metrics",
"experimental.popup",
"experimental.processes",