1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CANVAS_CANVAS_RENDERING_CONTEXT_HOST_H_
6 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CANVAS_CANVAS_RENDERING_CONTEXT_HOST_H_
7 
8 #include "services/metrics/public/cpp/ukm_recorder.h"
9 #include "third_party/blink/public/common/privacy_budget/identifiable_token.h"
10 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
11 #include "third_party/blink/renderer/core/core_export.h"
12 #include "third_party/blink/renderer/core/dom/events/event_dispatcher.h"
13 #include "third_party/blink/renderer/core/dom/events/event_target.h"
14 #include "third_party/blink/renderer/core/html/canvas/canvas_image_source.h"
15 #include "third_party/blink/renderer/core/html/canvas/ukm_parameters.h"
16 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
17 #include "third_party/blink/renderer/platform/bindings/script_state.h"
18 #include "third_party/blink/renderer/platform/geometry/float_rect.h"
19 #include "third_party/blink/renderer/platform/geometry/int_size.h"
20 #include "third_party/blink/renderer/platform/graphics/canvas_resource_host.h"
21 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
22 
23 namespace blink {
24 
25 class CanvasColorParams;
26 class CanvasRenderingContext;
27 class CanvasResource;
28 class CanvasResourceDispatcher;
29 class FontSelector;
30 class ImageEncodeOptions;
31 class KURL;
32 class StaticBitmapImage;
33 
34 class CORE_EXPORT CanvasRenderingContextHost : public CanvasResourceHost,
35                                                public CanvasImageSource,
36                                                public GarbageCollectedMixin {
37  public:
38   enum HostType {
39     kNone,
40     kCanvasHost,
41     kOffscreenCanvasHost,
42   };
43   explicit CanvasRenderingContextHost(HostType host_type);
44 
45   void RecordCanvasSizeToUMA(const IntSize&);
46 
47   virtual void DetachContext() = 0;
48 
49   virtual void DidDraw(const FloatRect& rect) = 0;
50   virtual void DidDraw() = 0;
51 
52   virtual void PreFinalizeFrame() = 0;
53   virtual void PostFinalizeFrame() = 0;
54   virtual bool PushFrame(scoped_refptr<CanvasResource> frame,
55                          const SkIRect& damage_rect) = 0;
56   virtual bool OriginClean() const = 0;
57   virtual void SetOriginTainted() = 0;
58   virtual const IntSize& Size() const = 0;
59   virtual CanvasRenderingContext* RenderingContext() const = 0;
60   virtual CanvasResourceDispatcher* GetOrCreateResourceDispatcher() = 0;
61 
62   virtual ExecutionContext* GetTopExecutionContext() const = 0;
63   virtual DispatchEventResult HostDispatchEvent(Event*) = 0;
64   virtual const KURL& GetExecutionContextUrl() const = 0;
65 
66   // If WebGL1 is disabled by enterprise policy or command line switch.
67   virtual bool IsWebGL1Enabled() const = 0;
68   // If WebGL2 is disabled by enterprise policy or command line switch.
69   virtual bool IsWebGL2Enabled() const = 0;
70   // If WebGL is temporarily blocked because WebGL contexts were lost one or
71   // more times, in particular, via the GL_ARB_robustness extension.
72   virtual bool IsWebGLBlocked() const = 0;
SetContextCreationWasBlocked()73   virtual void SetContextCreationWasBlocked() {}
74 
75   virtual FontSelector* GetFontSelector() = 0;
76 
77   virtual bool ShouldAccelerate2dContext() const = 0;
78 
IsNeutered()79   virtual bool IsNeutered() const { return false; }
80 
81   virtual void Commit(scoped_refptr<CanvasResource> canvas_resource,
82                       const SkIRect& damage_rect);
83 
84   virtual UkmParameters GetUkmParameters() = 0;
85 
86   // For deferred canvases this will have the side effect of drawing recorded
87   // commands in order to finalize the frame.
88   ScriptPromise convertToBlob(ScriptState*,
89                               const ImageEncodeOptions*,
90                               ExceptionState&,
91                               const CanvasRenderingContext* const context);
92 
93   bool IsPaintable() const;
94 
95   // Required by template functions in WebGLRenderingContextBase
width()96   int width() const { return Size().Width(); }
height()97   int height() const { return Size().Height(); }
98 
99   // Partial CanvasResourceHost implementation
100   void RestoreCanvasMatrixClipStack(cc::PaintCanvas*) const final;
101   CanvasResourceProvider* GetOrCreateCanvasResourceProviderImpl(
102       RasterModeHint hint) final;
103   CanvasResourceProvider* GetOrCreateCanvasResourceProvider(
104       RasterModeHint hint) override;
105 
106   bool Is3d() const;
107   bool IsRenderingContext2D() const;
108   CanvasColorParams ColorParams() const;
109 
110   // blink::CanvasImageSource
111   bool IsOffscreenCanvas() const override;
112 
113  protected:
114   ~CanvasRenderingContextHost() override = default;
115 
116   scoped_refptr<StaticBitmapImage> CreateTransparentImage(const IntSize&) const;
117 
118   void CreateCanvasResourceProvider2D(RasterModeHint hint);
119   void CreateCanvasResourceProvider3D();
120 
121   // Computes the digest that corresponds to the "input" of this canvas,
122   // including the context type, and if applicable, canvas digest, and taint
123   // bits.
124   IdentifiableToken IdentifiabilityInputDigest(
125       const CanvasRenderingContext* const context) const;
126 
127   bool did_fail_to_create_resource_provider_ = false;
128   bool did_record_canvas_size_to_uma_ = false;
129   HostType host_type_ = kNone;
130 };
131 
132 }  // namespace blink
133 
134 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CANVAS_CANVAS_RENDERING_CONTEXT_HOST_H_
135