On Thu, Sep 19, 2024 at 9:48 PM Stephen Chenney <schen...@chromium.org>
wrote:

> Reply to the spec concerns inline ...
>
> On Thu, Sep 19, 2024 at 12:15 AM Domenic Denicola <dome...@chromium.org>
> wrote:
>
>> Seems like a good idea!
>>
>> On Thu, Sep 19, 2024 at 4:55 AM Chromestatus <
>> ad...@cr-status.appspotmail.com> wrote:
>>
>>> Contact emails schen...@chromium.org
>>>
>>> Explainer None
>>>
>>> Specification
>>> https://html.spec.whatwg.org/multipage/canvas.html#security-with-canvas-elements
>>
>>
>> I spent some time looking into the specification situation for this
>> change, to understand how the interop problem might have arisen.
>>
>> Unfortunately, the current spec is a bit of a mess. The only information
>> on whether an <img> will taint the canvas is given by
>> https://html.spec.whatwg.org/#the-image-argument-is-not-origin-clean ,
>> which says that it's tainted if "image's current request
>> <https://html.spec.whatwg.org/#current-request>'s image data
>> <https://html.spec.whatwg.org/#img-req-data> is CORS-cross-origin
>> <https://html.spec.whatwg.org/#cors-cross-origin>". The definition of
>> "image data" is not clear, but at least some parts of the spec assume that
>> it is a response <https://fetch.spec.whatwg.org/#concept-response>. A
>> response is a generic fetch-level concept and doesn't have any SVG-specific
>> notions, like foreignObjects.
>>
>> I think at the very least we should open a spec issue about this. It
>> would be helpful to explain how the tainting is implemented in Chromium
>> (and maybe other browsers, if you have that info) so we can see where the
>> mismatch is between spec and implementation.
>>
>
> Yes, the spec on tainting is a mess and not very clear at all. I
> will happily create an issue and try to get the spec updated.
>
> It would also be ideal if we could add some sort of spec patch, even if
>> it's a hack on top of unsteady foundations, to capture this behavior for
>> everyone. One idea might be to add something near
>> https://html.spec.whatwg.org/#updating-the-image-data:img-req-data-2 like
>>
>> > If the resource obtained is an SVG image meeting [X conditions], then
>> it must be considered as CORS-cross-origin, even if the fetch response was
>> CORS-same-origin.
>>
>> Does this sound reasonable to you? I don't want to throw up roadblocks on
>> a small change that will improve developers' lives. But I think we can
>> multiply our impact here by doing a bit more work to straighten out the
>> ecosystem for everyone. And it might get some good discussion from WebKit
>> as well.
>>
>
> I agree that we can be explicit about what makes an SVG image same vs.
> cross origin. It's basically recursive in that an SVG is same origin if it
> only references same-origin image content, and then we have the special
> foreignObject rules where a foreignObject is same-origin if the SVG is
> referenced via a data URI (and blob when this intent ships) but not when
> referred to by a URL. Part of the confusion arises because it's the SVG
> spec that talks about SVG in a non-interactive context which basically
> means "when used in an img tag".
>
> It may be that we need to also update the information at the
> "updating-the-image-data-img-req-2" link above, because it says nothing
> about what to do when the <img> src is not a regular URL, but is instead a
> data URI or blob. It may be covered someplace, but I couldn't find it while
> researching this email.
>
>
>>
>>>
>>>
>>> Summary
>>>
>>> The ability to use an <img> element with an SVG source in a HTML canvas
>>> drawImage operation has long been supported by all browsers, but the canvas
>>> tainting behavior varies across platforms. All browsers taint the canvas
>>> when the SVG source includes a foreignObject tag and is referenced via a
>>> HTTP URI scheme. When the same SVG is referenced through a data URI all
>>> browsers agree not to taint the canvas. However, when a blob URI is used
>>> both Chromium (before this change) and WebKit taint the canvas, but Gecko
>>> does not. When this feature is shipped Chromium's behavior will match that
>>> of Gecko, allowing a wider range of SVG content to be used in canvas
>>> drawImage calls without tainting.
>>>
>>>
>>> Blink component Blink>Canvas
>>> <https://bugs.chromium.org/p/chromium/issues/list?q=component:Blink%3ECanvas>
>>>
>>> TAG review None
>>>
>>> TAG review status Not applicable
>>>
>>> Risks
>>>
>>>
>>> Interoperability and Compatibility
>>>
>>> The feature adds functionality and has no interop risk. We align with
>>> Gecko with this change, and begin to differ from WebKit.
>>>
>> This changes the tainting and does not add functionality, right? Or is
this adding a new ability?


>
>>>
>>> *Gecko*: Shipped/Shipping
>>>
>>> *WebKit*: No signal
>>>
>>
It's worthwhile to file a WebKit position here since we will start to
deviate from that behavior.


>
>>>
>>> *Web developers*: Strongly positive The bug has developers complaining
>>> about the lack of this feature. Stack Overflow also has questions about it.
>>>
>>
(https://issues.chromium.org/issues/41054640 is the bug (from below))


>
>>>
>>> *Other signals*:
>>>
>>> WebView application risks
>>>
>>> Does this intent deprecate or change behavior of existing APIs, such
>>> that it has potentially high risk for Android WebView-based applications?
>>>
>>> No. The change makes HTML canvas image read-back slightly more
>>> permissive but otherwise has no impact.
>>>
>>>
>>> Debuggability
>>>
>>> None
>>>
>>>
>>> Will this feature be supported on all six Blink platforms (Windows, Mac,
>>> Linux, ChromeOS, Android, and Android WebView)? Yes
>>>
>>> All platforms support the underlying functionality. We are changing the
>>> tainting behavior, not the underlying mechanisms.
>>>
>>>
>>> Is this feature fully tested by web-platform-tests
>>> <https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>
>>> ? Yes
>>>
>>> The CL that enables the feature will include comprehensive canvas tests.
>>> Existing tests cover the various privacy concerns, such as ensuring the SVG
>>> content is indeed non-interactive.
>>>
>>>
>>> Flag name on chrome://flags None
>>>
>>> Finch feature name None
>>>
>>> Non-finch justification
>>>
>>> The code change adjusts tainting behavior, which is a state flag on the
>>> HTML canvas context. Testing confirms that the existing behavior is
>>> maintained, and the new behavior allows more permissive behavior.
>>>
>>>
>>> Requires code in //chrome? False
>>>
>>> Tracking bug https://issues.chromium.org/issues/41054640
>>>
>>> Measurement No explicit plan though we could add UseCounters to see how
>>> often the change hits.
>>>
>>> Availability expectation Available in Chromium-based browsers and
>>> Gecko. No idea when it might be available in WebKit.
>>>
>>> Adoption expectation I expect sites to transition from Data-URI to
>>> Blob-URI for this use case. I would expect it to happen as sites update or
>>> look for performance improvements.
>>>
>>> Adoption plan No explicit plan.
>>>
>>> Non-OSS dependencies
>>>
>>> Does the feature depend on any code or APIs outside the Chromium open
>>> source repository and its open-source dependencies to function?
>>> No.
>>>
>>> Estimated milestones
>>> Shipping on desktop 131
>>> Shipping on Android 131
>>> Shipping on WebView 131
>>>
>>> Anticipated spec changes
>>>
>>> Open questions about a feature may be a source of future web compat or
>>> interop issues. Please list open issues (e.g. links to known github issues
>>> in the project for the feature specification) whose resolution may
>>> introduce web compat/interop risk (e.g., changing to naming or structure of
>>> the API in a non-backward-compatible way).
>>> No change.
>>>
>>> Link to entry on the Chrome Platform Status
>>> https://chromestatus.com/feature/5196074156032000?gate=5159222329999360
>>>
>>> This intent message was generated by Chrome Platform Status
>>> <https://chromestatus.com>.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "blink-dev" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to blink-dev+unsubscr...@chromium.org.
>>> To view this discussion on the web visit
>>> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/66eb300e.2b0a0220.28f9c2.0061.GAE%40google.com
>>> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/66eb300e.2b0a0220.28f9c2.0061.GAE%40google.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "blink-dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to blink-dev+unsubscr...@chromium.org.
> To view this discussion on the web visit
> https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAGsbWzTaP3M3E0NFdbtFJRgwKi0zOE2J6g%3DjgL5juTQQ3jiG8g%40mail.gmail.com
> <https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAGsbWzTaP3M3E0NFdbtFJRgwKi0zOE2J6g%3DjgL5juTQQ3jiG8g%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to blink-dev+unsubscr...@chromium.org.
To view this discussion on the web visit 
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CADsXd2NEvrHOd6Ti4vUsEUcBuCYncd%2BMB-q7Rnu4i3FqBPYjAA%40mail.gmail.com.

Reply via email to