| Index: cc/trees/layer_tree_host_pixeltest_masks.cc | 
| diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc | 
| index eecc5a0e3eddc68ea43530e3359c64e3f1705bf0..a560d5e6ff512e1eae7b1fef3a7b7a34b56c1359 100644 | 
| --- a/cc/trees/layer_tree_host_pixeltest_masks.cc | 
| +++ b/cc/trees/layer_tree_host_pixeltest_masks.cc | 
| @@ -282,6 +282,114 @@ TEST_P(LayerTreeHostMasksPixelTest, MaskOfReplicaOfClippedLayer) { | 
|  | 
| #endif  // !defined(OS_WIN) | 
|  | 
| +class CheckerContentLayerClient : public ContentLayerClient { | 
| + public: | 
| +  explicit CheckerContentLayerClient(const gfx::Size& bounds) | 
| +      : bounds_(bounds) {} | 
| +  ~CheckerContentLayerClient() override {} | 
| +  bool FillsBoundsCompletely() const override { return false; } | 
| +  void PaintContents(SkCanvas* canvas, | 
| +                     const gfx::Rect& rect, | 
| +                     PaintingControlSetting picture_control) override { | 
| +    SkPaint paint; | 
| +    paint.setStyle(SkPaint::kStroke_Style); | 
| +    paint.setStrokeWidth(SkIntToScalar(3)); | 
| +    paint.setColor(SK_ColorGREEN); | 
| +    canvas->clear(SK_ColorTRANSPARENT); | 
| +    for (int i = 0; i < bounds_.width(); i += 11) { | 
| +      canvas->drawLine(i, 0, i, bounds_.height(), paint); | 
| +    } | 
| +  } | 
| +  scoped_refptr<DisplayItemList> PaintContentsToDisplayList( | 
| +      const gfx::Rect& clip, | 
| +      PaintingControlSetting picture_control) override { | 
| +    NOTIMPLEMENTED(); | 
| +    return DisplayItemList::Create(); | 
| +  } | 
| + | 
| + private: | 
| +  gfx::Size bounds_; | 
| +}; | 
| + | 
| +class CircleContentLayerClient : public ContentLayerClient { | 
| + public: | 
| +  explicit CircleContentLayerClient(const gfx::Size& bounds) | 
| +      : bounds_(bounds) {} | 
| +  ~CircleContentLayerClient() override {} | 
| +  bool FillsBoundsCompletely() const override { return false; } | 
| +  void PaintContents(SkCanvas* canvas, | 
| +                     const gfx::Rect& rect, | 
| +                     PaintingControlSetting picture_control) override { | 
| +    SkPaint paint; | 
| +    paint.setStyle(SkPaint::kFill_Style); | 
| +    paint.setColor(SK_ColorWHITE); | 
| +    canvas->clear(SK_ColorTRANSPARENT); | 
| +    canvas->drawCircle(bounds_.width() / 2, | 
| +                       bounds_.height() / 2, | 
| +                       bounds_.width() / 4, | 
| +                       paint); | 
| +  } | 
| +  scoped_refptr<DisplayItemList> PaintContentsToDisplayList( | 
| +      const gfx::Rect& clip, | 
| +      PaintingControlSetting picture_control) override { | 
| +    NOTIMPLEMENTED(); | 
| +    return DisplayItemList::Create(); | 
| +  } | 
| + | 
| + private: | 
| +  gfx::Size bounds_; | 
| +}; | 
| + | 
| +using LayerTreeHostMasksForBackgroundFiltersPixelTest = | 
| +    ParameterizedPixelResourceTest; | 
| + | 
| +INSTANTIATE_TEST_CASE_P( | 
| +    PixelResourceTest, | 
| +    LayerTreeHostMasksForBackgroundFiltersPixelTest, | 
| +    ::testing::Values( | 
| +        // SOFTWARE, Background filters aren't implemented in software | 
| +        // GL_GPU_RASTER_2D_DRAW, Gpu rasterisation has errors in accuracy | 
| +        GL_ONE_COPY_2D_STAGING_2D_DRAW, | 
| +        GL_ONE_COPY_RECT_STAGING_2D_DRAW, | 
| +        GL_ONE_COPY_EXTERNAL_STAGING_2D_DRAW, | 
| +        GL_ZERO_COPY_2D_DRAW, | 
| +        GL_ZERO_COPY_RECT_DRAW, | 
| +        GL_ZERO_COPY_EXTERNAL_DRAW, | 
| +        GL_ASYNC_UPLOAD_2D_DRAW)); | 
| + | 
| +TEST_P(LayerTreeHostMasksForBackgroundFiltersPixelTest, | 
| +       MaskOfLayerWithBackgroundFilter) { | 
| +  scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( | 
| +      gfx::Rect(200, 200), SK_ColorWHITE); | 
| + | 
| +  gfx::Size picture_bounds(200, 200); | 
| +  CheckerContentLayerClient picture_client(picture_bounds); | 
| +  scoped_refptr<PictureLayer> picture = PictureLayer::Create(&picture_client); | 
| +  picture->SetBounds(picture_bounds); | 
| +  picture->SetIsDrawable(true); | 
| + | 
| +  scoped_refptr<SolidColorLayer> blur = CreateSolidColorLayer( | 
| +      gfx::Rect(200, 200), SK_ColorTRANSPARENT); | 
| +  background->AddChild(picture); | 
| +  background->AddChild(blur); | 
| + | 
| +  FilterOperations filters; | 
| +  filters.Append(FilterOperation::CreateBlurFilter(2.f)); | 
| +  blur->SetBackgroundFilters(filters); | 
| + | 
| +  gfx::Size mask_bounds(200, 200); | 
| +  CircleContentLayerClient mask_client(mask_bounds); | 
| +  scoped_refptr<PictureLayer> mask = PictureLayer::Create(&mask_client); | 
| +  mask->SetBounds(mask_bounds); | 
| +  mask->SetIsDrawable(true); | 
| +  mask->SetIsMask(true); | 
| +  blur->SetMaskLayer(mask.get()); | 
| + | 
| +  RunPixelResourceTest(background, | 
| +                       base::FilePath( | 
| +                           FILE_PATH_LITERAL("mask_of_background_filter.png"))); | 
| +} | 
| + | 
| }  // namespace | 
| }  // namespace cc | 
|  | 
|  |