summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/browser_resources.grd4
-rw-r--r--chrome/browser/extensions/extension_host.cc59
-rw-r--r--chrome/browser/extensions/extension_host.h8
-rw-r--r--chrome/browser/extensions/extension_shelf_model.cc2
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc4
-rw-r--r--chrome/browser/renderer_host/render_view_host.h3
-rw-r--r--chrome/browser/resources/extensions_toolstrip.css93
-rw-r--r--chrome/browser/views/extensions/extension_shelf.cc2
-rw-r--r--chrome/browser/views/extensions/extension_view.cc8
-rw-r--r--chrome/browser/views/extensions/extension_view.h6
-rwxr-xr-xchrome/common/view_types.h1
-rw-r--r--chrome/renderer/extensions/extension_process_bindings.cc46
-rw-r--r--chrome/renderer/extensions/extension_process_bindings.h9
-rw-r--r--chrome/renderer/render_view.cc25
-rw-r--r--chrome/renderer/render_view.h5
-rw-r--r--chrome/renderer/renderer_resources.grd3
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js38
-rw-r--r--chrome/renderer/resources/extension_toolstrip.css93
-rwxr-xr-xchrome/test/data/extensions/samples/mappy/mappy_toolstrip.html28
19 files changed, 268 insertions, 169 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 788d62d..5e63902 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. fb03 -->
+without changes to the corresponding grd file. ek -->
<grit latest_public_release="0" current_release="1">
<outputs>
<output filename="grit/browser_resources.h" type="rc_header">
@@ -41,7 +41,7 @@ without changes to the corresponding grd file. fb03 -->
<include name="IDR_LOCAL_STRINGS_JS" file="resources\local_strings.js" type="BINDATA" />
<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_EXTENSIONS_TOOLSTRIP_CSS" file="resources\extensions_toolstrip.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" />
<include name="IDR_PRINT_TAB_JS" file="resources\print_tab.js" type="BINDATA" />
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index f8503f3..b1a304f 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -180,34 +180,14 @@ void ExtensionHost::DidNavigate(RenderViewHost* render_view_host,
new ExtensionFunctionDispatcher(render_view_host_, this, url_));
}
-void ExtensionHost::InsertCssIfToolstrip() {
+void ExtensionHost::InsertThemeCSS() {
+ DCHECK(!is_background_page());
- // TODO(erikkay): Make these ifdefs go away -- http://crbug.com/21939
-#if defined(TOOLKIT_VIEWS)
- ExtensionView* view = view_.get();
- if (!view)
- return;
- if (!view->is_toolstrip()) {
- // No CSS injecting currently, but call SetDidInsertCSS to tell the view
- // that it's OK to display.
- view->SetDidInsertCSS(true);
- return;
- }
-#elif defined(OS_LINUX) || defined(OS_MACOSX)
-#if defined(OS_LINUX)
- ExtensionViewGtk* view = view_.get();
-#else
- ExtensionViewMac* view = view_.get();
-#endif
- if (!view || !view->is_toolstrip())
- return;
-#endif
-
- static const base::StringPiece toolstrip_css(
+ static const base::StringPiece toolstrip_theme_css(
ResourceBundle::GetSharedInstance().GetRawDataResource(
- IDR_EXTENSIONS_TOOLSTRIP_CSS));
+ IDR_EXTENSIONS_TOOLSTRIP_THEME_CSS));
- std::string css = toolstrip_css.as_string();
+ std::string css = toolstrip_theme_css.as_string();
ThemeProvider* theme_provider =
render_view_host()->process()->profile()->GetThemeProvider();
@@ -225,16 +205,12 @@ void ExtensionHost::InsertCssIfToolstrip() {
pos = css.find(kToolstripTextColorSubstitution);
}
- // 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.
- render_view_host()->InsertCSSInWebFrame(L"", css, "ToolstripDefaultCss");
+ render_view_host()->InsertCSSInWebFrame(L"", css, "ToolstripThemeCSS");
}
void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) {
- InsertCssIfToolstrip();
if (!did_stop_loading_) {
NotificationService::current()->Notify(
NotificationType::EXTENSION_HOST_DID_STOP_LOADING,
@@ -242,12 +218,21 @@ void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) {
Details<ExtensionHost>(this));
did_stop_loading_ = true;
}
+ if (extension_host_type_ == ViewType::EXTENSION_TOOLSTRIP ||
+ extension_host_type_ == ViewType::EXTENSION_MOLE) {
+#if defined(TOOLKIT_VIEWS)
+ if (view_.get())
+ view_->DidStopLoading();
+#endif
+ }
}
void ExtensionHost::DocumentAvailableInMainFrame(RenderViewHost* rvh) {
document_element_available_ = true;
if (is_background_page())
extension_->SetBackgroundPageReady();
+ else
+ InsertThemeCSS();
}
void ExtensionHost::RunJavaScriptMessage(const std::wstring& message,
@@ -278,13 +263,6 @@ void ExtensionHost::ProcessDOMUIMessage(const std::string& message,
}
}
-void ExtensionHost::DidInsertCSS() {
-#if defined(TOOLKIT_VIEWS)
- if (view_.get())
- view_->SetDidInsertCSS(true);
-#endif
-}
-
RenderViewHostDelegate::View* ExtensionHost::GetViewDelegate() {
return this;
}
@@ -391,6 +369,13 @@ Browser* ExtensionHost::GetBrowser() {
return browser;
}
+void ExtensionHost::SetRenderViewType(ViewType::Type type) {
+ DCHECK(type == ViewType::EXTENSION_MOLE ||
+ type == ViewType::EXTENSION_TOOLSTRIP);
+ extension_host_type_ = type;
+ render_view_host()->ViewTypeChanged(extension_host_type_);
+}
+
ViewType::Type ExtensionHost::GetRenderViewType() const {
return extension_host_type_;
}
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index 49a75f1..3b3d64e 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -69,6 +69,9 @@ class ExtensionHost : public RenderViewHostDelegate,
return document_element_available_;
}
+ // Sets the the ViewType of this host (e.g. mole, toolstrip).
+ void SetRenderViewType(ViewType::Type type);
+
// Returns true if the render view is initialized and didn't crash.
bool IsRenderViewLive() const;
@@ -80,8 +83,8 @@ class ExtensionHost : public RenderViewHostDelegate,
// Sets |url_| and navigates |render_view_host_|.
void NavigateToURL(const GURL& url);
- // Insert the CSS for a toolstrip.
- void InsertCssIfToolstrip();
+ // Insert the theme CSS for a toolstrip/mole.
+ void InsertThemeCSS();
// RenderViewHostDelegate implementation.
virtual RenderViewHostDelegate::View* GetViewDelegate();
@@ -106,7 +109,6 @@ class ExtensionHost : public RenderViewHostDelegate,
const int flags,
IPC::Message* reply_msg,
bool* did_suppress_message);
- virtual void DidInsertCSS();
// RenderViewHostDelegate::View
virtual void CreateNewWindow(int route_id,
diff --git a/chrome/browser/extensions/extension_shelf_model.cc b/chrome/browser/extensions/extension_shelf_model.cc
index 5a6db01..10b56b2 100644
--- a/chrome/browser/extensions/extension_shelf_model.cc
+++ b/chrome/browser/extensions/extension_shelf_model.cc
@@ -138,6 +138,7 @@ void ExtensionShelfModel::ExpandToolstrip(iterator toolstrip,
ToolstripEventRouter::OnToolstripExpanded(browser_->profile(),
routing_id,
url, height);
+ toolstrip->host->SetRenderViewType(ViewType::EXTENSION_MOLE);
}
void ExtensionShelfModel::CollapseToolstrip(iterator toolstrip,
@@ -152,6 +153,7 @@ void ExtensionShelfModel::CollapseToolstrip(iterator toolstrip,
ToolstripEventRouter::OnToolstripCollapsed(browser_->profile(),
routing_id,
url);
+ toolstrip->host->SetRenderViewType(ViewType::EXTENSION_TOOLSTRIP);
}
void ExtensionShelfModel::Observe(NotificationType type,
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 63cc15e..41a30f2 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -1660,6 +1660,10 @@ void RenderViewHost::BlockExtensionRequest(int request_id) {
"Access to extension API denied.");
}
+void RenderViewHost::ViewTypeChanged(ViewType::Type type) {
+ Send(new ViewMsg_NotifyRenderViewType(routing_id(), type));
+}
+
void RenderViewHost::OnExtensionPostMessage(
int port_id, const std::string& message) {
if (process()->profile()->GetExtensionMessageService()) {
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index b7f2d86..cbf0f73 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -436,6 +436,9 @@ class RenderViewHost : public RenderWidgetHost,
// permission.
void BlockExtensionRequest(int request_id);
+ // Notify the renderer that its view type has changed.
+ void ViewTypeChanged(ViewType::Type type);
+
void SignalModalDialogEvent();
void ResetModalDialogEvent();
diff --git a/chrome/browser/resources/extensions_toolstrip.css b/chrome/browser/resources/extensions_toolstrip.css
index cb23825..d4691fc 100644
--- a/chrome/browser/resources/extensions_toolstrip.css
+++ b/chrome/browser/resources/extensions_toolstrip.css
@@ -1,95 +1,8 @@
/**
- * Body styles. This makes the toolstrip layout fit in with the Windows
- * bookmarkbar. Note that the background is provided separately, by
- * RenderWidget.
+ * The following style rules affect toolstrips and moles and are affected by
+ * theme changes.
*/
-body {
- display:-webkit-box;
- -webkit-box-orient:horizontal;
- -webkit-box-align:center;
- white-space:nowrap;
- overflow: hidden;
- margin: 0;
- padding:0;
- font: menu;
- color: $TEXT_COLOR$;
- -webkit-user-select:none;
- cursor:default;
-}
-
-/**
- * This, combined with -webkit-box-align:center on body, makes content inside
- * the body tag center itself vertically by default.
- */
-body>* {
- display:-webkit-box;
-}
-
-/**
- * Set display property of <script> and <style> as none explicitly to avoid
- * inheriting from <body>.
- */
-body>script,
-body>style {
- display:none;
-}
-/**
- * Toolstrip Buttons. The following styles make
- * <div class="toolstrip-button"><img><span>Woot</span></div> look like the
- * bookmarkbar buttons on Windows.
- *
- * TODO(aa): We may have to come up with a way to modify these slightly on
- * different platforms.
- *
- * TODO(aa): It would be nice if we could use actual <button> tags work here,
- * which should work once https://bugs.webkit.org/show_bug.cgi?id=25406 is
- * fixed.
- */
-div.toolstrip-button {
- -webkit-box-orient:horizontal;
- -webkit-box-align:center;
- border:6px solid transparent;
- font:menu;
- background:transparent;
+body {
color: $TEXT_COLOR$;
- line-height:100%;
- padding:0;
-}
-
-div.toolstrip-button>img {
- display:-webkit-box;
- width:16px;
- height:16px;
- /**
- * We inset the image slightly vertically, so that the button can be shorter
- * than would otherwise be possibe with our fat borders.
- */
- margin:-1px 5px -1px 0;
-}
-
-div.toolstrip-button>span {
- display:-webkit-box;
- margin-right:1px;
- /**
- * Hack: WebKit appears to measure text height slightly differently than we do
- * in native code, making us not line up when centering, so we shift ourselves
- * up one pixel to match.
- */
- margin-top:-1px;
-}
-
-/**
- * TODO(aa): It would be nice if these border images could be stored in Chrome
- * as, normal images even if those images are just translated into data URLs at
- * runtime.
- */
-div.toolstrip-button:hover {
- border-width:6px;
- -webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAVRJREFUeNpi/P//PwMjIyMfAwODEhsbmworKxvD79+/GED0jx/fGf7+/csABT+A+B4Q3wLq+cME0sTMzOzW1dOncuX6bYZnL98wvH73CUy/+/iV4eOXH2B86+5DjoLCYi2gxgCwHiBDs7O7Vyg9I4uBh4eHARcAyTk6OTMICQkx7N61U5kJKCZqY2PLQCyAqv3ICCSCgE5jAvqPKI2/fv1iEBXiYwDZSLQmEACpBYYJWCNZgCyNoChi4uTkpJ+N9NdIdqhycHCSpxGUCcj3IygJkQpAWY6k5AbPmMB8yvT9+3f6BQ7YRrKTHMijZCVyUJyQGrLglAPSffvWTaI13bhxHWIj0LbLq1auIFoj1JKnoFLu44kTxzVAhY+goCCDmJg4TpuWL1vKkJOV8RTIvcsILZA5QAUy0O1aoDgC+RuWQkDg69cvIOoTEL8AFcpAPV8AAgwAn6qHYvNUlBEAAAAASUVORK5CYII=) 6 round round;
-}
-
-div.toolstrip-button:active {
- border-width:6px;
- -webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAbhJREFUeNqcVDtPwmAU/R6tCUZsIw5AKODoYNREBNREiAb9t+qoRmDxBYOYOGGiVAexaGzDUJK2X70fFURjUtuztfeennMfvdh1XTTCer5AKKUEY8zgkULMvrw4/06YAObE3Hoep1KppWx2YVqSZQTkcbLjOJgxhnX9Az0+PLx3uy/tZqOBBB5MJpNLO7sVobK3/yZJEotEIj9UTNPEmvZK67Va9PTkeHllZfWW8EBKUaa2S6V+PB53fpM4+LtMJmuXyuW+klbEVusGDYmxuZggSTJDPuA5PDdfKHpE6AiSZX8iz+G5hBBMUEB8NQ4LEw//BoyIkY3NLRqExMdT3Nj0xhEUoIgIColQzQGrOJQi7DINa5WFrxH+DhaGR8I0aGgVZuKEVQwMKM8JvHJjST4TSgU3qCiBe+IMBibRdd3XNj8hlmXxSRBi27bb62msp2m+lg3DIIau2yDGSLNxzZ5UVa/Xq7P37bbIv/qXkqp2hOrZafT5+Qk1rq+887iWy6FEIrmYzmRmYrF5QRRF5i20VzuUQuE82mqnYx4dHtyN7+oI/L4KAGiYM1pmHgdn1tXlxQ8XnwIMABNlyWs2CMVlAAAAAElFTkSuQmCC) 6 round round;
}
diff --git a/chrome/browser/views/extensions/extension_shelf.cc b/chrome/browser/views/extensions/extension_shelf.cc
index a3ac3bf..229d697 100644
--- a/chrome/browser/views/extensions/extension_shelf.cc
+++ b/chrome/browser/views/extensions/extension_shelf.cc
@@ -740,7 +740,7 @@ void ExtensionShelf::ThemeChanged() {
// Refresh the CSS to update toolstrip text colors from theme.
int count = model_->count();
for (int i = 0; i < count; ++i)
- ToolstripAtIndex(i)->view()->host()->InsertCssIfToolstrip();
+ ToolstripAtIndex(i)->view()->host()->InsertThemeCSS();
Layout();
}
diff --git a/chrome/browser/views/extensions/extension_view.cc b/chrome/browser/views/extensions/extension_view.cc
index 7b39336..4302c93 100644
--- a/chrome/browser/views/extensions/extension_view.cc
+++ b/chrome/browser/views/extensions/extension_view.cc
@@ -15,7 +15,7 @@
ExtensionView::ExtensionView(ExtensionHost* host, Browser* browser)
: host_(host), browser_(browser),
initialized_(false), pending_preferred_width_(0), container_(NULL),
- did_insert_css_(false), is_clipped_(false), is_toolstrip_(true) {
+ did_stop_loading_(false), is_clipped_(false), is_toolstrip_(true) {
host_->set_view(this);
}
@@ -34,8 +34,8 @@ RenderViewHost* ExtensionView::render_view_host() const {
return host_->render_view_host();
}
-void ExtensionView::SetDidInsertCSS(bool did_insert) {
- did_insert_css_ = did_insert;
+void ExtensionView::DidStopLoading() {
+ did_stop_loading_ = true;
ShowIfCompletelyLoaded();
}
@@ -100,7 +100,7 @@ void ExtensionView::ShowIfCompletelyLoaded() {
// given us a background and css has been inserted into page. These can happen
// in different orders.
if (!IsVisible() && host_->did_stop_loading() && render_view_host()->view() &&
- !is_clipped_ && did_insert_css_ &&
+ !is_clipped_ && did_stop_loading_ &&
!render_view_host()->view()->background().empty()) {
SetVisible(true);
UpdatePreferredWidth(pending_preferred_width_);
diff --git a/chrome/browser/views/extensions/extension_view.h b/chrome/browser/views/extensions/extension_view.h
index 1e08f79..fc1ef90 100644
--- a/chrome/browser/views/extensions/extension_view.h
+++ b/chrome/browser/views/extensions/extension_view.h
@@ -36,7 +36,7 @@ class ExtensionView : public views::NativeViewHost {
Browser* browser() const { return browser_; }
Extension* extension() const;
RenderViewHost* render_view_host() const;
- void SetDidInsertCSS(bool did_insert);
+ void DidStopLoading();
void set_is_clipped(bool is_clipped) { is_clipped_ = is_clipped; }
bool is_toolstrip() const { return is_toolstrip_; }
void set_is_toolstrip(bool is) { is_toolstrip_ = is; }
@@ -94,8 +94,8 @@ class ExtensionView : public views::NativeViewHost {
// Note: the view does not own its container.
ExtensionContainer* container_;
- // Whether the RenderView has inserted extension css into toolstrip page.
- bool did_insert_css_;
+ // Whether the RenderView has finished loading.
+ bool did_stop_loading_;
// Whether this extension view is clipped.
bool is_clipped_;
diff --git a/chrome/common/view_types.h b/chrome/common/view_types.h
index 4151fdd..7272250 100755
--- a/chrome/common/view_types.h
+++ b/chrome/common/view_types.h
@@ -14,6 +14,7 @@ class ViewType {
INVALID,
TAB_CONTENTS,
EXTENSION_TOOLSTRIP,
+ EXTENSION_MOLE,
EXTENSION_BACKGROUND_PAGE,
DEV_TOOLS_UI,
INTERSTITIAL_PAGE,
diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc
index 7a9d0ac..0fc9438 100644
--- a/chrome/renderer/extensions/extension_process_bindings.cc
+++ b/chrome/renderer/extensions/extension_process_bindings.cc
@@ -28,6 +28,7 @@ using bindings_utils::GetPendingRequestMap;
using bindings_utils::PendingRequest;
using bindings_utils::PendingRequestMap;
using bindings_utils::ExtensionBase;
+using WebKit::WebFrame;
namespace {
@@ -119,6 +120,25 @@ class ExtensionImpl : public ExtensionBase {
return v8::String::New(GetStringResource<IDR_EXTENSION_API_JSON>());
}
+ // Returns true is |type| "isa" |match|.
+ static bool ViewTypeMatches(ViewType::Type type, ViewType::Type match) {
+ if (type == match)
+ return true;
+
+ // INVALID means match all.
+ if (match == ViewType::INVALID)
+ return true;
+
+ // TODO(erikkay) for now, special case mole as a type of toolstrip.
+ // Perhaps this isn't the right long-term thing to do.
+ if (match == ViewType::EXTENSION_TOOLSTRIP &&
+ type == ViewType::EXTENSION_MOLE) {
+ return true;
+ }
+
+ return false;
+ }
+
static v8::Handle<v8::Value> GetExtensionViews(const v8::Arguments& args) {
if (args.Length() != 2)
return v8::Undefined();
@@ -135,6 +155,8 @@ class ExtensionImpl : public ExtensionBase {
ViewType::Type view_type = ViewType::INVALID;
if (view_type_string == "TOOLSTRIP") {
view_type = ViewType::EXTENSION_TOOLSTRIP;
+ } else if (view_type_string == "MOLE") {
+ view_type = ViewType::EXTENSION_MOLE;
} else if (view_type_string == "BACKGROUND") {
view_type = ViewType::EXTENSION_BACKGROUND_PAGE;
} else if (view_type_string == "TAB") {
@@ -154,7 +176,7 @@ class ExtensionImpl : public ExtensionBase {
std::set<RenderView* >::iterator it =
render_view_set_pointer->render_view_set_.begin();
for (; it != render_view_set_pointer->render_view_set_.end(); ++it) {
- if (view_type != ViewType::INVALID && (*it)->view_type() != view_type)
+ if (!ViewTypeMatches((*it)->view_type(), view_type))
continue;
GURL url = (*it)->webview()->GetMainFrame()->url();
@@ -396,3 +418,25 @@ v8::Handle<v8::Value>
return v8::ThrowException(v8::Exception::Error(
v8::String::New(error_msg.c_str())));
}
+
+// static
+void ExtensionProcessBindings::SetViewType(WebView* view,
+ ViewType::Type type) {
+ DCHECK(type == ViewType::EXTENSION_MOLE ||
+ type == ViewType::EXTENSION_TOOLSTRIP);
+ const char* type_str;
+ if (type == ViewType::EXTENSION_MOLE)
+ type_str = "mole";
+ else if (type == ViewType::EXTENSION_TOOLSTRIP)
+ type_str = "toolstrip";
+ else
+ return;
+
+ v8::HandleScope handle_scope;
+ WebFrame* frame = view->GetMainFrame();
+ v8::Local<v8::Context> context = frame->mainWorldScriptContext();
+ v8::Handle<v8::Value> argv[1];
+ argv[0] = v8::String::New(type_str);
+ bindings_utils::CallFunctionInContext(context, "setViewType",
+ arraysize(argv), argv);
+}
diff --git a/chrome/renderer/extensions/extension_process_bindings.h b/chrome/renderer/extensions/extension_process_bindings.h
index bea3e91..1777658 100644
--- a/chrome/renderer/extensions/extension_process_bindings.h
+++ b/chrome/renderer/extensions/extension_process_bindings.h
@@ -11,10 +11,12 @@
#include <string>
#include <vector>
+#include "chrome/common/view_types.h"
#include "v8/include/v8.h"
class GURL;
class URLPattern;
+class WebView;
class ExtensionProcessBindings {
public:
@@ -36,7 +38,7 @@ class ExtensionProcessBindings {
// Sets the host permissions for a particular extension.
static void SetHostPermissions(const GURL& extension_url,
- const std::vector<URLPattern>& permissions);
+ const std::vector<URLPattern>& permissions);
// Check if the extension in the currently running context has permission to
// access the given extension function. Must be called with a valid V8
@@ -47,6 +49,11 @@ class ExtensionProcessBindings {
// denied. Must be called with a valid V8 context in scope.
static v8::Handle<v8::Value> ThrowPermissionDeniedException(
const std::string& function_name);
+
+ // For EXTENSION_* |type| values, adds/replaces a special class name on to
+ // the document element (e.g. "extension_toolstrip", "extension_mole") so
+ // that the page can use CSS rules to control its display appropriately.
+ static void SetViewType(WebView* view, ViewType::Type type);
};
#endif // CHROME_RENDERER_EXTENSIONS_EXTENSION_PROCESS_BINDINGS_H_
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 2e68db7..a1aea97 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -2080,6 +2080,11 @@ void RenderView::didCreateDocumentElement(WebFrame* frame) {
RenderThread::current()->user_script_slave()->InjectScripts(
frame, UserScript::DOCUMENT_START);
}
+ if (view_type_ == ViewType::EXTENSION_TOOLSTRIP ||
+ view_type_ == ViewType::EXTENSION_MOLE) {
+ InjectToolstripCSS();
+ ExtensionProcessBindings::SetViewType(webview(), view_type_);
+ }
while (!pending_code_execution_queue_.empty()) {
scoped_refptr<CodeExecutionInfo> info =
@@ -2974,6 +2979,15 @@ void RenderView::OnMediaPlayerActionAt(int x,
}
void RenderView::OnNotifyRendererViewType(ViewType::Type type) {
+ // When this is first set, the bindings aren't fully loaded. We only need
+ // to call through this API after the page has already been loaded. It's
+ // also called in didCreateDocumentElement to bootstrap.
+ if (view_type_ != ViewType::INVALID) {
+ if (type == ViewType::EXTENSION_MOLE ||
+ type == ViewType::EXTENSION_TOOLSTRIP) {
+ ExtensionProcessBindings::SetViewType(webview(), type);
+ }
+ }
view_type_ = type;
}
@@ -3249,6 +3263,17 @@ void RenderView::OnExtensionResponse(int request_id,
request_id, success, response, error);
}
+void RenderView::InjectToolstripCSS() {
+ if (view_type_ != ViewType::EXTENSION_TOOLSTRIP)
+ return;
+
+ static const base::StringPiece toolstrip_css(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_EXTENSION_TOOLSTRIP_CSS));
+ std::string css = toolstrip_css.as_string();
+ InsertCSS(L"", css, "ToolstripDefaultCSS");
+}
+
void RenderView::OnExtensionMessageInvoke(const std::string& function_name,
const ListValue& args) {
RendererExtensionBindings::Invoke(function_name, args, this);
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index b2b71a95..753ce12 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -421,6 +421,8 @@ class RenderView : public RenderWidget,
const std::string& response,
const std::string& error);
+ void OnSetExtensionViewMode(const std::string& mode);
+
const WebPreferences& webkit_preferences() const {
return webkit_preferences_;
}
@@ -716,6 +718,9 @@ class RenderView : public RenderWidget,
void UpdateFontRenderingFromRendererPrefs() { }
#endif
+ // Inject toolstrip CSS for extension moles and toolstrips.
+ void InjectToolstripCSS();
+
// Initializes the document_tag_ member if necessary.
void EnsureDocumentTag();
diff --git a/chrome/renderer/renderer_resources.grd b/chrome/renderer/renderer_resources.grd
index 50230d5..efad954 100644
--- a/chrome/renderer/renderer_resources.grd
+++ b/chrome/renderer/renderer_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. rw2 -->
+without changes to the corresponding grd file. ek1 -->
<grit latest_public_release="0" current_release="1">
<outputs>
<output filename="grit/renderer_resources.h" type="rc_header">
@@ -21,6 +21,7 @@ without changes to the corresponding grd file. rw2 -->
<include name="IDR_RENDERER_EXTENSION_BINDINGS_JS" file="resources\renderer_extension_bindings.js" type="BINDATA" />
<include name="IDR_SAD_PLUGIN" file="resources\sadplugin.png" type="BINDATA" />
<include name="IDR_EXTENSION_APITEST_JS" file="resources\extension_apitest.js" type="BINDATA" />
+ <include name="IDR_EXTENSION_TOOLSTRIP_CSS" file="resources\extension_toolstrip.css" flattenhtml="true" type="BINDATA" />
</includes>
</release>
</grit>
diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
index 657baec..95e520e 100644
--- a/chrome/renderer/resources/extension_process_bindings.js
+++ b/chrome/renderer/resources/extension_process_bindings.js
@@ -115,6 +115,24 @@ var chrome = chrome || {};
}
};
+ chromeHidden.setViewType = function(type) {
+ var modeClass = "chrome-" + type;
+ var className = document.documentElement.className;
+ if (className && className.length) {
+ var classes = className.split(" ");
+ var new_classes = [];
+ classes.forEach(function(cls) {
+ if (cls.indexOf("chrome-") != 0) {
+ new_classes.push(cls);
+ }
+ });
+ new_classes.push(modeClass);
+ document.documentElement.className = new_classes.join(" ");
+ } else {
+ document.documentElement.className = modeClass;
+ }
+ };
+
function prepareRequest(args, argSchemas) {
var request = {};
var argCount = args.length;
@@ -156,14 +174,6 @@ var chrome = chrome || {};
request.callback ? true : false);
}
- // Using forEach for convenience, and to bind |module|s & |apiDefs|s via
- // closures.
- function forEach(a, f) {
- for (var i = 0; i < a.length; i++) {
- f(a[i], i);
- }
- }
-
function bind(obj, func) {
return function() {
return func.apply(obj, arguments);
@@ -211,20 +221,20 @@ var chrome = chrome || {};
// for api functions that wish to insert themselves into the call.
var apiDefinitions = JSON.parse(GetExtensionAPIDefinition());
- forEach(apiDefinitions, function(apiDef) {
+ apiDefinitions.forEach(function(apiDef) {
chrome[apiDef.namespace] = chrome[apiDef.namespace] || {};
var module = chrome[apiDef.namespace];
// Add types to global validationTypes
if (apiDef.types) {
- forEach(apiDef.types, function(t) {
+ apiDef.types.forEach(function(t) {
chromeHidden.validationTypes.push(t);
});
}
// Setup Functions.
if (apiDef.functions) {
- forEach(apiDef.functions, function(functionDef) {
+ apiDef.functions.forEach(function(functionDef) {
// Module functions may have been defined earlier by hand. Don't
// clobber them.
if (module[functionDef.name])
@@ -249,7 +259,7 @@ var chrome = chrome || {};
// Setup Events
if (apiDef.events) {
- forEach(apiDef.events, function(eventDef) {
+ apiDef.events.forEach(function(eventDef) {
// Module events may have been defined earlier by hand. Don't clobber
// them.
if (module[eventDef.name])
@@ -296,8 +306,8 @@ var chrome = chrome || {};
apiFunctions["devtools.getTabEvents"].handleRequest = function(tabId) {
var tabIdProxy = {};
- forEach(["onPageEvent", "onTabUrlChange", "onTabClose"],
- function(name) {
+ var functions = ["onPageEvent", "onTabUrlChange", "onTabClose"];
+ functions.forEach(function(name) {
// Event disambiguation is handled by name munging. See
// chrome/browser/extensions/extension_devtools_events.h for the C++
// equivalent of this logic.
diff --git a/chrome/renderer/resources/extension_toolstrip.css b/chrome/renderer/resources/extension_toolstrip.css
new file mode 100644
index 0000000..cb99470
--- /dev/null
+++ b/chrome/renderer/resources/extension_toolstrip.css
@@ -0,0 +1,93 @@
+/**
+ * Body styles. This makes the toolstrip layout fit in with the Windows
+ * bookmarkbar. Note that the background is provided separately, by
+ * RenderWidget.
+ */
+body {
+ display:-webkit-box;
+ -webkit-box-orient:horizontal;
+ -webkit-box-align:center;
+ white-space:nowrap;
+ overflow: hidden;
+ margin: 0;
+ padding:0;
+ font: menu;
+ -webkit-user-select:none;
+ cursor:default;
+}
+
+/**
+ * This, combined with -webkit-box-align:center on body, makes content inside
+ * the body tag center itself vertically by default.
+ */
+body>* {
+ display:-webkit-box;
+}
+
+/**
+ * Set display property of <script> and <style> as none explicitly to avoid
+ * inheriting from <body>.
+ */
+body>script,
+body>style {
+ display:none;
+}
+
+/**
+ * Toolstrip Buttons. The following styles make
+ * <div class="toolstrip-button"><img><span>Woot</span></div> look like the
+ * bookmarkbar buttons on Windows.
+ *
+ * TODO(aa): We may have to come up with a way to modify these slightly on
+ * different platforms.
+ *
+ * TODO(aa): It would be nice if we could use actual <button> tags work here,
+ * which should work once https://bugs.webkit.org/show_bug.cgi?id=25406 is
+ * fixed.
+ */
+div.toolstrip-button {
+ -webkit-box-orient:horizontal;
+ -webkit-box-align:center;
+ border:6px solid transparent;
+ font:menu;
+ background:transparent;
+ line-height:100%;
+ padding:0;
+}
+
+div.toolstrip-button>img {
+ display:-webkit-box;
+ width:16px;
+ height:16px;
+ /**
+ * We inset the image slightly vertically, so that the button can be shorter
+ * than would otherwise be possibe with our fat borders.
+ */
+ margin:-1px 5px -1px 0;
+}
+
+div.toolstrip-button>span {
+ display:-webkit-box;
+ margin-right:1px;
+ /**
+ * Hack: WebKit appears to measure text height slightly differently than we do
+ * in native code, making us not line up when centering, so we shift ourselves
+ * up one pixel to match.
+ */
+ margin-top:-1px;
+}
+
+/**
+ * TODO(aa): It would be nice if these border images could be stored in Chrome
+ * as, normal images even if those images are just translated into data URLs at
+ * runtime.
+ */
+div.toolstrip-button:hover {
+ border-width:6px;
+ -webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAVRJREFUeNpi/P//PwMjIyMfAwODEhsbmworKxvD79+/GED0jx/fGf7+/csABT+A+B4Q3wLq+cME0sTMzOzW1dOncuX6bYZnL98wvH73CUy/+/iV4eOXH2B86+5DjoLCYi2gxgCwHiBDs7O7Vyg9I4uBh4eHARcAyTk6OTMICQkx7N61U5kJKCZqY2PLQCyAqv3ICCSCgE5jAvqPKI2/fv1iEBXiYwDZSLQmEACpBYYJWCNZgCyNoChi4uTkpJ+N9NdIdqhycHCSpxGUCcj3IygJkQpAWY6k5AbPmMB8yvT9+3f6BQ7YRrKTHMijZCVyUJyQGrLglAPSffvWTaI13bhxHWIj0LbLq1auIFoj1JKnoFLu44kTxzVAhY+goCCDmJg4TpuWL1vKkJOV8RTIvcsILZA5QAUy0O1aoDgC+RuWQkDg69cvIOoTEL8AFcpAPV8AAgwAn6qHYvNUlBEAAAAASUVORK5CYII=) 6 round round;
+}
+
+div.toolstrip-button:active {
+ border-width:6px;
+ -webkit-border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAaCAYAAACHD21cAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAbhJREFUeNqcVDtPwmAU/R6tCUZsIw5AKODoYNREBNREiAb9t+qoRmDxBYOYOGGiVAexaGzDUJK2X70fFURjUtuztfeennMfvdh1XTTCer5AKKUEY8zgkULMvrw4/06YAObE3Hoep1KppWx2YVqSZQTkcbLjOJgxhnX9Az0+PLx3uy/tZqOBBB5MJpNLO7sVobK3/yZJEotEIj9UTNPEmvZK67Va9PTkeHllZfWW8EBKUaa2S6V+PB53fpM4+LtMJmuXyuW+klbEVusGDYmxuZggSTJDPuA5PDdfKHpE6AiSZX8iz+G5hBBMUEB8NQ4LEw//BoyIkY3NLRqExMdT3Nj0xhEUoIgIColQzQGrOJQi7DINa5WFrxH+DhaGR8I0aGgVZuKEVQwMKM8JvHJjST4TSgU3qCiBe+IMBibRdd3XNj8hlmXxSRBi27bb62msp2m+lg3DIIau2yDGSLNxzZ5UVa/Xq7P37bbIv/qXkqp2hOrZafT5+Qk1rq+887iWy6FEIrmYzmRmYrF5QRRF5i20VzuUQuE82mqnYx4dHtyN7+oI/L4KAGiYM1pmHgdn1tXlxQ8XnwIMABNlyWs2CMVlAAAAAElFTkSuQmCC) 6 round round;
+}
diff --git a/chrome/test/data/extensions/samples/mappy/mappy_toolstrip.html b/chrome/test/data/extensions/samples/mappy/mappy_toolstrip.html
index 9573344..88d1d52 100755
--- a/chrome/test/data/extensions/samples/mappy/mappy_toolstrip.html
+++ b/chrome/test/data/extensions/samples/mappy/mappy_toolstrip.html
@@ -1,6 +1,21 @@
<style>
-#map {
+.chrome-toolstrip #map {
display: none;
+}
+
+.chrome-toolstrip #button {
+ display: block;
+}
+
+.chrome-mole #map {
+ display: block;
+}
+
+.chrome-mole #button {
+ display: none;
+}
+
+#map {
width: 512px;
height: 512px;
}
@@ -10,20 +25,9 @@
<script>
var maps_key = "ABQIAAAATfHumDbW3OmRByfquHd3SRTRERdeAiwZ9EeJWta3L_JZVS0bOBRQeZgr4K0xyVKzUdnnuFl8X9PX0w";
-chrome.toolstrip.onCollapsed.addListener(function() {
- var map = document.getElementById("map");
- map.src = "";
- map.style.display = "none";
- var button = document.getElementById("button");
- button.style.display = "block";
-});
-
function expand(url) {
- var button = document.getElementById("button");
- button.style.display = "none";
var map = document.getElementById("map");
map.src = url;
- map.style.display = "block";
chrome.toolstrip.expand({height:512}, function() {});
}