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