• arthursonzogni's avatar
    (reland) [api] Add API callback setter for the SAB origin trial · 22f124ce
    arthursonzogni authored
    This reland patch:
    https://chromium-review.googlesource.com/c/v8/v8/+/2867473
    (See patchset 1)
    
    The problem was blink injecting interceptor into the window object. It
    observes "observation" and "mutations" on this object. When it happens
    to the initial empty document, the IPC DidAccessInitialDocument() is
    sent and modify the state of the browser process. Causing two tests to
    fail.
    
    The diff (See patchset 1..2) includes:
    1. Use JSObject::HasRealNamedProperty instead of JsObject::HasProperty.
       This skips the interceptor and do not walk the prototype chain.
    2. Invert JSObject::HasRealNamedProperty() with
       IsSharedArrayBufferConstructorEnabled(), just in case. This avoid
       observing the object when not needed.
    
    Original patch description:
    ---
    This change makes it possible to enable SharedArrayBuffer per Context,
    controlling whether it should be enabled or not with a callback. The
    previous implementation of the reverse origin trial for
    SharedArrayBuffer was broken, since the feature could only be enabled
    globally per process, and only if the feature flag is set early enough
    in the v8 initialization. This does not play well with how origin
    trials work.
    
    The implementation is similar to the callbacks that already exist for
    the origin trials for WebAssembly simd and exceptions.
    
    SharedArrayBuffer is still controlled by the flag
    harmony_sharedarraybuffer. If that flag is disabled, then
    SharedArrayBuffer is disabled unconditionally. On top of that, this CL
    introduces a new flag for enabling SharedArrayBuffer per context. If
    that flag is set, a callback is used to determine whether
    SharedArrayBuffer should be enabled.
    
    Note that this only controls whether the SharedArrayBuffer constructor
    should be exposed on the global object or not. It is always possible
    to construct a SharedArrayBuffer using
    
      new WebAssembly.Memory({
        shared:true, initial:0, maximum:0 }).buffer.constructor;
    
    There are few things which I do not like of this approach, but I did
    not have better ideas:
    
    1. The complex logic of dobule flag + callback. However, this seemed
    the best way to me to not break embedders which rely on that flag
    being enabled by default.
    
    2. The fact that what actually matters is just whether the callback
    returns `true` once. It would be good to check that the callback gives
    a consistent return value, or to provide a better API that cannot be
    missunderstood.
    
    Bug: chromium:923807,chromium:1071424,chromium:1138860
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2867473Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
    Commit-Queue: Antonio Sartori <antoniosartori@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#74378}
    
    ---
    
    Bug: chromium:923807,chromium:1071424,chromium:1138860,chromium:1206187
    Change-Id: Ibc6b4f8c0e0827178b7f0cbe4b942444bbbe6216
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2880215Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarLutz Vahl <vahl@chromium.org>
    Reviewed-by: 's avatarHannes Payer <hpayer@chromium.org>
    Auto-Submit: Arthur Sonzogni <arthursonzogni@chromium.org>
    Commit-Queue: Hannes Payer <hpayer@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#74441}
    22f124ce
api.cc 392 KB