1719ecb9dc
Like CSP flag 'unsafe-eval', which communicates if both JS source files and WASM binary files may be compiled, this CL adds a similar flag for the compilation of WASM binary files. That is, a WASM binary file will be compiled only if the new flag is defined, or the flag for 'unsafe-eval' allows it. These flags are implemented as callback functions on the isolate. The callbacks get a (CSP) context, and a string, and returns the corresponding value of the flag. Both callbacks are initialized with the nullptr, and is used to communicate that no CSP policy is defined. This allows this concept to work, independent of it running in Chrome. It also does a small clean up in api.cc to use macro CALLER_SETTERS, instead of explicit code when appropriate. Bug: v8:7041 Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_rel_ng Change-Id: Idb3356574ae2a298057e6b7bccbd3492831952ae Reviewed-on: https://chromium-review.googlesource.com/759162 Reviewed-by: Bill Budge <bbudge@chromium.org> Reviewed-by: Eric Holk <eholk@chromium.org> Commit-Queue: Karl Schimpf <kschimpf@chromium.org> Cr-Commit-Position: refs/heads/master@{#49243}
166 lines
4.6 KiB
JavaScript
166 lines
4.6 KiB
JavaScript
// Copyright 2017 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --expose-wasm --allow-natives-syntax
|
|
|
|
load("test/mjsunit/wasm/wasm-constants.js");
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
let kReturnValue = 19;
|
|
|
|
let buffer = (function CreateBuffer() {
|
|
let builder = new WasmModuleBuilder();
|
|
builder.addMemory(1, 1, true);
|
|
builder.addFunction('main', kSig_i_v)
|
|
.addBody([kExprI32Const, kReturnValue])
|
|
.exportFunc();
|
|
|
|
return builder.toBuffer();
|
|
})();
|
|
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(true);
|
|
|
|
async function SyncTestOk() {
|
|
print('sync module compile (ok)...');
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
let module = new WebAssembly.Module(buffer);
|
|
assertInstanceof(module, WebAssembly.Module);
|
|
}
|
|
|
|
async function SyncTestFail() {
|
|
print('sync module compile (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
try {
|
|
let module = new WebAssembly.Module(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function SyncTestWasmFail(disallow_codegen) {
|
|
print('sync wasm module compile (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
try {
|
|
let module = new WebAssembly.Module(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function AsyncTestOk() {
|
|
print('async module compile (ok)...');
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
let promise = WebAssembly.compile(buffer);
|
|
assertPromiseResult(
|
|
promise, module => assertInstanceof(module, WebAssembly.Module));
|
|
}
|
|
|
|
async function AsyncTestFail() {
|
|
print('async module compile (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
try {
|
|
let m = await WebAssembly.compile(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function AsyncTestWasmFail(disallow_codegen) {
|
|
print('async wasm module compile (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
try {
|
|
let m = await WebAssembly.compile(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function StreamingTestOk() {
|
|
print('streaming module compile (ok)...');
|
|
// TODO(titzer): compileStreaming must be supplied by embedder.
|
|
// (and it takes a response, not a buffer)
|
|
%DisallowCodegenFromStrings(false);
|
|
%DisallowWasmCodegen(false);
|
|
if ("Function" != typeof WebAssembly.compileStreaming) {
|
|
print(" no embedder for streaming compilation");
|
|
return;
|
|
}
|
|
let promise = WebAssembly.compileStreaming(buffer);
|
|
assertPromiseResult(
|
|
promise, module => assertInstanceof(module, WebAssembly.Module));
|
|
}
|
|
|
|
async function StreamingTestFail() {
|
|
print('streaming module compile (fail)...');
|
|
%DisallowCodegenFromStrings(true);
|
|
%DisallowWasmCodegen(false);
|
|
// TODO(titzer): compileStreaming must be supplied by embedder.
|
|
// (and it takes a response, not a buffer)
|
|
if ("Function" != typeof WebAssembly.compileStreaming) {
|
|
print(" no embedder for streaming compilation");
|
|
return;
|
|
}
|
|
try {
|
|
let m = await WebAssembly.compileStreaming(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
|
|
async function StreamingTestWasmFail(disallow_codegen) {
|
|
print('streaming wasm module compile (fail)...');
|
|
%DisallowCodegenFromStrings(disallow_codegen);
|
|
%DisallowWasmCodegen(true);
|
|
// TODO(titzer): compileStreaming must be supplied by embedder.
|
|
// (and it takes a response, not a buffer)
|
|
if ("Function" != typeof WebAssembly.compileStreaming) {
|
|
print(" no embedder for streaming compilation");
|
|
return;
|
|
}
|
|
try {
|
|
let m = await WebAssembly.compileStreaming(buffer);
|
|
assertUnreachable();
|
|
} catch (e) {
|
|
print(" " + e);
|
|
assertInstanceof(e, WebAssembly.CompileError);
|
|
}
|
|
}
|
|
|
|
async function RunAll() {
|
|
await SyncTestOk();
|
|
await SyncTestFail();
|
|
await AsyncTestOk();
|
|
await AsyncTestFail();
|
|
await StreamingTestOk();
|
|
await StreamingTestFail();
|
|
|
|
disallow_codegen = false;
|
|
for (count = 0; count < 2; ++count) {
|
|
SyncTestWasmFail(disallow_codegen);
|
|
AsyncTestWasmFail(disallow_codegen);
|
|
StreamingTestWasmFail(disallow_codegen)
|
|
disallow_codegen = true;
|
|
}
|
|
}
|
|
|
|
assertPromiseResult(RunAll());
|