From 6976132e5c794423693ac40ec4c705a9c736285c Mon Sep 17 00:00:00 2001 From: joshualitt Date: Mon, 14 Nov 2022 13:56:06 -0800 Subject: [PATCH 01/10] [web] Switch to doubles (#37336) --- lib/web_ui/lib/src/engine/assets.dart | 2 +- .../lib/src/engine/browser_detection.dart | 2 +- .../lib/src/engine/canvaskit/canvas.dart | 4 +- .../src/engine/canvaskit/canvaskit_api.dart | 112 +++++----- .../lib/src/engine/canvaskit/image.dart | 16 +- .../engine/canvaskit/image_wasm_codecs.dart | 6 +- .../engine/canvaskit/image_web_codecs.dart | 16 +- .../lib/src/engine/canvaskit/surface.dart | 6 +- lib/web_ui/lib/src/engine/canvaskit/text.dart | 14 +- lib/web_ui/lib/src/engine/canvaskit/util.dart | 4 +- lib/web_ui/lib/src/engine/configuration.dart | 5 +- lib/web_ui/lib/src/engine/dom.dart | 199 +++++++----------- lib/web_ui/lib/src/engine/embedder.dart | 24 +-- lib/web_ui/lib/src/engine/html/scene.dart | 4 +- .../lib/src/engine/html/surface_stats.dart | 4 +- .../lib/src/engine/html_image_codec.dart | 12 +- .../lib/src/engine/keyboard_binding.dart | 4 +- lib/web_ui/lib/src/engine/picture.dart | 4 +- .../lib/src/engine/platform_dispatcher.dart | 6 +- .../lib/src/engine/pointer_binding.dart | 73 +++---- .../lib/src/engine/safe_browser_api.dart | 28 +-- .../lib/src/engine/semantics/scrollable.dart | 12 +- .../lib/src/engine/text/font_collection.dart | 2 +- .../lib/src/engine/text/line_breaker.dart | 4 +- .../lib/src/engine/text/measurement.dart | 2 +- lib/web_ui/lib/src/engine/text/ruler.dart | 4 +- .../src/engine/text_editing/text_editing.dart | 8 +- lib/web_ui/lib/src/engine/window.dart | 14 +- .../engine/surface/scene_builder_test.dart | 10 +- .../test/engine/surface/surface_test.dart | 4 +- 30 files changed, 282 insertions(+), 323 deletions(-) diff --git a/lib/web_ui/lib/src/engine/assets.dart b/lib/web_ui/lib/src/engine/assets.dart index 0fdb7006072a3..bfc7bba0e46e9 100644 --- a/lib/web_ui/lib/src/engine/assets.dart +++ b/lib/web_ui/lib/src/engine/assets.dart @@ -84,7 +84,7 @@ class AssetManager { printWarning('Asset manifest does not exist at `$url` – ignoring.'); return Uint8List.fromList(utf8.encode('{}')).buffer.asByteData(); } - throw AssetManagerException(url, request.status!); + throw AssetManagerException(url, request.status!.toInt()); } final String? constructorName = target == null ? 'null' : diff --git a/lib/web_ui/lib/src/engine/browser_detection.dart b/lib/web_ui/lib/src/engine/browser_detection.dart index 769b2812f512b..3ff3c714e0907 100644 --- a/lib/web_ui/lib/src/engine/browser_detection.dart +++ b/lib/web_ui/lib/src/engine/browser_detection.dart @@ -142,7 +142,7 @@ OperatingSystem detectOperatingSystem({ // iDevices requesting a "desktop site" spoof their UA so it looks like a Mac. // This checks if we're in a touch device, or on a real mac. final int maxTouchPoints = - overrideMaxTouchPoints ?? domWindow.navigator.maxTouchPoints ?? 0; + overrideMaxTouchPoints ?? domWindow.navigator.maxTouchPoints?.toInt() ?? 0; if (maxTouchPoints > 2) { return OperatingSystem.iOs; } diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvas.dart b/lib/web_ui/lib/src/engine/canvaskit/canvas.dart index b499f95abe3a6..2c17785969c1b 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/canvas.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/canvas.dart @@ -35,7 +35,7 @@ class CkCanvas { final SkCanvas skCanvas; - int? get saveCount => skCanvas.getSaveCount(); + int? get saveCount => skCanvas.getSaveCount().toInt(); void clear(ui.Color color) { skCanvas.clear(toSharedSkColor1(color)); @@ -272,7 +272,7 @@ class CkCanvas { } int save() { - return skCanvas.save(); + return skCanvas.save().toInt(); } void saveLayer(ui.Rect bounds, CkPaint? paint) { diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart index dc35f568d231c..25e5f79e83874 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart @@ -96,10 +96,10 @@ extension CanvasKitExtension on CanvasKit { ); // Text decoration enum is embedded in the CanvasKit object itself. - external int get NoDecoration; - external int get UnderlineDecoration; - external int get OverlineDecoration; - external int get LineThroughDecoration; + external double get NoDecoration; + external double get UnderlineDecoration; + external double get OverlineDecoration; + external double get LineThroughDecoration; // End of text decoration enum. external SkTextDecorationStyleEnum get DecorationStyle; @@ -109,7 +109,7 @@ extension CanvasKitExtension on CanvasKit { external SkFontMgrNamespace get FontMgr; external TypefaceFontProviderNamespace get TypefaceFontProvider; external SkTypefaceFactory get Typeface; - external int GetWebGLContext( + external double GetWebGLContext( DomCanvasElement canvas, SkWebGLContextOptions options); external SkGrContext MakeGrContext(int glContext); external SkSurface? MakeOnScreenGLSurface( @@ -195,8 +195,8 @@ class SkSurface {} extension SkSurfaceExtension on SkSurface { external SkCanvas getCanvas(); external void flush(); - external int width(); - external int height(); + external double width(); + external double height(); external void dispose(); external SkImage makeImageSnapshot(); } @@ -226,7 +226,7 @@ extension SkFontSlantEnumExtension on SkFontSlantEnum { class SkFontSlant {} extension SkFontSlantExtension on SkFontSlant { - external int get value; + external double get value; } final List _skFontSlants = [ @@ -260,7 +260,7 @@ extension SkFontWeightEnumExtension on SkFontWeightEnum { class SkFontWeight {} extension SkFontWeightExtension on SkFontWeight { - external int get value; + external double get value; } final List _skFontWeights = [ @@ -293,7 +293,7 @@ extension SkAffinityEnumExtension on SkAffinityEnum { class SkAffinity {} extension SkAffinityExtension on SkAffinity { - external int get value; + external double get value; } final List _skAffinitys = [ @@ -319,7 +319,7 @@ extension SkTextDirectionEnumExtension on SkTextDirectionEnum { class SkTextDirection {} extension SkTextDirectionExtension on SkTextDirection { - external int get value; + external double get value; } // Flutter enumerates text directions as RTL, LTR, while CanvasKit @@ -351,7 +351,7 @@ extension SkTextAlignEnumExtension on SkTextAlignEnum { class SkTextAlign {} extension SkTextAlignExtension on SkTextAlign { - external int get value; + external double get value; } final List _skTextAligns = [ @@ -383,7 +383,7 @@ extension SkTextHeightBehaviorEnumExtension on SkTextHeightBehaviorEnum { class SkTextHeightBehavior {} extension SkTextHeightBehaviorExtension on SkTextHeightBehavior { - external int get value; + external double get value; } final List _skTextHeightBehaviors = @@ -418,7 +418,7 @@ extension SkRectHeightStyleEnumExtension on SkRectHeightStyleEnum { class SkRectHeightStyle {} extension SkRectHeightStyleExtension on SkRectHeightStyle { - external int get value; + external double get value; } final List _skRectHeightStyles = [ @@ -448,7 +448,7 @@ extension SkRectWidthStyleEnumExtension on SkRectWidthStyleEnum { class SkRectWidthStyle {} extension SkRectWidthStyleExtension on SkRectWidthStyle { - external int get value; + external double get value; } final List _skRectWidthStyles = [ @@ -476,7 +476,7 @@ extension SkVertexModeEnumExtension on SkVertexModeEnum { class SkVertexMode {} extension SkVertexModeExtension on SkVertexMode { - external int get value; + external double get value; } final List _skVertexModes = [ @@ -504,7 +504,7 @@ extension SkPointModeEnumExtension on SkPointModeEnum { class SkPointMode {} extension SkPointModeExtension on SkPointMode { - external int get value; + external double get value; } final List _skPointModes = [ @@ -531,7 +531,7 @@ extension SkClipOpEnumExtension on SkClipOpEnum { class SkClipOp {} extension SkClipOpExtension on SkClipOp { - external int get value; + external double get value; } final List _skClipOps = [ @@ -557,7 +557,7 @@ extension SkFillTypeEnumExtension on SkFillTypeEnum { class SkFillType {} extension SkFillTypeExtension on SkFillType { - external int get value; + external double get value; } final List _skFillTypes = [ @@ -586,7 +586,7 @@ extension SkPathOpEnumExtension on SkPathOpEnum { class SkPathOp {} extension SkPathOpExtension on SkPathOp { - external int get value; + external double get value; } final List _skPathOps = [ @@ -617,7 +617,7 @@ extension SkBlurStyleEnumExtension on SkBlurStyleEnum { class SkBlurStyle {} extension SkBlurStyleExtension on SkBlurStyle { - external int get value; + external double get value; } final List _skBlurStyles = [ @@ -646,7 +646,7 @@ extension SkStrokeCapEnumExtension on SkStrokeCapEnum { class SkStrokeCap {} extension SkStrokeCapExtension on SkStrokeCap { - external int get value; + external double get value; } final List _skStrokeCaps = [ @@ -673,7 +673,7 @@ extension SkPaintStyleEnumExtension on SkPaintStyleEnum { class SkPaintStyle {} extension SkPaintStyleExtension on SkPaintStyle { - external int get value; + external double get value; } final List _skPaintStyles = [ @@ -726,7 +726,7 @@ extension SkBlendModeEnumExtension on SkBlendModeEnum { class SkBlendMode {} extension SkBlendModeExtension on SkBlendMode { - external int get value; + external double get value; } final List _skBlendModes = [ @@ -780,7 +780,7 @@ extension SkStrokeJoinEnumExtension on SkStrokeJoinEnum { class SkStrokeJoin {} extension SkStrokeJoinExtension on SkStrokeJoin { - external int get value; + external double get value; } final List _skStrokeJoins = [ @@ -809,7 +809,7 @@ extension SkTileModeEnumExtension on SkTileModeEnum { class SkTileMode {} extension SkTileModeExtension on SkTileMode { - external int get value; + external double get value; } final List _skTileModes = [ @@ -837,7 +837,7 @@ extension SkFilterModeEnumExtension on SkFilterModeEnum { class SkFilterMode {} extension SkFilterModeExtension on SkFilterMode { - external int get value; + external double get value; } SkFilterMode toSkFilterMode(ui.FilterQuality filterQuality) { @@ -861,7 +861,7 @@ extension SkMipmapModeEnumExtension on SkMipmapModeEnum { class SkMipmapMode {} extension SkMipmapModeExtension on SkMipmapMode { - external int get value; + external double get value; } SkMipmapMode toSkMipmapMode(ui.FilterQuality filterQuality) { @@ -885,7 +885,7 @@ extension SkAlphaTypeEnumExtension on SkAlphaTypeEnum { class SkAlphaType {} extension SkAlphaTypeExtension on SkAlphaType { - external int get value; + external double get value; } @JS() @@ -911,7 +911,7 @@ extension SkColorTypeEnumExtension on SkColorTypeEnum { class SkColorType {} extension SkColorTypeExtension on SkColorType { - external int get value; + external double get value; } @JS() @@ -920,19 +920,19 @@ extension SkColorTypeExtension on SkColorType { class SkAnimatedImage {} extension SkAnimatedImageExtension on SkAnimatedImage { - external int getFrameCount(); + external double getFrameCount(); - external int getRepetitionCount(); + external double getRepetitionCount(); /// Returns duration in milliseconds. - external int currentFrameDuration(); + external double currentFrameDuration(); /// Advances to the next frame and returns its duration in milliseconds. - external int decodeNextFrame(); + external double decodeNextFrame(); external SkImage makeImageAtCurrentFrame(); - external int width(); - external int height(); + external double width(); + external double height(); /// Deletes the C++ object. /// @@ -948,8 +948,8 @@ class SkImage {} extension SkImageExtension on SkImage { external void delete(); - external int width(); - external int height(); + external double width(); + external double height(); external SkShader makeShaderCubic( SkTileMode tileModeX, SkTileMode tileModeY, @@ -1786,8 +1786,8 @@ extension SkCanvasExtension on SkCanvas { SkBlendMode blendMode, SkPaint paint, ); - external int save(); - external int getSaveCount(); + external double save(); + external double getSaveCount(); external void saveLayer( SkPaint? paint, Float32List? bounds, @@ -1902,7 +1902,7 @@ extension SkTextDecorationStyleEnumExtension on SkTextDecorationStyleEnum { class SkTextDecorationStyle {} extension SkTextDecorationStyleExtension on SkTextDecorationStyle { - external int get value; + external double get value; } final List _skTextDecorationStyles = @@ -1932,7 +1932,7 @@ extension SkTextBaselineEnumExtension on SkTextBaselineEnum { class SkTextBaseline {} extension SkTextBaselineExtension on SkTextBaseline { - external int get value; + external double get value; } final List _skTextBaselines = [ @@ -1962,7 +1962,7 @@ extension SkPlaceholderAlignmentEnumExtension on SkPlaceholderAlignmentEnum { class SkPlaceholderAlignment {} extension SkPlaceholderAlignmentExtension on SkPlaceholderAlignment { - external int get value; + external double get value; } final List _skPlaceholderAlignments = @@ -2120,10 +2120,10 @@ extension TypefaceFontProviderExtension on TypefaceFontProvider { class SkLineMetrics {} extension SkLineMetricsExtension on SkLineMetrics { - external int get startIndex; - external int get endIndex; - external int get endExcludingWhitespaces; - external int get endIncludingNewline; + external double get startIndex; + external double get endIndex; + external double get endExcludingWhitespaces; + external double get endIncludingNewline; external bool get isHardBreak; external double get ascent; external double get descent; @@ -2131,7 +2131,7 @@ extension SkLineMetricsExtension on SkLineMetrics { external double get width; external double get left; external double get baseline; - external int get lineNumber; + external double get lineNumber; } @JS() @@ -2171,7 +2171,7 @@ class SkTextPosition {} extension SkTextPositionExtnsion on SkTextPosition { external SkAffinity get affinity; - external int get pos; + external double get pos; } @JS() @@ -2179,8 +2179,8 @@ extension SkTextPositionExtnsion on SkTextPosition { class SkTextRange {} extension SkTextRangeExtension on SkTextRange { - external int get start; - external int get end; + external double get start; + external double get end; } @JS() @@ -2475,7 +2475,7 @@ void debugResetBrowserSupportsFinalizationRegistry() { class SkData {} extension SkDataExtension on SkData { - external int size(); + external double size(); external bool isEmpty(); external Uint8List bytes(); external void delete(); @@ -2498,11 +2498,11 @@ extension SkImageInfoExtension on SkImageInfo { external SkAlphaType get alphaType; external ColorSpace get colorSpace; external SkColorType get colorType; - external int get height; + external double get height; external bool get isEmpty; external bool get isOpaque; external Float32List get bounds; - external int get width; + external double get width; external SkImageInfo makeAlphaType(SkAlphaType alphaType); external SkImageInfo makeColorSpace(ColorSpace colorSpace); external SkImageInfo makeColorType(SkColorType colorType); @@ -2526,8 +2526,8 @@ extension SkPartialImageInfoExtension on SkPartialImageInfo { external SkAlphaType get alphaType; external ColorSpace get colorSpace; external SkColorType get colorType; - external int get height; - external int get width; + external double get height; + external double get width; } /// Helper interop methods for [patchCanvasKitModule]. diff --git a/lib/web_ui/lib/src/engine/canvaskit/image.dart b/lib/web_ui/lib/src/engine/canvaskit/image.dart index 88d0d9fe8dc0a..ad570e4110326 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image.dart @@ -111,7 +111,7 @@ Future fetchImage( if (chunkCallback != null) { request.addEventListener('progress', allowInterop((DomEvent event) { event = event as DomProgressEvent; - chunkCallback.call(event.loaded!, event.total!); + chunkCallback.call(event.loaded!.toInt(), event.total!.toInt()); })); } @@ -123,7 +123,7 @@ Future fetchImage( })); request.addEventListener('load', allowInterop((DomEvent event) { - final int status = request.status!; + final int status = request.status!.toInt(); final bool accepted = status >= 200 && status < 300; final bool fileUri = status == 0; // file:// URIs have status of 0. final bool notModified = status == 304; @@ -173,8 +173,8 @@ class CkImage implements ui.Image, StackTraceDebugger { 'be able to resurrect it once it has been garbage collected.'); return; } - final int originalWidth = skImage.width(); - final int originalHeight = skImage.height(); + final int originalWidth = skImage.width().toInt(); + final int originalHeight = skImage.height().toInt(); box = SkiaObjectBox.resurrectable(this, skImage, () { final SkImage? skImage = canvasKit.MakeImage( SkImageInfo( @@ -277,13 +277,13 @@ class CkImage implements ui.Image, StackTraceDebugger { @override int get width { assert(_debugCheckIsNotDisposed()); - return skImage.width(); + return skImage.width().toInt(); } @override int get height { assert(_debugCheckIsNotDisposed()); - return skImage.height(); + return skImage.height().toInt(); } @override @@ -328,8 +328,8 @@ class CkImage implements ui.Image, StackTraceDebugger { alphaType: alphaType, colorType: colorType, colorSpace: colorSpace, - width: skImage.width(), - height: skImage.height(), + width: skImage.width().toInt(), + height: skImage.height().toInt(), ); bytes = skImage.readPixels(0, 0, imageInfo); } else { diff --git a/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart b/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart index 15a6a93834ee2..e7772d7a10cb8 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart @@ -45,8 +45,8 @@ class CkAnimatedImage extends ManagedSkiaObject ); } - _frameCount = animatedImage.getFrameCount(); - _repetitionCount = animatedImage.getRepetitionCount(); + _frameCount = animatedImage.getFrameCount().toInt(); + _repetitionCount = animatedImage.getRepetitionCount().toInt(); // Normally CanvasKit initializes `SkAnimatedImage` to point to the first // frame in the animation. However, if the Skia object has been deleted then @@ -116,7 +116,7 @@ class CkAnimatedImage extends ManagedSkiaObject // current Skia frame, then advance SkAnimatedImage to the next frame, and // return the current frame. final ui.FrameInfo currentFrame = AnimatedImageFrameInfo( - Duration(milliseconds: animatedImage.currentFrameDuration()), + Duration(milliseconds: animatedImage.currentFrameDuration().toInt()), CkImage(animatedImage.makeImageAtCurrentFrame()), ); diff --git a/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart b/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart index c3ffcc7719fc9..3bb0f20b82050 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart @@ -179,8 +179,8 @@ class CkBrowserImageDecoder implements ui.Codec { // package:js bindings don't work with getters that return a Promise, which // is why js_util is used instead. await promiseToFuture(getJsProperty(webDecoder, 'completed')); - frameCount = webDecoder.tracks.selectedTrack!.frameCount; - repetitionCount = webDecoder.tracks.selectedTrack!.repetitionCount; + frameCount = webDecoder.tracks.selectedTrack!.frameCount.toInt(); + repetitionCount = webDecoder.tracks.selectedTrack!.repetitionCount.toInt(); _cachedWebDecoder = webDecoder; @@ -234,15 +234,15 @@ class CkBrowserImageDecoder implements ui.Codec { alphaType: canvasKit.AlphaType.Premul, colorType: canvasKit.ColorType.RGBA_8888, colorSpace: SkColorSpaceSRGB, - width: frame.displayWidth, - height: frame.displayHeight, + width: frame.displayWidth.toInt(), + height: frame.displayHeight.toInt(), ), ); // Duration can be null if the image is not animated. However, Flutter // requires a non-null value. 0 indicates that the frame is meant to be // displayed indefinitely, which is fine for a static image. - final Duration duration = Duration(microseconds: frame.duration ?? 0); + final Duration duration = Duration(microseconds: frame.duration?.toInt() ?? 0); if (skImage == null) { throw ImageCodecException( @@ -445,7 +445,7 @@ bool _shouldReadPixelsUnmodified(VideoFrame videoFrame, ui.ImageByteFormat forma } Future readVideoFramePixelsUnmodified(VideoFrame videoFrame) async { - final int size = videoFrame.allocationSize(); + final int size = videoFrame.allocationSize().toInt(); final Uint8List destination = Uint8List(size); final JsPromise copyPromise = videoFrame.copyTo(destination); await promiseToFuture(copyPromise); @@ -453,8 +453,8 @@ Future readVideoFramePixelsUnmodified(VideoFrame videoFrame) async { } Future encodeVideoFrameAsPng(VideoFrame videoFrame) async { - final int width = videoFrame.displayWidth; - final int height = videoFrame.displayHeight; + final int width = videoFrame.displayWidth.toInt(); + final int height = videoFrame.displayHeight.toInt(); final DomCanvasElement canvas = createDomCanvasElement(width: width, height: height); final DomCanvasRenderingContext2D ctx = canvas.context2D; diff --git a/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/lib/web_ui/lib/src/engine/canvaskit/surface.dart index 728913ad16342..d0fc7a3ee4bfe 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -327,7 +327,7 @@ class Surface { antialias: _kUsingMSAA ? 1 : 0, majorVersion: webGLVersion, ), - ); + ).toInt(); _glContext = glContext; @@ -429,8 +429,8 @@ class CkSurface { int? get context => _glContext; - int width() => surface.width(); - int height() => surface.height(); + int width() => surface.width().toInt(); + int height() => surface.height().toInt(); void dispose() { if (_isDisposed) { diff --git a/lib/web_ui/lib/src/engine/canvaskit/text.dart b/lib/web_ui/lib/src/engine/canvaskit/text.dart index 67d9630cc6919..0828763cdb531 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/text.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/text.dart @@ -363,15 +363,15 @@ class CkTextStyle implements ui.TextStyle { } if (decoration != null) { - int decorationValue = canvasKit.NoDecoration; + int decorationValue = canvasKit.NoDecoration.toInt(); if (decoration.contains(ui.TextDecoration.underline)) { - decorationValue |= canvasKit.UnderlineDecoration; + decorationValue |= canvasKit.UnderlineDecoration.toInt(); } if (decoration.contains(ui.TextDecoration.overline)) { - decorationValue |= canvasKit.OverlineDecoration; + decorationValue |= canvasKit.OverlineDecoration.toInt(); } if (decoration.contains(ui.TextDecoration.lineThrough)) { - decorationValue |= canvasKit.LineThroughDecoration; + decorationValue |= canvasKit.LineThroughDecoration.toInt(); } properties.decoration = decorationValue; } @@ -785,7 +785,7 @@ class CkParagraph extends SkiaObject implements ui.Paragraph { break; } final SkTextRange skRange = paragraph.getWordBoundary(characterPosition); - return ui.TextRange(start: skRange.start, end: skRange.end); + return ui.TextRange(start: skRange.start.toInt(), end: skRange.end.toInt()); } @override @@ -808,7 +808,7 @@ class CkParagraph extends SkiaObject implements ui.Paragraph { final int offset = position.offset; for (final SkLineMetrics metric in metrics) { if (offset >= metric.startIndex && offset <= metric.endIndex) { - return ui.TextRange(start: metric.startIndex, end: metric.endIndex); + return ui.TextRange(start: metric.startIndex.toInt(), end: metric.endIndex.toInt()); } } return ui.TextRange.empty; @@ -876,7 +876,7 @@ class CkLineMetrics implements ui.LineMetrics { double get width => skLineMetrics.width; @override - int get lineNumber => skLineMetrics.lineNumber; + int get lineNumber => skLineMetrics.lineNumber.toInt(); } class CkParagraphBuilder implements ui.ParagraphBuilder { diff --git a/lib/web_ui/lib/src/engine/canvaskit/util.dart b/lib/web_ui/lib/src/engine/canvaskit/util.dart index 7700abaf28ce7..b1906dac741e9 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/util.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/util.dart @@ -35,9 +35,9 @@ Float32List makeFreshSkColor(ui.Color color) { ui.TextPosition fromPositionWithAffinity(SkTextPosition positionWithAffinity) { final ui.TextAffinity affinity = - ui.TextAffinity.values[positionWithAffinity.affinity.value]; + ui.TextAffinity.values[positionWithAffinity.affinity.value.toInt()]; return ui.TextPosition( - offset: positionWithAffinity.pos, + offset: positionWithAffinity.pos.toInt(), affinity: affinity, ); } diff --git a/lib/web_ui/lib/src/engine/configuration.dart b/lib/web_ui/lib/src/engine/configuration.dart index 3cd9d1d5644f4..1e89528992962 100644 --- a/lib/web_ui/lib/src/engine/configuration.dart +++ b/lib/web_ui/lib/src/engine/configuration.dart @@ -204,7 +204,8 @@ class FlutterConfiguration { /// /// This value can be specified using either the `FLUTTER_WEB_MAXIMUM_SURFACES` /// environment variable, or using the runtime configuration. - int get canvasKitMaximumSurfaces => _configuration?.canvasKitMaximumSurfaces ?? _defaultCanvasKitMaximumSurfaces; + int get canvasKitMaximumSurfaces => + _configuration?.canvasKitMaximumSurfaces?.toInt() ?? _defaultCanvasKitMaximumSurfaces; static const int _defaultCanvasKitMaximumSurfaces = int.fromEnvironment( 'FLUTTER_WEB_MAXIMUM_SURFACES', defaultValue: 8, @@ -251,7 +252,7 @@ class JsFlutterConfiguration {} extension JsFlutterConfigurationExtension on JsFlutterConfiguration { external String? get canvasKitBaseUrl; external bool? get canvasKitForceCpuOnly; - external int? get canvasKitMaximumSurfaces; + external double? get canvasKitMaximumSurfaces; external bool? get debugShowSemanticsNodes; external DomElement? get hostElement; external String? get renderer; diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 0975d736212e4..8d60a25b358a7 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -28,13 +28,11 @@ class DomWindow extends DomEventTarget {} extension DomWindowExtension on DomWindow { external DomConsole get console; - external num get devicePixelRatio; + external double get devicePixelRatio; external DomDocument get document; external DomHistory get history; - int? get innerHeight => - js_util.getProperty(this, 'innerHeight')?.toInt(); - int? get innerWidth => - js_util.getProperty(this, 'innerWidth')?.toInt(); + external double? get innerHeight; + external double? get innerWidth; external DomLocation get location; external DomNavigator get navigator; external DomVisualViewport? get visualViewport; @@ -52,9 +50,7 @@ extension DomWindowExtension on DomWindow { if (pseudoElt != null) pseudoElt ]) as DomCSSStyleDeclaration; external DomScreen? get screen; - int requestAnimationFrame(DomRequestAnimationFrameCallback callback) => - js_util.callMethod(this, 'requestAnimationFrame', - [callback]).toInt(); + external double requestAnimationFrame(DomRequestAnimationFrameCallback callback); void postMessage(Object message, String targetOrigin, [List? messagePorts]) => js_util.callMethod(this, 'postMessage', [ @@ -92,8 +88,7 @@ class DomNavigator {} extension DomNavigatorExtension on DomNavigator { external DomClipboard? get clipboard; - int? get maxTouchPoints => - js_util.getProperty(this, 'maxTouchPoints')?.toInt(); + external double? get maxTouchPoints; external String get vendor; external String get language; external String? get platform; @@ -179,7 +174,7 @@ class DomEvent {} extension DomEventExtension on DomEvent { external DomEventTarget? get target; - external num? get timeStamp; + external double? get timeStamp; external String get type; external void preventDefault(); external void stopPropagation(); @@ -203,10 +198,8 @@ DomEvent createDomEvent(String type, String name) { class DomProgressEvent extends DomEvent {} extension DomProgressEventExtension on DomProgressEvent { - int? get loaded => - js_util.getProperty(this, 'loaded')?.toInt(); - int? get total => - js_util.getProperty(this, 'total')?.toInt(); + external double? get loaded; + external double? get total; } @JS() @@ -257,10 +250,8 @@ DomElement createDomElement(String tag) => domDocument.createElement(tag); extension DomElementExtension on DomElement { Iterable get children => createDomListWrapper( js_util.getProperty<_DomList>(this, 'children')); - int get clientHeight => - js_util.getProperty(this, 'clientHeight').toInt(); - int get clientWidth => - js_util.getProperty(this, 'clientWidth').toInt(); + external double get clientHeight; + external double get clientWidth; external String get id; external set id(String id); external set innerHtml(String? html); @@ -280,18 +271,13 @@ extension DomElementExtension on DomElement { external void setAttribute(String name, Object value); void appendText(String text) => append(createDomText(text)); external void removeAttribute(String name); - set tabIndex(int? value) => - js_util.setProperty(this, 'tabIndex', value?.toDouble()); - int? get tabIndex => - js_util.getProperty(this, 'tabIndex')?.toInt(); + external set tabIndex(double? value); + external double? get tabIndex; external void focus(); - int get scrollTop => js_util.getProperty(this, 'scrollTop').toInt(); - set scrollTop(int value) => - js_util.setProperty(this, 'scrollTop', value.toDouble()); - int get scrollLeft => - js_util.getProperty(this, 'scrollLeft').toInt(); - set scrollLeft(int value) => - js_util.setProperty(this, 'scrollLeft', value.toDouble()); + external double get scrollTop; + external set scrollTop(double value); + external double get scrollLeft; + external set scrollLeft(double value); external DomTokenList get classList; external set className(String value); external String get className; @@ -471,8 +457,7 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration { class DomHTMLElement extends DomElement {} extension DomHTMLElementExtension on DomHTMLElement { - int get offsetWidth => - js_util.getProperty(this, 'offsetWidth').toInt(); + external double get offsetWidth; } @JS() @@ -510,14 +495,10 @@ extension DomHTMLImageElementExtension on DomHTMLImageElement { external set alt(String? value); external String? get src; external set src(String? value); - int get naturalWidth => - js_util.getProperty(this, 'naturalWidth').toInt(); - int get naturalHeight => - js_util.getProperty(this, 'naturalHeight').toInt(); - set width(int? value) => - js_util.setProperty(this, 'width', value?.toDouble()); - set height(int? value) => - js_util.setProperty(this, 'height', value?.toDouble()); + external double get naturalWidth; + external double get naturalHeight; + external set width(double? value); + external set height(double? value); Future decode() => js_util.promiseToFuture(js_util.callMethod(this, 'decode', [])); } @@ -600,23 +581,19 @@ DomCanvasElement createDomCanvasElement({int? width, int? height}) { final DomCanvasElement canvas = domWindow.document.createElement('canvas') as DomCanvasElement; if (width != null) { - canvas.width = width; + canvas.width = width.toDouble(); } if (height != null) { - canvas.height = height; + canvas.height = height.toDouble(); } return canvas; } extension DomCanvasElementExtension on DomCanvasElement { - int? get width => - js_util.getProperty(this, 'width')?.toInt(); - set width(int? value) => - js_util.setProperty(this, 'width', value?.toDouble()); - int? get height => - js_util.getProperty(this, 'height')?.toInt(); - set height(int? value) => - js_util.setProperty(this, 'height', value?.toDouble()); + external double? get width; + external set width(double? value); + external double? get height; + external set height(double? value); external bool? get isConnected; String toDataURL([String type = 'image/png']) => js_util.callMethod(this, 'toDataURL', [type]); @@ -752,8 +729,7 @@ extension DomXMLHttpRequestExtension on DomXMLHttpRequest { external dynamic get response; external String? get responseText; external String get responseType; - int? get status => - js_util.getProperty(this, 'status')?.toInt(); + external double? get status; external set responseType(String value); void open(String method, String url, [bool? async]) => js_util.callMethod( this, 'open', [method, url, if (async != null) async]); @@ -771,7 +747,7 @@ Future domHttpRequest(String url, } xhr.addEventListener('load', allowInterop((DomEvent e) { - final int status = xhr.status!; + final int status = xhr.status!.toInt(); final bool accepted = status >= 200 && status < 300; final bool fileUri = status == 0; final bool notModified = status == 304; @@ -807,7 +783,7 @@ DomText createDomText(String data) => domDocument.createTextNode(data); class DomTextMetrics {} extension DomTextMetricsExtension on DomTextMetrics { - external num? get width; + external double? get width; } @JS() @@ -825,14 +801,14 @@ extension DomExceptionExtension on DomException { class DomRectReadOnly {} extension DomRectReadOnlyExtension on DomRectReadOnly { - external num get x; - external num get y; - external num get width; - external num get height; - external num get top; - external num get right; - external num get bottom; - external num get left; + external double get x; + external double get y; + external double get width; + external double get height; + external double get top; + external double get right; + external double get bottom; + external double get left; } DomRect createDomRectFromPoints(DomPoint a, DomPoint b) { @@ -884,8 +860,8 @@ typedef DomFontFaceSetForEachCallback = void Function( class DomVisualViewport extends DomEventTarget {} extension DomVisualViewportExtension on DomVisualViewport { - external num? get height; - external num? get width; + external double? get height; + external double? get width; } @JS() @@ -900,10 +876,10 @@ extension DomHTMLTextAreaElementExtension on DomHTMLTextAreaElement { external void select(); external set placeholder(String? value); external set name(String value); - external int? get selectionStart; - external int? get selectionEnd; - external set selectionStart(int? value); - external set selectionEnd(int? value); + external double? get selectionStart; + external double? get selectionEnd; + external set selectionStart(double? value); + external set selectionEnd(double? value); external String? get value; void setSelectionRange(int start, int end, [String? direction]) => js_util.callMethod(this, 'setSelectionRange', @@ -949,10 +925,8 @@ extension DomKeyboardEventExtension on DomKeyboardEvent { external String? get code; external bool get ctrlKey; external String? get key; - int get keyCode => - js_util.getProperty(this, 'keyCode').toInt(); - int get location => - js_util.getProperty(this, 'location').toInt(); + external double get keyCode; + external double get location; external bool get metaKey; external bool? get repeat; external bool get shiftKey; @@ -1107,16 +1081,14 @@ DomPath2D createDomPath2D([Object? path]) => class DomMouseEvent extends DomUIEvent {} extension DomMouseEventExtension on DomMouseEvent { - external num get clientX; - external num get clientY; - external num get offsetX; - external num get offsetY; + external double get clientX; + external double get clientY; + external double get offsetX; + external double get offsetY; DomPoint get client => DomPoint(clientX, clientY); DomPoint get offset => DomPoint(offsetX, offsetY); - int get button => - js_util.getProperty(this, 'button').toInt(); - int? get buttons => - js_util.getProperty(this, 'buttons')?.toInt(); + external double get button; + external double? get buttons; external bool getModifierState(String keyArg); } @@ -1129,14 +1101,11 @@ DomMouseEvent createDomMouseEvent(String type, [Map? init]) => class DomPointerEvent extends DomMouseEvent {} extension DomPointerEventExtension on DomPointerEvent { - int? get pointerId => - js_util.getProperty(this, 'pointerId')?.toInt(); + external double? get pointerId; external String? get pointerType; - external num? get pressure; - int? get tiltX => - js_util.getProperty(this, 'tiltX')?.toInt(); - int? get tiltY => - js_util.getProperty(this, 'tiltY')?.toInt(); + external double? get pressure; + external double? get tiltX; + external double? get tiltY; List getCoalescedEvents() => js_util.callMethod>( this, 'getCoalescedEvents', []).cast(); @@ -1152,10 +1121,9 @@ DomPointerEvent createDomPointerEvent(String type, class DomWheelEvent extends DomMouseEvent {} extension DomWheelEventExtension on DomWheelEvent { - external num get deltaX; - external num get deltaY; - int get deltaMode => - js_util.getProperty(this, 'deltaMode').toInt(); + external double get deltaX; + external double get deltaY; + external double get deltaMode; } @JS() @@ -1177,10 +1145,9 @@ extension DomTouchEventExtension on DomTouchEvent { class DomTouch {} extension DomTouchExtension on DomTouch { - int? get identifier => - js_util.getProperty(this, 'identifier')?.toInt(); - external num get clientX; - external num get clientY; + external double? get identifier; + external double get clientX; + external double get clientY; DomPoint get client => DomPoint(clientX, clientY); } @@ -1220,14 +1187,10 @@ extension DomHTMLInputElementExtension on DomHTMLInputElement { external set placeholder(String? value); external set name(String? value); external set autocomplete(String value); - int? get selectionStart => - js_util.getProperty(this, 'selectionStart')?.toInt(); - int? get selectionEnd => - js_util.getProperty(this, 'selectionEnd')?.toInt(); - set selectionStart(int? value) => - js_util.setProperty(this, 'selectionStart', value?.toDouble()); - set selectionEnd(int? value) => - js_util.setProperty(this, 'selectionEnd', value?.toDouble()); + external double? get selectionStart; + external double? get selectionEnd; + external set selectionStart(double? value); + external set selectionEnd(double? value); void setSelectionRange(int start, int end, [String? direction]) => js_util.callMethod(this, 'setSelectionRange', [start.toDouble(), end.toDouble(), @@ -1276,14 +1239,10 @@ DomHTMLLabelElement createDomHTMLLabelElement() => class DomOffscreenCanvas extends DomEventTarget {} extension DomOffscreenCanvasExtension on DomOffscreenCanvas { - int? get height => - js_util.getProperty(this, 'height')?.toInt(); - int? get width => - js_util.getProperty(this, 'width')?.toInt(); - set height(int? value) => - js_util.setProperty(this, 'height', value?.toDouble()); - set width(int? value) => - js_util.setProperty(this, 'width', value?.toDouble()); + external double? get height; + external double? get width; + external set height(double? value); + external set width(double? value); Object? getContext(String contextType, [Map? attributes]) { return js_util.callMethod(this, 'getContext', [ contextType, @@ -1348,10 +1307,10 @@ class DomCSSStyleSheet extends DomStyleSheet {} extension DomCSSStyleSheetExtension on DomCSSStyleSheet { external DomCSSRuleList get cssRules; - int insertRule(String rule, [int? index]) => js_util + double insertRule(String rule, [int? index]) => js_util .callMethod( this, 'insertRule', - [rule, if (index != null) index.toDouble()]).toInt(); + [rule, if (index != null) index.toDouble()]); } @JS() @@ -1460,8 +1419,7 @@ extension DomMessageChannelExtension on DomMessageChannel { class DomCSSRuleList {} extension DomCSSRuleListExtension on DomCSSRuleList { - int get length => - js_util.getProperty(this, 'length').toInt(); + external double get length; } /// A factory to create `TrustedTypePolicy` objects. @@ -1620,8 +1578,7 @@ bool domInstanceOfString(Object? element, String objectType) => class _DomList {} extension DomListExtension on _DomList { - int get length => - js_util.getProperty(this, 'length').toInt(); + external double get length; DomNode item(int index) => js_util.callMethod(this, 'item', [index.toDouble()]); } @@ -1655,7 +1612,7 @@ class _DomListWrapper extends Iterable { /// Override the length to avoid iterating through the whole collection. @override - int get length => list.length; + int get length => list.length.toInt(); } /// This is a work around for a `TypeError` which can be triggered by calling @@ -1681,9 +1638,9 @@ class DomV8BreakIterator {} extension DomV8BreakIteratorExtension on DomV8BreakIterator { external void adoptText(String text); - external int first(); - external int next(); - external int current(); + external double first(); + external double next(); + external double current(); external String breakType(); } diff --git a/lib/web_ui/lib/src/engine/embedder.dart b/lib/web_ui/lib/src/engine/embedder.dart index 42479a07c8b2f..0c98a3d259d86 100644 --- a/lib/web_ui/lib/src/engine/embedder.dart +++ b/lib/web_ui/lib/src/engine/embedder.dart @@ -340,7 +340,7 @@ class FlutterViewEmbedder { // Firefox returns correct values for innerHeight, innerWidth. // Firefox also triggers domWindow.onResize therefore this timer does // not need to be set up for Firefox. - final int initialInnerWidth = domWindow.innerWidth!; + final int initialInnerWidth = domWindow.innerWidth!.toInt(); // Counts how many times screen size was checked. It is checked up to 5 // times. int checkCount = 0; @@ -551,7 +551,7 @@ void applyGlobalCssRulesToSheet( // - See: https://github.com/flutter/flutter/issues/44803 sheet.insertRule( 'flt-paragraph, flt-span {line-height: 100%;}', - sheet.cssRules.length, + sheet.cssRules.length.toInt(), ); } @@ -571,7 +571,7 @@ void applyGlobalCssRulesToSheet( left: 0; } ''', - sheet.cssRules.length, + sheet.cssRules.length.toInt(), ); if (isWebKit) { @@ -579,7 +579,7 @@ void applyGlobalCssRulesToSheet( 'flt-semantics input[type=range]::-webkit-slider-thumb {' ' -webkit-appearance: none;' '}', - sheet.cssRules.length); + sheet.cssRules.length.toInt()); } if (isFirefox) { @@ -587,12 +587,12 @@ void applyGlobalCssRulesToSheet( 'input::-moz-selection {' ' background-color: transparent;' '}', - sheet.cssRules.length); + sheet.cssRules.length.toInt()); sheet.insertRule( 'textarea::-moz-selection {' ' background-color: transparent;' '}', - sheet.cssRules.length); + sheet.cssRules.length.toInt()); } else { // On iOS, the invisible semantic text field has a visible cursor and // selection highlight. The following 2 CSS rules force everything to be @@ -601,12 +601,12 @@ void applyGlobalCssRulesToSheet( 'input::selection {' ' background-color: transparent;' '}', - sheet.cssRules.length); + sheet.cssRules.length.toInt()); sheet.insertRule( 'textarea::selection {' ' background-color: transparent;' '}', - sheet.cssRules.length); + sheet.cssRules.length.toInt()); } sheet.insertRule(''' flt-semantics input, @@ -614,7 +614,7 @@ void applyGlobalCssRulesToSheet( flt-semantics [contentEditable="true"] { caret-color: transparent; } - ''', sheet.cssRules.length); + ''', sheet.cssRules.length.toInt()); // By default on iOS, Safari would highlight the element that's being tapped // on using gray background. This CSS rule disables that. @@ -623,7 +623,7 @@ void applyGlobalCssRulesToSheet( $glassPaneTagName * { -webkit-tap-highlight-color: transparent; } - ''', sheet.cssRules.length); + ''', sheet.cssRules.length.toInt()); } // Hide placeholder text @@ -633,7 +633,7 @@ void applyGlobalCssRulesToSheet( opacity: 0; } ''', - sheet.cssRules.length, + sheet.cssRules.length.toInt(), ); // This css prevents an autofill overlay brought by the browser during @@ -647,7 +647,7 @@ void applyGlobalCssRulesToSheet( .transparentTextEditing:-webkit-autofill:active { -webkit-transition-delay: 99999s; } - ''', sheet.cssRules.length); + ''', sheet.cssRules.length.toInt()); } } diff --git a/lib/web_ui/lib/src/engine/html/scene.dart b/lib/web_ui/lib/src/engine/html/scene.dart index 44831d6a8876c..9beba6a4a6537 100644 --- a/lib/web_ui/lib/src/engine/html/scene.dart +++ b/lib/web_ui/lib/src/engine/html/scene.dart @@ -48,8 +48,8 @@ class PersistedScene extends PersistedContainerSurface { // TODO(yjbanov): in the add2app scenario where we might be hosted inside // a custom element, this will be different. We will need to // update this code when we add add2app support. - final double screenWidth = domWindow.innerWidth!.toDouble(); - final double screenHeight = domWindow.innerHeight!.toDouble(); + final double screenWidth = domWindow.innerWidth!; + final double screenHeight = domWindow.innerHeight!; localClipBounds = ui.Rect.fromLTRB(0, 0, screenWidth, screenHeight); projectedClip = null; } diff --git a/lib/web_ui/lib/src/engine/html/surface_stats.dart b/lib/web_ui/lib/src/engine/html/surface_stats.dart index 339bf85ec2d05..841c318c441ed 100644 --- a/lib/web_ui/lib/src/engine/html/surface_stats.dart +++ b/lib/web_ui/lib/src/engine/html/surface_stats.dart @@ -97,7 +97,7 @@ class DebugSurfaceStats { DomCanvasRenderingContext2D? _debugSurfaceStatsOverlayCtx; void debugRepaintSurfaceStatsOverlay(PersistedScene scene) { - final int overlayWidth = domWindow.innerWidth!; + final int overlayWidth = domWindow.innerWidth!.toInt(); const int rowHeight = 30; const int rowCount = 4; const int overlayHeight = rowHeight * rowCount; @@ -296,7 +296,7 @@ void debugPrintSurfaceStats(PersistedScene scene, int frameNumber) { final int pixelCount = canvasElements .cast() .map((DomCanvasElement e) { - final int pixels = e.width! * e.height!; + final int pixels = (e.width! * e.height!).toInt(); canvasInfo.writeln(' - ${e.width!} x ${e.height!} = $pixels pixels'); return pixels; }).fold(0, (int total, int pixels) => total + pixels); diff --git a/lib/web_ui/lib/src/engine/html_image_codec.dart b/lib/web_ui/lib/src/engine/html_image_codec.dart index 11c4d29428d4d..742464446b1cc 100644 --- a/lib/web_ui/lib/src/engine/html_image_codec.dart +++ b/lib/web_ui/lib/src/engine/html_image_codec.dart @@ -53,8 +53,8 @@ class HtmlCodec implements ui.Codec { // ignore: unawaited_futures imgElement.decode().then((dynamic _) { chunkCallback?.call(100, 100); - int naturalWidth = imgElement.naturalWidth; - int naturalHeight = imgElement.naturalHeight; + int naturalWidth = imgElement.naturalWidth.toInt(); + int naturalHeight = imgElement.naturalHeight.toInt(); // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=700533. if (naturalWidth == 0 && naturalHeight == 0 && browserEngine == BrowserEngine.firefox) { const int kDefaultImageSizeFallback = 300; @@ -103,8 +103,8 @@ class HtmlCodec implements ui.Codec { imgElement.removeEventListener('error', errorListener); final HtmlImage image = HtmlImage( imgElement, - imgElement.naturalWidth, - imgElement.naturalHeight, + imgElement.naturalWidth.toInt(), + imgElement.naturalHeight.toInt(), ); completer.complete(SingleFrameInfo(image)); }); @@ -188,8 +188,8 @@ class HtmlImage implements ui.Image { case ui.ImageByteFormat.rawRgba: case ui.ImageByteFormat.rawStraightRgba: final DomCanvasElement canvas = createDomCanvasElement() - ..width = width - ..height = height; + ..width = width.toDouble() + ..height = height.toDouble(); final DomCanvasRenderingContext2D ctx = canvas.context2D; ctx.drawImage(imgElement, 0, 0); final DomImageData imageData = ctx.getImageData(0, 0, width, height); diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index b5403ac3eedee..0e8226a15aa01 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -190,9 +190,9 @@ class FlutterHtmlKeyboardEvent { String get type => _event.type; String? get code => _event.code; String? get key => _event.key; - int get keyCode => _event.keyCode; + int get keyCode => _event.keyCode.toInt(); bool? get repeat => _event.repeat; - int? get location => _event.location; + int? get location => _event.location.toInt(); num? get timeStamp => _event.timeStamp; bool get altKey => _event.altKey; bool get ctrlKey => _event.ctrlKey; diff --git a/lib/web_ui/lib/src/engine/picture.dart b/lib/web_ui/lib/src/engine/picture.dart index 074dc9f27856d..3b9083ff04231 100644 --- a/lib/web_ui/lib/src/engine/picture.dart +++ b/lib/web_ui/lib/src/engine/picture.dart @@ -64,8 +64,8 @@ class EnginePicture implements ui.Picture { final String imageDataUrl = canvas.toDataUrl(); final DomHTMLImageElement imageElement = createDomHTMLImageElement() ..src = imageDataUrl - ..width = width - ..height = height; + ..width = width.toDouble() + ..height = height.toDouble(); // The image loads asynchronously. We need to wait before returning, // otherwise the returned HtmlImage will be temporarily unusable. diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/lib/web_ui/lib/src/engine/platform_dispatcher.dart index 3cfbffeb1fcc2..e7d6f80b7f355 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher.dart @@ -185,9 +185,9 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { /// Returns device pixel ratio returned by browser. static double get browserDevicePixelRatio { - final double? ratio = domWindow.devicePixelRatio as double?; - // Guard against WebOS returning 0 and other browsers returning null. - return (ratio == null || ratio == 0.0) ? 1.0 : ratio; + final double ratio = domWindow.devicePixelRatio; + // Guard against WebOS returning 0. + return (ratio == 0.0) ? 1.0 : ratio; } /// A callback invoked when any window begins a frame. diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index 72f646c7c473a..639814d3a9dfb 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -342,9 +342,9 @@ mixin _WheelEventListenerMixin on _BaseAdapter { // Flutter only supports pixel scroll delta. Convert deltaMode values // to pixels. - double deltaX = event.deltaX as double; - double deltaY = event.deltaY as double; - switch (event.deltaMode) { + double deltaX = event.deltaX; + double deltaY = event.deltaY; + switch (event.deltaMode.toInt()) { case domDeltaLine: _defaultScrollLineHeight ??= _computeDefaultScrollLineHeight(); deltaX *= _defaultScrollLineHeight!; @@ -374,9 +374,9 @@ mixin _WheelEventListenerMixin on _BaseAdapter { kind: ui.PointerDeviceKind.mouse, signalKind: ui.PointerSignalKind.scroll, device: _mouseDeviceId, - physicalX: event.clientX.toDouble() * ui.window.devicePixelRatio, - physicalY: event.clientY.toDouble() * ui.window.devicePixelRatio, - buttons: event.buttons!, + physicalX: event.clientX * ui.window.devicePixelRatio, + physicalY: event.clientY * ui.window.devicePixelRatio, + buttons: event.buttons!.toInt(), pressure: 1.0, pressureMax: 1.0, scrollDeltaX: deltaX, @@ -647,14 +647,14 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final List pointerData = []; final _ButtonSanitizer sanitizer = _ensureSanitizer(device); final _SanitizedDetails? up = - sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); + sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } final _SanitizedDetails down = sanitizer.sanitizeDownEvent( - button: event.button, - buttons: event.buttons!, + button: event.button.toInt(), + buttons: event.buttons!.toInt(), ); _convertEventsToPointerData(data: pointerData, event: event, details: down); _callback(pointerData); @@ -666,11 +666,11 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final List pointerData = []; final List expandedEvents = _expandEvents(event); for (final DomPointerEvent event in expandedEvents) { - final _SanitizedDetails? up = sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); + final _SanitizedDetails? up = sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } - final _SanitizedDetails move = sanitizer.sanitizeMoveEvent(buttons: event.buttons!); + final _SanitizedDetails move = sanitizer.sanitizeMoveEvent(buttons: event.buttons!.toInt()); _convertEventsToPointerData(data: pointerData, event: event, details: move); } _callback(pointerData); @@ -680,7 +680,7 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final int device = _getPointerId(event); final _ButtonSanitizer sanitizer = _ensureSanitizer(device); final List pointerData = []; - final _SanitizedDetails? details = sanitizer.sanitizeLeaveEvent(buttons: event.buttons!); + final _SanitizedDetails? details = sanitizer.sanitizeLeaveEvent(buttons: event.buttons!.toInt()); if (details != null) { _convertEventsToPointerData(data: pointerData, event: event, details: details); _callback(pointerData); @@ -691,7 +691,7 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final int device = _getPointerId(event); if (_hasSanitizer(device)) { final List pointerData = []; - final _SanitizedDetails? details = _getSanitizer(device).sanitizeUpEvent(buttons: event.buttons); + final _SanitizedDetails? details = _getSanitizer(device).sanitizeUpEvent(buttons: event.buttons?.toInt()); _removePointerIfUnhoverable(event); if (details != null) { _convertEventsToPointerData(data: pointerData, event: event, details: details); @@ -739,8 +739,8 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { kind: kind, signalKind: ui.PointerSignalKind.none, device: _getPointerId(event), - physicalX: event.clientX.toDouble() * ui.window.devicePixelRatio, - physicalY: event.clientY.toDouble() * ui.window.devicePixelRatio, + physicalX: event.clientX * ui.window.devicePixelRatio, + physicalY: event.clientY * ui.window.devicePixelRatio, buttons: details.buttons, pressure: pressure == null ? 0.0 : pressure.toDouble(), pressureMax: 1.0, @@ -781,12 +781,13 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { // might come before any PointerEvents, and since wheel events don't contain // pointerId we always assign `device: _mouseDeviceId` to them. final ui.PointerDeviceKind kind = _pointerTypeToDeviceKind(event.pointerType!); - return kind == ui.PointerDeviceKind.mouse ? _mouseDeviceId : event.pointerId!; + return kind == ui.PointerDeviceKind.mouse ? _mouseDeviceId : + event.pointerId!.toInt(); } /// Tilt angle is -90 to + 90. Take maximum deflection and convert to radians. double _computeHighestTilt(DomPointerEvent e) => - (e.tiltX!.abs() > e.tiltY!.abs() ? e.tiltX : e.tiltY)!.toDouble() / + (e.tiltX!.abs() > e.tiltY!.abs() ? e.tiltX : e.tiltY)! / 180.0 * math.pi; } @@ -833,9 +834,9 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!); + final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); if (!nowPressed) { - _pressTouch(touch.identifier!); + _pressTouch(touch.identifier!.toInt()); _convertEventToPointerData( data: pointerData, change: ui.PointerChange.down, @@ -853,7 +854,7 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!); + final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); if (nowPressed) { _convertEventToPointerData( data: pointerData, @@ -874,9 +875,9 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!); + final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); if (nowPressed) { - _unpressTouch(touch.identifier!); + _unpressTouch(touch.identifier!.toInt()); _convertEventToPointerData( data: pointerData, change: ui.PointerChange.up, @@ -893,9 +894,9 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!); + final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); if (nowPressed) { - _unpressTouch(touch.identifier!); + _unpressTouch(touch.identifier!.toInt()); _convertEventToPointerData( data: pointerData, change: ui.PointerChange.cancel, @@ -921,9 +922,9 @@ class _TouchAdapter extends _BaseAdapter { change: change, timeStamp: timeStamp, signalKind: ui.PointerSignalKind.none, - device: touch.identifier!, - physicalX: touch.clientX.toDouble() * ui.window.devicePixelRatio, - physicalY: touch.clientY.toDouble() * ui.window.devicePixelRatio, + device: touch.identifier!.toInt(), + physicalX: touch.clientX * ui.window.devicePixelRatio, + physicalY: touch.clientY * ui.window.devicePixelRatio, buttons: pressed ? _kPrimaryMouseButton : 0, pressure: 1.0, pressureMax: 1.0, @@ -992,14 +993,14 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { _addMouseEventListener(glassPaneElement, 'mousedown', (DomMouseEvent event) { final List pointerData = []; final _SanitizedDetails? up = - _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); + _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } final _SanitizedDetails sanitizedDetails = _sanitizer.sanitizeDownEvent( - button: event.button, - buttons: event.buttons!, + button: event.button.toInt(), + buttons: event.buttons!.toInt(), ); _convertEventsToPointerData(data: pointerData, event: event, details: sanitizedDetails); _callback(pointerData); @@ -1007,18 +1008,18 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { _addMouseEventListener(domWindow, 'mousemove', (DomMouseEvent event) { final List pointerData = []; - final _SanitizedDetails? up = _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); + final _SanitizedDetails? up = _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } - final _SanitizedDetails move = _sanitizer.sanitizeMoveEvent(buttons: event.buttons!); + final _SanitizedDetails move = _sanitizer.sanitizeMoveEvent(buttons: event.buttons!.toInt()); _convertEventsToPointerData(data: pointerData, event: event, details: move); _callback(pointerData); }); _addMouseEventListener(glassPaneElement, 'mouseleave', (DomMouseEvent event) { final List pointerData = []; - final _SanitizedDetails? details = _sanitizer.sanitizeLeaveEvent(buttons: event.buttons!); + final _SanitizedDetails? details = _sanitizer.sanitizeLeaveEvent(buttons: event.buttons!.toInt()); if (details != null) { _convertEventsToPointerData(data: pointerData, event: event, details: details); _callback(pointerData); @@ -1027,7 +1028,7 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { _addMouseEventListener(domWindow, 'mouseup', (DomMouseEvent event) { final List pointerData = []; - final _SanitizedDetails? sanitizedDetails = _sanitizer.sanitizeUpEvent(buttons: event.buttons); + final _SanitizedDetails? sanitizedDetails = _sanitizer.sanitizeUpEvent(buttons: event.buttons?.toInt()); if (sanitizedDetails != null) { _convertEventsToPointerData(data: pointerData, event: event, details: sanitizedDetails); _callback(pointerData); @@ -1056,8 +1057,8 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { kind: ui.PointerDeviceKind.mouse, signalKind: ui.PointerSignalKind.none, device: _mouseDeviceId, - physicalX: event.clientX.toDouble() * ui.window.devicePixelRatio, - physicalY: event.clientY.toDouble() * ui.window.devicePixelRatio, + physicalX: event.clientX * ui.window.devicePixelRatio, + physicalY: event.clientY * ui.window.devicePixelRatio, buttons: details.buttons, pressure: 1.0, pressureMax: 1.0, diff --git a/lib/web_ui/lib/src/engine/safe_browser_api.dart b/lib/web_ui/lib/src/engine/safe_browser_api.dart index b534fa3085485..77323d7780959 100644 --- a/lib/web_ui/lib/src/engine/safe_browser_api.dart +++ b/lib/web_ui/lib/src/engine/safe_browser_api.dart @@ -202,8 +202,8 @@ DomCanvasElement? tryCreateCanvasElement(int width, int height) { return null; } try { - canvas.width = width; - canvas.height = height; + canvas.width = width.toDouble(); + canvas.height = height.toDouble(); } catch (e) { // It seems the tribal knowledge of why we anticipate an exception while // setting width/height on a non-null canvas and why it's OK to return null @@ -336,14 +336,14 @@ class DecodeOptions { class VideoFrame implements DomCanvasImageSource {} extension VideoFrameExtension on VideoFrame { - external int allocationSize(); + external double allocationSize(); external JsPromise copyTo(Uint8List destination); external String? get format; - external int get codedWidth; - external int get codedHeight; - external int get displayWidth; - external int get displayHeight; - external int? get duration; + external double get codedWidth; + external double get codedHeight; + external double get displayWidth; + external double get displayHeight; + external double? get duration; external VideoFrame clone(); external void close(); } @@ -374,8 +374,8 @@ extension ImageTrackListExtension on ImageTrackList { class ImageTrack {} extension ImageTrackExtension on ImageTrack { - external int get repetitionCount; - external int get frameCount; + external double get repetitionCount; + external double get frameCount; } void scaleCanvas2D(Object context2d, num x, num y) { @@ -990,11 +990,11 @@ class OffScreenCanvas { width = requestedWidth; height = requestedHeight; if(offScreenCanvas != null) { - offScreenCanvas!.width = requestedWidth; - offScreenCanvas!.height = requestedHeight; + offScreenCanvas!.width = requestedWidth.toDouble(); + offScreenCanvas!.height = requestedHeight.toDouble(); } else if (canvasElement != null) { - canvasElement!.width = requestedWidth; - canvasElement!.height = requestedHeight; + canvasElement!.width = requestedWidth.toDouble(); + canvasElement!.height = requestedHeight.toDouble(); _updateCanvasCssSize(canvasElement!); } } diff --git a/lib/web_ui/lib/src/engine/semantics/scrollable.dart b/lib/web_ui/lib/src/engine/semantics/scrollable.dart index 839a9c7bd5128..06910c7baaa76 100644 --- a/lib/web_ui/lib/src/engine/semantics/scrollable.dart +++ b/lib/web_ui/lib/src/engine/semantics/scrollable.dart @@ -131,10 +131,10 @@ class Scrollable extends RoleManager { /// The value of "scrollTop" or "scrollLeft", depending on the scroll axis. int get _domScrollPosition { if (semanticsObject.isVerticalScrollContainer) { - return semanticsObject.element.scrollTop; + return semanticsObject.element.scrollTop.toInt(); } else { assert(semanticsObject.isHorizontalScrollContainer); - return semanticsObject.element.scrollLeft; + return semanticsObject.element.scrollLeft.toInt(); } } @@ -167,9 +167,9 @@ class Scrollable extends RoleManager { ..width = '${rect.width.round()}px' ..height = '${canonicalNeutralScrollPosition}px'; - element.scrollTop = canonicalNeutralScrollPosition; + element.scrollTop = canonicalNeutralScrollPosition.toDouble(); // Read back because the effective value depends on the amount of content. - _effectiveNeutralScrollPosition = element.scrollTop; + _effectiveNeutralScrollPosition = element.scrollTop.toInt(); semanticsObject ..verticalContainerAdjustment = _effectiveNeutralScrollPosition.toDouble() @@ -184,9 +184,9 @@ class Scrollable extends RoleManager { ..width = '${canonicalNeutralScrollPosition}px' ..height = '${rect.height.round()}px'; - element.scrollLeft = canonicalNeutralScrollPosition; + element.scrollLeft = canonicalNeutralScrollPosition.toDouble(); // Read back because the effective value depends on the amount of content. - _effectiveNeutralScrollPosition = element.scrollLeft; + _effectiveNeutralScrollPosition = element.scrollLeft.toInt(); semanticsObject ..verticalContainerAdjustment = 0.0 ..horizontalContainerAdjustment = diff --git a/lib/web_ui/lib/src/engine/text/font_collection.dart b/lib/web_ui/lib/src/engine/text/font_collection.dart index 029d5ee2c679f..6133ade36050b 100644 --- a/lib/web_ui/lib/src/engine/text/font_collection.dart +++ b/lib/web_ui/lib/src/engine/text/font_collection.dart @@ -289,7 +289,7 @@ class _PolyfillFontManager extends FontManager { paragraph.text = _testString; domDocument.body!.append(paragraph); - final int sansSerifWidth = paragraph.offsetWidth; + final int sansSerifWidth = paragraph.offsetWidth.toInt(); paragraph.style.fontFamily = "'$family', $fallbackFontName"; diff --git a/lib/web_ui/lib/src/engine/text/line_breaker.dart b/lib/web_ui/lib/src/engine/text/line_breaker.dart index 5c30f81ce95c9..c2bf0ab1e2090 100644 --- a/lib/web_ui/lib/src/engine/text/line_breaker.dart +++ b/lib/web_ui/lib/src/engine/text/line_breaker.dart @@ -80,7 +80,7 @@ class V8LineBreakFragmenter extends TextFragmenter implements LineBreakFragmente while (iterator.next() != -1) { final LineBreakType type = _getBreakType(iterator); - final int fragmentEnd = iterator.current(); + final int fragmentEnd = iterator.current().toInt(); int trailingNewlines = 0; int trailingSpaces = 0; @@ -128,7 +128,7 @@ class V8LineBreakFragmenter extends TextFragmenter implements LineBreakFragmente /// Gets break type from v8BreakIterator. LineBreakType _getBreakType(DomV8BreakIterator iterator) { - final int fragmentEnd = iterator.current(); + final int fragmentEnd = iterator.current().toInt(); // I don't know why v8BreakIterator uses the type "none" to mean "soft break". if (iterator.breakType() != 'none') { diff --git a/lib/web_ui/lib/src/engine/text/measurement.dart b/lib/web_ui/lib/src/engine/text/measurement.dart index 6eb95a971575d..0a8ccddfe16e1 100644 --- a/lib/web_ui/lib/src/engine/text/measurement.dart +++ b/lib/web_ui/lib/src/engine/text/measurement.dart @@ -102,7 +102,7 @@ double measureSubstring( } else { final String sub = start == 0 && end == text.length ? text : text.substring(start, end); - width = canvasContext.measureText(sub).width!.toDouble(); + width = canvasContext.measureText(sub).width!; } _lastStart = start; diff --git a/lib/web_ui/lib/src/engine/text/ruler.dart b/lib/web_ui/lib/src/engine/text/ruler.dart index 18c2d80821e91..bce0e6bbd08ff 100644 --- a/lib/web_ui/lib/src/engine/text/ruler.dart +++ b/lib/web_ui/lib/src/engine/text/ruler.dart @@ -137,7 +137,7 @@ class TextDimensions { /// The height of the paragraph being measured. double get height { - double cachedHeight = _readAndCacheMetrics().height as double; + double cachedHeight = _readAndCacheMetrics().height; if (browserEngine == BrowserEngine.firefox && // In the flutter tester environment, we use a predictable-size for font // measurement tests. @@ -170,7 +170,7 @@ class TextHeightRuler { final TextDimensions _dimensions = TextDimensions(domDocument.createElement('flt-paragraph')); /// The alphabetic baseline for this ruler's [textHeightStyle]. - late final double alphabeticBaseline = _probe.getBoundingClientRect().bottom.toDouble(); + late final double alphabeticBaseline = _probe.getBoundingClientRect().bottom; /// The height for this ruler's [textHeightStyle]. late final double height = _dimensions.height; diff --git a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart index fda0324a3f506..76b5b4543ca2a 100644 --- a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart +++ b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart @@ -724,15 +724,15 @@ class EditingState { final DomHTMLInputElement element = domElement! as DomHTMLInputElement; return EditingState( text: element.value, - baseOffset: element.selectionStart, - extentOffset: element.selectionEnd); + baseOffset: element.selectionStart?.toInt(), + extentOffset: element.selectionEnd?.toInt()); } else if (domInstanceOfString(domElement, 'HTMLTextAreaElement')) { final DomHTMLTextAreaElement element = domElement! as DomHTMLTextAreaElement; return EditingState( text: element.value, - baseOffset: element.selectionStart, - extentOffset: element.selectionEnd); + baseOffset: element.selectionStart?.toInt(), + extentOffset: element.selectionEnd?.toInt()); } else { throw UnsupportedError('Initialized with unsupported input type'); } diff --git a/lib/web_ui/lib/src/engine/window.dart b/lib/web_ui/lib/src/engine/window.dart index 953235213008e..7010ece2079c6 100644 --- a/lib/web_ui/lib/src/engine/window.dart +++ b/lib/web_ui/lib/src/engine/window.dart @@ -247,14 +247,14 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { /// text editing to make sure inset is correctly reported to /// framework. final double docWidth = - domDocument.documentElement!.clientWidth.toDouble(); + domDocument.documentElement!.clientWidth; final double docHeight = - domDocument.documentElement!.clientHeight.toDouble(); + domDocument.documentElement!.clientHeight; windowInnerWidth = docWidth * devicePixelRatio; windowInnerHeight = docHeight * devicePixelRatio; } else { - windowInnerWidth = viewport.width!.toDouble() * devicePixelRatio; - windowInnerHeight = viewport.height!.toDouble() * devicePixelRatio; + windowInnerWidth = viewport.width! * devicePixelRatio; + windowInnerHeight = viewport.height! * devicePixelRatio; } } else { windowInnerWidth = domWindow.innerWidth! * devicePixelRatio; @@ -280,7 +280,7 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { windowInnerHeight = domDocument.documentElement!.clientHeight * devicePixelRatio; } else { - windowInnerHeight = viewport.height!.toDouble() * devicePixelRatio; + windowInnerHeight = viewport.height! * devicePixelRatio; } } else { windowInnerHeight = domWindow.innerHeight! * devicePixelRatio; @@ -309,8 +309,8 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { double width = 0; if (domWindow.visualViewport != null) { height = - domWindow.visualViewport!.height!.toDouble() * devicePixelRatio; - width = domWindow.visualViewport!.width!.toDouble() * devicePixelRatio; + domWindow.visualViewport!.height! * devicePixelRatio; + width = domWindow.visualViewport!.width! * devicePixelRatio; } else { height = domWindow.innerHeight! * devicePixelRatio; width = domWindow.innerWidth! * devicePixelRatio; diff --git a/lib/web_ui/test/engine/surface/scene_builder_test.dart b/lib/web_ui/test/engine/surface/scene_builder_test.dart index 05dd5b7d1c38c..e0535d7351847 100644 --- a/lib/web_ui/test/engine/surface/scene_builder_test.dart +++ b/lib/web_ui/test/engine/surface/scene_builder_test.dart @@ -35,7 +35,7 @@ void testMain() { test('pushTransform implements surface lifecycle', () { testLayerLifeCycle((ui.SceneBuilder sceneBuilder, ui.EngineLayer? oldLayer) { return sceneBuilder.pushTransform( - (Matrix4.identity()..scale(domWindow.devicePixelRatio as double)).toFloat64()); + (Matrix4.identity()..scale(domWindow.devicePixelRatio)).toFloat64()); }, () { return ''''''; }); @@ -595,8 +595,8 @@ void testMain() { final DomElement content = builder.build().webOnlyRootElement!; final DomCanvasElement canvas = content.querySelector('canvas')! as DomCanvasElement; - final int unscaledWidth = canvas.width!; - final int unscaledHeight = canvas.height!; + final int unscaledWidth = canvas.width!.toInt(); + final int unscaledHeight = canvas.height!.toInt(); // Force update to scene which will utilize reuse code path. final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder(); @@ -627,8 +627,8 @@ void testMain() { final DomElement content = builder.build().webOnlyRootElement!; final DomCanvasElement canvas = content.querySelector('canvas')! as DomCanvasElement; - final int unscaledWidth = canvas.width!; - final int unscaledHeight = canvas.height!; + final int unscaledWidth = canvas.width!.toInt(); + final int unscaledHeight = canvas.height!.toInt(); // Force update to scene which will utilize reuse code path. final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder(); diff --git a/lib/web_ui/test/engine/surface/surface_test.dart b/lib/web_ui/test/engine/surface/surface_test.dart index 5a57d85ed6c59..4b78dec4f7238 100644 --- a/lib/web_ui/test/engine/surface/surface_test.dart +++ b/lib/web_ui/test/engine/surface/surface_test.dart @@ -160,7 +160,7 @@ void testMain() { final SurfaceSceneBuilder builder1 = SurfaceSceneBuilder(); final PersistedTransform a1 = builder1.pushTransform( - (Matrix4.identity()..scale(domWindow.devicePixelRatio as double)).toFloat64()) as PersistedTransform; + (Matrix4.identity()..scale(domWindow.devicePixelRatio)).toFloat64()) as PersistedTransform; final PersistedOpacity b1 = builder1.pushOpacity(100) as PersistedOpacity; final PersistedTransform c1 = builder1.pushTransform(Matrix4.identity().toFloat64()) as PersistedTransform; @@ -181,7 +181,7 @@ void testMain() { final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder(); final PersistedTransform a2 = builder2.pushTransform( - (Matrix4.identity()..scale(domWindow.devicePixelRatio as double)).toFloat64(), + (Matrix4.identity()..scale(domWindow.devicePixelRatio)).toFloat64(), oldLayer: a1) as PersistedTransform; final PersistedTransform c2 = builder2.pushTransform(Matrix4.identity().toFloat64(), oldLayer: c1) as PersistedTransform; From c3d7c5967d82038933c8c74358d49223912b17be Mon Sep 17 00:00:00 2001 From: skia-flutter-autoroll Date: Mon, 14 Nov 2022 17:32:05 -0500 Subject: [PATCH 02/10] Roll Skia from a434f9b69660 to 33c62dafffc9 (9 revisions) (#37598) https://skia.googlesource.com/skia.git/+log/a434f9b69660..33c62dafffc9 2022-11-14 johnstiles@google.com [experiment] Replace ball of void* with SkRasterPipelineStage struct. 2022-11-14 johnstiles@google.com Add SkOpts::raster_pipeline_highp|lowp_stride. 2022-11-14 skia-autoroll@skia-public.iam.gserviceaccount.com Roll Skia Infra from 9f31a3bcc069 to 44d375050861 (1 revision) 2022-11-14 robertphillips@google.com [graphite] Make PipelineData Graphite-only 2022-11-14 herb@google.com Rename fCount->fSize, fAllocCount->fCapacity, fItemArray->fData 2022-11-14 skia-autoroll@skia-public.iam.gserviceaccount.com Roll Skia Infra from c48dbf0bb02a to 9f31a3bcc069 (1 revision) 2022-11-14 johnstiles@google.com Replace Program_GetFunction with SkSL::Program::getFunction. 2022-11-14 skia-autoroll@skia-public.iam.gserviceaccount.com Roll Skia Infra from c7eaa2978786 to c48dbf0bb02a (1 revision) 2022-11-14 egdaniel@google.com Add support for kRectangle textureType as a DstProxy. If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/skia-flutter-autoroll Please CC jimgraham@google.com,tdenniston@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --- DEPS | 2 +- ci/licenses_golden/licenses_skia | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DEPS b/DEPS index e85fb68bb1a4b..ce62ea1a9cd49 100644 --- a/DEPS +++ b/DEPS @@ -18,7 +18,7 @@ vars = { 'llvm_git': 'https://llvm.googlesource.com', # OCMock is for testing only so there is no google clone 'ocmock_git': 'https://github.com/erikdoe/ocmock.git', - 'skia_revision': 'a434f9b696605c0ff601c47a72951002bf7d93d2', + 'skia_revision': '33c62dafffc9610789890738e7b3a1c7df9cd733', # WARNING: DO NOT EDIT canvaskit_cipd_instance MANUALLY # See `lib/web_ui/README.md` for how to roll CanvasKit to a new version. diff --git a/ci/licenses_golden/licenses_skia b/ci/licenses_golden/licenses_skia index 9e4123924c32d..adafe71cd993c 100644 --- a/ci/licenses_golden/licenses_skia +++ b/ci/licenses_golden/licenses_skia @@ -1,4 +1,4 @@ -Signature: db288064ee19461958f1c2a47a92a7b0 +Signature: 0230356593f7a51fa41de7be3b63dff1 UNUSED LICENSES: @@ -7735,8 +7735,6 @@ FILE: ../../../third_party/skia/src/core/SkKeyContext.cpp FILE: ../../../third_party/skia/src/core/SkKeyContext.h FILE: ../../../third_party/skia/src/core/SkKeyHelpers.cpp FILE: ../../../third_party/skia/src/core/SkKeyHelpers.h -FILE: ../../../third_party/skia/src/core/SkPipelineData.cpp -FILE: ../../../third_party/skia/src/core/SkPipelineData.h FILE: ../../../third_party/skia/src/core/SkRuntimeEffectDictionary.h FILE: ../../../third_party/skia/src/core/SkSLTypeShared.cpp FILE: ../../../third_party/skia/src/core/SkSLTypeShared.h @@ -7786,6 +7784,8 @@ FILE: ../../../third_party/skia/src/gpu/graphite/PaintParamsKey.cpp FILE: ../../../third_party/skia/src/gpu/graphite/PaintParamsKey.h FILE: ../../../third_party/skia/src/gpu/graphite/PietRenderTask.cpp FILE: ../../../third_party/skia/src/gpu/graphite/PietRenderTask.h +FILE: ../../../third_party/skia/src/gpu/graphite/PipelineData.cpp +FILE: ../../../third_party/skia/src/gpu/graphite/PipelineData.h FILE: ../../../third_party/skia/src/gpu/graphite/Precompile.h FILE: ../../../third_party/skia/src/gpu/graphite/QueueManager.cpp FILE: ../../../third_party/skia/src/gpu/graphite/QueueManager.h From 91656a5ff1c73532633a95890a5ba603852b6bd3 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 14 Nov 2022 14:41:04 -0800 Subject: [PATCH 03/10] Avoid segfault when converting no-op ColorFilter to ImageFilter (#37596) --- lib/ui/painting/image_filter.cc | 7 +++++-- testing/dart/canvas_test.dart | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/ui/painting/image_filter.cc b/lib/ui/painting/image_filter.cc index 9d1b7adcd09ce..90105f4054ed1 100644 --- a/lib/ui/painting/image_filter.cc +++ b/lib/ui/painting/image_filter.cc @@ -74,8 +74,11 @@ void ImageFilter::initMatrix(const tonic::Float64List& matrix4, void ImageFilter::initColorFilter(ColorFilter* colorFilter) { FML_DCHECK(colorFilter); - filter_ = - std::make_shared(colorFilter->dl_filter()); + auto dl_filter = colorFilter->dl_filter(); + // Skia may return nullptr if the colorfilter is a no-op. + if (dl_filter) { + filter_ = std::make_shared(dl_filter); + } } void ImageFilter::initComposeFilter(ImageFilter* outer, ImageFilter* inner) { diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 7505012fbc350..5870692166767 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -110,6 +110,9 @@ void testNoCrashes() { testCanvas((Canvas canvas) => canvas.drawVertices(Vertices(VertexMode.triangles, [], indices: []), BlendMode.screen, paint)); testCanvas((Canvas canvas) => canvas.drawVertices(Vertices(VertexMode.triangles, [])..dispose(), BlendMode.screen, paint)); + + // Regression test for https://github.com/flutter/flutter/issues/115143 + testCanvas((Canvas canvas) => canvas.drawPaint(Paint()..imageFilter = const ColorFilter.mode(Color(0x00000000), BlendMode.xor))); }); } From 965f87d314b87c2ab029c59f066e3dbe85d7e88a Mon Sep 17 00:00:00 2001 From: godofredoc Date: Mon, 14 Nov 2022 14:54:53 -0800 Subject: [PATCH 04/10] Archive windows gen_snapshot.exe. (#35414) * Archive windows gen_snapshot.exe. This is required to enable engine_v2 recipes for windows platform. Bug: https://github.com/flutter/flutter/issues/81855 * Add dep to generate gen_snapshot.exe. * Use target platform name rather than host. * Use prebuilt_arch. * Use platform_name instead of is_win. * Remove android check. * Fix output name. * Separate platform and cpu in name. * Remove failing line. * Use dart_target_arch rather than target_cpu in windows. * Add dart_target_arch to scope. * Add support for android_cpu. * Fix android_cpu variable name. * Rebase to ToT * Try to use target cpu directly. * Use host os instead of is_win. * Build engine artifacts for win. * Update build/archives/BUILD.gn Co-authored-by: Zachary Anderson * Update build/archives/BUILD.gn Co-authored-by: Zachary Anderson * Update build/archives/BUILD.gn Co-authored-by: Zachary Anderson Co-authored-by: Zachary Anderson --- build/archives/BUILD.gn | 13 +++++++++++++ common/config.gni | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/build/archives/BUILD.gn b/build/archives/BUILD.gn index 7743e1ad911c8..90993ddb42793 100644 --- a/build/archives/BUILD.gn +++ b/build/archives/BUILD.gn @@ -300,3 +300,16 @@ if (is_mac) { ] } } + +if (host_os == "win") { + zip_bundle("archive_win_gen_snapshot") { + deps = [ "//flutter:gen_snapshot" ] + output = "$full_target_platform_name-$flutter_runtime_mode/windows-x64.zip" + files = [ + { + source = "$root_out_dir/gen_snapshot/gen_snapshot.exe" + destination = "gen_snapshot.exe" + }, + ] + } +} diff --git a/common/config.gni b/common/config.gni index affe61af22dad..afb8f0b2b2c92 100644 --- a/common/config.gni +++ b/common/config.gni @@ -132,4 +132,4 @@ if (flutter_prebuilt_dart_sdk) { # see https://github.com/flutter/flutter/issues/74322 build_engine_artifacts = current_toolchain == host_toolchain || - (is_linux && !is_chromeos && current_cpu != "arm") || is_mac + (is_linux && !is_chromeos && current_cpu != "arm") || is_mac || is_win From 16dba68e525e72f528bef7e5f6a53d79c79f7acb Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Mon, 14 Nov 2022 14:58:27 -0800 Subject: [PATCH 05/10] [Impeller] Only apply the rrect blur fast path for solid Colors (#37594) --- impeller/aiks/canvas.cc | 11 ++-- impeller/aiks/paint.h | 11 ++++ .../display_list/display_list_dispatcher.cc | 57 ++++++++++++++----- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/impeller/aiks/canvas.cc b/impeller/aiks/canvas.cc index f1a2ae48b596a..996ea68839355 100644 --- a/impeller/aiks/canvas.cc +++ b/impeller/aiks/canvas.cc @@ -160,14 +160,17 @@ void Canvas::DrawPaint(const Paint& paint) { bool Canvas::AttemptDrawBlurredRRect(const Rect& rect, Scalar corner_radius, const Paint& paint) { - // TODO(114184): This should return false when the paint's ColorSource is not - // color. - if (!paint.mask_blur_descriptor.has_value() || - paint.mask_blur_descriptor->style != FilterContents::BlurStyle::kNormal || + if (paint.color_source == nullptr || + paint.color_source_type != Paint::ColorSourceType::kColor || paint.style != Paint::Style::kFill) { return false; } + if (!paint.mask_blur_descriptor.has_value() || + paint.mask_blur_descriptor->style != FilterContents::BlurStyle::kNormal) { + return false; + } + Paint new_paint = paint; // For symmetrically mask blurred solid RRects, absorb the mask blur and use diff --git a/impeller/aiks/paint.h b/impeller/aiks/paint.h index 536eae3fbea77..6f3784112e94c 100644 --- a/impeller/aiks/paint.h +++ b/impeller/aiks/paint.h @@ -36,6 +36,16 @@ struct Paint { kStroke, }; + enum class ColorSourceType { + kColor, + kImage, + kLinearGradient, + kRadialGradient, + kConicalGradient, + kSweepGradient, + kRuntimeEffect, + }; + struct MaskBlurDescriptor { FilterContents::BlurStyle style; Sigma sigma; @@ -48,6 +58,7 @@ struct Paint { Color color = Color::Black(); std::optional color_source; + ColorSourceType color_source_type = ColorSourceType::kColor; Scalar stroke_width = 0.0; Cap stroke_cap = Cap::kButt; diff --git a/impeller/display_list/display_list_dispatcher.cc b/impeller/display_list/display_list_dispatcher.cc index 80678248e858b..a5fe27bb24aca 100644 --- a/impeller/display_list/display_list_dispatcher.cc +++ b/impeller/display_list/display_list_dispatcher.cc @@ -320,23 +320,58 @@ static void ConvertStops(T* gradient, } } +static std::optional ToColorSourceType( + flutter::DlColorSourceType type) { + switch (type) { + case flutter::DlColorSourceType::kColor: + return Paint::ColorSourceType::kColor; + case flutter::DlColorSourceType::kImage: + return Paint::ColorSourceType::kImage; + case flutter::DlColorSourceType::kLinearGradient: + return Paint::ColorSourceType::kLinearGradient; + case flutter::DlColorSourceType::kRadialGradient: + return Paint::ColorSourceType::kRadialGradient; + case flutter::DlColorSourceType::kConicalGradient: + return Paint::ColorSourceType::kConicalGradient; + case flutter::DlColorSourceType::kSweepGradient: + return Paint::ColorSourceType::kSweepGradient; + case flutter::DlColorSourceType::kRuntimeEffect: + return Paint::ColorSourceType::kRuntimeEffect; + case flutter::DlColorSourceType::kUnknown: + return std::nullopt; + } +} + // |flutter::Dispatcher| void DisplayListDispatcher::setColorSource( const flutter::DlColorSource* source) { if (!source) { paint_.color_source = std::nullopt; + paint_.color_source_type = Paint::ColorSourceType::kColor; return; } - switch (source->type()) { - case flutter::DlColorSourceType::kColor: { + std::optional type = + ToColorSourceType(source->type()); + + if (!type.has_value()) { + FML_LOG(ERROR) << "Requested ColorSourceType::kUnknown"; + paint_.color_source = std::nullopt; + paint_.color_source_type = Paint::ColorSourceType::kColor; + return; + } + + paint_.color_source_type = type.value(); + + switch (type.value()) { + case Paint::ColorSourceType::kColor: { const flutter::DlColorColorSource* color = source->asColor(); paint_.color_source = std::nullopt; setColor(color->color()); FML_DCHECK(color); return; } - case flutter::DlColorSourceType::kLinearGradient: { + case Paint::ColorSourceType::kLinearGradient: { const flutter::DlLinearGradientColorSource* linear = source->asLinearGradient(); FML_DCHECK(linear); @@ -360,7 +395,7 @@ void DisplayListDispatcher::setColorSource( }; return; } - case flutter::DlColorSourceType::kRadialGradient: { + case Paint::ColorSourceType::kRadialGradient: { const flutter::DlRadialGradientColorSource* radialGradient = source->asRadialGradient(); FML_DCHECK(radialGradient); @@ -384,7 +419,7 @@ void DisplayListDispatcher::setColorSource( }; return; } - case flutter::DlColorSourceType::kSweepGradient: { + case Paint::ColorSourceType::kSweepGradient: { const flutter::DlSweepGradientColorSource* sweepGradient = source->asSweepGradient(); FML_DCHECK(sweepGradient); @@ -411,7 +446,7 @@ void DisplayListDispatcher::setColorSource( }; return; } - case flutter::DlColorSourceType::kImage: { + case Paint::ColorSourceType::kImage: { const flutter::DlImageColorSource* image_color_source = source->asImage(); FML_DCHECK(image_color_source && image_color_source->image()->impeller_texture()); @@ -431,7 +466,7 @@ void DisplayListDispatcher::setColorSource( }; return; } - case flutter::DlColorSourceType::kRuntimeEffect: { + case Paint::ColorSourceType::kRuntimeEffect: { const flutter::DlRuntimeEffectColorSource* runtime_effect_color_source = source->asRuntimeEffect(); auto runtime_stage = @@ -466,14 +501,10 @@ void DisplayListDispatcher::setColorSource( }; return; } - case flutter::DlColorSourceType::kConicalGradient: - case flutter::DlColorSourceType::kUnknown: + case Paint::ColorSourceType::kConicalGradient: UNIMPLEMENTED; break; } - - // Needs https://github.com/flutter/flutter/issues/95434 - UNIMPLEMENTED; } static std::optional ToColorFilterProc( @@ -509,7 +540,7 @@ static std::optional ToColorFilterProc( return ColorFilterContents::MakeLinearToSrgbFilter({std::move(input)}); }; case flutter::DlColorFilterType::kUnknown: - FML_LOG(ERROR) << "requested DlColorFilterType::kUnknown"; + FML_LOG(ERROR) << "Requested DlColorFilterType::kUnknown"; UNIMPLEMENTED; } return std::nullopt; From d366183c03c9e12b8e0845ed2f35c6c091a29627 Mon Sep 17 00:00:00 2001 From: skia-flutter-autoroll Date: Mon, 14 Nov 2022 18:01:06 -0500 Subject: [PATCH 06/10] Roll Dart SDK from 7cbcf48157cf to 6f5478a58387 (2 revisions) (#37597) https://dart.googlesource.com/sdk.git/+log/7cbcf48157cf..6f5478a58387 2022-11-14 dart-internal-merge@dart-ci-internal.iam.gserviceaccount.com Version 2.19.0-398.0.dev 2022-11-14 dart-internal-merge@dart-ci-internal.iam.gserviceaccount.com Version 2.19.0-397.0.dev If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/dart-sdk-flutter-engine Please CC dart-vm-team@google.com,jimgraham@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter Engine: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --- DEPS | 2 +- ci/licenses_golden/licenses_third_party | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DEPS b/DEPS index ce62ea1a9cd49..c014d2d3c1a7c 100644 --- a/DEPS +++ b/DEPS @@ -48,7 +48,7 @@ vars = { # Dart is: https://github.com/dart-lang/sdk/blob/main/DEPS # You can use //tools/dart/create_updated_flutter_deps.py to produce # updated revision list of existing dependencies. - 'dart_revision': '7cbcf48157cf7324ca36ba3070d80a4abe205eb7', + 'dart_revision': '6f5478a5838705ad74859cb179127cb4c65baa7c', # WARNING: DO NOT EDIT MANUALLY # The lines between blank lines above and below are generated by a script. See create_updated_flutter_deps.py diff --git a/ci/licenses_golden/licenses_third_party b/ci/licenses_golden/licenses_third_party index 2a83c88ba8897..801d7bd769c4a 100644 --- a/ci/licenses_golden/licenses_third_party +++ b/ci/licenses_golden/licenses_third_party @@ -1,4 +1,4 @@ -Signature: f605759571f528a9c8fee0b3b7fd6cd0 +Signature: 3edfee755dd8cf9a49fd787175b6d2ec UNUSED LICENSES: From 88f56870bb571e6d94db0f3c3e2a86e35ca0b550 Mon Sep 17 00:00:00 2001 From: skia-flutter-autoroll Date: Mon, 14 Nov 2022 18:59:01 -0500 Subject: [PATCH 07/10] Roll Fuchsia Linux SDK from dRHIZSishiboEHMdw... to B0OuUvWOY24LI1WoF... (#37603) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/fuchsia-linux-sdk-flutter-engine Please CC jimgraham@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --- DEPS | 2 +- ci/licenses_golden/licenses_fuchsia | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DEPS b/DEPS index c014d2d3c1a7c..a9bb15353e1a9 100644 --- a/DEPS +++ b/DEPS @@ -702,7 +702,7 @@ deps = { 'packages': [ { 'package': 'fuchsia/sdk/core/linux-amd64', - 'version': 'dRHIZSishiboEHMdwk8lx5PckyhbaUS17CBWLU9y6DgC' + 'version': 'B0OuUvWOY24LI1WoFG0VoTzinMc9p9KrXt7jOZmDynQC' } ], 'condition': 'host_os == "linux" and not download_fuchsia_sdk', diff --git a/ci/licenses_golden/licenses_fuchsia b/ci/licenses_golden/licenses_fuchsia index 12eee47111e60..9692b12e0a3d6 100644 --- a/ci/licenses_golden/licenses_fuchsia +++ b/ci/licenses_golden/licenses_fuchsia @@ -1,4 +1,4 @@ -Signature: 769a24c8d70912eaa999e5e4dd6f4af9 +Signature: df6f9d715374c03a4cac3a5f377f26e6 UNUSED LICENSES: From 28eeba5187354aea08aea4d905bb2b7c10e08d6d Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 14 Nov 2022 16:03:13 -0800 Subject: [PATCH 08/10] [Multiwindow, macOS] FlutterCompositor::Present receives view_id (#37391) * Impl and test * Change to default view --- .../darwin/macos/framework/Source/FlutterCompositor.h | 8 +++++--- .../darwin/macos/framework/Source/FlutterEngine.mm | 6 +++++- .../macos/framework/Source/FlutterMetalCompositor.h | 9 ++++++--- .../macos/framework/Source/FlutterMetalCompositor.mm | 9 ++++----- .../framework/Source/FlutterMetalCompositorUnittests.mm | 2 +- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.h b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.h index 498d8c85e378a..9a7249d7dc1d6 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.h @@ -47,10 +47,12 @@ class FlutterCompositor { virtual bool CollectBackingStore( const FlutterBackingStore* backing_store) = 0; - // Presents the FlutterLayers by updating FlutterView(s) using the - // layer content. + // Presents the FlutterLayers by updating the FlutterView specified by + // `view_id` using the layer content. // Present sets frame_started_ to false. - virtual bool Present(const FlutterLayer** layers, size_t layers_count) = 0; + virtual bool Present(uint64_t view_id, + const FlutterLayer** layers, + size_t layers_count) = 0; using PresentCallback = std::function; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 632bda5033349..7dd0c864841eb 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -458,7 +458,11 @@ - (FlutterCompositor*)createFlutterCompositor { size_t layers_count, // void* user_data // ) { - return reinterpret_cast(user_data)->Present(layers, layers_count); + // TODO(dkwingsmt): This callback only supports single-view, therefore it + // only operates on the default view. To support multi-view, we need a new + // callback that also receives a view ID. + return reinterpret_cast(user_data)->Present(kFlutterDefaultViewId, + layers, layers_count); }; _compositor.avoid_backing_store_cache = true; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.h b/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.h index 9a4d462d81f2c..b2406baf91dea 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.h +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.h @@ -40,9 +40,12 @@ class FlutterMetalCompositor : public FlutterCompositor { // for this FlutterBackingStore object in CreateBackingStore. bool CollectBackingStore(const FlutterBackingStore* backing_store) override; - // Composites the provided FlutterLayer objects and presents the composited - // frame to the FlutterView(s). - bool Present(const FlutterLayer** layers, size_t layers_count) override; + // Presents the FlutterLayers by updating the FlutterView specified by + // `view_id` using the layer content. + // Present sets frame_started_ to false. + bool Present(uint64_t view_id, + const FlutterLayer** layers, + size_t layers_count) override; private: // Presents the platform view layer represented by `layer`. `layer_index` is diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.mm index 74eae76f8e885..2e8ff9b176c5b 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositor.mm @@ -80,11 +80,10 @@ return true; } -bool FlutterMetalCompositor::Present(const FlutterLayer** layers, size_t layers_count) { - // TODO(dkwingsmt): This class only supports single-view for now. As more - // classes are gradually converted to multi-view, it should get the view ID - // from somewhere. - FlutterView* view = GetView(kFlutterDefaultViewId); +bool FlutterMetalCompositor::Present(uint64_t view_id, + const FlutterLayer** layers, + size_t layers_count) { + FlutterView* view = GetView(view_id); if (!view) { return false; } diff --git a/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositorUnittests.mm b/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositorUnittests.mm index 4a2884cf61432..4084a61395d3f 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositorUnittests.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterMetalCompositorUnittests.mm @@ -73,7 +73,7 @@ - (nullable FlutterView*)getView:(uint64_t)viewId { return true; }); - ASSERT_TRUE(macos_compositor->Present(nil, 0)); + ASSERT_TRUE(macos_compositor->Present(0, nil, 0)); ASSERT_TRUE(flag); } From 8d815657c064d9d5814df5200a00c327923ccef5 Mon Sep 17 00:00:00 2001 From: skia-flutter-autoroll Date: Mon, 14 Nov 2022 19:37:14 -0500 Subject: [PATCH 09/10] Roll Skia from 33c62dafffc9 to b474a43dcc34 (6 revisions) (#37606) https://skia.googlesource.com/skia.git/+log/33c62dafffc9..b474a43dcc34 2022-11-14 bsalomon@google.com 11 file Sample->Slide conversion 2022-11-14 michaelludwig@google.com [skif] Fix origin negation 2022-11-14 johnstiles@google.com Revert "Add SkRasterPipeline ops immediate_f and store_unmasked." 2022-11-14 robertphillips@google.com Fix chrome build 2022-11-14 jamesgk@google.com [graphite] Track Device size separately from target texture proxy's 2022-11-14 johnstiles@google.com Add SkRasterPipeline ops immediate_f and store_unmasked. If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/skia-flutter-autoroll Please CC jimgraham@google.com,tdenniston@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md --- DEPS | 2 +- ci/licenses_golden/licenses_skia | 13 +------------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/DEPS b/DEPS index a9bb15353e1a9..c55e22319b980 100644 --- a/DEPS +++ b/DEPS @@ -18,7 +18,7 @@ vars = { 'llvm_git': 'https://llvm.googlesource.com', # OCMock is for testing only so there is no google clone 'ocmock_git': 'https://github.com/erikdoe/ocmock.git', - 'skia_revision': '33c62dafffc9610789890738e7b3a1c7df9cd733', + 'skia_revision': 'b474a43dcc343d7d85ac36304af6b58ccf0a6955', # WARNING: DO NOT EDIT canvaskit_cipd_instance MANUALLY # See `lib/web_ui/README.md` for how to roll CanvasKit to a new version. diff --git a/ci/licenses_golden/licenses_skia b/ci/licenses_golden/licenses_skia index adafe71cd993c..a8dc3aca38adf 100644 --- a/ci/licenses_golden/licenses_skia +++ b/ci/licenses_golden/licenses_skia @@ -1,4 +1,4 @@ -Signature: 0230356593f7a51fa41de7be3b63dff1 +Signature: e29eaa271a08261df359f3ce51177431 UNUSED LICENSES: @@ -2036,11 +2036,6 @@ FILE: ../../../third_party/skia/include/private/SkTArray.h FILE: ../../../third_party/skia/include/utils/SkNWayCanvas.h FILE: ../../../third_party/skia/include/utils/mac/SkCGUtils.h FILE: ../../../third_party/skia/samplecode/Sample.h -FILE: ../../../third_party/skia/samplecode/SamplePatch.cpp -FILE: ../../../third_party/skia/samplecode/SamplePath.cpp -FILE: ../../../third_party/skia/samplecode/SamplePathClip.cpp -FILE: ../../../third_party/skia/samplecode/SamplePathEffects.cpp -FILE: ../../../third_party/skia/samplecode/SampleRepeatTile.cpp FILE: ../../../third_party/skia/samplecode/SampleSlides.cpp FILE: ../../../third_party/skia/samplecode/SampleTextBox.cpp FILE: ../../../third_party/skia/samplecode/vertexdump.cpp @@ -2326,7 +2321,6 @@ FILE: ../../../third_party/skia/include/private/SkChecksum.h FILE: ../../../third_party/skia/include/private/SkPathRef.h FILE: ../../../third_party/skia/include/private/SkWeakRefCnt.h FILE: ../../../third_party/skia/include/utils/SkNullCanvas.h -FILE: ../../../third_party/skia/samplecode/SampleQuadStroker.cpp FILE: ../../../third_party/skia/src/codec/SkColorTable.h FILE: ../../../third_party/skia/src/core/SkAnnotation.cpp FILE: ../../../third_party/skia/src/core/SkFontDescriptor.cpp @@ -2838,7 +2832,6 @@ FILE: ../../../third_party/skia/include/gpu/gl/GrGLAssembleInterface.h FILE: ../../../third_party/skia/include/ports/SkFontMgr_indirect.h FILE: ../../../third_party/skia/include/ports/SkRemotableFontMgr.h FILE: ../../../third_party/skia/include/private/SkHalf.h -FILE: ../../../third_party/skia/samplecode/SampleRectanizer.cpp FILE: ../../../third_party/skia/src/core/SkBBHFactory.cpp FILE: ../../../third_party/skia/src/core/SkBitmapCache.cpp FILE: ../../../third_party/skia/src/core/SkBitmapCache.h @@ -3626,7 +3619,6 @@ FILE: ../../../third_party/skia/modules/svg/src/SkSVGTransformableNode.cpp FILE: ../../../third_party/skia/modules/svg/src/SkSVGValue.cpp FILE: ../../../third_party/skia/samplecode/DecodeFile.h FILE: ../../../third_party/skia/samplecode/Sample.cpp -FILE: ../../../third_party/skia/samplecode/SamplePathOverstroke.cpp FILE: ../../../third_party/skia/samplecode/SampleSVGFile.cpp FILE: ../../../third_party/skia/src/codec/SkRawCodec.cpp FILE: ../../../third_party/skia/src/codec/SkRawCodec.h @@ -4107,8 +4099,6 @@ FILE: ../../../third_party/skia/modules/svg/src/SkSVGGradient.cpp FILE: ../../../third_party/skia/modules/svg/src/SkSVGPattern.cpp FILE: ../../../third_party/skia/modules/svg/src/SkSVGRadialGradient.cpp FILE: ../../../third_party/skia/modules/svg/src/SkSVGUse.cpp -FILE: ../../../third_party/skia/samplecode/SampleMixer.cpp -FILE: ../../../third_party/skia/samplecode/SamplePathText.cpp FILE: ../../../third_party/skia/samplecode/SampleShadowColor.cpp FILE: ../../../third_party/skia/samplecode/SampleShadowReference.cpp FILE: ../../../third_party/skia/samplecode/SampleShadowUtils.cpp @@ -7655,7 +7645,6 @@ FILE: ../../../third_party/skia/modules/skottie/src/text/Font.h FILE: ../../../third_party/skia/modules/skunicode/src/SkUnicode_client.cpp FILE: ../../../third_party/skia/modules/svg/include/SkSVGOpenTypeSVGDecoder.h FILE: ../../../third_party/skia/modules/svg/src/SkSVGOpenTypeSVGDecoder.cpp -FILE: ../../../third_party/skia/samplecode/SampleSBIX.cpp FILE: ../../../third_party/skia/src/codec/SkAvifCodec.cpp FILE: ../../../third_party/skia/src/codec/SkAvifCodec.h FILE: ../../../third_party/skia/src/gpu/graphite/mtl/MtlComputeCommandEncoder.h From 78ae2414003a611dbb2abe5dcacb47fe7034083d Mon Sep 17 00:00:00 2001 From: joshualitt Date: Mon, 14 Nov 2022 16:44:30 -0800 Subject: [PATCH 10/10] Revert "[web] Switch to doubles (#37336)" (#37609) This reverts commit 6976132e5c794423693ac40ec4c705a9c736285c. --- lib/web_ui/lib/src/engine/assets.dart | 2 +- .../lib/src/engine/browser_detection.dart | 2 +- .../lib/src/engine/canvaskit/canvas.dart | 4 +- .../src/engine/canvaskit/canvaskit_api.dart | 112 +++++----- .../lib/src/engine/canvaskit/image.dart | 16 +- .../engine/canvaskit/image_wasm_codecs.dart | 6 +- .../engine/canvaskit/image_web_codecs.dart | 16 +- .../lib/src/engine/canvaskit/surface.dart | 6 +- lib/web_ui/lib/src/engine/canvaskit/text.dart | 14 +- lib/web_ui/lib/src/engine/canvaskit/util.dart | 4 +- lib/web_ui/lib/src/engine/configuration.dart | 5 +- lib/web_ui/lib/src/engine/dom.dart | 199 +++++++++++------- lib/web_ui/lib/src/engine/embedder.dart | 24 +-- lib/web_ui/lib/src/engine/html/scene.dart | 4 +- .../lib/src/engine/html/surface_stats.dart | 4 +- .../lib/src/engine/html_image_codec.dart | 12 +- .../lib/src/engine/keyboard_binding.dart | 4 +- lib/web_ui/lib/src/engine/picture.dart | 4 +- .../lib/src/engine/platform_dispatcher.dart | 6 +- .../lib/src/engine/pointer_binding.dart | 73 ++++--- .../lib/src/engine/safe_browser_api.dart | 28 +-- .../lib/src/engine/semantics/scrollable.dart | 12 +- .../lib/src/engine/text/font_collection.dart | 2 +- .../lib/src/engine/text/line_breaker.dart | 4 +- .../lib/src/engine/text/measurement.dart | 2 +- lib/web_ui/lib/src/engine/text/ruler.dart | 4 +- .../src/engine/text_editing/text_editing.dart | 8 +- lib/web_ui/lib/src/engine/window.dart | 14 +- .../engine/surface/scene_builder_test.dart | 10 +- .../test/engine/surface/surface_test.dart | 4 +- 30 files changed, 323 insertions(+), 282 deletions(-) diff --git a/lib/web_ui/lib/src/engine/assets.dart b/lib/web_ui/lib/src/engine/assets.dart index bfc7bba0e46e9..0fdb7006072a3 100644 --- a/lib/web_ui/lib/src/engine/assets.dart +++ b/lib/web_ui/lib/src/engine/assets.dart @@ -84,7 +84,7 @@ class AssetManager { printWarning('Asset manifest does not exist at `$url` – ignoring.'); return Uint8List.fromList(utf8.encode('{}')).buffer.asByteData(); } - throw AssetManagerException(url, request.status!.toInt()); + throw AssetManagerException(url, request.status!); } final String? constructorName = target == null ? 'null' : diff --git a/lib/web_ui/lib/src/engine/browser_detection.dart b/lib/web_ui/lib/src/engine/browser_detection.dart index 3ff3c714e0907..769b2812f512b 100644 --- a/lib/web_ui/lib/src/engine/browser_detection.dart +++ b/lib/web_ui/lib/src/engine/browser_detection.dart @@ -142,7 +142,7 @@ OperatingSystem detectOperatingSystem({ // iDevices requesting a "desktop site" spoof their UA so it looks like a Mac. // This checks if we're in a touch device, or on a real mac. final int maxTouchPoints = - overrideMaxTouchPoints ?? domWindow.navigator.maxTouchPoints?.toInt() ?? 0; + overrideMaxTouchPoints ?? domWindow.navigator.maxTouchPoints ?? 0; if (maxTouchPoints > 2) { return OperatingSystem.iOs; } diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvas.dart b/lib/web_ui/lib/src/engine/canvaskit/canvas.dart index 2c17785969c1b..b499f95abe3a6 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/canvas.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/canvas.dart @@ -35,7 +35,7 @@ class CkCanvas { final SkCanvas skCanvas; - int? get saveCount => skCanvas.getSaveCount().toInt(); + int? get saveCount => skCanvas.getSaveCount(); void clear(ui.Color color) { skCanvas.clear(toSharedSkColor1(color)); @@ -272,7 +272,7 @@ class CkCanvas { } int save() { - return skCanvas.save().toInt(); + return skCanvas.save(); } void saveLayer(ui.Rect bounds, CkPaint? paint) { diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart index 25e5f79e83874..dc35f568d231c 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart @@ -96,10 +96,10 @@ extension CanvasKitExtension on CanvasKit { ); // Text decoration enum is embedded in the CanvasKit object itself. - external double get NoDecoration; - external double get UnderlineDecoration; - external double get OverlineDecoration; - external double get LineThroughDecoration; + external int get NoDecoration; + external int get UnderlineDecoration; + external int get OverlineDecoration; + external int get LineThroughDecoration; // End of text decoration enum. external SkTextDecorationStyleEnum get DecorationStyle; @@ -109,7 +109,7 @@ extension CanvasKitExtension on CanvasKit { external SkFontMgrNamespace get FontMgr; external TypefaceFontProviderNamespace get TypefaceFontProvider; external SkTypefaceFactory get Typeface; - external double GetWebGLContext( + external int GetWebGLContext( DomCanvasElement canvas, SkWebGLContextOptions options); external SkGrContext MakeGrContext(int glContext); external SkSurface? MakeOnScreenGLSurface( @@ -195,8 +195,8 @@ class SkSurface {} extension SkSurfaceExtension on SkSurface { external SkCanvas getCanvas(); external void flush(); - external double width(); - external double height(); + external int width(); + external int height(); external void dispose(); external SkImage makeImageSnapshot(); } @@ -226,7 +226,7 @@ extension SkFontSlantEnumExtension on SkFontSlantEnum { class SkFontSlant {} extension SkFontSlantExtension on SkFontSlant { - external double get value; + external int get value; } final List _skFontSlants = [ @@ -260,7 +260,7 @@ extension SkFontWeightEnumExtension on SkFontWeightEnum { class SkFontWeight {} extension SkFontWeightExtension on SkFontWeight { - external double get value; + external int get value; } final List _skFontWeights = [ @@ -293,7 +293,7 @@ extension SkAffinityEnumExtension on SkAffinityEnum { class SkAffinity {} extension SkAffinityExtension on SkAffinity { - external double get value; + external int get value; } final List _skAffinitys = [ @@ -319,7 +319,7 @@ extension SkTextDirectionEnumExtension on SkTextDirectionEnum { class SkTextDirection {} extension SkTextDirectionExtension on SkTextDirection { - external double get value; + external int get value; } // Flutter enumerates text directions as RTL, LTR, while CanvasKit @@ -351,7 +351,7 @@ extension SkTextAlignEnumExtension on SkTextAlignEnum { class SkTextAlign {} extension SkTextAlignExtension on SkTextAlign { - external double get value; + external int get value; } final List _skTextAligns = [ @@ -383,7 +383,7 @@ extension SkTextHeightBehaviorEnumExtension on SkTextHeightBehaviorEnum { class SkTextHeightBehavior {} extension SkTextHeightBehaviorExtension on SkTextHeightBehavior { - external double get value; + external int get value; } final List _skTextHeightBehaviors = @@ -418,7 +418,7 @@ extension SkRectHeightStyleEnumExtension on SkRectHeightStyleEnum { class SkRectHeightStyle {} extension SkRectHeightStyleExtension on SkRectHeightStyle { - external double get value; + external int get value; } final List _skRectHeightStyles = [ @@ -448,7 +448,7 @@ extension SkRectWidthStyleEnumExtension on SkRectWidthStyleEnum { class SkRectWidthStyle {} extension SkRectWidthStyleExtension on SkRectWidthStyle { - external double get value; + external int get value; } final List _skRectWidthStyles = [ @@ -476,7 +476,7 @@ extension SkVertexModeEnumExtension on SkVertexModeEnum { class SkVertexMode {} extension SkVertexModeExtension on SkVertexMode { - external double get value; + external int get value; } final List _skVertexModes = [ @@ -504,7 +504,7 @@ extension SkPointModeEnumExtension on SkPointModeEnum { class SkPointMode {} extension SkPointModeExtension on SkPointMode { - external double get value; + external int get value; } final List _skPointModes = [ @@ -531,7 +531,7 @@ extension SkClipOpEnumExtension on SkClipOpEnum { class SkClipOp {} extension SkClipOpExtension on SkClipOp { - external double get value; + external int get value; } final List _skClipOps = [ @@ -557,7 +557,7 @@ extension SkFillTypeEnumExtension on SkFillTypeEnum { class SkFillType {} extension SkFillTypeExtension on SkFillType { - external double get value; + external int get value; } final List _skFillTypes = [ @@ -586,7 +586,7 @@ extension SkPathOpEnumExtension on SkPathOpEnum { class SkPathOp {} extension SkPathOpExtension on SkPathOp { - external double get value; + external int get value; } final List _skPathOps = [ @@ -617,7 +617,7 @@ extension SkBlurStyleEnumExtension on SkBlurStyleEnum { class SkBlurStyle {} extension SkBlurStyleExtension on SkBlurStyle { - external double get value; + external int get value; } final List _skBlurStyles = [ @@ -646,7 +646,7 @@ extension SkStrokeCapEnumExtension on SkStrokeCapEnum { class SkStrokeCap {} extension SkStrokeCapExtension on SkStrokeCap { - external double get value; + external int get value; } final List _skStrokeCaps = [ @@ -673,7 +673,7 @@ extension SkPaintStyleEnumExtension on SkPaintStyleEnum { class SkPaintStyle {} extension SkPaintStyleExtension on SkPaintStyle { - external double get value; + external int get value; } final List _skPaintStyles = [ @@ -726,7 +726,7 @@ extension SkBlendModeEnumExtension on SkBlendModeEnum { class SkBlendMode {} extension SkBlendModeExtension on SkBlendMode { - external double get value; + external int get value; } final List _skBlendModes = [ @@ -780,7 +780,7 @@ extension SkStrokeJoinEnumExtension on SkStrokeJoinEnum { class SkStrokeJoin {} extension SkStrokeJoinExtension on SkStrokeJoin { - external double get value; + external int get value; } final List _skStrokeJoins = [ @@ -809,7 +809,7 @@ extension SkTileModeEnumExtension on SkTileModeEnum { class SkTileMode {} extension SkTileModeExtension on SkTileMode { - external double get value; + external int get value; } final List _skTileModes = [ @@ -837,7 +837,7 @@ extension SkFilterModeEnumExtension on SkFilterModeEnum { class SkFilterMode {} extension SkFilterModeExtension on SkFilterMode { - external double get value; + external int get value; } SkFilterMode toSkFilterMode(ui.FilterQuality filterQuality) { @@ -861,7 +861,7 @@ extension SkMipmapModeEnumExtension on SkMipmapModeEnum { class SkMipmapMode {} extension SkMipmapModeExtension on SkMipmapMode { - external double get value; + external int get value; } SkMipmapMode toSkMipmapMode(ui.FilterQuality filterQuality) { @@ -885,7 +885,7 @@ extension SkAlphaTypeEnumExtension on SkAlphaTypeEnum { class SkAlphaType {} extension SkAlphaTypeExtension on SkAlphaType { - external double get value; + external int get value; } @JS() @@ -911,7 +911,7 @@ extension SkColorTypeEnumExtension on SkColorTypeEnum { class SkColorType {} extension SkColorTypeExtension on SkColorType { - external double get value; + external int get value; } @JS() @@ -920,19 +920,19 @@ extension SkColorTypeExtension on SkColorType { class SkAnimatedImage {} extension SkAnimatedImageExtension on SkAnimatedImage { - external double getFrameCount(); + external int getFrameCount(); - external double getRepetitionCount(); + external int getRepetitionCount(); /// Returns duration in milliseconds. - external double currentFrameDuration(); + external int currentFrameDuration(); /// Advances to the next frame and returns its duration in milliseconds. - external double decodeNextFrame(); + external int decodeNextFrame(); external SkImage makeImageAtCurrentFrame(); - external double width(); - external double height(); + external int width(); + external int height(); /// Deletes the C++ object. /// @@ -948,8 +948,8 @@ class SkImage {} extension SkImageExtension on SkImage { external void delete(); - external double width(); - external double height(); + external int width(); + external int height(); external SkShader makeShaderCubic( SkTileMode tileModeX, SkTileMode tileModeY, @@ -1786,8 +1786,8 @@ extension SkCanvasExtension on SkCanvas { SkBlendMode blendMode, SkPaint paint, ); - external double save(); - external double getSaveCount(); + external int save(); + external int getSaveCount(); external void saveLayer( SkPaint? paint, Float32List? bounds, @@ -1902,7 +1902,7 @@ extension SkTextDecorationStyleEnumExtension on SkTextDecorationStyleEnum { class SkTextDecorationStyle {} extension SkTextDecorationStyleExtension on SkTextDecorationStyle { - external double get value; + external int get value; } final List _skTextDecorationStyles = @@ -1932,7 +1932,7 @@ extension SkTextBaselineEnumExtension on SkTextBaselineEnum { class SkTextBaseline {} extension SkTextBaselineExtension on SkTextBaseline { - external double get value; + external int get value; } final List _skTextBaselines = [ @@ -1962,7 +1962,7 @@ extension SkPlaceholderAlignmentEnumExtension on SkPlaceholderAlignmentEnum { class SkPlaceholderAlignment {} extension SkPlaceholderAlignmentExtension on SkPlaceholderAlignment { - external double get value; + external int get value; } final List _skPlaceholderAlignments = @@ -2120,10 +2120,10 @@ extension TypefaceFontProviderExtension on TypefaceFontProvider { class SkLineMetrics {} extension SkLineMetricsExtension on SkLineMetrics { - external double get startIndex; - external double get endIndex; - external double get endExcludingWhitespaces; - external double get endIncludingNewline; + external int get startIndex; + external int get endIndex; + external int get endExcludingWhitespaces; + external int get endIncludingNewline; external bool get isHardBreak; external double get ascent; external double get descent; @@ -2131,7 +2131,7 @@ extension SkLineMetricsExtension on SkLineMetrics { external double get width; external double get left; external double get baseline; - external double get lineNumber; + external int get lineNumber; } @JS() @@ -2171,7 +2171,7 @@ class SkTextPosition {} extension SkTextPositionExtnsion on SkTextPosition { external SkAffinity get affinity; - external double get pos; + external int get pos; } @JS() @@ -2179,8 +2179,8 @@ extension SkTextPositionExtnsion on SkTextPosition { class SkTextRange {} extension SkTextRangeExtension on SkTextRange { - external double get start; - external double get end; + external int get start; + external int get end; } @JS() @@ -2475,7 +2475,7 @@ void debugResetBrowserSupportsFinalizationRegistry() { class SkData {} extension SkDataExtension on SkData { - external double size(); + external int size(); external bool isEmpty(); external Uint8List bytes(); external void delete(); @@ -2498,11 +2498,11 @@ extension SkImageInfoExtension on SkImageInfo { external SkAlphaType get alphaType; external ColorSpace get colorSpace; external SkColorType get colorType; - external double get height; + external int get height; external bool get isEmpty; external bool get isOpaque; external Float32List get bounds; - external double get width; + external int get width; external SkImageInfo makeAlphaType(SkAlphaType alphaType); external SkImageInfo makeColorSpace(ColorSpace colorSpace); external SkImageInfo makeColorType(SkColorType colorType); @@ -2526,8 +2526,8 @@ extension SkPartialImageInfoExtension on SkPartialImageInfo { external SkAlphaType get alphaType; external ColorSpace get colorSpace; external SkColorType get colorType; - external double get height; - external double get width; + external int get height; + external int get width; } /// Helper interop methods for [patchCanvasKitModule]. diff --git a/lib/web_ui/lib/src/engine/canvaskit/image.dart b/lib/web_ui/lib/src/engine/canvaskit/image.dart index ad570e4110326..88d0d9fe8dc0a 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image.dart @@ -111,7 +111,7 @@ Future fetchImage( if (chunkCallback != null) { request.addEventListener('progress', allowInterop((DomEvent event) { event = event as DomProgressEvent; - chunkCallback.call(event.loaded!.toInt(), event.total!.toInt()); + chunkCallback.call(event.loaded!, event.total!); })); } @@ -123,7 +123,7 @@ Future fetchImage( })); request.addEventListener('load', allowInterop((DomEvent event) { - final int status = request.status!.toInt(); + final int status = request.status!; final bool accepted = status >= 200 && status < 300; final bool fileUri = status == 0; // file:// URIs have status of 0. final bool notModified = status == 304; @@ -173,8 +173,8 @@ class CkImage implements ui.Image, StackTraceDebugger { 'be able to resurrect it once it has been garbage collected.'); return; } - final int originalWidth = skImage.width().toInt(); - final int originalHeight = skImage.height().toInt(); + final int originalWidth = skImage.width(); + final int originalHeight = skImage.height(); box = SkiaObjectBox.resurrectable(this, skImage, () { final SkImage? skImage = canvasKit.MakeImage( SkImageInfo( @@ -277,13 +277,13 @@ class CkImage implements ui.Image, StackTraceDebugger { @override int get width { assert(_debugCheckIsNotDisposed()); - return skImage.width().toInt(); + return skImage.width(); } @override int get height { assert(_debugCheckIsNotDisposed()); - return skImage.height().toInt(); + return skImage.height(); } @override @@ -328,8 +328,8 @@ class CkImage implements ui.Image, StackTraceDebugger { alphaType: alphaType, colorType: colorType, colorSpace: colorSpace, - width: skImage.width().toInt(), - height: skImage.height().toInt(), + width: skImage.width(), + height: skImage.height(), ); bytes = skImage.readPixels(0, 0, imageInfo); } else { diff --git a/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart b/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart index e7772d7a10cb8..15a6a93834ee2 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image_wasm_codecs.dart @@ -45,8 +45,8 @@ class CkAnimatedImage extends ManagedSkiaObject ); } - _frameCount = animatedImage.getFrameCount().toInt(); - _repetitionCount = animatedImage.getRepetitionCount().toInt(); + _frameCount = animatedImage.getFrameCount(); + _repetitionCount = animatedImage.getRepetitionCount(); // Normally CanvasKit initializes `SkAnimatedImage` to point to the first // frame in the animation. However, if the Skia object has been deleted then @@ -116,7 +116,7 @@ class CkAnimatedImage extends ManagedSkiaObject // current Skia frame, then advance SkAnimatedImage to the next frame, and // return the current frame. final ui.FrameInfo currentFrame = AnimatedImageFrameInfo( - Duration(milliseconds: animatedImage.currentFrameDuration().toInt()), + Duration(milliseconds: animatedImage.currentFrameDuration()), CkImage(animatedImage.makeImageAtCurrentFrame()), ); diff --git a/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart b/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart index 3bb0f20b82050..c3ffcc7719fc9 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/image_web_codecs.dart @@ -179,8 +179,8 @@ class CkBrowserImageDecoder implements ui.Codec { // package:js bindings don't work with getters that return a Promise, which // is why js_util is used instead. await promiseToFuture(getJsProperty(webDecoder, 'completed')); - frameCount = webDecoder.tracks.selectedTrack!.frameCount.toInt(); - repetitionCount = webDecoder.tracks.selectedTrack!.repetitionCount.toInt(); + frameCount = webDecoder.tracks.selectedTrack!.frameCount; + repetitionCount = webDecoder.tracks.selectedTrack!.repetitionCount; _cachedWebDecoder = webDecoder; @@ -234,15 +234,15 @@ class CkBrowserImageDecoder implements ui.Codec { alphaType: canvasKit.AlphaType.Premul, colorType: canvasKit.ColorType.RGBA_8888, colorSpace: SkColorSpaceSRGB, - width: frame.displayWidth.toInt(), - height: frame.displayHeight.toInt(), + width: frame.displayWidth, + height: frame.displayHeight, ), ); // Duration can be null if the image is not animated. However, Flutter // requires a non-null value. 0 indicates that the frame is meant to be // displayed indefinitely, which is fine for a static image. - final Duration duration = Duration(microseconds: frame.duration?.toInt() ?? 0); + final Duration duration = Duration(microseconds: frame.duration ?? 0); if (skImage == null) { throw ImageCodecException( @@ -445,7 +445,7 @@ bool _shouldReadPixelsUnmodified(VideoFrame videoFrame, ui.ImageByteFormat forma } Future readVideoFramePixelsUnmodified(VideoFrame videoFrame) async { - final int size = videoFrame.allocationSize().toInt(); + final int size = videoFrame.allocationSize(); final Uint8List destination = Uint8List(size); final JsPromise copyPromise = videoFrame.copyTo(destination); await promiseToFuture(copyPromise); @@ -453,8 +453,8 @@ Future readVideoFramePixelsUnmodified(VideoFrame videoFrame) async { } Future encodeVideoFrameAsPng(VideoFrame videoFrame) async { - final int width = videoFrame.displayWidth.toInt(); - final int height = videoFrame.displayHeight.toInt(); + final int width = videoFrame.displayWidth; + final int height = videoFrame.displayHeight; final DomCanvasElement canvas = createDomCanvasElement(width: width, height: height); final DomCanvasRenderingContext2D ctx = canvas.context2D; diff --git a/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/lib/web_ui/lib/src/engine/canvaskit/surface.dart index d0fc7a3ee4bfe..728913ad16342 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -327,7 +327,7 @@ class Surface { antialias: _kUsingMSAA ? 1 : 0, majorVersion: webGLVersion, ), - ).toInt(); + ); _glContext = glContext; @@ -429,8 +429,8 @@ class CkSurface { int? get context => _glContext; - int width() => surface.width().toInt(); - int height() => surface.height().toInt(); + int width() => surface.width(); + int height() => surface.height(); void dispose() { if (_isDisposed) { diff --git a/lib/web_ui/lib/src/engine/canvaskit/text.dart b/lib/web_ui/lib/src/engine/canvaskit/text.dart index 0828763cdb531..67d9630cc6919 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/text.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/text.dart @@ -363,15 +363,15 @@ class CkTextStyle implements ui.TextStyle { } if (decoration != null) { - int decorationValue = canvasKit.NoDecoration.toInt(); + int decorationValue = canvasKit.NoDecoration; if (decoration.contains(ui.TextDecoration.underline)) { - decorationValue |= canvasKit.UnderlineDecoration.toInt(); + decorationValue |= canvasKit.UnderlineDecoration; } if (decoration.contains(ui.TextDecoration.overline)) { - decorationValue |= canvasKit.OverlineDecoration.toInt(); + decorationValue |= canvasKit.OverlineDecoration; } if (decoration.contains(ui.TextDecoration.lineThrough)) { - decorationValue |= canvasKit.LineThroughDecoration.toInt(); + decorationValue |= canvasKit.LineThroughDecoration; } properties.decoration = decorationValue; } @@ -785,7 +785,7 @@ class CkParagraph extends SkiaObject implements ui.Paragraph { break; } final SkTextRange skRange = paragraph.getWordBoundary(characterPosition); - return ui.TextRange(start: skRange.start.toInt(), end: skRange.end.toInt()); + return ui.TextRange(start: skRange.start, end: skRange.end); } @override @@ -808,7 +808,7 @@ class CkParagraph extends SkiaObject implements ui.Paragraph { final int offset = position.offset; for (final SkLineMetrics metric in metrics) { if (offset >= metric.startIndex && offset <= metric.endIndex) { - return ui.TextRange(start: metric.startIndex.toInt(), end: metric.endIndex.toInt()); + return ui.TextRange(start: metric.startIndex, end: metric.endIndex); } } return ui.TextRange.empty; @@ -876,7 +876,7 @@ class CkLineMetrics implements ui.LineMetrics { double get width => skLineMetrics.width; @override - int get lineNumber => skLineMetrics.lineNumber.toInt(); + int get lineNumber => skLineMetrics.lineNumber; } class CkParagraphBuilder implements ui.ParagraphBuilder { diff --git a/lib/web_ui/lib/src/engine/canvaskit/util.dart b/lib/web_ui/lib/src/engine/canvaskit/util.dart index b1906dac741e9..7700abaf28ce7 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/util.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/util.dart @@ -35,9 +35,9 @@ Float32List makeFreshSkColor(ui.Color color) { ui.TextPosition fromPositionWithAffinity(SkTextPosition positionWithAffinity) { final ui.TextAffinity affinity = - ui.TextAffinity.values[positionWithAffinity.affinity.value.toInt()]; + ui.TextAffinity.values[positionWithAffinity.affinity.value]; return ui.TextPosition( - offset: positionWithAffinity.pos.toInt(), + offset: positionWithAffinity.pos, affinity: affinity, ); } diff --git a/lib/web_ui/lib/src/engine/configuration.dart b/lib/web_ui/lib/src/engine/configuration.dart index 1e89528992962..3cd9d1d5644f4 100644 --- a/lib/web_ui/lib/src/engine/configuration.dart +++ b/lib/web_ui/lib/src/engine/configuration.dart @@ -204,8 +204,7 @@ class FlutterConfiguration { /// /// This value can be specified using either the `FLUTTER_WEB_MAXIMUM_SURFACES` /// environment variable, or using the runtime configuration. - int get canvasKitMaximumSurfaces => - _configuration?.canvasKitMaximumSurfaces?.toInt() ?? _defaultCanvasKitMaximumSurfaces; + int get canvasKitMaximumSurfaces => _configuration?.canvasKitMaximumSurfaces ?? _defaultCanvasKitMaximumSurfaces; static const int _defaultCanvasKitMaximumSurfaces = int.fromEnvironment( 'FLUTTER_WEB_MAXIMUM_SURFACES', defaultValue: 8, @@ -252,7 +251,7 @@ class JsFlutterConfiguration {} extension JsFlutterConfigurationExtension on JsFlutterConfiguration { external String? get canvasKitBaseUrl; external bool? get canvasKitForceCpuOnly; - external double? get canvasKitMaximumSurfaces; + external int? get canvasKitMaximumSurfaces; external bool? get debugShowSemanticsNodes; external DomElement? get hostElement; external String? get renderer; diff --git a/lib/web_ui/lib/src/engine/dom.dart b/lib/web_ui/lib/src/engine/dom.dart index 8d60a25b358a7..0975d736212e4 100644 --- a/lib/web_ui/lib/src/engine/dom.dart +++ b/lib/web_ui/lib/src/engine/dom.dart @@ -28,11 +28,13 @@ class DomWindow extends DomEventTarget {} extension DomWindowExtension on DomWindow { external DomConsole get console; - external double get devicePixelRatio; + external num get devicePixelRatio; external DomDocument get document; external DomHistory get history; - external double? get innerHeight; - external double? get innerWidth; + int? get innerHeight => + js_util.getProperty(this, 'innerHeight')?.toInt(); + int? get innerWidth => + js_util.getProperty(this, 'innerWidth')?.toInt(); external DomLocation get location; external DomNavigator get navigator; external DomVisualViewport? get visualViewport; @@ -50,7 +52,9 @@ extension DomWindowExtension on DomWindow { if (pseudoElt != null) pseudoElt ]) as DomCSSStyleDeclaration; external DomScreen? get screen; - external double requestAnimationFrame(DomRequestAnimationFrameCallback callback); + int requestAnimationFrame(DomRequestAnimationFrameCallback callback) => + js_util.callMethod(this, 'requestAnimationFrame', + [callback]).toInt(); void postMessage(Object message, String targetOrigin, [List? messagePorts]) => js_util.callMethod(this, 'postMessage', [ @@ -88,7 +92,8 @@ class DomNavigator {} extension DomNavigatorExtension on DomNavigator { external DomClipboard? get clipboard; - external double? get maxTouchPoints; + int? get maxTouchPoints => + js_util.getProperty(this, 'maxTouchPoints')?.toInt(); external String get vendor; external String get language; external String? get platform; @@ -174,7 +179,7 @@ class DomEvent {} extension DomEventExtension on DomEvent { external DomEventTarget? get target; - external double? get timeStamp; + external num? get timeStamp; external String get type; external void preventDefault(); external void stopPropagation(); @@ -198,8 +203,10 @@ DomEvent createDomEvent(String type, String name) { class DomProgressEvent extends DomEvent {} extension DomProgressEventExtension on DomProgressEvent { - external double? get loaded; - external double? get total; + int? get loaded => + js_util.getProperty(this, 'loaded')?.toInt(); + int? get total => + js_util.getProperty(this, 'total')?.toInt(); } @JS() @@ -250,8 +257,10 @@ DomElement createDomElement(String tag) => domDocument.createElement(tag); extension DomElementExtension on DomElement { Iterable get children => createDomListWrapper( js_util.getProperty<_DomList>(this, 'children')); - external double get clientHeight; - external double get clientWidth; + int get clientHeight => + js_util.getProperty(this, 'clientHeight').toInt(); + int get clientWidth => + js_util.getProperty(this, 'clientWidth').toInt(); external String get id; external set id(String id); external set innerHtml(String? html); @@ -271,13 +280,18 @@ extension DomElementExtension on DomElement { external void setAttribute(String name, Object value); void appendText(String text) => append(createDomText(text)); external void removeAttribute(String name); - external set tabIndex(double? value); - external double? get tabIndex; + set tabIndex(int? value) => + js_util.setProperty(this, 'tabIndex', value?.toDouble()); + int? get tabIndex => + js_util.getProperty(this, 'tabIndex')?.toInt(); external void focus(); - external double get scrollTop; - external set scrollTop(double value); - external double get scrollLeft; - external set scrollLeft(double value); + int get scrollTop => js_util.getProperty(this, 'scrollTop').toInt(); + set scrollTop(int value) => + js_util.setProperty(this, 'scrollTop', value.toDouble()); + int get scrollLeft => + js_util.getProperty(this, 'scrollLeft').toInt(); + set scrollLeft(int value) => + js_util.setProperty(this, 'scrollLeft', value.toDouble()); external DomTokenList get classList; external set className(String value); external String get className; @@ -457,7 +471,8 @@ extension DomCSSStyleDeclarationExtension on DomCSSStyleDeclaration { class DomHTMLElement extends DomElement {} extension DomHTMLElementExtension on DomHTMLElement { - external double get offsetWidth; + int get offsetWidth => + js_util.getProperty(this, 'offsetWidth').toInt(); } @JS() @@ -495,10 +510,14 @@ extension DomHTMLImageElementExtension on DomHTMLImageElement { external set alt(String? value); external String? get src; external set src(String? value); - external double get naturalWidth; - external double get naturalHeight; - external set width(double? value); - external set height(double? value); + int get naturalWidth => + js_util.getProperty(this, 'naturalWidth').toInt(); + int get naturalHeight => + js_util.getProperty(this, 'naturalHeight').toInt(); + set width(int? value) => + js_util.setProperty(this, 'width', value?.toDouble()); + set height(int? value) => + js_util.setProperty(this, 'height', value?.toDouble()); Future decode() => js_util.promiseToFuture(js_util.callMethod(this, 'decode', [])); } @@ -581,19 +600,23 @@ DomCanvasElement createDomCanvasElement({int? width, int? height}) { final DomCanvasElement canvas = domWindow.document.createElement('canvas') as DomCanvasElement; if (width != null) { - canvas.width = width.toDouble(); + canvas.width = width; } if (height != null) { - canvas.height = height.toDouble(); + canvas.height = height; } return canvas; } extension DomCanvasElementExtension on DomCanvasElement { - external double? get width; - external set width(double? value); - external double? get height; - external set height(double? value); + int? get width => + js_util.getProperty(this, 'width')?.toInt(); + set width(int? value) => + js_util.setProperty(this, 'width', value?.toDouble()); + int? get height => + js_util.getProperty(this, 'height')?.toInt(); + set height(int? value) => + js_util.setProperty(this, 'height', value?.toDouble()); external bool? get isConnected; String toDataURL([String type = 'image/png']) => js_util.callMethod(this, 'toDataURL', [type]); @@ -729,7 +752,8 @@ extension DomXMLHttpRequestExtension on DomXMLHttpRequest { external dynamic get response; external String? get responseText; external String get responseType; - external double? get status; + int? get status => + js_util.getProperty(this, 'status')?.toInt(); external set responseType(String value); void open(String method, String url, [bool? async]) => js_util.callMethod( this, 'open', [method, url, if (async != null) async]); @@ -747,7 +771,7 @@ Future domHttpRequest(String url, } xhr.addEventListener('load', allowInterop((DomEvent e) { - final int status = xhr.status!.toInt(); + final int status = xhr.status!; final bool accepted = status >= 200 && status < 300; final bool fileUri = status == 0; final bool notModified = status == 304; @@ -783,7 +807,7 @@ DomText createDomText(String data) => domDocument.createTextNode(data); class DomTextMetrics {} extension DomTextMetricsExtension on DomTextMetrics { - external double? get width; + external num? get width; } @JS() @@ -801,14 +825,14 @@ extension DomExceptionExtension on DomException { class DomRectReadOnly {} extension DomRectReadOnlyExtension on DomRectReadOnly { - external double get x; - external double get y; - external double get width; - external double get height; - external double get top; - external double get right; - external double get bottom; - external double get left; + external num get x; + external num get y; + external num get width; + external num get height; + external num get top; + external num get right; + external num get bottom; + external num get left; } DomRect createDomRectFromPoints(DomPoint a, DomPoint b) { @@ -860,8 +884,8 @@ typedef DomFontFaceSetForEachCallback = void Function( class DomVisualViewport extends DomEventTarget {} extension DomVisualViewportExtension on DomVisualViewport { - external double? get height; - external double? get width; + external num? get height; + external num? get width; } @JS() @@ -876,10 +900,10 @@ extension DomHTMLTextAreaElementExtension on DomHTMLTextAreaElement { external void select(); external set placeholder(String? value); external set name(String value); - external double? get selectionStart; - external double? get selectionEnd; - external set selectionStart(double? value); - external set selectionEnd(double? value); + external int? get selectionStart; + external int? get selectionEnd; + external set selectionStart(int? value); + external set selectionEnd(int? value); external String? get value; void setSelectionRange(int start, int end, [String? direction]) => js_util.callMethod(this, 'setSelectionRange', @@ -925,8 +949,10 @@ extension DomKeyboardEventExtension on DomKeyboardEvent { external String? get code; external bool get ctrlKey; external String? get key; - external double get keyCode; - external double get location; + int get keyCode => + js_util.getProperty(this, 'keyCode').toInt(); + int get location => + js_util.getProperty(this, 'location').toInt(); external bool get metaKey; external bool? get repeat; external bool get shiftKey; @@ -1081,14 +1107,16 @@ DomPath2D createDomPath2D([Object? path]) => class DomMouseEvent extends DomUIEvent {} extension DomMouseEventExtension on DomMouseEvent { - external double get clientX; - external double get clientY; - external double get offsetX; - external double get offsetY; + external num get clientX; + external num get clientY; + external num get offsetX; + external num get offsetY; DomPoint get client => DomPoint(clientX, clientY); DomPoint get offset => DomPoint(offsetX, offsetY); - external double get button; - external double? get buttons; + int get button => + js_util.getProperty(this, 'button').toInt(); + int? get buttons => + js_util.getProperty(this, 'buttons')?.toInt(); external bool getModifierState(String keyArg); } @@ -1101,11 +1129,14 @@ DomMouseEvent createDomMouseEvent(String type, [Map? init]) => class DomPointerEvent extends DomMouseEvent {} extension DomPointerEventExtension on DomPointerEvent { - external double? get pointerId; + int? get pointerId => + js_util.getProperty(this, 'pointerId')?.toInt(); external String? get pointerType; - external double? get pressure; - external double? get tiltX; - external double? get tiltY; + external num? get pressure; + int? get tiltX => + js_util.getProperty(this, 'tiltX')?.toInt(); + int? get tiltY => + js_util.getProperty(this, 'tiltY')?.toInt(); List getCoalescedEvents() => js_util.callMethod>( this, 'getCoalescedEvents', []).cast(); @@ -1121,9 +1152,10 @@ DomPointerEvent createDomPointerEvent(String type, class DomWheelEvent extends DomMouseEvent {} extension DomWheelEventExtension on DomWheelEvent { - external double get deltaX; - external double get deltaY; - external double get deltaMode; + external num get deltaX; + external num get deltaY; + int get deltaMode => + js_util.getProperty(this, 'deltaMode').toInt(); } @JS() @@ -1145,9 +1177,10 @@ extension DomTouchEventExtension on DomTouchEvent { class DomTouch {} extension DomTouchExtension on DomTouch { - external double? get identifier; - external double get clientX; - external double get clientY; + int? get identifier => + js_util.getProperty(this, 'identifier')?.toInt(); + external num get clientX; + external num get clientY; DomPoint get client => DomPoint(clientX, clientY); } @@ -1187,10 +1220,14 @@ extension DomHTMLInputElementExtension on DomHTMLInputElement { external set placeholder(String? value); external set name(String? value); external set autocomplete(String value); - external double? get selectionStart; - external double? get selectionEnd; - external set selectionStart(double? value); - external set selectionEnd(double? value); + int? get selectionStart => + js_util.getProperty(this, 'selectionStart')?.toInt(); + int? get selectionEnd => + js_util.getProperty(this, 'selectionEnd')?.toInt(); + set selectionStart(int? value) => + js_util.setProperty(this, 'selectionStart', value?.toDouble()); + set selectionEnd(int? value) => + js_util.setProperty(this, 'selectionEnd', value?.toDouble()); void setSelectionRange(int start, int end, [String? direction]) => js_util.callMethod(this, 'setSelectionRange', [start.toDouble(), end.toDouble(), @@ -1239,10 +1276,14 @@ DomHTMLLabelElement createDomHTMLLabelElement() => class DomOffscreenCanvas extends DomEventTarget {} extension DomOffscreenCanvasExtension on DomOffscreenCanvas { - external double? get height; - external double? get width; - external set height(double? value); - external set width(double? value); + int? get height => + js_util.getProperty(this, 'height')?.toInt(); + int? get width => + js_util.getProperty(this, 'width')?.toInt(); + set height(int? value) => + js_util.setProperty(this, 'height', value?.toDouble()); + set width(int? value) => + js_util.setProperty(this, 'width', value?.toDouble()); Object? getContext(String contextType, [Map? attributes]) { return js_util.callMethod(this, 'getContext', [ contextType, @@ -1307,10 +1348,10 @@ class DomCSSStyleSheet extends DomStyleSheet {} extension DomCSSStyleSheetExtension on DomCSSStyleSheet { external DomCSSRuleList get cssRules; - double insertRule(String rule, [int? index]) => js_util + int insertRule(String rule, [int? index]) => js_util .callMethod( this, 'insertRule', - [rule, if (index != null) index.toDouble()]); + [rule, if (index != null) index.toDouble()]).toInt(); } @JS() @@ -1419,7 +1460,8 @@ extension DomMessageChannelExtension on DomMessageChannel { class DomCSSRuleList {} extension DomCSSRuleListExtension on DomCSSRuleList { - external double get length; + int get length => + js_util.getProperty(this, 'length').toInt(); } /// A factory to create `TrustedTypePolicy` objects. @@ -1578,7 +1620,8 @@ bool domInstanceOfString(Object? element, String objectType) => class _DomList {} extension DomListExtension on _DomList { - external double get length; + int get length => + js_util.getProperty(this, 'length').toInt(); DomNode item(int index) => js_util.callMethod(this, 'item', [index.toDouble()]); } @@ -1612,7 +1655,7 @@ class _DomListWrapper extends Iterable { /// Override the length to avoid iterating through the whole collection. @override - int get length => list.length.toInt(); + int get length => list.length; } /// This is a work around for a `TypeError` which can be triggered by calling @@ -1638,9 +1681,9 @@ class DomV8BreakIterator {} extension DomV8BreakIteratorExtension on DomV8BreakIterator { external void adoptText(String text); - external double first(); - external double next(); - external double current(); + external int first(); + external int next(); + external int current(); external String breakType(); } diff --git a/lib/web_ui/lib/src/engine/embedder.dart b/lib/web_ui/lib/src/engine/embedder.dart index 0c98a3d259d86..42479a07c8b2f 100644 --- a/lib/web_ui/lib/src/engine/embedder.dart +++ b/lib/web_ui/lib/src/engine/embedder.dart @@ -340,7 +340,7 @@ class FlutterViewEmbedder { // Firefox returns correct values for innerHeight, innerWidth. // Firefox also triggers domWindow.onResize therefore this timer does // not need to be set up for Firefox. - final int initialInnerWidth = domWindow.innerWidth!.toInt(); + final int initialInnerWidth = domWindow.innerWidth!; // Counts how many times screen size was checked. It is checked up to 5 // times. int checkCount = 0; @@ -551,7 +551,7 @@ void applyGlobalCssRulesToSheet( // - See: https://github.com/flutter/flutter/issues/44803 sheet.insertRule( 'flt-paragraph, flt-span {line-height: 100%;}', - sheet.cssRules.length.toInt(), + sheet.cssRules.length, ); } @@ -571,7 +571,7 @@ void applyGlobalCssRulesToSheet( left: 0; } ''', - sheet.cssRules.length.toInt(), + sheet.cssRules.length, ); if (isWebKit) { @@ -579,7 +579,7 @@ void applyGlobalCssRulesToSheet( 'flt-semantics input[type=range]::-webkit-slider-thumb {' ' -webkit-appearance: none;' '}', - sheet.cssRules.length.toInt()); + sheet.cssRules.length); } if (isFirefox) { @@ -587,12 +587,12 @@ void applyGlobalCssRulesToSheet( 'input::-moz-selection {' ' background-color: transparent;' '}', - sheet.cssRules.length.toInt()); + sheet.cssRules.length); sheet.insertRule( 'textarea::-moz-selection {' ' background-color: transparent;' '}', - sheet.cssRules.length.toInt()); + sheet.cssRules.length); } else { // On iOS, the invisible semantic text field has a visible cursor and // selection highlight. The following 2 CSS rules force everything to be @@ -601,12 +601,12 @@ void applyGlobalCssRulesToSheet( 'input::selection {' ' background-color: transparent;' '}', - sheet.cssRules.length.toInt()); + sheet.cssRules.length); sheet.insertRule( 'textarea::selection {' ' background-color: transparent;' '}', - sheet.cssRules.length.toInt()); + sheet.cssRules.length); } sheet.insertRule(''' flt-semantics input, @@ -614,7 +614,7 @@ void applyGlobalCssRulesToSheet( flt-semantics [contentEditable="true"] { caret-color: transparent; } - ''', sheet.cssRules.length.toInt()); + ''', sheet.cssRules.length); // By default on iOS, Safari would highlight the element that's being tapped // on using gray background. This CSS rule disables that. @@ -623,7 +623,7 @@ void applyGlobalCssRulesToSheet( $glassPaneTagName * { -webkit-tap-highlight-color: transparent; } - ''', sheet.cssRules.length.toInt()); + ''', sheet.cssRules.length); } // Hide placeholder text @@ -633,7 +633,7 @@ void applyGlobalCssRulesToSheet( opacity: 0; } ''', - sheet.cssRules.length.toInt(), + sheet.cssRules.length, ); // This css prevents an autofill overlay brought by the browser during @@ -647,7 +647,7 @@ void applyGlobalCssRulesToSheet( .transparentTextEditing:-webkit-autofill:active { -webkit-transition-delay: 99999s; } - ''', sheet.cssRules.length.toInt()); + ''', sheet.cssRules.length); } } diff --git a/lib/web_ui/lib/src/engine/html/scene.dart b/lib/web_ui/lib/src/engine/html/scene.dart index 9beba6a4a6537..44831d6a8876c 100644 --- a/lib/web_ui/lib/src/engine/html/scene.dart +++ b/lib/web_ui/lib/src/engine/html/scene.dart @@ -48,8 +48,8 @@ class PersistedScene extends PersistedContainerSurface { // TODO(yjbanov): in the add2app scenario where we might be hosted inside // a custom element, this will be different. We will need to // update this code when we add add2app support. - final double screenWidth = domWindow.innerWidth!; - final double screenHeight = domWindow.innerHeight!; + final double screenWidth = domWindow.innerWidth!.toDouble(); + final double screenHeight = domWindow.innerHeight!.toDouble(); localClipBounds = ui.Rect.fromLTRB(0, 0, screenWidth, screenHeight); projectedClip = null; } diff --git a/lib/web_ui/lib/src/engine/html/surface_stats.dart b/lib/web_ui/lib/src/engine/html/surface_stats.dart index 841c318c441ed..339bf85ec2d05 100644 --- a/lib/web_ui/lib/src/engine/html/surface_stats.dart +++ b/lib/web_ui/lib/src/engine/html/surface_stats.dart @@ -97,7 +97,7 @@ class DebugSurfaceStats { DomCanvasRenderingContext2D? _debugSurfaceStatsOverlayCtx; void debugRepaintSurfaceStatsOverlay(PersistedScene scene) { - final int overlayWidth = domWindow.innerWidth!.toInt(); + final int overlayWidth = domWindow.innerWidth!; const int rowHeight = 30; const int rowCount = 4; const int overlayHeight = rowHeight * rowCount; @@ -296,7 +296,7 @@ void debugPrintSurfaceStats(PersistedScene scene, int frameNumber) { final int pixelCount = canvasElements .cast() .map((DomCanvasElement e) { - final int pixels = (e.width! * e.height!).toInt(); + final int pixels = e.width! * e.height!; canvasInfo.writeln(' - ${e.width!} x ${e.height!} = $pixels pixels'); return pixels; }).fold(0, (int total, int pixels) => total + pixels); diff --git a/lib/web_ui/lib/src/engine/html_image_codec.dart b/lib/web_ui/lib/src/engine/html_image_codec.dart index 742464446b1cc..11c4d29428d4d 100644 --- a/lib/web_ui/lib/src/engine/html_image_codec.dart +++ b/lib/web_ui/lib/src/engine/html_image_codec.dart @@ -53,8 +53,8 @@ class HtmlCodec implements ui.Codec { // ignore: unawaited_futures imgElement.decode().then((dynamic _) { chunkCallback?.call(100, 100); - int naturalWidth = imgElement.naturalWidth.toInt(); - int naturalHeight = imgElement.naturalHeight.toInt(); + int naturalWidth = imgElement.naturalWidth; + int naturalHeight = imgElement.naturalHeight; // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=700533. if (naturalWidth == 0 && naturalHeight == 0 && browserEngine == BrowserEngine.firefox) { const int kDefaultImageSizeFallback = 300; @@ -103,8 +103,8 @@ class HtmlCodec implements ui.Codec { imgElement.removeEventListener('error', errorListener); final HtmlImage image = HtmlImage( imgElement, - imgElement.naturalWidth.toInt(), - imgElement.naturalHeight.toInt(), + imgElement.naturalWidth, + imgElement.naturalHeight, ); completer.complete(SingleFrameInfo(image)); }); @@ -188,8 +188,8 @@ class HtmlImage implements ui.Image { case ui.ImageByteFormat.rawRgba: case ui.ImageByteFormat.rawStraightRgba: final DomCanvasElement canvas = createDomCanvasElement() - ..width = width.toDouble() - ..height = height.toDouble(); + ..width = width + ..height = height; final DomCanvasRenderingContext2D ctx = canvas.context2D; ctx.drawImage(imgElement, 0, 0); final DomImageData imageData = ctx.getImageData(0, 0, width, height); diff --git a/lib/web_ui/lib/src/engine/keyboard_binding.dart b/lib/web_ui/lib/src/engine/keyboard_binding.dart index 0e8226a15aa01..b5403ac3eedee 100644 --- a/lib/web_ui/lib/src/engine/keyboard_binding.dart +++ b/lib/web_ui/lib/src/engine/keyboard_binding.dart @@ -190,9 +190,9 @@ class FlutterHtmlKeyboardEvent { String get type => _event.type; String? get code => _event.code; String? get key => _event.key; - int get keyCode => _event.keyCode.toInt(); + int get keyCode => _event.keyCode; bool? get repeat => _event.repeat; - int? get location => _event.location.toInt(); + int? get location => _event.location; num? get timeStamp => _event.timeStamp; bool get altKey => _event.altKey; bool get ctrlKey => _event.ctrlKey; diff --git a/lib/web_ui/lib/src/engine/picture.dart b/lib/web_ui/lib/src/engine/picture.dart index 3b9083ff04231..074dc9f27856d 100644 --- a/lib/web_ui/lib/src/engine/picture.dart +++ b/lib/web_ui/lib/src/engine/picture.dart @@ -64,8 +64,8 @@ class EnginePicture implements ui.Picture { final String imageDataUrl = canvas.toDataUrl(); final DomHTMLImageElement imageElement = createDomHTMLImageElement() ..src = imageDataUrl - ..width = width.toDouble() - ..height = height.toDouble(); + ..width = width + ..height = height; // The image loads asynchronously. We need to wait before returning, // otherwise the returned HtmlImage will be temporarily unusable. diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/lib/web_ui/lib/src/engine/platform_dispatcher.dart index e7d6f80b7f355..3cfbffeb1fcc2 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher.dart @@ -185,9 +185,9 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { /// Returns device pixel ratio returned by browser. static double get browserDevicePixelRatio { - final double ratio = domWindow.devicePixelRatio; - // Guard against WebOS returning 0. - return (ratio == 0.0) ? 1.0 : ratio; + final double? ratio = domWindow.devicePixelRatio as double?; + // Guard against WebOS returning 0 and other browsers returning null. + return (ratio == null || ratio == 0.0) ? 1.0 : ratio; } /// A callback invoked when any window begins a frame. diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index 639814d3a9dfb..72f646c7c473a 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -342,9 +342,9 @@ mixin _WheelEventListenerMixin on _BaseAdapter { // Flutter only supports pixel scroll delta. Convert deltaMode values // to pixels. - double deltaX = event.deltaX; - double deltaY = event.deltaY; - switch (event.deltaMode.toInt()) { + double deltaX = event.deltaX as double; + double deltaY = event.deltaY as double; + switch (event.deltaMode) { case domDeltaLine: _defaultScrollLineHeight ??= _computeDefaultScrollLineHeight(); deltaX *= _defaultScrollLineHeight!; @@ -374,9 +374,9 @@ mixin _WheelEventListenerMixin on _BaseAdapter { kind: ui.PointerDeviceKind.mouse, signalKind: ui.PointerSignalKind.scroll, device: _mouseDeviceId, - physicalX: event.clientX * ui.window.devicePixelRatio, - physicalY: event.clientY * ui.window.devicePixelRatio, - buttons: event.buttons!.toInt(), + physicalX: event.clientX.toDouble() * ui.window.devicePixelRatio, + physicalY: event.clientY.toDouble() * ui.window.devicePixelRatio, + buttons: event.buttons!, pressure: 1.0, pressureMax: 1.0, scrollDeltaX: deltaX, @@ -647,14 +647,14 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final List pointerData = []; final _ButtonSanitizer sanitizer = _ensureSanitizer(device); final _SanitizedDetails? up = - sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); + sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } final _SanitizedDetails down = sanitizer.sanitizeDownEvent( - button: event.button.toInt(), - buttons: event.buttons!.toInt(), + button: event.button, + buttons: event.buttons!, ); _convertEventsToPointerData(data: pointerData, event: event, details: down); _callback(pointerData); @@ -666,11 +666,11 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final List pointerData = []; final List expandedEvents = _expandEvents(event); for (final DomPointerEvent event in expandedEvents) { - final _SanitizedDetails? up = sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); + final _SanitizedDetails? up = sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } - final _SanitizedDetails move = sanitizer.sanitizeMoveEvent(buttons: event.buttons!.toInt()); + final _SanitizedDetails move = sanitizer.sanitizeMoveEvent(buttons: event.buttons!); _convertEventsToPointerData(data: pointerData, event: event, details: move); } _callback(pointerData); @@ -680,7 +680,7 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final int device = _getPointerId(event); final _ButtonSanitizer sanitizer = _ensureSanitizer(device); final List pointerData = []; - final _SanitizedDetails? details = sanitizer.sanitizeLeaveEvent(buttons: event.buttons!.toInt()); + final _SanitizedDetails? details = sanitizer.sanitizeLeaveEvent(buttons: event.buttons!); if (details != null) { _convertEventsToPointerData(data: pointerData, event: event, details: details); _callback(pointerData); @@ -691,7 +691,7 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { final int device = _getPointerId(event); if (_hasSanitizer(device)) { final List pointerData = []; - final _SanitizedDetails? details = _getSanitizer(device).sanitizeUpEvent(buttons: event.buttons?.toInt()); + final _SanitizedDetails? details = _getSanitizer(device).sanitizeUpEvent(buttons: event.buttons); _removePointerIfUnhoverable(event); if (details != null) { _convertEventsToPointerData(data: pointerData, event: event, details: details); @@ -739,8 +739,8 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { kind: kind, signalKind: ui.PointerSignalKind.none, device: _getPointerId(event), - physicalX: event.clientX * ui.window.devicePixelRatio, - physicalY: event.clientY * ui.window.devicePixelRatio, + physicalX: event.clientX.toDouble() * ui.window.devicePixelRatio, + physicalY: event.clientY.toDouble() * ui.window.devicePixelRatio, buttons: details.buttons, pressure: pressure == null ? 0.0 : pressure.toDouble(), pressureMax: 1.0, @@ -781,13 +781,12 @@ class _PointerAdapter extends _BaseAdapter with _WheelEventListenerMixin { // might come before any PointerEvents, and since wheel events don't contain // pointerId we always assign `device: _mouseDeviceId` to them. final ui.PointerDeviceKind kind = _pointerTypeToDeviceKind(event.pointerType!); - return kind == ui.PointerDeviceKind.mouse ? _mouseDeviceId : - event.pointerId!.toInt(); + return kind == ui.PointerDeviceKind.mouse ? _mouseDeviceId : event.pointerId!; } /// Tilt angle is -90 to + 90. Take maximum deflection and convert to radians. double _computeHighestTilt(DomPointerEvent e) => - (e.tiltX!.abs() > e.tiltY!.abs() ? e.tiltX : e.tiltY)! / + (e.tiltX!.abs() > e.tiltY!.abs() ? e.tiltX : e.tiltY)!.toDouble() / 180.0 * math.pi; } @@ -834,9 +833,9 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); + final bool nowPressed = _isTouchPressed(touch.identifier!); if (!nowPressed) { - _pressTouch(touch.identifier!.toInt()); + _pressTouch(touch.identifier!); _convertEventToPointerData( data: pointerData, change: ui.PointerChange.down, @@ -854,7 +853,7 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); + final bool nowPressed = _isTouchPressed(touch.identifier!); if (nowPressed) { _convertEventToPointerData( data: pointerData, @@ -875,9 +874,9 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); + final bool nowPressed = _isTouchPressed(touch.identifier!); if (nowPressed) { - _unpressTouch(touch.identifier!.toInt()); + _unpressTouch(touch.identifier!); _convertEventToPointerData( data: pointerData, change: ui.PointerChange.up, @@ -894,9 +893,9 @@ class _TouchAdapter extends _BaseAdapter { final Duration timeStamp = _BaseAdapter._eventTimeStampToDuration(event.timeStamp!); final List pointerData = []; for (final DomTouch touch in event.changedTouches!.cast()) { - final bool nowPressed = _isTouchPressed(touch.identifier!.toInt()); + final bool nowPressed = _isTouchPressed(touch.identifier!); if (nowPressed) { - _unpressTouch(touch.identifier!.toInt()); + _unpressTouch(touch.identifier!); _convertEventToPointerData( data: pointerData, change: ui.PointerChange.cancel, @@ -922,9 +921,9 @@ class _TouchAdapter extends _BaseAdapter { change: change, timeStamp: timeStamp, signalKind: ui.PointerSignalKind.none, - device: touch.identifier!.toInt(), - physicalX: touch.clientX * ui.window.devicePixelRatio, - physicalY: touch.clientY * ui.window.devicePixelRatio, + device: touch.identifier!, + physicalX: touch.clientX.toDouble() * ui.window.devicePixelRatio, + physicalY: touch.clientY.toDouble() * ui.window.devicePixelRatio, buttons: pressed ? _kPrimaryMouseButton : 0, pressure: 1.0, pressureMax: 1.0, @@ -993,14 +992,14 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { _addMouseEventListener(glassPaneElement, 'mousedown', (DomMouseEvent event) { final List pointerData = []; final _SanitizedDetails? up = - _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); + _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } final _SanitizedDetails sanitizedDetails = _sanitizer.sanitizeDownEvent( - button: event.button.toInt(), - buttons: event.buttons!.toInt(), + button: event.button, + buttons: event.buttons!, ); _convertEventsToPointerData(data: pointerData, event: event, details: sanitizedDetails); _callback(pointerData); @@ -1008,18 +1007,18 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { _addMouseEventListener(domWindow, 'mousemove', (DomMouseEvent event) { final List pointerData = []; - final _SanitizedDetails? up = _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!.toInt()); + final _SanitizedDetails? up = _sanitizer.sanitizeMissingRightClickUp(buttons: event.buttons!); if (up != null) { _convertEventsToPointerData(data: pointerData, event: event, details: up); } - final _SanitizedDetails move = _sanitizer.sanitizeMoveEvent(buttons: event.buttons!.toInt()); + final _SanitizedDetails move = _sanitizer.sanitizeMoveEvent(buttons: event.buttons!); _convertEventsToPointerData(data: pointerData, event: event, details: move); _callback(pointerData); }); _addMouseEventListener(glassPaneElement, 'mouseleave', (DomMouseEvent event) { final List pointerData = []; - final _SanitizedDetails? details = _sanitizer.sanitizeLeaveEvent(buttons: event.buttons!.toInt()); + final _SanitizedDetails? details = _sanitizer.sanitizeLeaveEvent(buttons: event.buttons!); if (details != null) { _convertEventsToPointerData(data: pointerData, event: event, details: details); _callback(pointerData); @@ -1028,7 +1027,7 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { _addMouseEventListener(domWindow, 'mouseup', (DomMouseEvent event) { final List pointerData = []; - final _SanitizedDetails? sanitizedDetails = _sanitizer.sanitizeUpEvent(buttons: event.buttons?.toInt()); + final _SanitizedDetails? sanitizedDetails = _sanitizer.sanitizeUpEvent(buttons: event.buttons); if (sanitizedDetails != null) { _convertEventsToPointerData(data: pointerData, event: event, details: sanitizedDetails); _callback(pointerData); @@ -1057,8 +1056,8 @@ class _MouseAdapter extends _BaseAdapter with _WheelEventListenerMixin { kind: ui.PointerDeviceKind.mouse, signalKind: ui.PointerSignalKind.none, device: _mouseDeviceId, - physicalX: event.clientX * ui.window.devicePixelRatio, - physicalY: event.clientY * ui.window.devicePixelRatio, + physicalX: event.clientX.toDouble() * ui.window.devicePixelRatio, + physicalY: event.clientY.toDouble() * ui.window.devicePixelRatio, buttons: details.buttons, pressure: 1.0, pressureMax: 1.0, diff --git a/lib/web_ui/lib/src/engine/safe_browser_api.dart b/lib/web_ui/lib/src/engine/safe_browser_api.dart index 77323d7780959..b534fa3085485 100644 --- a/lib/web_ui/lib/src/engine/safe_browser_api.dart +++ b/lib/web_ui/lib/src/engine/safe_browser_api.dart @@ -202,8 +202,8 @@ DomCanvasElement? tryCreateCanvasElement(int width, int height) { return null; } try { - canvas.width = width.toDouble(); - canvas.height = height.toDouble(); + canvas.width = width; + canvas.height = height; } catch (e) { // It seems the tribal knowledge of why we anticipate an exception while // setting width/height on a non-null canvas and why it's OK to return null @@ -336,14 +336,14 @@ class DecodeOptions { class VideoFrame implements DomCanvasImageSource {} extension VideoFrameExtension on VideoFrame { - external double allocationSize(); + external int allocationSize(); external JsPromise copyTo(Uint8List destination); external String? get format; - external double get codedWidth; - external double get codedHeight; - external double get displayWidth; - external double get displayHeight; - external double? get duration; + external int get codedWidth; + external int get codedHeight; + external int get displayWidth; + external int get displayHeight; + external int? get duration; external VideoFrame clone(); external void close(); } @@ -374,8 +374,8 @@ extension ImageTrackListExtension on ImageTrackList { class ImageTrack {} extension ImageTrackExtension on ImageTrack { - external double get repetitionCount; - external double get frameCount; + external int get repetitionCount; + external int get frameCount; } void scaleCanvas2D(Object context2d, num x, num y) { @@ -990,11 +990,11 @@ class OffScreenCanvas { width = requestedWidth; height = requestedHeight; if(offScreenCanvas != null) { - offScreenCanvas!.width = requestedWidth.toDouble(); - offScreenCanvas!.height = requestedHeight.toDouble(); + offScreenCanvas!.width = requestedWidth; + offScreenCanvas!.height = requestedHeight; } else if (canvasElement != null) { - canvasElement!.width = requestedWidth.toDouble(); - canvasElement!.height = requestedHeight.toDouble(); + canvasElement!.width = requestedWidth; + canvasElement!.height = requestedHeight; _updateCanvasCssSize(canvasElement!); } } diff --git a/lib/web_ui/lib/src/engine/semantics/scrollable.dart b/lib/web_ui/lib/src/engine/semantics/scrollable.dart index 06910c7baaa76..839a9c7bd5128 100644 --- a/lib/web_ui/lib/src/engine/semantics/scrollable.dart +++ b/lib/web_ui/lib/src/engine/semantics/scrollable.dart @@ -131,10 +131,10 @@ class Scrollable extends RoleManager { /// The value of "scrollTop" or "scrollLeft", depending on the scroll axis. int get _domScrollPosition { if (semanticsObject.isVerticalScrollContainer) { - return semanticsObject.element.scrollTop.toInt(); + return semanticsObject.element.scrollTop; } else { assert(semanticsObject.isHorizontalScrollContainer); - return semanticsObject.element.scrollLeft.toInt(); + return semanticsObject.element.scrollLeft; } } @@ -167,9 +167,9 @@ class Scrollable extends RoleManager { ..width = '${rect.width.round()}px' ..height = '${canonicalNeutralScrollPosition}px'; - element.scrollTop = canonicalNeutralScrollPosition.toDouble(); + element.scrollTop = canonicalNeutralScrollPosition; // Read back because the effective value depends on the amount of content. - _effectiveNeutralScrollPosition = element.scrollTop.toInt(); + _effectiveNeutralScrollPosition = element.scrollTop; semanticsObject ..verticalContainerAdjustment = _effectiveNeutralScrollPosition.toDouble() @@ -184,9 +184,9 @@ class Scrollable extends RoleManager { ..width = '${canonicalNeutralScrollPosition}px' ..height = '${rect.height.round()}px'; - element.scrollLeft = canonicalNeutralScrollPosition.toDouble(); + element.scrollLeft = canonicalNeutralScrollPosition; // Read back because the effective value depends on the amount of content. - _effectiveNeutralScrollPosition = element.scrollLeft.toInt(); + _effectiveNeutralScrollPosition = element.scrollLeft; semanticsObject ..verticalContainerAdjustment = 0.0 ..horizontalContainerAdjustment = diff --git a/lib/web_ui/lib/src/engine/text/font_collection.dart b/lib/web_ui/lib/src/engine/text/font_collection.dart index 6133ade36050b..029d5ee2c679f 100644 --- a/lib/web_ui/lib/src/engine/text/font_collection.dart +++ b/lib/web_ui/lib/src/engine/text/font_collection.dart @@ -289,7 +289,7 @@ class _PolyfillFontManager extends FontManager { paragraph.text = _testString; domDocument.body!.append(paragraph); - final int sansSerifWidth = paragraph.offsetWidth.toInt(); + final int sansSerifWidth = paragraph.offsetWidth; paragraph.style.fontFamily = "'$family', $fallbackFontName"; diff --git a/lib/web_ui/lib/src/engine/text/line_breaker.dart b/lib/web_ui/lib/src/engine/text/line_breaker.dart index c2bf0ab1e2090..5c30f81ce95c9 100644 --- a/lib/web_ui/lib/src/engine/text/line_breaker.dart +++ b/lib/web_ui/lib/src/engine/text/line_breaker.dart @@ -80,7 +80,7 @@ class V8LineBreakFragmenter extends TextFragmenter implements LineBreakFragmente while (iterator.next() != -1) { final LineBreakType type = _getBreakType(iterator); - final int fragmentEnd = iterator.current().toInt(); + final int fragmentEnd = iterator.current(); int trailingNewlines = 0; int trailingSpaces = 0; @@ -128,7 +128,7 @@ class V8LineBreakFragmenter extends TextFragmenter implements LineBreakFragmente /// Gets break type from v8BreakIterator. LineBreakType _getBreakType(DomV8BreakIterator iterator) { - final int fragmentEnd = iterator.current().toInt(); + final int fragmentEnd = iterator.current(); // I don't know why v8BreakIterator uses the type "none" to mean "soft break". if (iterator.breakType() != 'none') { diff --git a/lib/web_ui/lib/src/engine/text/measurement.dart b/lib/web_ui/lib/src/engine/text/measurement.dart index 0a8ccddfe16e1..6eb95a971575d 100644 --- a/lib/web_ui/lib/src/engine/text/measurement.dart +++ b/lib/web_ui/lib/src/engine/text/measurement.dart @@ -102,7 +102,7 @@ double measureSubstring( } else { final String sub = start == 0 && end == text.length ? text : text.substring(start, end); - width = canvasContext.measureText(sub).width!; + width = canvasContext.measureText(sub).width!.toDouble(); } _lastStart = start; diff --git a/lib/web_ui/lib/src/engine/text/ruler.dart b/lib/web_ui/lib/src/engine/text/ruler.dart index bce0e6bbd08ff..18c2d80821e91 100644 --- a/lib/web_ui/lib/src/engine/text/ruler.dart +++ b/lib/web_ui/lib/src/engine/text/ruler.dart @@ -137,7 +137,7 @@ class TextDimensions { /// The height of the paragraph being measured. double get height { - double cachedHeight = _readAndCacheMetrics().height; + double cachedHeight = _readAndCacheMetrics().height as double; if (browserEngine == BrowserEngine.firefox && // In the flutter tester environment, we use a predictable-size for font // measurement tests. @@ -170,7 +170,7 @@ class TextHeightRuler { final TextDimensions _dimensions = TextDimensions(domDocument.createElement('flt-paragraph')); /// The alphabetic baseline for this ruler's [textHeightStyle]. - late final double alphabeticBaseline = _probe.getBoundingClientRect().bottom; + late final double alphabeticBaseline = _probe.getBoundingClientRect().bottom.toDouble(); /// The height for this ruler's [textHeightStyle]. late final double height = _dimensions.height; diff --git a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart index 76b5b4543ca2a..fda0324a3f506 100644 --- a/lib/web_ui/lib/src/engine/text_editing/text_editing.dart +++ b/lib/web_ui/lib/src/engine/text_editing/text_editing.dart @@ -724,15 +724,15 @@ class EditingState { final DomHTMLInputElement element = domElement! as DomHTMLInputElement; return EditingState( text: element.value, - baseOffset: element.selectionStart?.toInt(), - extentOffset: element.selectionEnd?.toInt()); + baseOffset: element.selectionStart, + extentOffset: element.selectionEnd); } else if (domInstanceOfString(domElement, 'HTMLTextAreaElement')) { final DomHTMLTextAreaElement element = domElement! as DomHTMLTextAreaElement; return EditingState( text: element.value, - baseOffset: element.selectionStart?.toInt(), - extentOffset: element.selectionEnd?.toInt()); + baseOffset: element.selectionStart, + extentOffset: element.selectionEnd); } else { throw UnsupportedError('Initialized with unsupported input type'); } diff --git a/lib/web_ui/lib/src/engine/window.dart b/lib/web_ui/lib/src/engine/window.dart index 7010ece2079c6..953235213008e 100644 --- a/lib/web_ui/lib/src/engine/window.dart +++ b/lib/web_ui/lib/src/engine/window.dart @@ -247,14 +247,14 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { /// text editing to make sure inset is correctly reported to /// framework. final double docWidth = - domDocument.documentElement!.clientWidth; + domDocument.documentElement!.clientWidth.toDouble(); final double docHeight = - domDocument.documentElement!.clientHeight; + domDocument.documentElement!.clientHeight.toDouble(); windowInnerWidth = docWidth * devicePixelRatio; windowInnerHeight = docHeight * devicePixelRatio; } else { - windowInnerWidth = viewport.width! * devicePixelRatio; - windowInnerHeight = viewport.height! * devicePixelRatio; + windowInnerWidth = viewport.width!.toDouble() * devicePixelRatio; + windowInnerHeight = viewport.height!.toDouble() * devicePixelRatio; } } else { windowInnerWidth = domWindow.innerWidth! * devicePixelRatio; @@ -280,7 +280,7 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { windowInnerHeight = domDocument.documentElement!.clientHeight * devicePixelRatio; } else { - windowInnerHeight = viewport.height! * devicePixelRatio; + windowInnerHeight = viewport.height!.toDouble() * devicePixelRatio; } } else { windowInnerHeight = domWindow.innerHeight! * devicePixelRatio; @@ -309,8 +309,8 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { double width = 0; if (domWindow.visualViewport != null) { height = - domWindow.visualViewport!.height! * devicePixelRatio; - width = domWindow.visualViewport!.width! * devicePixelRatio; + domWindow.visualViewport!.height!.toDouble() * devicePixelRatio; + width = domWindow.visualViewport!.width!.toDouble() * devicePixelRatio; } else { height = domWindow.innerHeight! * devicePixelRatio; width = domWindow.innerWidth! * devicePixelRatio; diff --git a/lib/web_ui/test/engine/surface/scene_builder_test.dart b/lib/web_ui/test/engine/surface/scene_builder_test.dart index e0535d7351847..05dd5b7d1c38c 100644 --- a/lib/web_ui/test/engine/surface/scene_builder_test.dart +++ b/lib/web_ui/test/engine/surface/scene_builder_test.dart @@ -35,7 +35,7 @@ void testMain() { test('pushTransform implements surface lifecycle', () { testLayerLifeCycle((ui.SceneBuilder sceneBuilder, ui.EngineLayer? oldLayer) { return sceneBuilder.pushTransform( - (Matrix4.identity()..scale(domWindow.devicePixelRatio)).toFloat64()); + (Matrix4.identity()..scale(domWindow.devicePixelRatio as double)).toFloat64()); }, () { return ''''''; }); @@ -595,8 +595,8 @@ void testMain() { final DomElement content = builder.build().webOnlyRootElement!; final DomCanvasElement canvas = content.querySelector('canvas')! as DomCanvasElement; - final int unscaledWidth = canvas.width!.toInt(); - final int unscaledHeight = canvas.height!.toInt(); + final int unscaledWidth = canvas.width!; + final int unscaledHeight = canvas.height!; // Force update to scene which will utilize reuse code path. final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder(); @@ -627,8 +627,8 @@ void testMain() { final DomElement content = builder.build().webOnlyRootElement!; final DomCanvasElement canvas = content.querySelector('canvas')! as DomCanvasElement; - final int unscaledWidth = canvas.width!.toInt(); - final int unscaledHeight = canvas.height!.toInt(); + final int unscaledWidth = canvas.width!; + final int unscaledHeight = canvas.height!; // Force update to scene which will utilize reuse code path. final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder(); diff --git a/lib/web_ui/test/engine/surface/surface_test.dart b/lib/web_ui/test/engine/surface/surface_test.dart index 4b78dec4f7238..5a57d85ed6c59 100644 --- a/lib/web_ui/test/engine/surface/surface_test.dart +++ b/lib/web_ui/test/engine/surface/surface_test.dart @@ -160,7 +160,7 @@ void testMain() { final SurfaceSceneBuilder builder1 = SurfaceSceneBuilder(); final PersistedTransform a1 = builder1.pushTransform( - (Matrix4.identity()..scale(domWindow.devicePixelRatio)).toFloat64()) as PersistedTransform; + (Matrix4.identity()..scale(domWindow.devicePixelRatio as double)).toFloat64()) as PersistedTransform; final PersistedOpacity b1 = builder1.pushOpacity(100) as PersistedOpacity; final PersistedTransform c1 = builder1.pushTransform(Matrix4.identity().toFloat64()) as PersistedTransform; @@ -181,7 +181,7 @@ void testMain() { final SurfaceSceneBuilder builder2 = SurfaceSceneBuilder(); final PersistedTransform a2 = builder2.pushTransform( - (Matrix4.identity()..scale(domWindow.devicePixelRatio)).toFloat64(), + (Matrix4.identity()..scale(domWindow.devicePixelRatio as double)).toFloat64(), oldLayer: a1) as PersistedTransform; final PersistedTransform c2 = builder2.pushTransform(Matrix4.identity().toFloat64(), oldLayer: c1) as PersistedTransform;