Commit 6ed26f01 authored by Chris Harrelson's avatar Chris Harrelson Committed by Commit Bot

[PE] Distinguish between tainting due to canvas content and filter.

A filter on a canvas can itself lead to origin tainting, for reasons
other than that the canvas contents are tainted. This CL changes
to distinguish these two causes, so that we recompute filters
on content-tainting change.

Bug: 778506
Change-Id: I3cec8ef3b2772f2af78cdd4b290520113092cca6
Reviewed-on: https://chromium-review.googlesource.com/811767Reviewed-by: default avatarFredrik Söderquist <fs@opera.com>
Commit-Queue: Chris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#522274}
parent e2028a77
...@@ -17,7 +17,8 @@ img.src = "http://localhost:8000/resources/square.png"; ...@@ -17,7 +17,8 @@ img.src = "http://localhost:8000/resources/square.png";
img.onload = function () { img.onload = function () {
var ctx = document.getElementById("canvas").getContext("2d"); var ctx = document.getElementById("canvas").getContext("2d");
ctx.filter = "url(#filter)"; ctx.filter = "url(#filter)";
// Fill rect will force resolving of the filter before drawImage.
ctx.fillRect(-10, -10, 1, 1);
ctx.drawImage(img, 0, 0); ctx.drawImage(img, 0, 0);
window.testRunner.notifyDone(); window.testRunner.notifyDone();
} }
......
...@@ -45,7 +45,7 @@ const char BaseRenderingContext2D::kLtrDirectionString[] = "ltr"; ...@@ -45,7 +45,7 @@ const char BaseRenderingContext2D::kLtrDirectionString[] = "ltr";
const double BaseRenderingContext2D::kCDeviceScaleFactor = 1.0; const double BaseRenderingContext2D::kCDeviceScaleFactor = 1.0;
BaseRenderingContext2D::BaseRenderingContext2D() BaseRenderingContext2D::BaseRenderingContext2D()
: clip_antialiasing_(kNotAntiAliased) { : clip_antialiasing_(kNotAntiAliased), origin_tainted_by_content_(false) {
state_stack_.push_back(CanvasRenderingContext2DState::Create()); state_stack_.push_back(CanvasRenderingContext2DState::Create());
} }
...@@ -151,6 +151,7 @@ void BaseRenderingContext2D::Reset() { ...@@ -151,6 +151,7 @@ void BaseRenderingContext2D::Reset() {
#endif #endif
} }
ValidateStateStack(); ValidateStateStack();
origin_tainted_by_content_ = false;
} }
static inline void ConvertCanvasStyleToUnionType( static inline void ConvertCanvasStyleToUnionType(
...@@ -195,10 +196,8 @@ void BaseRenderingContext2D::setStrokeStyle( ...@@ -195,10 +196,8 @@ void BaseRenderingContext2D::setStrokeStyle(
} else if (style.IsCanvasPattern()) { } else if (style.IsCanvasPattern()) {
CanvasPattern* canvas_pattern = style.GetAsCanvasPattern(); CanvasPattern* canvas_pattern = style.GetAsCanvasPattern();
if (OriginClean() && !canvas_pattern->OriginClean()) { if (!origin_tainted_by_content_ && !canvas_pattern->OriginClean())
SetOriginTainted(); SetOriginTaintedByContent();
ClearResolvedFilters();
}
canvas_style = CanvasStyle::CreateFromPattern(canvas_pattern); canvas_style = CanvasStyle::CreateFromPattern(canvas_pattern);
} }
...@@ -238,9 +237,8 @@ void BaseRenderingContext2D::setFillStyle( ...@@ -238,9 +237,8 @@ void BaseRenderingContext2D::setFillStyle(
} else if (style.IsCanvasPattern()) { } else if (style.IsCanvasPattern()) {
CanvasPattern* canvas_pattern = style.GetAsCanvasPattern(); CanvasPattern* canvas_pattern = style.GetAsCanvasPattern();
if (OriginClean() && !canvas_pattern->OriginClean()) { if (!origin_tainted_by_content_ && !canvas_pattern->OriginClean()) {
SetOriginTainted(); SetOriginTaintedByContent();
ClearResolvedFilters();
} }
if (canvas_pattern->GetPattern()->IsTextureBacked()) if (canvas_pattern->GetPattern()->IsTextureBacked())
DisableDeferral(kDisableDeferralReasonUsingTextureBackedPattern); DisableDeferral(kDisableDeferralReasonUsingTextureBackedPattern);
...@@ -1107,7 +1105,9 @@ bool ShouldDisableDeferral(CanvasImageSource* image_source, ...@@ -1107,7 +1105,9 @@ bool ShouldDisableDeferral(CanvasImageSource* image_source,
return false; return false;
} }
void BaseRenderingContext2D::ClearResolvedFilters() { void BaseRenderingContext2D::SetOriginTaintedByContent() {
SetOriginTainted();
origin_tainted_by_content_ = true;
for (auto& state : state_stack_) for (auto& state : state_stack_)
state->ClearResolvedFilter(); state->ClearResolvedFilter();
} }
...@@ -1274,11 +1274,9 @@ void BaseRenderingContext2D::drawImage(ScriptState* script_state, ...@@ -1274,11 +1274,9 @@ void BaseRenderingContext2D::drawImage(ScriptState* script_state,
ValidateStateStack(); ValidateStateStack();
if (OriginClean() && if (!origin_tainted_by_content_ &&
WouldTaintOrigin(image_source, ExecutionContext::From(script_state))) { WouldTaintOrigin(image_source, ExecutionContext::From(script_state)))
SetOriginTainted(); SetOriginTaintedByContent();
ClearResolvedFilters();
}
Draw( Draw(
[this, &image_source, &image, &src_rect, dst_rect]( [this, &image_source, &image, &src_rect, dst_rect](
......
...@@ -410,9 +410,14 @@ class MODULES_EXPORT BaseRenderingContext2D : public GarbageCollectedMixin, ...@@ -410,9 +410,14 @@ class MODULES_EXPORT BaseRenderingContext2D : public GarbageCollectedMixin,
void ClearCanvas(); void ClearCanvas();
bool RectContainsTransformedRect(const FloatRect&, const SkIRect&) const; bool RectContainsTransformedRect(const FloatRect&, const SkIRect&) const;
void ClearResolvedFilters(); // Sets the origin to be tainted by the content of the canvas, such
// as a cross-origin image. This is as opposed to some other reason
// such as tainting from a filter applied to the canvas.
void SetOriginTaintedByContent();
ImageDataColorSettings GetColorSettingsAsImageDataColorSettings() const; ImageDataColorSettings GetColorSettingsAsImageDataColorSettings() const;
bool origin_tainted_by_content_;
}; };
template <typename DrawFunc, typename ContainsFunc> template <typename DrawFunc, typename ContainsFunc>
......
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