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) {
GetIsolate(),
"(function(require, requireNative, loadScript, exports, console, "
"privates, apiBridge, bindingUtil, getInternalApi, $Array, $Function, "
"$JSON, $Object, $RegExp, $String, $Error) {"
"$JSON, $Object, $RegExp, $String, $Error, $Promise) {"
"'use strict';");
v8::Local<v8::String> right = ToV8StringUnsafe(GetIsolate(), "\n})");
return handle_scope.Escape(v8::Local<v8::String>(v8::String::Concat(
......@@ -798,6 +798,7 @@ v8::Local<v8::Value> ModuleSystem::LoadModuleWithNativeAPIBridge(
context_->safe_builtins()->GetRegExp(),
context_->safe_builtins()->GetString(),
context_->safe_builtins()->GetError(),
context_->safe_builtins()->GetPromise(),
};
{
v8::TryCatch try_catch(GetIsolate());
......
......@@ -5,23 +5,32 @@
var SetIconCommon = requireNative('setIcon').SetIconCommon;
function loadImagePath(path, callback) {
var img = new Image();
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 fetchPromise = fetch(path);
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');
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,
canvas.height);
callback(imageData);
};
img.src = path;
});
$Promise.catch(imageDataPromise, function(error) {
console.error(error);
});
}
function smellsLikeImageData(imageData) {
......
......@@ -87,6 +87,8 @@ const char kScript[] =
"saveBuiltin(Error,\n"
" [],\n"
" ['captureStackTrace']);\n"
"saveBuiltin(Promise,\n"
" ['then', 'catch']);\n"
"\n"
"// JSON is trickier because extensions can override toJSON in\n"
"// incompatible ways, and we need to prevent that.\n"
......@@ -258,4 +260,8 @@ v8::Local<v8::Object> SafeBuiltins::GetError() const {
return Load("Error", context_->v8_context());
}
v8::Local<v8::Object> SafeBuiltins::GetPromise() const {
return Load("Promise", context_->v8_context());
}
} // namespace extensions
......@@ -39,6 +39,7 @@ class SafeBuiltins {
v8::Local<v8::Object> GetRegExp() const;
v8::Local<v8::Object> GetString() const;
v8::Local<v8::Object> GetError() const;
v8::Local<v8::Object> GetPromise() const;
private:
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