summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-19 18:05:56 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-19 18:05:56 +0000
commit8b8e7c9bce4198a4ee2865d9dfce6e8baa173ad3 (patch)
tree938304b8e1be417c1b9c73d7463dacbc1da79843 /chrome/renderer
parentf2c4ee3627e6039fd42bd7c0c93e902b72653449 (diff)
downloadchromium_src-8b8e7c9bce4198a4ee2865d9dfce6e8baa173ad3.zip
chromium_src-8b8e7c9bce4198a4ee2865d9dfce6e8baa173ad3.tar.gz
chromium_src-8b8e7c9bce4198a4ee2865d9dfce6e8baa173ad3.tar.bz2
Initial version of chrome.experimental.sidebar extension API.
BUG=51084 TEST=Run interactive_ui_tests and browser_tests. New: - sidebar Extension API (design doc: https://docs.google.com/a/google.com/Doc?docid=0AV4Qg3xyZ8RQZGZtbWIydDJfNWc0eHJtbmRm&hl=en); - Sidebar panel in Chrome browser view; Original review=http://codereview.chromium.org/2836040/show Patch by alekseys@google.com git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56716 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/extensions/extension_process_bindings.cc49
-rw-r--r--chrome/renderer/render_view.cc14
-rw-r--r--chrome/renderer/render_view.h5
-rw-r--r--chrome/renderer/resources/extension_process_bindings.js43
-rw-r--r--chrome/renderer/resources/renderer_extension_bindings.js1
5 files changed, 66 insertions, 46 deletions
diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc
index cbc2cd1..ec7e1c0 100644
--- a/chrome/renderer/extensions/extension_process_bindings.cc
+++ b/chrome/renderer/extensions/extension_process_bindings.cc
@@ -259,8 +259,8 @@ class ExtensionImpl : public ExtensionBase {
return v8::FunctionTemplate::New(GetPopupView);
} else if (name->Equals(v8::String::New("GetPopupParentWindow"))) {
return v8::FunctionTemplate::New(GetPopupParentWindow);
- } else if (name->Equals(v8::String::New("SetExtensionActionIcon"))) {
- return v8::FunctionTemplate::New(SetExtensionActionIcon);
+ } else if (name->Equals(v8::String::New("SetIconCommon"))) {
+ return v8::FunctionTemplate::New(SetIconCommon);
} else if (name->Equals(v8::String::New("IsExtensionProcess"))) {
return v8::FunctionTemplate::New(IsExtensionProcess);
}
@@ -416,8 +416,9 @@ class ExtensionImpl : public ExtensionBase {
// Common code for starting an API request to the browser. |value_args|
// contains the request's arguments.
+ // Steals value_args contents for efficiency.
static v8::Handle<v8::Value> StartRequestCommon(
- const v8::Arguments& args, const ListValue& value_args) {
+ const v8::Arguments& args, ListValue* value_args) {
// Get the current RenderView so that we can send a routed IPC message from
// the correct source.
RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext();
@@ -448,8 +449,14 @@ class ExtensionImpl : public ExtensionBase {
GetPendingRequestMap()[request_id].reset(new PendingRequest(
current_context, name));
- renderview->SendExtensionRequest(name, value_args, source_url,
- request_id, has_callback);
+ ViewHostMsg_DomMessage_Params params;
+ params.name = name;
+ params.arguments.Swap(value_args);
+ params.source_url = source_url;
+ params.request_id = request_id;
+ params.has_callback = has_callback;
+ params.user_gesture = webframe->isProcessingUserGesture();
+ renderview->SendExtensionRequest(params);
return v8::Undefined();
}
@@ -469,15 +476,11 @@ class ExtensionImpl : public ExtensionBase {
return v8::Undefined();
}
- return StartRequestCommon(args, static_cast<const ListValue&>(
- *value_args.get()));
+ return StartRequestCommon(args, static_cast<ListValue*>(value_args.get()));
}
- // A special request for setting the extension action icon. This function
- // accepts a canvas ImageData object, so it needs to do extra processing
- // before sending the request to the browser.
- static v8::Handle<v8::Value> SetExtensionActionIcon(
- const v8::Arguments& args) {
+ static bool ConvertImageDataToBitmapValue(
+ const v8::Arguments& args, Value** bitmap_value) {
v8::Local<v8::Object> extension_args = args[1]->ToObject();
v8::Local<v8::Object> details =
extension_args->Get(v8::String::New("0"))->ToObject();
@@ -491,7 +494,7 @@ class ExtensionImpl : public ExtensionBase {
int data_length = data->Get(v8::String::New("length"))->Int32Value();
if (data_length != 4 * width * height) {
NOTREACHED() << "Invalid argument to setIcon. Expecting ImageData.";
- return v8::Undefined();
+ return false;
}
SkBitmap bitmap;
@@ -512,9 +515,25 @@ class ExtensionImpl : public ExtensionBase {
// Construct the Value object.
IPC::Message bitmap_pickle;
IPC::WriteParam(&bitmap_pickle, bitmap);
- Value* bitmap_value = BinaryValue::CreateWithCopiedBuffer(
+ *bitmap_value = BinaryValue::CreateWithCopiedBuffer(
static_cast<const char*>(bitmap_pickle.data()), bitmap_pickle.size());
+ return true;
+ }
+
+ // A special request for setting the extension action icon and the sidebar
+ // mini tab icon. This function accepts a canvas ImageData object, so it needs
+ // to do extra processing before sending the request to the browser.
+ static v8::Handle<v8::Value> SetIconCommon(
+ const v8::Arguments& args) {
+ Value* bitmap_value = NULL;
+ if (!ConvertImageDataToBitmapValue(args, &bitmap_value))
+ return v8::Undefined();
+
+ v8::Local<v8::Object> extension_args = args[1]->ToObject();
+ v8::Local<v8::Object> details =
+ extension_args->Get(v8::String::New("0"))->ToObject();
+
DictionaryValue* dict = new DictionaryValue();
dict->Set("imageData", bitmap_value);
@@ -526,7 +545,7 @@ class ExtensionImpl : public ExtensionBase {
ListValue list_value;
list_value.Append(dict);
- return StartRequestCommon(args, list_value);
+ return StartRequestCommon(args, &list_value);
}
static v8::Handle<v8::Value> GetRenderViewId(const v8::Arguments& args) {
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 8602b5f..d3b8b8b 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -4587,17 +4587,9 @@ void RenderView::OnWindowFrameChanged(const gfx::Rect& window_frame,
}
#endif // OS_MACOSX
-void RenderView::SendExtensionRequest(const std::string& name,
- const ListValue& args,
- const GURL& source_url,
- int request_id,
- bool has_callback) {
- Send(new ViewHostMsg_ExtensionRequest(routing_id_,
- name,
- args,
- source_url,
- request_id,
- has_callback));
+void RenderView::SendExtensionRequest(
+ const ViewHostMsg_DomMessage_Params& params) {
+ Send(new ViewHostMsg_ExtensionRequest(routing_id_, params));
}
void RenderView::OnExtensionResponse(int request_id,
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 000fc09..fb4aa71 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -241,10 +241,7 @@ class RenderView : public RenderWidget,
// Extensions ----------------------------------------------------------------
- void SendExtensionRequest(const std::string& name, const ListValue& args,
- const GURL& source_url,
- int request_id,
- bool has_callback);
+ void SendExtensionRequest(const ViewHostMsg_DomMessage_Params& params);
void OnExtensionResponse(int request_id, bool success,
const std::string& response,
diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
index f0986f2..fee9b4c 100644
--- a/chrome/renderer/resources/extension_process_bindings.js
+++ b/chrome/renderer/resources/extension_process_bindings.js
@@ -17,7 +17,7 @@ var chrome = chrome || {};
native function GetRenderViewId();
native function GetPopupParentWindow();
native function GetPopupView();
- native function SetExtensionActionIcon();
+ native function SetIconCommon();
native function IsExtensionProcess();
var chromeHidden = GetChromeHidden();
@@ -535,9 +535,8 @@ var chrome = chrome || {};
};
var canvas;
- function setIconCommon(details, name, parameters, actionType) {
- var EXTENSION_ACTION_ICON_SIZE = 19;
-
+ function setIconCommon(details, name, parameters, actionType, iconSize,
+ nativeFunction) {
if ("iconIndex" in details) {
sendRequest(name, [details], parameters);
} else if ("imageData" in details) {
@@ -554,14 +553,14 @@ var chrome = chrome || {};
"The imageData property must contain an ImageData object.");
}
- if (details.imageData.width > EXTENSION_ACTION_ICON_SIZE ||
- details.imageData.height > EXTENSION_ACTION_ICON_SIZE) {
+ if (details.imageData.width > iconSize ||
+ details.imageData.height > iconSize) {
throw new Error(
"The imageData property must contain an ImageData object that " +
- "is no larger than 19 pixels square.");
+ "is no larger than " + iconSize + " pixels square.");
}
- sendCustomRequest(SetExtensionActionIcon, name, [details], parameters);
+ sendCustomRequest(nativeFunction, name, [details], parameters);
} else if ("path" in details) {
var img = new Image();
img.onerror = function() {
@@ -570,10 +569,8 @@ var chrome = chrome || {};
}
img.onload = function() {
var canvas = document.createElement("canvas");
- canvas.width = img.width > EXTENSION_ACTION_ICON_SIZE ?
- EXTENSION_ACTION_ICON_SIZE : img.width;
- canvas.height = img.height > EXTENSION_ACTION_ICON_SIZE ?
- EXTENSION_ACTION_ICON_SIZE : img.height;
+ canvas.width = img.width > iconSize ? iconSize : img.width;
+ canvas.height = img.height > iconSize ? iconSize : img.height;
var canvas_context = canvas.getContext('2d');
canvas_context.clearRect(0, 0, canvas.width, canvas.height);
@@ -581,8 +578,7 @@ var chrome = chrome || {};
delete details.path;
details.imageData = canvas_context.getImageData(0, 0, canvas.width,
canvas.height);
- sendCustomRequest(SetExtensionActionIcon, name, [details],
- parameters);
+ sendCustomRequest(nativeFunction, name, [details], parameters);
}
img.src = details.path;
} else {
@@ -591,16 +587,31 @@ var chrome = chrome || {};
}
}
+ function setExtensionActionIconCommon(details, name, parameters,
+ actionType) {
+ var EXTENSION_ACTION_ICON_SIZE = 19;
+ setIconCommon(details, name, parameters, actionType,
+ EXTENSION_ACTION_ICON_SIZE, SetIconCommon);
+ }
+
apiFunctions["browserAction.setIcon"].handleRequest = function(details) {
- setIconCommon(
+ setExtensionActionIconCommon(
details, this.name, this.definition.parameters, "browser action");
};
apiFunctions["pageAction.setIcon"].handleRequest = function(details) {
- setIconCommon(
+ setExtensionActionIconCommon(
details, this.name, this.definition.parameters, "page action");
};
+ apiFunctions["experimental.sidebar.setIcon"].handleRequest =
+ function(details) {
+ var SIDEBAR_ICON_SIZE = 16;
+ setIconCommon(
+ details, this.name, this.definition.parameters, "sidebar",
+ SIDEBAR_ICON_SIZE, SetIconCommon);
+ };
+
apiFunctions["contextMenus.create"].handleRequest =
function() {
var args = arguments;
diff --git a/chrome/renderer/resources/renderer_extension_bindings.js b/chrome/renderer/resources/renderer_extension_bindings.js
index 62184c6..22f7f48 100644
--- a/chrome/renderer/resources/renderer_extension_bindings.js
+++ b/chrome/renderer/resources/renderer_extension_bindings.js
@@ -262,6 +262,7 @@ var chrome = chrome || {};
"experimental.tts",
"experimental.proxy",
"experimental.rlz",
+ "experimental.sidebar",
"experimental.webNavigation",
"experimental.webRequest",
"history",