From 9e42ef3426d1b08e4f4280c84fc3e56a8615f255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Wed, 15 Sep 2021 17:46:44 +0800 Subject: [PATCH 01/15] :bug: fix: make multi frame image can replay. --- kraken/lib/src/css/background.dart | 19 +- kraken/lib/src/css/values/url.dart | 32 ++- kraken/lib/src/dom/element.dart | 5 +- kraken/lib/src/dom/elements/img.dart | 203 ++++++++++-------- .../src/painting/image_provider_factory.dart | 20 +- 5 files changed, 144 insertions(+), 135 deletions(-) diff --git a/kraken/lib/src/css/background.dart b/kraken/lib/src/css/background.dart index 836b40e057..245c68d829 100644 --- a/kraken/lib/src/css/background.dart +++ b/kraken/lib/src/css/background.dart @@ -89,7 +89,7 @@ class CSSBackground { } static DecorationImage? getDecorationImage(CSSStyleDeclaration? style, CSSFunctionalNotation method, { int? contextId }) { - DecorationImage backgroundImage; + DecorationImage? backgroundImage; String url = method.args.isNotEmpty ? method.args[0] : ''; if (url.isEmpty) { @@ -111,16 +111,17 @@ class CSSBackground { } } - if (contextId != null) { - KrakenController controller = KrakenController.getControllerOfJSContextId(contextId)!; - url = controller.uriParser!.resolve(Uri.parse(controller.href), Uri.parse(url)).toString(); + if (contextId != null && url.isNotEmpty) { + KrakenController? controller = KrakenController.getControllerOfJSContextId(contextId); + if (controller != null) { + Uri uri = controller.uriParser!.resolve(Uri.parse(controller.href), Uri.parse(url)); + backgroundImage = DecorationImage( + image: CSSUrl.parseUrl(uri, contextId: contextId)!, + repeat: imageRepeat, + ); + } } - backgroundImage = DecorationImage( - image: CSSUrl.parseUrl(url, contextId: contextId)!, - repeat: imageRepeat, - ); - return backgroundImage; } diff --git a/kraken/lib/src/css/values/url.dart b/kraken/lib/src/css/values/url.dart index 041d672c42..e171697401 100644 --- a/kraken/lib/src/css/values/url.dart +++ b/kraken/lib/src/css/values/url.dart @@ -11,39 +11,31 @@ import 'package:kraken/painting.dart'; // CSS Values and Units: https://drafts.csswg.org/css-values-3/#urls class CSSUrl { - - static ImageProvider? parseUrl(String rawInput, { cache = 'auto', int? contextId }) { - // support input string enclosed in quotation marks - if ((rawInput.startsWith('\'') && rawInput.endsWith('\'')) || - (rawInput.startsWith('"') && rawInput.endsWith('"'))) { - rawInput = rawInput.substring(1, rawInput.length - 1); - } + static ImageProvider? parseUrl(Uri resolvedUri, { cache = 'auto', int? contextId }) { ImageProvider? imageProvider; - - if (rawInput.startsWith('//') || rawInput.startsWith('http://') || rawInput.startsWith('https://')) { - String url = rawInput.startsWith('//') ? 'https:' + rawInput : rawInput; + if (resolvedUri.isScheme('HTTP') || resolvedUri.isScheme('HTTPS')) { // @TODO: Caching also works after image downloaded. ImageType cacheType = (cache == 'store' || cache == 'auto') ? ImageType.cached : ImageType.network; - imageProvider = getImageProviderFactory(cacheType)(url, [contextId]); - } else if (rawInput.startsWith('file://')) { - File file = File.fromUri(Uri.parse(rawInput)); - imageProvider = getImageProviderFactory(ImageType.file)(rawInput, file); - } else if (rawInput.startsWith('data:')) { + imageProvider = getImageProviderFactory(cacheType)(resolvedUri, [contextId]); + } else if (resolvedUri.isScheme('FILE')) { + File file = File.fromUri(resolvedUri); + imageProvider = getImageProviderFactory(ImageType.file)(resolvedUri, file); + } else if (resolvedUri.isScheme('DATA')) { // Data URL: https://tools.ietf.org/html/rfc2397 // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data - UriData data = UriData.parse(rawInput); + UriData data = UriData.fromUri(resolvedUri); if (data.isBase64) { - imageProvider = getImageProviderFactory(ImageType.dataUrl)(rawInput, data.contentAsBytes()); + imageProvider = getImageProviderFactory(ImageType.dataUrl)(resolvedUri, data.contentAsBytes()); } - } else if (rawInput.startsWith('blob:')) { + } else if (resolvedUri.isScheme('BLOB')) { // @TODO: support blob file url - imageProvider = getImageProviderFactory(ImageType.blob)(rawInput); + imageProvider = getImageProviderFactory(ImageType.blob)(resolvedUri); } else { // Fallback to asset image - imageProvider = getImageProviderFactory(ImageType.assets)(rawInput); + imageProvider = getImageProviderFactory(ImageType.assets)(resolvedUri); } return imageProvider; diff --git a/kraken/lib/src/dom/element.dart b/kraken/lib/src/dom/element.dart index 35fe03223c..00d48238cf 100644 --- a/kraken/lib/src/dom/element.dart +++ b/kraken/lib/src/dom/element.dart @@ -170,8 +170,6 @@ class Element extends Node /// Whether should create repaintBoundary for this element when style changed bool get shouldConvertToRepaintBoundary { // Following cases should always convert to repaint boundary for performance consideration - // Multiframe image - bool isMultiframeImage = this is ImageElement && (this as ImageElement).isMultiframe; // Intrinsic element such as Canvas bool isSetRepaintSelf = repaintSelf; // Scrolling box @@ -181,8 +179,7 @@ class Element extends Node // Fixed element bool isPositionedFixed = renderBoxModel?.renderStyle.position == CSSPositionType.fixed; - return isMultiframeImage || isScrollingBox || - isSetRepaintSelf || hasTransform || isPositionedFixed; + return isScrollingBox || isSetRepaintSelf || hasTransform || isPositionedFixed; } Element(int targetId, this.nativeElementPtr, ElementManager elementManager, diff --git a/kraken/lib/src/dom/elements/img.dart b/kraken/lib/src/dom/elements/img.dart index 30ff6bb65b..609e570375 100644 --- a/kraken/lib/src/dom/elements/img.dart +++ b/kraken/lib/src/dom/elements/img.dart @@ -19,11 +19,7 @@ const String IMAGE = 'IMG'; final RegExp _numExp = RegExp(r'^\d+'); -bool _isNumberString(String str) { - return _numExp.hasMatch(str); -} - -// FIXME: shoud be inline default +// FIXME: should be inline default. const Map _defaultStyle = { DISPLAY: INLINE_BLOCK, }; @@ -33,29 +29,8 @@ final Pointer> nativeGetImageHeight = Pointer.fr final Pointer> nativeGetImageNaturalWidth = Pointer.fromFunction(ImageElement.getImageNaturalWidth, 0.0); final Pointer> nativeGetImageNaturalHeight = Pointer.fromFunction(ImageElement.getImageNaturalHeight, 0.0); +// The HTMLImageElement. class ImageElement extends Element { - String? _source; - ImageProvider? _image; - RenderImage? _imageBox; - ImageStream? _imageStream; - ImageInfo? _imageInfo; - double? _propertyWidth; - double? _propertyHeight; - ImageStreamListener? _initImageListener; - late ImageStreamListener _renderStreamListener; - - /// Number of image frame, used to identify gif after image loaded - int _frameNumber = 0; - - bool _isInLazyLoading = false; - - bool get _shouldLazyLoading { - return properties['loading'] == 'lazy'; - } - - // Whether is multiframe image - bool isMultiframe = false; - static final SplayTreeMap _nativeMap = SplayTreeMap(); static ImageElement getImageElementOfNativePtr(Pointer nativeImageElement) { @@ -85,6 +60,34 @@ class ImageElement extends Element { return imageElement.naturalHeight; } + // The render box to draw image. + RenderImage? _renderImage; + + // The image source url. + String? get _source => getProperty('src'); + + ImageProvider? _imageProvider; + + ImageStream? _imageStream; + + ImageInfo? _imageInfo; + + ImageStreamListener? _initImageListener; + + late ImageStreamListener _renderStreamListener; + + double? _propertyWidth; + double? _propertyHeight; + + ui.Image? get image => _imageInfo?.image; + + /// Number of image frame, used to identify multi frame image after loaded. + int _frameCount = 0; + + bool _isInLazyLoading = false; + + bool get _shouldLazyLoading => properties['loading'] == 'lazy'; + final Pointer nativeImgElement; ImageElement(int targetId, this.nativeImgElement, ElementManager elementManager) @@ -104,8 +107,6 @@ class ImageElement extends Element { nativeImgElement.ref.getImageNaturalHeight = nativeGetImageNaturalHeight; } - ui.Image? get image => _imageInfo?.image; - @override void willAttachRenderer() { super.willAttachRenderer(); @@ -117,29 +118,56 @@ class ImageElement extends Element { super.didAttachRenderer(); // Should add image box after style has applied to ensure intersection observer // attached to correct renderBoxModel - _renderImage(); + if (!_isInLazyLoading) { + // Image dimensions (width or height) should specified for performance when lazy-load. + if (_shouldLazyLoading) { + _isInLazyLoading = true; + + // When detach renderer, all listeners will be cleared. + renderBoxModel!.addIntersectionChangeListener(_handleIntersectionChange); + } else { + _constructImageChild(); + } + } _resize(); } @override - void didDetachRenderer() { + void didDetachRenderer() async { super.didDetachRenderer(); style.removeStyleChangeListener(_stylePropertyChanged); + + // Dispose image info. + _imageInfo?.dispose(); + _imageInfo = null; + + // Unlink image render box, which has been detached. + _renderImage = null; + + // @NOTE: Evict image cache, make multi frame image can replay. + // https://github.com/flutter/flutter/issues/51775 + _imageProvider?.evict(); + + _removeStreamListener(); } @override void dispose() { super.dispose(); + + _imageProvider?.evict(); + _imageProvider = null; + _removeStreamListener(); - _image = null; - _imageBox = null; - _imageStream = null; + + _renderImage = null; + _nativeMap.remove(nativeImgElement.address); } double? get width { - if (_imageBox != null) { - return _imageBox!.width; + if (_renderImage != null) { + return _renderImage!.width; } if (renderBoxModel != null && renderBoxModel!.hasSize) { @@ -151,8 +179,8 @@ class ImageElement extends Element { } double? get height { - if (_imageBox != null) { - return _imageBox!.height; + if (_renderImage != null) { + return _renderImage!.height; } if (renderBoxModel != null && renderBoxModel!.hasSize) { @@ -177,17 +205,6 @@ class ImageElement extends Element { return 0.0; } - void _renderImage() { - if (_isInLazyLoading) return; - // Image dimensions(width/height) should specified for performance when lazy-load. - if (_shouldLazyLoading) { - _isInLazyLoading = true; - renderBoxModel!.addIntersectionChangeListener(_handleIntersectionChange); - } else { - _constructImageChild(); - } - } - void _handleIntersectionChange(IntersectionObserverEntry entry) { // When appear if (entry.isIntersecting) { @@ -195,7 +212,6 @@ class ImageElement extends Element { _resetLazyLoading(); _constructImageChild(); _loadImage(); - } } @@ -206,15 +222,15 @@ class ImageElement extends Element { void _removeImage() { _removeStreamListener(); - _image = null; - _imageBox!.image = null; + _imageProvider = null; + _renderImage!.image = null; } void _constructImageChild() { - _imageBox = createRenderImageBox(); + _renderImage = createRenderImageBox(); if (childNodes.isEmpty) { - addChild(_imageBox!); + addChild(_renderImage!); } } @@ -248,14 +264,17 @@ class ImageElement extends Element { } } + // Multi frame image should convert to repaint boundary. + @override + bool get shouldConvertToRepaintBoundary => _frameCount > 2 || super.shouldConvertToRepaintBoundary; + void _renderImageStream(ImageInfo imageInfo, bool synchronousCall) { - _frameNumber++; + _frameCount++; _imageInfo = imageInfo; // @HACK Flutter image cache will cause image steam listener to trigger twice when page reload - // so use two frames to tell multiframe image from static image, note this optimization will fail - // at multiframe image with only two frames which is not common - isMultiframe = _frameNumber > 2; + // so use two frames to tell multi frame image from static image, note this optimization will fail + // at multi frame image with only two frames which is not common. if (shouldConvertToRepaintBoundary) { convertToRepaintBoundary(); } else { @@ -263,7 +282,7 @@ class ImageElement extends Element { } _resize(); - _imageBox?.image = _imageInfo?.image; + _renderImage?.image = image; } // Delay image size setting to next frame to make sure image has been layouted @@ -318,8 +337,8 @@ class ImageElement extends Element { width = 0.0; } - _imageBox?.width = width; - _imageBox?.height = height; + _renderImage?.width = width; + _renderImage?.height = height; renderBoxModel!.intrinsicWidth = naturalWidth; renderBoxModel!.intrinsicHeight = naturalHeight; @@ -335,6 +354,7 @@ class ImageElement extends Element { if (_initImageListener != null) { _imageStream?.removeListener(_initImageListener!); + _initImageListener = null; } _imageStream = null; } @@ -356,7 +376,7 @@ class ImageElement extends Element { super.removeProperty(key); if (key == 'src') { _removeImage(); - } else if (key == 'loading' && _isInLazyLoading && _image == null) { + } else if (key == 'loading' && _isInLazyLoading && _imageProvider == null) { _resetLazyLoading(); } } @@ -372,7 +392,7 @@ class ImageElement extends Element { } // Reset frame number to zero when image needs to reload - _frameNumber = 0; + _frameCount = 0; if (key == 'src' && !_shouldLazyLoading) { // Loads the image immediately. _loadImage(); @@ -380,7 +400,7 @@ class ImageElement extends Element { // Should reset lazy when value change. _resetLazyLoading(); } else if (key == WIDTH) { - if (value is String && _isNumberString(value)) { + if (value is String && _isNumber(value)) { value += 'px'; } @@ -392,7 +412,7 @@ class ImageElement extends Element { ); _resize(); } else if (key == HEIGHT) { - if (value is String && _isNumberString(value)) { + if (value is String && _isNumber(value)) { value += 'px'; } @@ -407,21 +427,21 @@ class ImageElement extends Element { } void _loadImage() { - String? source = properties['src']; - if (_source == null || _source != source) { - _source = source; - if (source != null && source.isNotEmpty) { - _removeStreamListener(); - - Uri base = Uri.parse(elementManager.controller.href); - _image = CSSUrl.parseUrl( - elementManager.controller.uriParser!.resolve(base, Uri.parse(source)).toString(), - cache: properties['caching'], contextId: elementManager.contextId); - _imageStream = _image!.resolve(ImageConfiguration.empty); - _imageStream!.addListener(_renderStreamListener); - - _initImageListener = ImageStreamListener(_initImageInfo); - _imageStream!.addListener(_initImageListener!); + if (_source != null) { + _removeStreamListener(); + + Uri base = Uri.parse(elementManager.controller.href); + Uri resolvedUri = elementManager.controller.uriParser!.resolve(base, Uri.parse(_source!)); + + ImageProvider? imageProvider = CSSUrl.parseUrl(resolvedUri, + cache: properties['caching'], contextId: elementManager.contextId); + + if (imageProvider != null) { + _imageProvider = imageProvider; + _imageStream = imageProvider + .resolve(ImageConfiguration.empty) + ..addListener(_renderStreamListener) + ..addListener(_initImageListener = ImageStreamListener(_initImageInfo)); } } } @@ -430,15 +450,9 @@ class ImageElement extends Element { dynamic getProperty(String key) { switch (key) { case WIDTH: - if (_imageBox != null) { - return _imageBox!.width; - } - return 0; + return _renderImage?.width ?? 0; case HEIGHT: - if (_imageBox != null) { - return _imageBox!.height; - } - return 0; + return _renderImage?.height ?? 0; } return super.getProperty(key); @@ -447,10 +461,15 @@ class ImageElement extends Element { void _stylePropertyChanged(String property, String? original, String present) { if (property == WIDTH || property == HEIGHT) { _resize(); - } else if (property == OBJECT_FIT && _imageBox != null) { - _imageBox!.fit = renderBoxModel!.renderStyle.objectFit; - } else if (property == OBJECT_POSITION && _imageBox != null) { - _imageBox!.alignment = renderBoxModel!.renderStyle.objectPosition; + } else if (property == OBJECT_FIT && _renderImage != null) { + _renderImage!.fit = renderBoxModel!.renderStyle.objectFit; + } else if (property == OBJECT_POSITION && _renderImage != null) { + _renderImage!.alignment = renderBoxModel!.renderStyle.objectPosition; } } } + +// Return true if the input string only contain numbers. +bool _isNumber(String input) { + return _numExp.hasMatch(input); +} diff --git a/kraken/lib/src/painting/image_provider_factory.dart b/kraken/lib/src/painting/image_provider_factory.dart index 0ddbe5c2de..66da6330df 100644 --- a/kraken/lib/src/painting/image_provider_factory.dart +++ b/kraken/lib/src/painting/image_provider_factory.dart @@ -17,7 +17,7 @@ import 'package:kraken/painting.dart'; /// This class allows user to customize Kraken's image loading. /// A factory function allow user to build an customized ImageProvider class. -typedef ImageProviderFactory = ImageProvider? Function(String url, [dynamic param]); +typedef ImageProviderFactory = ImageProvider? Function(Uri uri, [dynamic param]); /// defines the types of supported image source. enum ImageType { @@ -127,15 +127,15 @@ int? _getContextId(param) { } /// default ImageProviderFactory implementation of [ImageType.cached] -ImageProvider defaultCachedProviderFactory(String url, [param]) { +ImageProvider defaultCachedProviderFactory(Uri uri, [param]) { int? contextId = _getContextId(param); - return CachedNetworkImage(url, contextId: contextId); + return CachedNetworkImage(uri.toString(), contextId: contextId); } /// default ImageProviderFactory implementation of [ImageType.network] -ImageProvider defaultNetworkProviderFactory(String url, [param]) { +ImageProvider defaultNetworkProviderFactory(Uri uri, [param]) { int? contextId = _getContextId(param); - NetworkImage networkImage = NetworkImage(url, headers: { + NetworkImage networkImage = NetworkImage(uri.toString(), headers: { HttpHeaders.userAgentHeader: getKrakenInfo().userAgent, HttpHeaderContext: contextId.toString(), }); @@ -143,7 +143,7 @@ ImageProvider defaultNetworkProviderFactory(String url, [param]) { } /// default ImageProviderFactory implementation of [ImageType.file] -ImageProvider? defaultFileProviderFactory(String rawPath, [param]) { +ImageProvider? defaultFileProviderFactory(Uri uri, [param]) { ImageProvider? _imageProvider; if (param is File) { _imageProvider = FileImage(param); @@ -152,7 +152,7 @@ ImageProvider? defaultFileProviderFactory(String rawPath, [param]) { } /// default ImageProviderFactory implementation of [ImageType.dataUrl]. -ImageProvider? defaultDataUrlProviderFactory(String uriDataPath, [param]) { +ImageProvider? defaultDataUrlProviderFactory(Uri uri, [param]) { ImageProvider? _imageProvider; if (param is Uint8List) { _imageProvider = MemoryImage(param); @@ -161,12 +161,12 @@ ImageProvider? defaultDataUrlProviderFactory(String uriDataPath, [param]) { } /// default ImageProviderFactory implementation of [ImageType.blob]. -ImageProvider? defaultBlobProviderFactory(String blobPath, [param]) { +ImageProvider? defaultBlobProviderFactory(Uri uri, [param]) { // @TODO: support blob file url return null; } /// default ImageProviderFactory implementation of [ImageType.assets]. -ImageProvider defaultAssetsProvider(String rawUrl, [param]) { - return AssetImage(rawUrl); +ImageProvider defaultAssetsProvider(Uri uri, [param]) { + return AssetImage(uri.toString()); } From deb0ef8f8413ede4c698ddb36f57ecf8cbcb2533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Wed, 15 Sep 2021 18:39:26 +0800 Subject: [PATCH 02/15] :bug: fix: shunk off quotation mark in css background image. --- kraken/lib/src/css/background.dart | 25 ++++++++++++++++++++----- kraken/lib/src/css/box.dart | 5 ++++- kraken/lib/src/rendering/box_model.dart | 3 +++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/kraken/lib/src/css/background.dart b/kraken/lib/src/css/background.dart index 245c68d829..c9b7a1789c 100644 --- a/kraken/lib/src/css/background.dart +++ b/kraken/lib/src/css/background.dart @@ -96,6 +96,9 @@ class CSSBackground { return null; } + // Method may contain quotation mark, like ['"assets/foo.png"'] + url = _shuckOffQuotationMark(url); + ImageRepeat imageRepeat = ImageRepeat.repeat; if (style![BACKGROUND_REPEAT].isNotEmpty) { switch (style[BACKGROUND_REPEAT]) { @@ -111,17 +114,19 @@ class CSSBackground { } } + Uri uri = Uri.parse(url); if (contextId != null && url.isNotEmpty) { KrakenController? controller = KrakenController.getControllerOfJSContextId(contextId); if (controller != null) { - Uri uri = controller.uriParser!.resolve(Uri.parse(controller.href), Uri.parse(url)); - backgroundImage = DecorationImage( - image: CSSUrl.parseUrl(uri, contextId: contextId)!, - repeat: imageRepeat, - ); + uri = controller.uriParser!.resolve(Uri.parse(controller.href), uri); } } + backgroundImage = DecorationImage( + image: CSSUrl.parseUrl(uri, contextId: contextId)!, + repeat: imageRepeat, + ); + return backgroundImage; } @@ -404,3 +409,13 @@ class CSSBackground { return colorGradients; } } + +const String _singleQuote = '\''; +const String _doubleQuote = '"'; +String _shuckOffQuotationMark(String input) { + if ((input.startsWith(_singleQuote) && input.endsWith(_singleQuote)) + || (input.startsWith(_doubleQuote) && input.endsWith(_doubleQuote))) { + input = input.substring(1, input.length - 1); + } + return input; +} diff --git a/kraken/lib/src/css/box.dart b/kraken/lib/src/css/box.dart index 8b09b6a9b7..139a4be227 100644 --- a/kraken/lib/src/css/box.dart +++ b/kraken/lib/src/css/box.dart @@ -262,6 +262,10 @@ mixin CSSBoxMixin on RenderStyleBase { renderBoxModel!.boxPainter?.dispose(); renderBoxModel!.boxPainter = null; + + // Evict image cache. + _decoration?.image?.image.evict(); + _decoration = value; // If has border, render padding should subtracting the edge of the border if (value.border != null) { @@ -430,7 +434,6 @@ mixin CSSBoxMixin on RenderStyleBase { } else { decoration = updateBoxDecoration; } - } static final Map _borderRadiusMapping = { diff --git a/kraken/lib/src/rendering/box_model.dart b/kraken/lib/src/rendering/box_model.dart index 94c5bf3d8d..d0bd8baca8 100644 --- a/kraken/lib/src/rendering/box_model.dart +++ b/kraken/lib/src/rendering/box_model.dart @@ -1484,6 +1484,9 @@ class RenderBoxModel extends RenderBox if (fixedChildren.isNotEmpty) { fixedChildren.clear(); } + + // Evict render decoration image cache. + _renderStyle.decoration?.image?.image.evict(); } Offset getTotalScrollOffset() { From fca2a31873815baaf23b043622a06b6ed4cac003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Wed, 15 Sep 2021 19:59:54 +0800 Subject: [PATCH 03/15] :bug: fix: handling image loaded and error event. --- kraken/lib/src/dom/elements/img.dart | 94 ++++++++++++------------- kraken/lib/src/rendering/box_model.dart | 17 ++--- kraken/lib/src/rendering/flex.dart | 15 ++-- kraken/lib/src/rendering/flow.dart | 8 +-- 4 files changed, 64 insertions(+), 70 deletions(-) diff --git a/kraken/lib/src/dom/elements/img.dart b/kraken/lib/src/dom/elements/img.dart index 609e570375..48b23b8e92 100644 --- a/kraken/lib/src/dom/elements/img.dart +++ b/kraken/lib/src/dom/elements/img.dart @@ -72,8 +72,6 @@ class ImageElement extends Element { ImageInfo? _imageInfo; - ImageStreamListener? _initImageListener; - late ImageStreamListener _renderStreamListener; double? _propertyWidth; @@ -98,7 +96,7 @@ class ImageElement extends Element { isIntrinsicBox: true, tagName: IMAGE, defaultStyle: _defaultStyle) { - _renderStreamListener = ImageStreamListener(_renderImageStream); + _renderStreamListener = ImageStreamListener(_renderImageStream, onChunk: _onImageChunk, onError: _onImageError); _nativeMap[nativeImgElement.address] = this; nativeImgElement.ref.getImageWidth = nativeGetImageWidth; @@ -118,7 +116,7 @@ class ImageElement extends Element { super.didAttachRenderer(); // Should add image box after style has applied to ensure intersection observer // attached to correct renderBoxModel - if (!_isInLazyLoading) { + if (!_isInLazyLoading || _renderImage == null) { // Image dimensions (width or height) should specified for performance when lazy-load. if (_shouldLazyLoading) { _isInLazyLoading = true; @@ -127,6 +125,7 @@ class ImageElement extends Element { renderBoxModel!.addIntersectionChangeListener(_handleIntersectionChange); } else { _constructImageChild(); + _loadImage(); } } _resize(); @@ -165,9 +164,9 @@ class ImageElement extends Element { _nativeMap.remove(nativeImgElement.address); } - double? get width { - if (_renderImage != null) { - return _renderImage!.width; + double get width { + if (_renderImage != null && _renderImage!.width != null) { + return _renderImage!.width!; } if (renderBoxModel != null && renderBoxModel!.hasSize) { @@ -178,32 +177,21 @@ class ImageElement extends Element { return naturalWidth; } - double? get height { - if (_renderImage != null) { - return _renderImage!.height; + double get height { + if (_renderImage != null && _renderImage!.height != null) { + return _renderImage!.height!; } if (renderBoxModel != null && renderBoxModel!.hasSize) { return renderBoxModel!.clientHeight; } - // Fallback to natural width, if image is not on screen. + // Fallback to natural height, if image is not on screen. return naturalHeight; } - double get naturalWidth { - if (_imageInfo != null) { - return _imageInfo!.image.width.toDouble(); - } - return 0.0; - } - - double get naturalHeight { - if (_imageInfo != null) { - return _imageInfo!.image.height.toDouble(); - } - return 0.0; - } + double get naturalWidth => image?.width.toDouble() ?? 0; + double get naturalHeight => image?.height.toDouble() ?? 0; void _handleIntersectionChange(IntersectionObserverEntry entry) { // When appear @@ -249,19 +237,19 @@ class ImageElement extends Element { } void _initImageInfo(ImageInfo imageInfo, bool synchronousCall) { - _imageInfo = imageInfo; - - if (synchronousCall) { - // `synchronousCall` happens when caches image and calling `addListener`. - scheduleMicrotask(_handleEventAfterImageLoaded); - } else { - _handleEventAfterImageLoaded(); - } - - // Only trigger `initImageListener` once. - if (_initImageListener != null) { - _imageStream?.removeListener(_initImageListener!); - } + // + // + // if (synchronousCall) { + // // `synchronousCall` happens when caches image and calling `addListener`. + // scheduleMicrotask(_handleEventAfterImageLoaded); + // } else { + // _handleEventAfterImageLoaded(); + // } + // + // // Only trigger `initImageListener` once. + // if (_initImageListener != null) { + // _imageStream?.removeListener(_initImageListener!); + // } } // Multi frame image should convert to repaint boundary. @@ -285,6 +273,21 @@ class ImageElement extends Element { _renderImage?.image = image; } + // Mark if the same src loaded. + bool _loaded = false; + + void _onImageChunk(ImageChunkEvent imageChunkEvent) { + if (!_loaded && imageChunkEvent.cumulativeBytesLoaded == imageChunkEvent.expectedTotalBytes) { + _handleEventAfterImageLoaded(); + _loaded = true; + } + } + + void _onImageError(Object exception, StackTrace? stackTrace) { + // @TODO: Native side support error event. + // dispatchEvent(Event(EVENT_ERROR)); + } + // Delay image size setting to next frame to make sure image has been layouted // to wait for percentage size to be calculated correctly in the case of image has been cached bool _hasImageLayoutCallbackPending = false; @@ -351,11 +354,6 @@ class ImageElement extends Element { void _removeStreamListener() { _imageStream?.removeListener(_renderStreamListener); - - if (_initImageListener != null) { - _imageStream?.removeListener(_initImageListener!); - _initImageListener = null; - } _imageStream = null; } @@ -376,6 +374,7 @@ class ImageElement extends Element { super.removeProperty(key); if (key == 'src') { _removeImage(); + _loaded = false; } else if (key == 'loading' && _isInLazyLoading && _imageProvider == null) { _resetLazyLoading(); } @@ -383,6 +382,7 @@ class ImageElement extends Element { @override void setProperty(String key, dynamic value) { + bool propertyChanged = properties[key] != value; super.setProperty(key, value); double? rootFontSize; double? fontSize; @@ -393,8 +393,9 @@ class ImageElement extends Element { // Reset frame number to zero when image needs to reload _frameCount = 0; - if (key == 'src' && !_shouldLazyLoading) { + if (key == 'src' && propertyChanged && !_shouldLazyLoading) { // Loads the image immediately. + _loaded = false; _loadImage(); } else if (key == 'loading' && _isInLazyLoading) { // Should reset lazy when value change. @@ -427,21 +428,20 @@ class ImageElement extends Element { } void _loadImage() { - if (_source != null) { + if (_source != null && _imageStream == null) { _removeStreamListener(); Uri base = Uri.parse(elementManager.controller.href); Uri resolvedUri = elementManager.controller.uriParser!.resolve(base, Uri.parse(_source!)); - ImageProvider? imageProvider = CSSUrl.parseUrl(resolvedUri, + ImageProvider? imageProvider = _imageProvider ?? CSSUrl.parseUrl(resolvedUri, cache: properties['caching'], contextId: elementManager.contextId); if (imageProvider != null) { _imageProvider = imageProvider; _imageStream = imageProvider .resolve(ImageConfiguration.empty) - ..addListener(_renderStreamListener) - ..addListener(_initImageListener = ImageStreamListener(_initImageInfo)); + ..addListener(_renderStreamListener); } } } diff --git a/kraken/lib/src/rendering/box_model.dart b/kraken/lib/src/rendering/box_model.dart index d0bd8baca8..13a06d458d 100644 --- a/kraken/lib/src/rendering/box_model.dart +++ b/kraken/lib/src/rendering/box_model.dart @@ -326,10 +326,9 @@ class RenderLayoutBox extends RenderBoxModel // Text box always has baseline if (childDistance == null && isChildInline && - child is RenderBoxModel && - child.contentSize != null) { + child is RenderBoxModel) { // Flutter only allow access size of direct children, so cannot use child.size - Size childSize = child.getBoxSize(child.contentSize!); + Size childSize = child.getBoxSize(child.contentSize); childDistance = childSize.height; } @@ -1175,13 +1174,7 @@ class RenderBoxModel extends RenderBox // The contentSize of layout box Size? _contentSize; - - Size? get contentSize { - if (_contentSize == null) { - return Size(0, 0); - } - return _contentSize; - } + Size get contentSize => _contentSize ?? Size.zero; /// Logical content width calculated from style double? logicalContentWidth; @@ -1190,7 +1183,7 @@ class RenderBoxModel extends RenderBox double? logicalContentHeight; double get clientWidth { - double width = contentSize!.width; + double width = contentSize.width; if (renderStyle.padding != null) { width += renderStyle.padding!.horizontal; } @@ -1198,7 +1191,7 @@ class RenderBoxModel extends RenderBox } double get clientHeight { - double height = contentSize!.height; + double height = contentSize.height; if (renderStyle.padding != null) { height += renderStyle.padding!.vertical; } diff --git a/kraken/lib/src/rendering/flex.dart b/kraken/lib/src/rendering/flex.dart index c18257d69c..a47ae3e13c 100644 --- a/kraken/lib/src/rendering/flex.dart +++ b/kraken/lib/src/rendering/flex.dart @@ -1080,7 +1080,7 @@ class RenderFlexLayout extends RenderLayoutBox { RenderBoxModel realDisplayedBox = child.realDisplayedBox!; // Flutter only allow access size of direct children, so cannot use realDisplayedBox.size Size realDisplayedBoxSize = - realDisplayedBox.getBoxSize(realDisplayedBox.contentSize!); + realDisplayedBox.getBoxSize(realDisplayedBox.contentSize); double realDisplayedBoxWidth = realDisplayedBoxSize.width; double realDisplayedBoxHeight = realDisplayedBoxSize.height; childConstraints = BoxConstraints( @@ -2058,11 +2058,11 @@ class RenderFlexLayout extends RenderLayoutBox { double crossAxisContentSize; if (CSSFlex.isHorizontalFlexDirection(renderStyle.flexDirection)) { - mainAxisContentSize = contentSize!.width; - crossAxisContentSize = contentSize!.height; + mainAxisContentSize = contentSize.width; + crossAxisContentSize = contentSize.height; } else { - mainAxisContentSize = contentSize!.height; - crossAxisContentSize = contentSize!.width; + mainAxisContentSize = contentSize.height; + crossAxisContentSize = contentSize.width; } /// Set offset of children @@ -2522,9 +2522,10 @@ class RenderFlexLayout extends RenderLayoutBox { /// Get cross size of content size double _getContentCrossSize() { if (CSSFlex.isHorizontalFlexDirection(renderStyle.flexDirection)) { - return contentSize!.height; + return contentSize.height; + } else { + return contentSize.width; } - return contentSize!.width; } double? _getLineHeight(RenderBox child) { diff --git a/kraken/lib/src/rendering/flow.dart b/kraken/lib/src/rendering/flow.dart index 1078b222fb..2c65b5e400 100644 --- a/kraken/lib/src/rendering/flow.dart +++ b/kraken/lib/src/rendering/flow.dart @@ -747,15 +747,15 @@ class RenderFlowLayout extends RenderLayoutBox { case Axis.horizontal: Size logicalSize = Size(constraintWidth, constraintHeight); size = getBoxSize(logicalSize); - mainAxisContentSize = contentSize!.width; - crossAxisContentSize = contentSize!.height; + mainAxisContentSize = contentSize.width; + crossAxisContentSize = contentSize.height; break; case Axis.vertical: Size logicalSize = Size(crossAxisExtent, mainAxisExtent); size = getBoxSize(logicalSize); - mainAxisContentSize = contentSize!.height; - crossAxisContentSize = contentSize!.width; + mainAxisContentSize = contentSize.height; + crossAxisContentSize = contentSize.width; break; } From 7922e26010afdcec155704977647ff93300fe361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Wed, 15 Sep 2021 20:06:02 +0800 Subject: [PATCH 04/15] :white_check_mark: test: add test for image load --- integration_tests/specs/dom/elements/img.ts | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/integration_tests/specs/dom/elements/img.ts b/integration_tests/specs/dom/elements/img.ts index 66174b1e07..a80ff3baff 100644 --- a/integration_tests/specs/dom/elements/img.ts +++ b/integration_tests/specs/dom/elements/img.ts @@ -262,4 +262,27 @@ describe('Tags img', () => { document.body.appendChild(img); }); + + it('same image src should only trigger once event', async (done) => { + const imageURL = 'assets/100x100-green.png'; + const img = document.createElement('img'); + img.src = imageURL; + + var loadCount = 0; + img.onload = (event) => { + loadCount++; + document.body.removeChild(img); + document.body.appendChild(img); + }; + + document.body.appendChild(img); + + setTimeout(() => { + if (loadCount == 1) { + done(); + } else { + done('load event should only trigger once.'); + } + }, 100); + }); }); From 62b2eb8b2b2867c189515b18af1db73f66dda3d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Wed, 15 Sep 2021 20:32:11 +0800 Subject: [PATCH 05/15] :white_check_mark: test: add test for replay gif --- integration_tests/assets/sample-gif-138k.gif | Bin 0 -> 138380 bytes integration_tests/assets/sample-gif-40k.gif | Bin 0 -> 40316 bytes .../dom/elements/img.ts.ff77830b1.png | Bin 0 -> 9553 bytes .../dom/elements/img.ts.ff77830b2.png | Bin 0 -> 9553 bytes integration_tests/specs/dom/elements/img.ts | 24 +++++++++ kraken/lib/src/dom/elements/img.dart | 48 +++++++----------- 6 files changed, 43 insertions(+), 29 deletions(-) create mode 100644 integration_tests/assets/sample-gif-138k.gif create mode 100644 integration_tests/assets/sample-gif-40k.gif create mode 100644 integration_tests/snapshots/dom/elements/img.ts.ff77830b1.png create mode 100644 integration_tests/snapshots/dom/elements/img.ts.ff77830b2.png diff --git a/integration_tests/assets/sample-gif-138k.gif b/integration_tests/assets/sample-gif-138k.gif new file mode 100644 index 0000000000000000000000000000000000000000..6133fe1e2e29da1c4d267e9cc8d6dc312b73d2f6 GIT binary patch literal 138380 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 PDA`?0+b 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

5^m|ZWQAcYo^_=hNnc@tJxo4Qfv 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 mHUkcDvvNHk{je?0ZxG+-HI3Y;(ng@{0-mt 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 UvVZ;uT#Ew9NhwKIi5ms{4{b7UjsO4v literal 0 HcmV?d00001 diff --git a/integration_tests/snapshots/dom/elements/img.ts.ff77830b2.png b/integration_tests/snapshots/dom/elements/img.ts.ff77830b2.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7c517411415053383c763f719374d5beaacc5d GIT binary patch literal 9553 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 UvVZ;uT#Ew9NhwKIi5ms{4{b7UjsO4v literal 0 HcmV?d00001 diff --git a/integration_tests/specs/dom/elements/img.ts b/integration_tests/specs/dom/elements/img.ts index a80ff3baff..48af0cf630 100644 --- a/integration_tests/specs/dom/elements/img.ts +++ b/integration_tests/specs/dom/elements/img.ts @@ -285,4 +285,28 @@ describe('Tags img', () => { } }, 100); }); + + it('gif can replay', async (done) => { + const imageURL = 'assets/sample-gif-40k.gif'; + const img = document.createElement('img'); + img.src = imageURL; + + img.onload = async () => { + await snapshot(img); + document.body.removeChild(img); + + setTimeout(() => { + document.body.appendChild(img); + // After next frame that image has shown. + requestAnimationFrame(async () => { + // When replay, the image should be same as first frame. + await snapshot(img); + done(); + }); + // Delay 600ms to play gif. + }, 600); + }; + + document.body.appendChild(img); + }); }); diff --git a/kraken/lib/src/dom/elements/img.dart b/kraken/lib/src/dom/elements/img.dart index 48b23b8e92..1875825cc3 100644 --- a/kraken/lib/src/dom/elements/img.dart +++ b/kraken/lib/src/dom/elements/img.dart @@ -3,17 +3,17 @@ * Author: Kraken Team. */ +import 'dart:async'; +import 'dart:collection'; +import 'dart:ffi'; import 'dart:ui' as ui show Image; import 'package:flutter/rendering.dart'; import 'package:flutter/scheduler.dart'; -import 'package:kraken/dom.dart'; +import 'package:kraken/bridge.dart'; import 'package:kraken/css.dart'; +import 'package:kraken/dom.dart'; import 'package:kraken/rendering.dart'; -import 'package:kraken/bridge.dart'; -import 'dart:async'; -import 'dart:ffi'; -import 'dart:collection'; const String IMAGE = 'IMG'; @@ -96,7 +96,7 @@ class ImageElement extends Element { isIntrinsicBox: true, tagName: IMAGE, defaultStyle: _defaultStyle) { - _renderStreamListener = ImageStreamListener(_renderImageStream, onChunk: _onImageChunk, onError: _onImageError); + _renderStreamListener = ImageStreamListener(_renderImageStream, onError: _onImageError); _nativeMap[nativeImgElement.address] = this; nativeImgElement.ref.getImageWidth = nativeGetImageWidth; @@ -236,22 +236,6 @@ class ImageElement extends Element { } } - void _initImageInfo(ImageInfo imageInfo, bool synchronousCall) { - // - // - // if (synchronousCall) { - // // `synchronousCall` happens when caches image and calling `addListener`. - // scheduleMicrotask(_handleEventAfterImageLoaded); - // } else { - // _handleEventAfterImageLoaded(); - // } - // - // // Only trigger `initImageListener` once. - // if (_initImageListener != null) { - // _imageStream?.removeListener(_initImageListener!); - // } - } - // Multi frame image should convert to repaint boundary. @override bool get shouldConvertToRepaintBoundary => _frameCount > 2 || super.shouldConvertToRepaintBoundary; @@ -260,6 +244,18 @@ class ImageElement extends Element { _frameCount++; _imageInfo = imageInfo; + // Only trigger load once. + if (!_loaded) { + _loaded = true; + + if (synchronousCall) { + // `synchronousCall` happens when caches image and calling `addListener`. + scheduleMicrotask(_handleEventAfterImageLoaded); + } else { + _handleEventAfterImageLoaded(); + } + } + // @HACK Flutter image cache will cause image steam listener to trigger twice when page reload // so use two frames to tell multi frame image from static image, note this optimization will fail // at multi frame image with only two frames which is not common. @@ -276,15 +272,9 @@ class ImageElement extends Element { // Mark if the same src loaded. bool _loaded = false; - void _onImageChunk(ImageChunkEvent imageChunkEvent) { - if (!_loaded && imageChunkEvent.cumulativeBytesLoaded == imageChunkEvent.expectedTotalBytes) { - _handleEventAfterImageLoaded(); - _loaded = true; - } - } - void _onImageError(Object exception, StackTrace? stackTrace) { // @TODO: Native side support error event. + // https://github.com/openkraken/kraken/issues/686 // dispatchEvent(Event(EVENT_ERROR)); } From 411a30427b150be9ad32bc0dd7d3023072823862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Wed, 15 Sep 2021 20:56:18 +0800 Subject: [PATCH 06/15] :bug: fix: test cases. --- kraken/lib/src/dom/elements/img.dart | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/kraken/lib/src/dom/elements/img.dart b/kraken/lib/src/dom/elements/img.dart index 1875825cc3..aa6dc46006 100644 --- a/kraken/lib/src/dom/elements/img.dart +++ b/kraken/lib/src/dom/elements/img.dart @@ -136,18 +136,22 @@ class ImageElement extends Element { super.didDetachRenderer(); style.removeStyleChangeListener(_stylePropertyChanged); - // Dispose image info. - _imageInfo?.dispose(); - _imageInfo = null; + _resetImage(); // Unlink image render box, which has been detached. _renderImage = null; + } + + void _resetImage() { + _imageInfo = null; // @NOTE: Evict image cache, make multi frame image can replay. // https://github.com/flutter/flutter/issues/51775 _imageProvider?.evict(); + _imageProvider = null; _removeStreamListener(); + _renderImage?.image = null; } @override @@ -208,12 +212,6 @@ class ImageElement extends Element { renderBoxModel!.removeIntersectionChangeListener(_handleIntersectionChange); } - void _removeImage() { - _removeStreamListener(); - _imageProvider = null; - _renderImage!.image = null; - } - void _constructImageChild() { _renderImage = createRenderImageBox(); @@ -363,7 +361,7 @@ class ImageElement extends Element { void removeProperty(String key) { super.removeProperty(key); if (key == 'src') { - _removeImage(); + _resetImage(); _loaded = false; } else if (key == 'loading' && _isInLazyLoading && _imageProvider == null) { _resetLazyLoading(); @@ -418,7 +416,9 @@ class ImageElement extends Element { } void _loadImage() { - if (_source != null && _imageStream == null) { + _resetImage(); + + if (_source != null) { _removeStreamListener(); Uri base = Uri.parse(elementManager.controller.href); From 56fbd7a15a35e620a181dfef20d6f90a5558db7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 11:23:31 +0800 Subject: [PATCH 07/15] :white_check_mark: test: consider image load cost. --- .../css/css-backgrounds/background-origin.ts | 6 ++--- .../specs/css/css-display/containing-block.ts | 14 +++++++---- .../specs/css/css-flexbox/flex_shrink.ts | 6 ++--- .../specs/css/css-flow/block-replaced.ts | 18 +++++++------- .../specs/css/css-flow/containing-block.ts | 4 ++-- .../specs/css/css-position/absolute-non.ts | 4 ++-- .../css/css-position/absolute-replaced.ts | 24 +++++++++---------- .../specs/css/css-position/abspos-001.ts | 2 +- .../css/css-position/position-relative.ts | 8 +++---- .../specs/css/css-position/position-sticky.ts | 2 +- .../specs/css/css-position/right-007.ts | 2 +- .../specs/css/css-position/right-019.ts | 2 +- .../specs/css/css-position/right-applies.ts | 4 ++-- .../specs/css/css-position/right-offset.ts | 4 ++-- .../specs/css/css-position/top-offset.ts | 2 +- 15 files changed, 53 insertions(+), 49 deletions(-) diff --git a/integration_tests/specs/css/css-backgrounds/background-origin.ts b/integration_tests/specs/css/css-backgrounds/background-origin.ts index 7fbe8cb082..3a9bcd34fd 100644 --- a/integration_tests/specs/css/css-backgrounds/background-origin.ts +++ b/integration_tests/specs/css/css-backgrounds/background-origin.ts @@ -47,7 +47,7 @@ describe('Background-origin', () => { ] ); append(BODY, div); - await snapshot(); + await snapshot(0.1); }); it('works with padding-box', async () => { @@ -73,7 +73,7 @@ describe('Background-origin', () => { ] ); append(BODY, div); - await snapshot(); + await snapshot(0.1); }); it('works with content-box', async () => { @@ -99,6 +99,6 @@ describe('Background-origin', () => { ] ); append(BODY, div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-display/containing-block.ts b/integration_tests/specs/css/css-display/containing-block.ts index ec0aafb31a..98bfa68939 100644 --- a/integration_tests/specs/css/css-display/containing-block.ts +++ b/integration_tests/specs/css/css-display/containing-block.ts @@ -231,7 +231,7 @@ describe('containing-block', () => { ); document.body.appendChild(p); - await snapshot(0.5); + await snapshot(0.1); }); it('007', async () => { let p; @@ -945,7 +945,7 @@ describe('containing-block', () => { ); document.body.appendChild(div); - await snapshot(0.5); + await snapshot(0.1); }); it('019', async () => { let p; @@ -1018,9 +1018,10 @@ describe('containing-block', () => { await snapshot(); }); - it('020-ref', async () => { + it('020-ref', async (done) => { let p; let div; + let img; p = createElement( 'p', { @@ -1051,7 +1052,7 @@ describe('containing-block', () => { }, }, [ - createElement('img', { + img = createElement('img', { src: 'assets/blue96x96.png', width: '96', height: '96', @@ -1063,7 +1064,10 @@ describe('containing-block', () => { document.body.appendChild(p); document.body.appendChild(div); - await snapshot(0.5); + img.onload = async () => { + await snapshot(); + done(); + } }); it('020', async () => { let p; diff --git a/integration_tests/specs/css/css-flexbox/flex_shrink.ts b/integration_tests/specs/css/css-flexbox/flex_shrink.ts index 88361b78a4..2f9187ce5f 100644 --- a/integration_tests/specs/css/css-flexbox/flex_shrink.ts +++ b/integration_tests/specs/css/css-flexbox/flex_shrink.ts @@ -181,7 +181,7 @@ describe('flexbox flex-shrink', () => { ); BODY.appendChild(constrainedFlex); - await snapshot(); + await snapshot(0.1); }); it('should work with intrinsic element with min-height', async () => { @@ -210,7 +210,7 @@ describe('flexbox flex-shrink', () => { ); BODY.appendChild(constrainedFlex); - await snapshot(); + await snapshot(0.1); }); it('should work with intrinsic element with width and no height', async () => { @@ -239,7 +239,7 @@ describe('flexbox flex-shrink', () => { ); BODY.appendChild(constrainedFlex); - await snapshot(); + await snapshot(0.1); }); it('should work with flex layout in the column direction with children and height is not larger than children height', async () => { diff --git a/integration_tests/specs/css/css-flow/block-replaced.ts b/integration_tests/specs/css/css-flow/block-replaced.ts index d85899ab7b..06a3eb90a5 100644 --- a/integration_tests/specs/css/css-flow/block-replaced.ts +++ b/integration_tests/specs/css/css-flow/block-replaced.ts @@ -39,7 +39,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(0.5); + await snapshot(0.1); }); it('height-001', async () => { let p; @@ -85,7 +85,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-002-ref', async () => { let p; @@ -140,7 +140,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(0.5); + await snapshot(0.1); }); xit('height-003', async () => { let p; @@ -202,7 +202,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-004-ref', async () => { let p; @@ -236,7 +236,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-004', async () => { let p; @@ -290,7 +290,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('height-005', async () => { let p; @@ -398,7 +398,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-001', async () => { let p; @@ -525,7 +525,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('width-002', async () => { let p; @@ -914,6 +914,6 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-flow/containing-block.ts b/integration_tests/specs/css/css-flow/containing-block.ts index dc9a7c5b92..032a66a0f8 100644 --- a/integration_tests/specs/css/css-flow/containing-block.ts +++ b/integration_tests/specs/css/css-flow/containing-block.ts @@ -945,7 +945,7 @@ describe('containing-block', () => { ); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('019', async () => { let p; @@ -1063,7 +1063,7 @@ describe('containing-block', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('020', async () => { let p; diff --git a/integration_tests/specs/css/css-position/absolute-non.ts b/integration_tests/specs/css/css-position/absolute-non.ts index fb6d0513df..cd7473d317 100644 --- a/integration_tests/specs/css/css-position/absolute-non.ts +++ b/integration_tests/specs/css/css-position/absolute-non.ts @@ -696,7 +696,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-height-008', async () => { let p; @@ -2332,7 +2332,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-width-003', async () => { let p; diff --git a/integration_tests/specs/css/css-position/absolute-replaced.ts b/integration_tests/specs/css/css-position/absolute-replaced.ts index 953cecee86..73465c2158 100644 --- a/integration_tests/specs/css/css-position/absolute-replaced.ts +++ b/integration_tests/specs/css/css-position/absolute-replaced.ts @@ -2455,7 +2455,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-001', async () => { let p; @@ -2511,7 +2511,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-002-ref', async () => { let p; @@ -2562,7 +2562,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-003-ref', async () => { let p; @@ -2613,7 +2613,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-003a-ref', async () => { let p; @@ -3279,7 +3279,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-022', async () => { let p; @@ -3340,7 +3340,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-023-ref', async () => { let p; @@ -3393,7 +3393,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-024-ref', async () => { let p; @@ -3446,7 +3446,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-025-ref', async () => { let p; @@ -3799,7 +3799,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-036', async () => { let p; @@ -3871,7 +3871,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-037-ref', async () => { let p; @@ -3932,7 +3932,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-039-ref', async () => { let p; @@ -4056,7 +4056,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('width-041', async () => { let p; diff --git a/integration_tests/specs/css/css-position/abspos-001.ts b/integration_tests/specs/css/css-position/abspos-001.ts index 94809fa9b7..d1b6da7fec 100644 --- a/integration_tests/specs/css/css-position/abspos-001.ts +++ b/integration_tests/specs/css/css-position/abspos-001.ts @@ -32,6 +32,6 @@ describe('abspos-001', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-position/position-relative.ts b/integration_tests/specs/css/css-position/position-relative.ts index 2f005a5917..3ce515edf8 100644 --- a/integration_tests/specs/css/css-position/position-relative.ts +++ b/integration_tests/specs/css/css-position/position-relative.ts @@ -30,7 +30,7 @@ describe('position-relative', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('001', async () => { let p; @@ -1031,7 +1031,7 @@ describe('position-relative', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); // Some position relation case not works right // restrict to flutter's renderiing pipe @@ -2270,7 +2270,7 @@ describe('position-relative', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('037', async () => { let p; @@ -2359,7 +2359,7 @@ describe('position-relative', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('038', async () => { let p; diff --git a/integration_tests/specs/css/css-position/position-sticky.ts b/integration_tests/specs/css/css-position/position-sticky.ts index 933b2b870f..b51e1a659e 100644 --- a/integration_tests/specs/css/css-position/position-sticky.ts +++ b/integration_tests/specs/css/css-position/position-sticky.ts @@ -274,7 +274,7 @@ describe('position-sticky', () => { scroller.scrollTop = 100; }); - await snapshot(); + await snapshot(0.1); }); it('flexbox-ref', async () => { let flexItem; diff --git a/integration_tests/specs/css/css-position/right-007.ts b/integration_tests/specs/css/css-position/right-007.ts index 86aa24c225..743a34d9cd 100644 --- a/integration_tests/specs/css/css-position/right-007.ts +++ b/integration_tests/specs/css/css-position/right-007.ts @@ -42,6 +42,6 @@ describe('right-007', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-position/right-019.ts b/integration_tests/specs/css/css-position/right-019.ts index 1755c93b56..bc98566e80 100644 --- a/integration_tests/specs/css/css-position/right-019.ts +++ b/integration_tests/specs/css/css-position/right-019.ts @@ -42,6 +42,6 @@ describe('right-019', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-position/right-applies.ts b/integration_tests/specs/css/css-position/right-applies.ts index bef11e911b..2ccce4c81f 100644 --- a/integration_tests/specs/css/css-position/right-applies.ts +++ b/integration_tests/specs/css/css-position/right-applies.ts @@ -36,7 +36,7 @@ describe('right-applies', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('to-008', async () => { let p; @@ -72,7 +72,7 @@ describe('right-applies', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('to-009', async () => { let p; diff --git a/integration_tests/specs/css/css-position/right-offset.ts b/integration_tests/specs/css/css-position/right-offset.ts index 1b9f1c5d72..4e2b1f6a98 100644 --- a/integration_tests/specs/css/css-position/right-offset.ts +++ b/integration_tests/specs/css/css-position/right-offset.ts @@ -82,7 +82,7 @@ describe('right-offset', () => { BODY.appendChild(p); BODY.appendChild(inlineBlock); - await snapshot(); + await snapshot(0.1); }); it('001', async () => { let p; @@ -344,7 +344,7 @@ describe('right-offset', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('percentage-001', async () => { let p; diff --git a/integration_tests/specs/css/css-position/top-offset.ts b/integration_tests/specs/css/css-position/top-offset.ts index a7250b867d..978811e49b 100644 --- a/integration_tests/specs/css/css-position/top-offset.ts +++ b/integration_tests/specs/css/css-position/top-offset.ts @@ -189,7 +189,7 @@ describe('top-offset', () => { BODY.appendChild(p); BODY.appendChild(inlineBlock); - await snapshot(); + await snapshot(0.1); }); it('003', async () => { let p; From 32ab037b28dc02fc6b5473f31c8d35525e7901df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 17:52:22 +0800 Subject: [PATCH 08/15] :white_check_mark: test: update test & using override dispatchEvent --- .../specs/css/css-flexbox/flex_shrink.ts | 2 +- .../specs/css/css-flow/containing-block.ts | 2 +- .../specs/css/css-position/absolute-non.ts | 4 ++-- .../specs/css/css-position/absolute-replaced.ts | 4 ++-- .../specs/css/css-position/abspos-025.ts | 2 +- .../specs/css/css-position/bottom-offset.ts | 2 +- .../specs/css/css-position/left-offset.ts | 2 +- .../specs/css/css-position/position-absolute.ts | 2 +- .../specs/css/css-position/position-relative.ts | 2 +- kraken/lib/src/dom/element.dart | 17 ++++++++++++++--- kraken/lib/src/dom/event_target.dart | 13 ++----------- 11 files changed, 27 insertions(+), 25 deletions(-) diff --git a/integration_tests/specs/css/css-flexbox/flex_shrink.ts b/integration_tests/specs/css/css-flexbox/flex_shrink.ts index 2f9187ce5f..7196c7644f 100644 --- a/integration_tests/specs/css/css-flexbox/flex_shrink.ts +++ b/integration_tests/specs/css/css-flexbox/flex_shrink.ts @@ -210,7 +210,7 @@ describe('flexbox flex-shrink', () => { ); BODY.appendChild(constrainedFlex); - await snapshot(0.1); + await snapshot(0.2); }); it('should work with intrinsic element with width and no height', async () => { diff --git a/integration_tests/specs/css/css-flow/containing-block.ts b/integration_tests/specs/css/css-flow/containing-block.ts index 032a66a0f8..90026c9e65 100644 --- a/integration_tests/specs/css/css-flow/containing-block.ts +++ b/integration_tests/specs/css/css-flow/containing-block.ts @@ -432,7 +432,7 @@ describe('containing-block', () => { ); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('009', async () => { let p; diff --git a/integration_tests/specs/css/css-position/absolute-non.ts b/integration_tests/specs/css/css-position/absolute-non.ts index cd7473d317..c84a116018 100644 --- a/integration_tests/specs/css/css-position/absolute-non.ts +++ b/integration_tests/specs/css/css-position/absolute-non.ts @@ -582,7 +582,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); await snapshot(); }); @@ -1592,7 +1592,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-max-height-007', async () => { let p; diff --git a/integration_tests/specs/css/css-position/absolute-replaced.ts b/integration_tests/specs/css/css-position/absolute-replaced.ts index 73465c2158..388647abed 100644 --- a/integration_tests/specs/css/css-position/absolute-replaced.ts +++ b/integration_tests/specs/css/css-position/absolute-replaced.ts @@ -2819,7 +2819,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('width-006', async () => { let p; @@ -3163,7 +3163,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('width-020', async () => { let p; diff --git a/integration_tests/specs/css/css-position/abspos-025.ts b/integration_tests/specs/css/css-position/abspos-025.ts index 009634810e..0ba750b77e 100644 --- a/integration_tests/specs/css/css-position/abspos-025.ts +++ b/integration_tests/specs/css/css-position/abspos-025.ts @@ -45,6 +45,6 @@ describe('abspos-025', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-position/bottom-offset.ts b/integration_tests/specs/css/css-position/bottom-offset.ts index deabfe1599..1565b0d1b8 100644 --- a/integration_tests/specs/css/css-position/bottom-offset.ts +++ b/integration_tests/specs/css/css-position/bottom-offset.ts @@ -82,7 +82,7 @@ describe('bottom-offset', () => { BODY.appendChild(p); BODY.appendChild(inlineBlock); - await snapshot(); + await snapshot(0.1); }); it('001', async () => { let p; diff --git a/integration_tests/specs/css/css-position/left-offset.ts b/integration_tests/specs/css/css-position/left-offset.ts index b4b58b62a3..b2205eddab 100644 --- a/integration_tests/specs/css/css-position/left-offset.ts +++ b/integration_tests/specs/css/css-position/left-offset.ts @@ -82,7 +82,7 @@ describe('left-offset', () => { BODY.appendChild(p); BODY.appendChild(inlineBlock); - await snapshot(); + await snapshot(0.1); }); it('001', async () => { let p; diff --git a/integration_tests/specs/css/css-position/position-absolute.ts b/integration_tests/specs/css/css-position/position-absolute.ts index f9934faabd..3bff88f492 100644 --- a/integration_tests/specs/css/css-position/position-absolute.ts +++ b/integration_tests/specs/css/css-position/position-absolute.ts @@ -276,7 +276,7 @@ describe('position-absolute', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('004', async () => { let p; diff --git a/integration_tests/specs/css/css-position/position-relative.ts b/integration_tests/specs/css/css-position/position-relative.ts index 3ce515edf8..9f5bc3eb23 100644 --- a/integration_tests/specs/css/css-position/position-relative.ts +++ b/integration_tests/specs/css/css-position/position-relative.ts @@ -892,7 +892,7 @@ describe('position-relative', () => { BODY.appendChild(div); BODY.appendChild(div_1); - await snapshot(); + await snapshot(0.1); }); it('014', async () => { let p; diff --git a/kraken/lib/src/dom/element.dart b/kraken/lib/src/dom/element.dart index 00d48238cf..bffcd04816 100644 --- a/kraken/lib/src/dom/element.dart +++ b/kraken/lib/src/dom/element.dart @@ -1388,7 +1388,7 @@ class Element extends Node bool isIntersectionObserverEvent = _isIntersectionObserverEvent(eventType); bool hasIntersectionObserverEvent = isIntersectionObserverEvent && _hasIntersectionObserverEvent(eventHandlers); - addEventListener(eventType, eventResponder); + addEventListener(eventType, _eventResponder); RenderBoxModel? selfRenderBoxModel = renderBoxModel; if (selfRenderBoxModel != null) { @@ -1403,7 +1403,7 @@ class Element extends Node void removeEvent(String eventType) { if (!eventHandlers.containsKey(eventType)) return; // Only listen once. - removeEventListener(eventType, eventResponder); + removeEventListener(eventType, _eventResponder); RenderBoxModel? selfRenderBoxModel = renderBoxModel; if (selfRenderBoxModel != null) { @@ -1417,7 +1417,18 @@ class Element extends Node } } - void eventResponder(Event event) { + @override + void dispatchEvent(Event event) { + super.dispatchEvent(event); + if (event.currentTarget != null) { + _eventResponder(event); + + // Dispatch listener for widget. + elementManager.eventClient?.eventListener(event); + } + } + + void _eventResponder(Event event) { emitUIEvent(elementManager.controller.view.contextId, nativeElementPtr.ref.nativeNode.ref.nativeEventTarget, event); } diff --git a/kraken/lib/src/dom/event_target.dart b/kraken/lib/src/dom/event_target.dart index 63bcb3cbe8..204a0c3912 100644 --- a/kraken/lib/src/dom/event_target.dart +++ b/kraken/lib/src/dom/event_target.dart @@ -45,17 +45,8 @@ class EventTarget { } void dispatchEvent(Event event) { - if(elementManager.controller.view.disposed) { - return; - } - event.currentTarget = event.target = this; - if (event.currentTarget != null && this is Element) { - (this as Element).eventResponder(event); - - // dispatch listener of widget. - if ((this as Element).elementManager.eventClient != null) { - (this as Element).elementManager.eventClient!.eventListener(event); - } + if (!elementManager.controller.view.disposed) { + event.currentTarget = event.target = this; } } From a39419abb187442b0818820a6880e7af0577836d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 18:14:53 +0800 Subject: [PATCH 09/15] :bug: test: update tests --- .../specs/css/css-flow/containing-block.ts | 2 +- .../css/css-position/absolute-replaced.ts | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/integration_tests/specs/css/css-flow/containing-block.ts b/integration_tests/specs/css/css-flow/containing-block.ts index 90026c9e65..7db5b1f4ea 100644 --- a/integration_tests/specs/css/css-flow/containing-block.ts +++ b/integration_tests/specs/css/css-flow/containing-block.ts @@ -231,7 +231,7 @@ describe('containing-block', () => { ); BODY.appendChild(p); - await snapshot(); + await snapshot(0.1); }); it('007', async () => { let p; diff --git a/integration_tests/specs/css/css-position/absolute-replaced.ts b/integration_tests/specs/css/css-position/absolute-replaced.ts index 388647abed..3dc72bcbbf 100644 --- a/integration_tests/specs/css/css-position/absolute-replaced.ts +++ b/integration_tests/specs/css/css-position/absolute-replaced.ts @@ -98,7 +98,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-002-ref', async () => { let p; @@ -279,7 +279,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-004-ref', async () => { let p; @@ -522,7 +522,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-007-ref', async () => { let p; @@ -715,7 +715,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-009', async () => { let p; @@ -774,7 +774,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('height-010-ref', async () => { let p; @@ -4346,7 +4346,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-055', async () => { let p; @@ -4491,7 +4491,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-062', async () => { let p; @@ -4564,7 +4564,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-064', async () => { let p; @@ -4636,7 +4636,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-069', async () => { let p; @@ -4709,7 +4709,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-071', async () => { let p; @@ -4781,7 +4781,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-076', async () => { let p; @@ -4854,6 +4854,6 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); }); From 55d89f5b1ae01ee4b0c80a4916f8c07b88856b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 19:11:31 +0800 Subject: [PATCH 10/15] :white_check_mark: test: update tests --- .../specs/css/css-flexbox/css-flexbox.ts | 2 +- .../css/css-position/absolute-replaced.ts | 56 +++++++++---------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/integration_tests/specs/css/css-flexbox/css-flexbox.ts b/integration_tests/specs/css/css-flexbox/css-flexbox.ts index 80e53d5e4f..5e4c0e094c 100644 --- a/integration_tests/specs/css/css-flexbox/css-flexbox.ts +++ b/integration_tests/specs/css/css-flexbox/css-flexbox.ts @@ -202,6 +202,6 @@ describe('css-flexbox', () => { BODY.appendChild(p); BODY.appendChild(flexbox); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-position/absolute-replaced.ts b/integration_tests/specs/css/css-position/absolute-replaced.ts index 3dc72bcbbf..70ea49d9e0 100644 --- a/integration_tests/specs/css/css-position/absolute-replaced.ts +++ b/integration_tests/specs/css/css-position/absolute-replaced.ts @@ -872,7 +872,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('height-011-ref', async () => { let p; @@ -907,7 +907,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('height-011', async () => { let p; @@ -970,7 +970,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('height-012-ref', async () => { let p; @@ -1128,7 +1128,7 @@ describe('absolute-replaced', () => { BODY.appendChild(div); BODY.appendChild(div_1); - await snapshot(); + await snapshot(0.1); }); it('height-014-ref', async () => { let p; @@ -1284,7 +1284,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-017', async () => { let p; @@ -1343,7 +1343,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-018', async () => { let p; @@ -1593,7 +1593,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-023', async () => { let p; @@ -1654,7 +1654,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-024', async () => { let p; @@ -1715,7 +1715,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-025', async () => { let p; @@ -1971,7 +1971,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-030', async () => { let p; @@ -2032,7 +2032,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-031', async () => { let p; @@ -2093,7 +2093,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('height-032', async () => { let p; @@ -2408,7 +2408,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(container); - await snapshot(); + await snapshot(0.1); }); it('width-001-ref', async () => { let p; @@ -2768,7 +2768,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-006-ref', async () => { let p; @@ -2877,7 +2877,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-008', async () => { let p; @@ -2936,7 +2936,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-013', async () => { let p; @@ -2997,7 +2997,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-015-ref', async () => { let p; @@ -3048,7 +3048,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('width-015', async () => { let p; @@ -3108,7 +3108,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-020-ref', async () => { let p; @@ -3224,7 +3224,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-022-ref', async () => { let p; @@ -3501,7 +3501,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-027-ref', async () => { let p; @@ -3554,7 +3554,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('width-027', async () => { let p; @@ -3616,7 +3616,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-029', async () => { let p; @@ -3995,7 +3995,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('width-041-ref', async () => { let p; @@ -4129,7 +4129,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-043', async () => { let p; @@ -4201,7 +4201,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-048', async () => { let p; @@ -4274,7 +4274,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-050', async () => { let p; @@ -4419,7 +4419,7 @@ describe('absolute-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); xit('width-057', async () => { let p; From 86b04832b71f671e621068b150b2f11bd4cd92ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 19:23:57 +0800 Subject: [PATCH 11/15] :pencil2: fix: test cases --- integration_tests/specs/css/css-position/right-031.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/specs/css/css-position/right-031.ts b/integration_tests/specs/css/css-position/right-031.ts index d3ef25725c..d6f1af4d7f 100644 --- a/integration_tests/specs/css/css-position/right-031.ts +++ b/integration_tests/specs/css/css-position/right-031.ts @@ -42,6 +42,6 @@ describe('right-031', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); From 69cc552308dc32f1e6c04c61355ad3512179c211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 19:46:42 +0800 Subject: [PATCH 12/15] :white_check_mark: test: update tests --- .../specs/css/css-flow/block-replaced.ts | 2 +- .../specs/css/css-position/absolute-non.ts | 24 +++++++++---------- .../specs/css/css-position/right-103.ts | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/integration_tests/specs/css/css-flow/block-replaced.ts b/integration_tests/specs/css/css-flow/block-replaced.ts index 06a3eb90a5..3e7a1608a4 100644 --- a/integration_tests/specs/css/css-flow/block-replaced.ts +++ b/integration_tests/specs/css/css-flow/block-replaced.ts @@ -460,7 +460,7 @@ describe('block-replaced', () => { BODY.appendChild(p); BODY.appendChild(div1); - await snapshot(); + await snapshot(0.1); }); it('width-002-ref', async () => { let p; diff --git a/integration_tests/specs/css/css-position/absolute-non.ts b/integration_tests/specs/css/css-position/absolute-non.ts index c84a116018..cc74c2dd07 100644 --- a/integration_tests/specs/css/css-position/absolute-non.ts +++ b/integration_tests/specs/css/css-position/absolute-non.ts @@ -102,7 +102,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-height-002', async () => { let p; @@ -233,7 +233,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-height-003', async () => { let p; @@ -461,7 +461,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-height-006', async () => { let p; @@ -796,7 +796,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-height-009', async () => { let p; @@ -1188,7 +1188,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-max-height-002', async () => { let p; @@ -1297,7 +1297,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-max-height-003', async () => { let p; @@ -1716,7 +1716,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-max-height-008', async () => { let p; @@ -1823,7 +1823,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-max-height-009', async () => { let p; @@ -2204,7 +2204,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-width-002', async () => { let p; @@ -2760,7 +2760,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); xit('replaced-width-008', async () => { let p; @@ -3337,7 +3337,7 @@ describe('absolute-non', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('replaced-width-015', async () => { let p; @@ -4338,6 +4338,6 @@ describe('absolute-non', () => { BODY.appendChild(p_1); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/css/css-position/right-103.ts b/integration_tests/specs/css/css-position/right-103.ts index c0b07b25d7..df137f6f36 100644 --- a/integration_tests/specs/css/css-position/right-103.ts +++ b/integration_tests/specs/css/css-position/right-103.ts @@ -42,6 +42,6 @@ describe('right-103', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); From a73ca36cfbb1d6c7ac1224bcac7d638527e0133f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 19:53:56 +0800 Subject: [PATCH 13/15] :recycle: chore: rename shuck-off to remove --- kraken/lib/src/css/background.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kraken/lib/src/css/background.dart b/kraken/lib/src/css/background.dart index c9b7a1789c..403d2b4623 100644 --- a/kraken/lib/src/css/background.dart +++ b/kraken/lib/src/css/background.dart @@ -97,7 +97,7 @@ class CSSBackground { } // Method may contain quotation mark, like ['"assets/foo.png"'] - url = _shuckOffQuotationMark(url); + url = _removeQuotationMark(url); ImageRepeat imageRepeat = ImageRepeat.repeat; if (style![BACKGROUND_REPEAT].isNotEmpty) { @@ -412,7 +412,7 @@ class CSSBackground { const String _singleQuote = '\''; const String _doubleQuote = '"'; -String _shuckOffQuotationMark(String input) { +String _removeQuotationMark(String input) { if ((input.startsWith(_singleQuote) && input.endsWith(_singleQuote)) || (input.startsWith(_doubleQuote) && input.endsWith(_doubleQuote))) { input = input.substring(1, input.length - 1); From 08371ff5a552985d4681e1e97f1224303e8ff9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 20:06:35 +0800 Subject: [PATCH 14/15] :white_check_mark: test: update tests --- integration_tests/specs/css/css-position/right-004.ts | 2 +- integration_tests/specs/dom/elements/img.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integration_tests/specs/css/css-position/right-004.ts b/integration_tests/specs/css/css-position/right-004.ts index 66cd858228..0ca70360e9 100644 --- a/integration_tests/specs/css/css-position/right-004.ts +++ b/integration_tests/specs/css/css-position/right-004.ts @@ -49,6 +49,6 @@ describe('right-004', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); }); diff --git a/integration_tests/specs/dom/elements/img.ts b/integration_tests/specs/dom/elements/img.ts index 48af0cf630..c78f2bedeb 100644 --- a/integration_tests/specs/dom/elements/img.ts +++ b/integration_tests/specs/dom/elements/img.ts @@ -289,8 +289,7 @@ describe('Tags img', () => { it('gif can replay', async (done) => { const imageURL = 'assets/sample-gif-40k.gif'; const img = document.createElement('img'); - img.src = imageURL; - + img.onload = async () => { await snapshot(img); document.body.removeChild(img); @@ -308,5 +307,6 @@ describe('Tags img', () => { }; document.body.appendChild(img); + img.src = imageURL; }); }); From 908be58bf586aeef119760f522937bb7e6c8a153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=93=E5=87=8C?= Date: Thu, 16 Sep 2021 20:26:25 +0800 Subject: [PATCH 15/15] :white_check_mark: test: update test --- integration_tests/specs/css/css-position/position-relative.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/specs/css/css-position/position-relative.ts b/integration_tests/specs/css/css-position/position-relative.ts index 9f5bc3eb23..75e2416124 100644 --- a/integration_tests/specs/css/css-position/position-relative.ts +++ b/integration_tests/specs/css/css-position/position-relative.ts @@ -439,7 +439,7 @@ describe('position-relative', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); + await snapshot(0.1); }); it('005', async () => { let p;