diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-19 18:05:56 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-19 18:05:56 +0000 |
commit | 8b8e7c9bce4198a4ee2865d9dfce6e8baa173ad3 (patch) | |
tree | 938304b8e1be417c1b9c73d7463dacbc1da79843 /chrome/renderer | |
parent | f2c4ee3627e6039fd42bd7c0c93e902b72653449 (diff) | |
download | chromium_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.cc | 49 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 14 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 5 | ||||
-rw-r--r-- | chrome/renderer/resources/extension_process_bindings.js | 43 | ||||
-rw-r--r-- | chrome/renderer/resources/renderer_extension_bindings.js | 1 |
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", |