Commit ec5f56aa authored by David Bertoni's avatar David Bertoni Committed by Commit Bot

[Extensions] Use fetch/createImageBitmap in loadImagePath.

This change uses code that is compatible with both Service Worker-based
extensions and background/event page-based extensions to implement the
browserAction.setIcon() JavaScript code.

Bug: 1015136
Change-Id: I1bc55cd5da2cc106e8d74dba172122d2bf943d31
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1921640Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Commit-Queue: David Bertoni <dbertoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#718928}
parent af5d2321
...@@ -658,7 +658,7 @@ v8::Local<v8::String> ModuleSystem::WrapSource(v8::Local<v8::String> source) { ...@@ -658,7 +658,7 @@ v8::Local<v8::String> ModuleSystem::WrapSource(v8::Local<v8::String> source) {
GetIsolate(), GetIsolate(),
"(function(require, requireNative, loadScript, exports, console, " "(function(require, requireNative, loadScript, exports, console, "
"privates, apiBridge, bindingUtil, getInternalApi, $Array, $Function, " "privates, apiBridge, bindingUtil, getInternalApi, $Array, $Function, "
"$JSON, $Object, $RegExp, $String, $Error) {" "$JSON, $Object, $RegExp, $String, $Error, $Promise) {"
"'use strict';"); "'use strict';");
v8::Local<v8::String> right = ToV8StringUnsafe(GetIsolate(), "\n})"); v8::Local<v8::String> right = ToV8StringUnsafe(GetIsolate(), "\n})");
return handle_scope.Escape(v8::Local<v8::String>(v8::String::Concat( return handle_scope.Escape(v8::Local<v8::String>(v8::String::Concat(
...@@ -798,6 +798,7 @@ v8::Local<v8::Value> ModuleSystem::LoadModuleWithNativeAPIBridge( ...@@ -798,6 +798,7 @@ v8::Local<v8::Value> ModuleSystem::LoadModuleWithNativeAPIBridge(
context_->safe_builtins()->GetRegExp(), context_->safe_builtins()->GetRegExp(),
context_->safe_builtins()->GetString(), context_->safe_builtins()->GetString(),
context_->safe_builtins()->GetError(), context_->safe_builtins()->GetError(),
context_->safe_builtins()->GetPromise(),
}; };
{ {
v8::TryCatch try_catch(GetIsolate()); v8::TryCatch try_catch(GetIsolate());
......
...@@ -5,23 +5,32 @@ ...@@ -5,23 +5,32 @@
var SetIconCommon = requireNative('setIcon').SetIconCommon; var SetIconCommon = requireNative('setIcon').SetIconCommon;
function loadImagePath(path, callback) { function loadImagePath(path, callback) {
var img = new Image(); let fetchPromise = fetch(path);
img.onerror = function() {
console.error('Could not load action icon \'' + path + '\'.');
};
img.onload = function() {
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
let blobPromise = $Promise.then(fetchPromise, function(response) {
if (!response.ok) {
throw new $Error.self('Could not load action icon \'' + path + '\'.');
}
return response.blob();
});
let imagePromise = $Promise.then(blobPromise, function(blob) {
return createImageBitmap(blob);
});
let imageDataPromise = $Promise.then(imagePromise, function(image) {
var canvas = new OffscreenCanvas(image.width, image.height);
var canvas_context = canvas.getContext('2d'); var canvas_context = canvas.getContext('2d');
canvas_context.clearRect(0, 0, canvas.width, canvas.height); canvas_context.clearRect(0, 0, canvas.width, canvas.height);
canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); canvas_context.drawImage(image, 0, 0, canvas.width, canvas.height);
var imageData = canvas_context.getImageData(0, 0, canvas.width, var imageData = canvas_context.getImageData(0, 0, canvas.width,
canvas.height); canvas.height);
callback(imageData); callback(imageData);
}; });
img.src = path;
$Promise.catch(imageDataPromise, function(error) {
console.error(error);
});
} }
function smellsLikeImageData(imageData) { function smellsLikeImageData(imageData) {
......
...@@ -87,6 +87,8 @@ const char kScript[] = ...@@ -87,6 +87,8 @@ const char kScript[] =
"saveBuiltin(Error,\n" "saveBuiltin(Error,\n"
" [],\n" " [],\n"
" ['captureStackTrace']);\n" " ['captureStackTrace']);\n"
"saveBuiltin(Promise,\n"
" ['then', 'catch']);\n"
"\n" "\n"
"// JSON is trickier because extensions can override toJSON in\n" "// JSON is trickier because extensions can override toJSON in\n"
"// incompatible ways, and we need to prevent that.\n" "// incompatible ways, and we need to prevent that.\n"
...@@ -258,4 +260,8 @@ v8::Local<v8::Object> SafeBuiltins::GetError() const { ...@@ -258,4 +260,8 @@ v8::Local<v8::Object> SafeBuiltins::GetError() const {
return Load("Error", context_->v8_context()); return Load("Error", context_->v8_context());
} }
v8::Local<v8::Object> SafeBuiltins::GetPromise() const {
return Load("Promise", context_->v8_context());
}
} // namespace extensions } // namespace extensions
...@@ -39,6 +39,7 @@ class SafeBuiltins { ...@@ -39,6 +39,7 @@ class SafeBuiltins {
v8::Local<v8::Object> GetRegExp() const; v8::Local<v8::Object> GetRegExp() const;
v8::Local<v8::Object> GetString() const; v8::Local<v8::Object> GetString() const;
v8::Local<v8::Object> GetError() const; v8::Local<v8::Object> GetError() const;
v8::Local<v8::Object> GetPromise() const;
private: private:
ScriptContext* context_; ScriptContext* context_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment