diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 308c5ccbf9..b68574fc01 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,7 +5,7 @@ * [Flutter](https://flutter.dev/docs/get-started/install) version in the `kraken/pubspec.yaml` * [CMake](https://cmake.org/) v3.10.0 or later * [Xcode](https://developer.apple.com/xcode/) (10.12) or later (Running on macOS or iOS) - * [Android NDK](https://developer.android.com/studio/projects/install-ndk) version `21.4.7075529` (Running on Android) + * [Android NDK](https://developer.android.com/studio/projects/install-ndk) version `23.2.8568313` (Running on Android) 1. Install diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index dc61ad5541..0000000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Sample Page Benchmark - -on: - push: - branches: [main] - workflow_dispatch: - -env: - nodeVersion: "16" - cmakeVersion: "3.22.x" - flutterVersion: "2.8.1" - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - benchmark: - runs-on: [self-hosted, benchmark] - timeout-minutes: 30 - steps: - - uses: actions/checkout@v2 - - uses: subosito/flutter-action@v2 - with: - flutter-version: ${{ env.flutterVersion }} - - run: flutter doctor -v - - name: Run Benchmark - run: npm run benchmark - id: benchmark diff --git a/.github/workflows/bridge_compile_test.yml b/.github/workflows/bridge_compile_test.yml deleted file mode 100644 index 617d5d0dad..0000000000 --- a/.github/workflows/bridge_compile_test.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Bridge Compile Test - -on: - push: - paths: - - 'bridge/**' -jobs: - build_for_android: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: nttld/setup-ndk@v1 - id: setup-ndk - with: - ndk-version: r21e - - name: npm install - run: npm install - - name: compile for android - run: npm run build:bridge:android:release - env: - ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} - - build_for_ios: - runs-on: macos-latest - steps: - - uses: actions/checkout@v2 - - uses: nttld/setup-ndk@v1 - id: setup-ndk - with: - ndk-version: r21e - - name: npm install - run: npm install - - name: compile for ios - run: npm run build:bridge:ios:release - - build_for_macos: - runs-on: macos-latest - steps: - - uses: actions/checkout@v2 - - uses: nttld/setup-ndk@v1 - id: setup-ndk - with: - ndk-version: r21e - - name: npm install - run: npm install - - name: compile for macos - run: npm run build:bridge:macos:release diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 6d89c28612..c560266a11 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -20,8 +20,8 @@ jobs: - name: Deploy uses: taixw2/deploy-aliyun-oss@main with: - access-key-id: ${{ secrets.OSS_AK }} - access-key-secret: ${{ secrets.OSS_SK }} - bucket: kraken - region: oss-cn-hangzhou + access-key-id: ${{ secrets.ALIYUN_OSS_AK }} + access-key-secret: ${{ secrets.ALIYUN_OSS_SK }} + bucket: andycall + region: oss-cn-beijing entry: CONTRIBUTORS.svg diff --git a/.github/workflows/integration_test_flutter.yml b/.github/workflows/integration_test_flutter.yml index cfffcee22c..c9cc6def3e 100644 --- a/.github/workflows/integration_test_flutter.yml +++ b/.github/workflows/integration_test_flutter.yml @@ -9,21 +9,90 @@ env: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: + setup: + runs-on: macos-latest + outputs: + matrix: ${{ steps.matrix.outputs.value }} + steps: + - uses: actions/checkout@v2 + - id: matrix + run: | + JSON=$(node -e "console.log(JSON.stringify(require('./integration_tests/spec_group.json').map(j=>j.name)))") + echo "::set-output name=value::$(echo $JSON)" + build_bridge: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ env.nodeVersion }} + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} + - run: npm i + - run: ENABLE_ASAN=true npm run build:bridge:macos + - uses: actions/upload-artifact@v2 + with: + name: macos_bridge_binary + path: bridge/build/macos/ integration_test: - runs-on: [self-hosted] + runs-on: macos-latest + needs: [ setup, build_bridge ] + strategy: + fail-fast: false + matrix: + value: ${{fromJson(needs.setup.outputs.matrix)}} steps: - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ env.nodeVersion }} - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.flutterVersion }} + - run: flutter config --enable-macos-desktop + - run: flutter doctor -v + - uses: actions/download-artifact@v2 + with: + name: macos_bridge_binary + path: bridge/build/macos/ + - run: cd integration_tests && npm i - name: Run Test - run: npm test + run: cd integration_tests && SPEC_SCOPE="${{ matrix.value }}" npm run integration id: test continue-on-error: true - - name: Upload Snapshots - run: node scripts/upload_snapshots.js + - uses: actions/upload-artifact@v2 + with: + name: integration_${{ matrix.value }}_snapshots + path: integration_tests/snapshots + - name: Check on failures + if: steps.test.outcome != 'success' + run: exit 1 + plugin_test: + runs-on: macos-latest + needs: [ build_bridge ] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ env.nodeVersion }} + - uses: actions/download-artifact@v2 + with: + name: macos_bridge_binary + path: bridge/build/macos/ + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.flutterVersion }} + - run: flutter config --enable-macos-desktop + - run: flutter doctor -v + - name: Run Plugin Test + run: cd integration_tests && npm run plugin_test + id: test continue-on-error: true + - uses: actions/upload-artifact@v2 + with: + name: plugin_snapshots + path: integration_tests/snapshots/plugins - name: Check on failures if: steps.test.outcome != 'success' run: exit 1 - diff --git a/.github/workflows/plugin_test_flutter.yml b/.github/workflows/plugin_test_flutter.yml deleted file mode 100644 index 7720959284..0000000000 --- a/.github/workflows/plugin_test_flutter.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Plugin Test - -on: [workflow_dispatch, pull_request] - -env: - nodeVersion: "16" - cmakeVersion: "3.22.x" - flutterVersion: "2.8.1" - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - plugin_test: - runs-on: [self-hosted] - steps: - - uses: actions/checkout@v2 - - uses: subosito/flutter-action@v2 - with: - flutter-version: ${{ env.flutterVersion }} - - name: Run Plugin Test - run: npm run pretest && npm run plugin_test - id: test - continue-on-error: true - - name: Upload Snapshots - run: node scripts/upload_snapshots.js - continue-on-error: true - - name: Check on failures - if: steps.test.outcome != 'success' - run: exit 1 diff --git a/.github/workflows/publish_to_dart_dev.yml b/.github/workflows/publish_to_dart_dev.yml index 41d1428d1e..7eb84e3ecd 100644 --- a/.github/workflows/publish_to_dart_dev.yml +++ b/.github/workflows/publish_to_dart_dev.yml @@ -29,19 +29,102 @@ jobs: with: name: linux_binary path: bridge/build/linux/ - - publishToPubDev: - needs: build_linux_binary - runs-on: [self-hosted, flutter_2.2.0] + build_macos_binary: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} + - name: NPM INSTALL + run: npm install + - name: Build bridge binary + run: npm run build:bridge:macos:release + - uses: actions/upload-artifact@v2 + with: + name: macos_binary + path: bridge/build/macos/ + build_ios_binary: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} + - name: NPM INSTALL + run: npm install + - name: Build bridge binary + run: npm run build:bridge:ios:release + - uses: actions/upload-artifact@v2 + with: + name: ios_binary + path: bridge/build/ios/ + build_android_binary: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + - uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r23c + env: + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} - name: NPM INSTALL run: npm install - name: Build bridge binary - run: npm run build:bridge:all:release + run: npm run build:bridge:android:release + - uses: actions/upload-artifact@v2 + with: + name: android_binary + path: bridge/build/android/ + publish: + needs: [build_linux_binary, build_android_binary, build_ios_binary, build_macos_binary] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.flutterVersion }} + - name: NPM INSTALL + run: npm install + - name: Set up nightly version + run: node scripts/set_up_nightly_release.js - uses: actions/download-artifact@v2 with: name: linux_binary path: bridge/build/linux/ - - name: Publish to dart.dev - run: cd kraken && flutter pub publish --force + - uses: actions/download-artifact@v2 + with: + name: ios_binary + path: bridge/build/ios/ + - uses: actions/download-artifact@v2 + with: + name: macos_binary + path: bridge/build/macos/ + - uses: actions/download-artifact@v2 + with: + name: android_binary + path: bridge/build/android/ + - name: Prepare distribute binaries + run: node scripts/pre_publish_kraken.js + - name: Publish + uses: k-paxian/dart-package-publisher@master + with: + credentialJson: ${{ secrets.CREDENTIAL_JSON }} + force: true + flutter: true + skipTests: true + relativePath: ./kraken + diff --git a/.github/workflows/publish_to_dart_dev_nightly.yml b/.github/workflows/publish_to_dart_dev_nightly.yml index c7475a61c1..11ad4d90eb 100644 --- a/.github/workflows/publish_to_dart_dev_nightly.yml +++ b/.github/workflows/publish_to_dart_dev_nightly.yml @@ -4,7 +4,7 @@ on: schedule: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule # Run workflow every day at 21:00 - - cron: '0 21 * * *' + - cron: '0 0 * * 0' workflow_dispatch: env: @@ -31,21 +31,101 @@ jobs: with: name: linux_binary path: bridge/build/linux/ - - publishToPubDev: - needs: build_linux_binary - runs-on: [self-hosted, flutter_2.2.0] + build_macos_binary: + runs-on: macos-latest steps: - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} + - name: NPM INSTALL + run: npm install + - name: Build bridge binary + run: npm run build:bridge:macos:release + - uses: actions/upload-artifact@v2 + with: + name: macos_binary + path: bridge/build/macos/ + build_ios_binary: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} + - name: NPM INSTALL + run: npm install + - name: Build bridge binary + run: npm run build:bridge:ios:release + - uses: actions/upload-artifact@v2 + with: + name: ios_binary + path: bridge/build/ios/ + build_android_binary: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + - uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r23c + env: + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} + - uses: jwlawson/actions-setup-cmake@v1.11 + with: + cmake-version: ${{ env.cmakeVersion }} + - name: NPM INSTALL + run: npm install + - name: Build bridge binary + run: npm run build:bridge:android:release + - uses: actions/upload-artifact@v2 + with: + name: android_binary + path: bridge/build/android/ + publish: + needs: [build_linux_binary, build_android_binary, build_ios_binary, build_macos_binary] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.flutterVersion }} - name: NPM INSTALL run: npm install - name: Set up nightly version run: node scripts/set_up_nightly_release.js - - name: Build bridge binary - run: npm run build:bridge:all:release - uses: actions/download-artifact@v2 with: name: linux_binary path: bridge/build/linux/ - - name: Publish to dart.dev - run: cd kraken && flutter pub publish --force + - uses: actions/download-artifact@v2 + with: + name: ios_binary + path: bridge/build/ios/ + - uses: actions/download-artifact@v2 + with: + name: macos_binary + path: bridge/build/macos/ + - uses: actions/download-artifact@v2 + with: + name: android_binary + path: bridge/build/android/ + - name: Prepare distribute binaries + run: node scripts/pre_publish_kraken.js + - name: Publish + uses: k-paxian/dart-package-publisher@master + with: + credentialJson: ${{ secrets.CREDENTIAL_JSON }} + force: true + flutter: true + skipTests: true + relativePath: ./kraken diff --git a/README.md b/README.md index f6db6c0637..b94381b3ee 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ ![kraken Post](https://user-images.githubusercontent.com/677114/101163298-6264ae80-366e-11eb-9151-f560d18c2ceb.png) +> ⭐️ If your project uses Flutter 3.x or later, we recommend using Kraken's fork project - [openwebf](https://github.com/openwebf/webf). +> +> ⭐️ 如果你的项目使用的 Flutter 3.x 以上版本,我们推荐使用 Kraken 的 fork 项目 —— [openwebf](https://github.com/openwebf/webf)。 + # [Kraken](https://openkraken.com/) [![pub package](https://img.shields.io/pub/v/kraken.svg)](https://pub.dev/packages/kraken) [![Integration Test WorkFlow](https://github.com/openkraken/kraken/actions/workflows/integration_test.yml/badge.svg?branch=main)](https://github.com/openkraken/kraken/actions/workflows/integration_test.yml) ## 💁 Have a try @@ -54,7 +58,7 @@ Read our [contributing guide](https://github.com/openkraken/kraken/blob/main/.gi Thank you to all the people who already contributed to Kraken! -![CONTRIBUTORS](https://kraken.oss-cn-hangzhou.aliyuncs.com/CONTRIBUTORS.svg) +![CONTRIBUTORS](https://andycall.oss-cn-beijing.aliyuncs.com/CONTRIBUTORS.svg) Copyright (c) 2019-present, The Kraken authors. diff --git a/bridge/CMakeLists.txt b/bridge/CMakeLists.txt index b261f5a4b3..e25b92ee62 100644 --- a/bridge/CMakeLists.txt +++ b/bridge/CMakeLists.txt @@ -160,6 +160,8 @@ if ($ENV{KRAKEN_JS_ENGINE} MATCHES "quickjs") ) list(APPEND QUICK_JS_SOURCE + ${CMAKE_CURRENT_SOURCE_DIR}/third_party/quickjs/libbf.c + ${CMAKE_CURRENT_SOURCE_DIR}/third_party/quickjs/libbf.h ${CMAKE_CURRENT_SOURCE_DIR}/third_party/quickjs/cutils.c ${CMAKE_CURRENT_SOURCE_DIR}/third_party/quickjs/cutils.h ${CMAKE_CURRENT_SOURCE_DIR}/third_party/quickjs/libregexp.c @@ -237,6 +239,7 @@ if ($ENV{KRAKEN_JS_ENGINE} MATCHES "quickjs") bindings/qjs/dom/document_fragment.h bindings/qjs/dom/style_declaration.cc bindings/qjs/dom/style_declaration.h + bindings/qjs/dom/css_property_list.h bindings/qjs/dom/elements/.gen/canvas_element.cc bindings/qjs/dom/elements/.gen/canvas_element.h bindings/qjs/dom/elements/image_element.cc diff --git a/bridge/bindings/qjs/dom/css_property_list.h b/bridge/bindings/qjs/dom/css_property_list.h new file mode 100644 index 0000000000..a4cf27faf3 --- /dev/null +++ b/bridge/bindings/qjs/dom/css_property_list.h @@ -0,0 +1,435 @@ +/* + * Copyright (C) 2021-present The Kraken authors. All rights reserved. + */ + +#ifndef KRAKENBRIDGE_BINDINGS_QJS_DOM_CSS_PROPERTY_LIST_H_ +#define KRAKENBRIDGE_BINDINGS_QJS_DOM_CSS_PROPERTY_LIST_H_ + +#include +#include + +namespace kraken { + +std::unordered_map cssPropertyList{{"accentColor", true}, + {"additiveSymbols", true}, + {"alignContent", true}, + {"alignItems", true}, + {"alignSelf", true}, + {"alignmentBaseline", true}, + {"all", true}, + {"animation", true}, + {"animationDelay", true}, + {"animationDirection", true}, + {"animationDuration", true}, + {"animationFillMode", true}, + {"animationIterationCount", true}, + {"animationName", true}, + {"animationPlayState", true}, + {"animationTimingFunction", true}, + {"appRegion", true}, + {"appearance", true}, + {"ascentOverride", true}, + {"aspectRatio", true}, + {"backdropFilter", true}, + {"backfaceVisibility", true}, + {"background", true}, + {"backgroundAttachment", true}, + {"backgroundBlendMode", true}, + {"backgroundClip", true}, + {"backgroundColor", true}, + {"backgroundImage", true}, + {"backgroundOrigin", true}, + {"backgroundPosition", true}, + {"backgroundPositionX", true}, + {"backgroundPositionY", true}, + {"backgroundRepeat", true}, + {"backgroundRepeatX", true}, + {"backgroundRepeatY", true}, + {"backgroundSize", true}, + {"baselineShift", true}, + {"blockSize", true}, + {"border", true}, + {"borderBlock", true}, + {"borderBlockColor", true}, + {"borderBlockEnd", true}, + {"borderBlockEndColor", true}, + {"borderBlockEndStyle", true}, + {"borderBlockEndWidth", true}, + {"borderBlockStart", true}, + {"borderBlockStartColor", true}, + {"borderBlockStartStyle", true}, + {"borderBlockStartWidth", true}, + {"borderBlockStyle", true}, + {"borderBlockWidth", true}, + {"borderBottom", true}, + {"borderBottomColor", true}, + {"borderBottomLeftRadius", true}, + {"borderBottomRightRadius", true}, + {"borderBottomStyle", true}, + {"borderBottomWidth", true}, + {"borderCollapse", true}, + {"borderColor", true}, + {"borderEndEndRadius", true}, + {"borderEndStartRadius", true}, + {"borderImage", true}, + {"borderImageOutset", true}, + {"borderImageRepeat", true}, + {"borderImageSlice", true}, + {"borderImageSource", true}, + {"borderImageWidth", true}, + {"borderInline", true}, + {"borderInlineColor", true}, + {"borderInlineEnd", true}, + {"borderInlineEndColor", true}, + {"borderInlineEndStyle", true}, + {"borderInlineEndWidth", true}, + {"borderInlineStart", true}, + {"borderInlineStartColor", true}, + {"borderInlineStartStyle", true}, + {"borderInlineStartWidth", true}, + {"borderInlineStyle", true}, + {"borderInlineWidth", true}, + {"borderLeft", true}, + {"borderLeftColor", true}, + {"borderLeftStyle", true}, + {"borderLeftWidth", true}, + {"borderRadius", true}, + {"borderRight", true}, + {"borderRightColor", true}, + {"borderRightStyle", true}, + {"borderRightWidth", true}, + {"borderSpacing", true}, + {"borderStartEndRadius", true}, + {"borderStartStartRadius", true}, + {"borderStyle", true}, + {"borderTop", true}, + {"borderTopColor", true}, + {"borderTopLeftRadius", true}, + {"borderTopRightRadius", true}, + {"borderTopStyle", true}, + {"borderTopWidth", true}, + {"borderWidth", true}, + {"bottom", true}, + {"boxShadow", true}, + {"boxSizing", true}, + {"breakAfter", true}, + {"breakBefore", true}, + {"breakInside", true}, + {"bufferedRendering", true}, + {"captionSide", true}, + {"caretColor", true}, + {"clear", true}, + {"clip", true}, + {"clipPath", true}, + {"clipRule", true}, + {"color", true}, + {"colorInterpolation", true}, + {"colorInterpolationFilters", true}, + {"colorRendering", true}, + {"colorScheme", true}, + {"columnCount", true}, + {"columnFill", true}, + {"columnGap", true}, + {"columnRule", true}, + {"columnRuleColor", true}, + {"columnRuleStyle", true}, + {"columnRuleWidth", true}, + {"columnSpan", true}, + {"columnWidth", true}, + {"columns", true}, + {"content", true}, + {"contentVisibility", true}, + {"counterIncrement", true}, + {"counterReset", true}, + {"counterSet", true}, + {"cursor", true}, + {"cx", true}, + {"cy", true}, + {"d", true}, + {"descentOverride", true}, + {"direction", true}, + {"display", true}, + {"dominantBaseline", true}, + {"emptyCells", true}, + {"fallback", true}, + {"fill", true}, + {"fillOpacity", true}, + {"fillRule", true}, + {"filter", true}, + {"flex", true}, + {"flexBasis", true}, + {"flexDirection", true}, + {"flexFlow", true}, + {"flexGrow", true}, + {"flexShrink", true}, + {"flexWrap", true}, + {"float", true}, + {"floodColor", true}, + {"floodOpacity", true}, + {"font", true}, + {"fontDisplay", true}, + {"fontFamily", true}, + {"fontFeatureSettings", true}, + {"fontKerning", true}, + {"fontOpticalSizing", true}, + {"fontSize", true}, + {"fontStretch", true}, + {"fontStyle", true}, + {"fontSynthesis", true}, + {"fontSynthesisSmallCaps", true}, + {"fontSynthesisStyle", true}, + {"fontSynthesisWeight", true}, + {"fontVariant", true}, + {"fontVariantCaps", true}, + {"fontVariantEastAsian", true}, + {"fontVariantLigatures", true}, + {"fontVariantNumeric", true}, + {"fontVariationSettings", true}, + {"fontWeight", true}, + {"forcedColorAdjust", true}, + {"gap", true}, + {"grid", true}, + {"gridArea", true}, + {"gridAutoColumns", true}, + {"gridAutoFlow", true}, + {"gridAutoRows", true}, + {"gridColumn", true}, + {"gridColumnEnd", true}, + {"gridColumnGap", true}, + {"gridColumnStart", true}, + {"gridGap", true}, + {"gridRow", true}, + {"gridRowEnd", true}, + {"gridRowGap", true}, + {"gridRowStart", true}, + {"gridTemplate", true}, + {"gridTemplateAreas", true}, + {"gridTemplateColumns", true}, + {"gridTemplateRows", true}, + {"height", true}, + {"hyphens", true}, + {"imageOrientation", true}, + {"imageRendering", true}, + {"inherits", true}, + {"initialValue", true}, + {"inlineSize", true}, + {"inset", true}, + {"insetBlock", true}, + {"insetBlockEnd", true}, + {"insetBlockStart", true}, + {"insetInline", true}, + {"insetInlineEnd", true}, + {"insetInlineStart", true}, + {"isolation", true}, + {"justifyContent", true}, + {"justifyItems", true}, + {"justifySelf", true}, + {"left", true}, + {"letterSpacing", true}, + {"lightingColor", true}, + {"lineBreak", true}, + {"lineGapOverride", true}, + {"lineHeight", true}, + {"listStyle", true}, + {"listStyleImage", true}, + {"listStylePosition", true}, + {"listStyleType", true}, + {"margin", true}, + {"marginBlock", true}, + {"marginBlockEnd", true}, + {"marginBlockStart", true}, + {"marginBottom", true}, + {"marginInline", true}, + {"marginInlineEnd", true}, + {"marginInlineStart", true}, + {"marginLeft", true}, + {"marginRight", true}, + {"marginTop", true}, + {"marker", true}, + {"markerEnd", true}, + {"markerMid", true}, + {"markerStart", true}, + {"mask", true}, + {"maskType", true}, + {"maxBlockSize", true}, + {"maxHeight", true}, + {"maxInlineSize", true}, + {"maxWidth", true}, + {"maxZoom", true}, + {"minBlockSize", true}, + {"minHeight", true}, + {"minInlineSize", true}, + {"minWidth", true}, + {"minZoom", true}, + {"mixBlendMode", true}, + {"negative", true}, + {"objectFit", true}, + {"objectPosition", true}, + {"offset", true}, + {"offsetDistance", true}, + {"offsetPath", true}, + {"offsetRotate", true}, + {"opacity", true}, + {"order", true}, + {"orientation", true}, + {"orphans", true}, + {"outline", true}, + {"outlineColor", true}, + {"outlineOffset", true}, + {"outlineStyle", true}, + {"outlineWidth", true}, + {"overflow", true}, + {"overflowAnchor", true}, + {"overflowClipMargin", true}, + {"overflowWrap", true}, + {"overflowX", true}, + {"overflowY", true}, + {"overscrollBehavior", true}, + {"overscrollBehaviorBlock", true}, + {"overscrollBehaviorInline", true}, + {"overscrollBehaviorX", true}, + {"overscrollBehaviorY", true}, + {"pad", true}, + {"padding", true}, + {"paddingBlock", true}, + {"paddingBlockEnd", true}, + {"paddingBlockStart", true}, + {"paddingBottom", true}, + {"paddingInline", true}, + {"paddingInlineEnd", true}, + {"paddingInlineStart", true}, + {"paddingLeft", true}, + {"paddingRight", true}, + {"paddingTop", true}, + {"page", true}, + {"pageBreakAfter", true}, + {"pageBreakBefore", true}, + {"pageBreakInside", true}, + {"pageOrientation", true}, + {"paintOrder", true}, + {"perspective", true}, + {"perspectiveOrigin", true}, + {"placeContent", true}, + {"placeItems", true}, + {"placeSelf", true}, + {"pointerEvents", true}, + {"position", true}, + {"prefix", true}, + {"quotes", true}, + {"r", true}, + {"range", true}, + {"resize", true}, + {"right", true}, + {"rowGap", true}, + {"rubyPosition", true}, + {"rx", true}, + {"ry", true}, + {"scrollBehavior", true}, + {"scrollMargin", true}, + {"scrollMarginBlock", true}, + {"scrollMarginBlockEnd", true}, + {"scrollMarginBlockStart", true}, + {"scrollMarginBottom", true}, + {"scrollMarginInline", true}, + {"scrollMarginInlineEnd", true}, + {"scrollMarginInlineStart", true}, + {"scrollMarginLeft", true}, + {"scrollMarginRight", true}, + {"scrollMarginTop", true}, + {"scrollPadding", true}, + {"scrollPaddingBlock", true}, + {"scrollPaddingBlockEnd", true}, + {"scrollPaddingBlockStart", true}, + {"scrollPaddingBottom", true}, + {"scrollPaddingInline", true}, + {"scrollPaddingInlineEnd", true}, + {"scrollPaddingInlineStart", true}, + {"scrollPaddingLeft", true}, + {"scrollPaddingRight", true}, + {"scrollPaddingTop", true}, + {"scrollSnapAlign", true}, + {"scrollSnapStop", true}, + {"scrollSnapType", true}, + {"scrollbarGutter", true}, + {"shapeImageThreshold", true}, + {"shapeMargin", true}, + {"shapeOutside", true}, + {"shapeRendering", true}, + {"size", true}, + {"sizeAdjust", true}, + {"speak", true}, + {"speakAs", true}, + {"src", true}, + {"stopColor", true}, + {"stopOpacity", true}, + {"stroke", true}, + {"strokeDasharray", true}, + {"strokeDashoffset", true}, + {"strokeLinecap", true}, + {"strokeLinejoin", true}, + {"strokeMiterlimit", true}, + {"strokeOpacity", true}, + {"strokeWidth", true}, + {"suffix", true}, + {"symbols", true}, + {"syntax", true}, + {"system", true}, + {"tabSize", true}, + {"tableLayout", true}, + {"textAlign", true}, + {"textAlignLast", true}, + {"textAnchor", true}, + {"textCombineUpright", true}, + {"textDecoration", true}, + {"textDecorationColor", true}, + {"textDecorationLine", true}, + {"textDecorationSkipInk", true}, + {"textDecorationStyle", true}, + {"textDecorationThickness", true}, + {"textEmphasis", true}, + {"textEmphasisColor", true}, + {"textEmphasisPosition", true}, + {"textEmphasisStyle", true}, + {"textIndent", true}, + {"textOrientation", true}, + {"textOverflow", true}, + {"textRendering", true}, + {"textShadow", true}, + {"textSizeAdjust", true}, + {"textTransform", true}, + {"textUnderlineOffset", true}, + {"textUnderlinePosition", true}, + {"top", true}, + {"touchAction", true}, + {"transform", true}, + {"transformBox", true}, + {"transformOrigin", true}, + {"transformStyle", true}, + {"transition", true}, + {"transitionDelay", true}, + {"transitionDuration", true}, + {"transitionProperty", true}, + {"transitionTimingFunction", true}, + {"unicodeBidi", true}, + {"unicodeRange", true}, + {"userSelect", true}, + {"userZoom", true}, + {"vectorEffect", true}, + {"verticalAlign", true}, + {"visibility", true}, + {"whiteSpace", true}, + {"widows", true}, + {"width", true}, + {"willChange", true}, + {"wordBreak", true}, + {"wordSpacing", true}, + {"wordWrap", true}, + {"writingMode", true}, + {"x", true}, + {"y", true}, + {"zIndex", true}, + {"zoom", true}}; + +} // namespace kraken + +#endif // KRAKENBRIDGE_BINDINGS_QJS_DOM_CSS_PROPERTY_LIST_H_ diff --git a/bridge/bindings/qjs/dom/element_test.cc b/bridge/bindings/qjs/dom/element_test.cc index 6e5b848dc0..5a6040d6a2 100644 --- a/bridge/bindings/qjs/dom/element_test.cc +++ b/bridge/bindings/qjs/dom/element_test.cc @@ -73,6 +73,23 @@ TEST(Element, setAttributeWithHTML) { EXPECT_EQ(errorCalled, false); } +TEST(Element, style) { + bool static errorCalled = false; + bool static logCalled = false; + kraken::KrakenPage::consoleMessageHandler = [](void* ctx, const std::string& message, int logLevel) { + logCalled = true; + EXPECT_STREQ(message.c_str(), "true false"); + }; + auto bridge = TEST_init([](int32_t contextId, const char* errmsg) { + KRAKEN_LOG(VERBOSE) << errmsg; + errorCalled = true; + }); + auto context = bridge->getContext(); + const char* code = "console.log('borderTop' in document.body.style, 'borderXXX' in document.body.style)"; + bridge->evaluateScript(code, strlen(code), "vm://", 0); + EXPECT_EQ(errorCalled, false); +} + TEST(Element, instanceofNode) { bool static errorCalled = false; bool static logCalled = false; diff --git a/bridge/bindings/qjs/dom/style_declaration.cc b/bridge/bindings/qjs/dom/style_declaration.cc index 2b46dc3377..0a1c58377c 100644 --- a/bridge/bindings/qjs/dom/style_declaration.cc +++ b/bridge/bindings/qjs/dom/style_declaration.cc @@ -3,6 +3,7 @@ */ #include "style_declaration.h" +#include "bindings/qjs/dom/css_property_list.h" #include "event_target.h" #include "kraken_bridge.h" @@ -181,7 +182,13 @@ int StyleDeclarationInstance::hasProperty(JSContext* ctx, JSValue obj, JSAtom at auto* style = static_cast(JS_GetOpaque(obj, CSSStyleDeclaration::kCSSStyleDeclarationClassId)); const char* cname = JS_AtomToCString(ctx, atom); std::string name = std::string(cname); - bool match = style->properties.count(name) >= 0; + + if (cssPropertyList.count(name) > 0) { + JS_FreeCString(ctx, cname); + return true; + } + + bool match = style->properties.count(name) > 0; JS_FreeCString(ctx, cname); return match; } @@ -214,7 +221,7 @@ JSValue StyleDeclarationInstance::getProperty(JSContext* ctx, JSValue obj, JSAto } JSClassExoticMethods StyleDeclarationInstance::m_exoticMethods{ - nullptr, nullptr, nullptr, nullptr, nullptr, getProperty, setProperty, + nullptr, nullptr, nullptr, nullptr, hasProperty, getProperty, setProperty, }; void StyleDeclarationInstance::trace(JSRuntime* rt, JSValue val, JS_MarkFunc* mark_func) { diff --git a/bridge/polyfill/src/dom.ts b/bridge/polyfill/src/dom.ts index c64e6aa3c9..310f383153 100644 --- a/bridge/polyfill/src/dom.ts +++ b/bridge/polyfill/src/dom.ts @@ -17,3 +17,12 @@ class SVGElement extends Element { Object.defineProperty(window, 'SVGElement', { value: SVGElement }); + +// Polyfill for document.getElementsByName +// https://html.spec.whatwg.org/multipage/dom.html#dom-document-getelementsbyname +Object.defineProperty(Object.getPrototypeOf(document), 'getElementsByName', { + configurable: true, + enumerable: true, + writable: true, + value: (elementName: string) => document.querySelectorAll(`[name="${elementName}"]`), +}); diff --git a/integration_tests/assets/10frames-1s.gif b/integration_tests/assets/10frames-1s.gif new file mode 100644 index 0000000000..2a2f68aa38 Binary files /dev/null and b/integration_tests/assets/10frames-1s.gif differ diff --git a/integration_tests/assets/defineA.js b/integration_tests/assets/defineA.js index cef5151903..39cd6772a2 100644 --- a/integration_tests/assets/defineA.js +++ b/integration_tests/assets/defineA.js @@ -1,2 +1,2 @@ window.A = 'A'; -window.bundleALoadTime = Date.now(); +window.bundleALoadTime = performance.now(); diff --git a/integration_tests/assets/defineB.js b/integration_tests/assets/defineB.js index f794306e9a..f55f57f894 100644 --- a/integration_tests/assets/defineB.js +++ b/integration_tests/assets/defineB.js @@ -1,2 +1,2 @@ window.B = 'B'; -window.bundleBLoadTime = Date.now(); +window.bundleBLoadTime = performance.now(); diff --git a/integration_tests/assets/large-script.js b/integration_tests/assets/large-script.js new file mode 100644 index 0000000000..7e2926b07b --- /dev/null +++ b/integration_tests/assets/large-script.js @@ -0,0 +1,386 @@ +/* + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + * Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling Filling + */ +window.C = 'C'; +window.bundleCLoadTime = performance.now(); diff --git a/integration_tests/assets/sample-gif-138k.gif b/integration_tests/assets/sample-gif-138k.gif deleted file mode 100644 index 6133fe1e2e..0000000000 Binary files a/integration_tests/assets/sample-gif-138k.gif and /dev/null differ diff --git a/integration_tests/assets/sample-gif-40k.gif b/integration_tests/assets/sample-gif-40k.gif deleted file mode 100644 index d41b6a1579..0000000000 Binary files a/integration_tests/assets/sample-gif-40k.gif and /dev/null differ diff --git a/integration_tests/lib/bridge/match_snapshots.dart b/integration_tests/lib/bridge/match_snapshots.dart index 5c737e3812..04fc079d1e 100644 --- a/integration_tests/lib/bridge/match_snapshots.dart +++ b/integration_tests/lib/bridge/match_snapshots.dart @@ -94,12 +94,14 @@ bool matchImage(Uint8List imageA, List imageB, String filename) { diff /= height * width; - if (diff > 0) { + bool isMatch = (diff * 10e5) < 1; + + if (!isMatch) { final newSnap = File('$filename.diff.png'); newSnap.writeAsBytesSync(encodePng(diffImg)); } - return (diff * 10e5) < 300; // < 0.03% + return isMatch; // < 0.001% } bool matchFile(List left, List right) { diff --git a/integration_tests/runtime/global.ts b/integration_tests/runtime/global.ts index 6963550ece..4bf133ac79 100644 --- a/integration_tests/runtime/global.ts +++ b/integration_tests/runtime/global.ts @@ -12,6 +12,8 @@ */ // Should by getter because body will reset before each spec +declare const BODY: HTMLBodyElement + Object.defineProperty(global, 'BODY', { get() { return document.body; diff --git a/integration_tests/scripts/core_integration_starter.js b/integration_tests/scripts/core_integration_starter.js index ad408ba39b..4e1f028089 100644 --- a/integration_tests/scripts/core_integration_starter.js +++ b/integration_tests/scripts/core_integration_starter.js @@ -19,6 +19,8 @@ function startIntegrationTest() { env: { ...process.env, KRAKEN_ENABLE_TEST: 'true', + 'enable-software-rendering': true, + 'skia-deterministic-rendering': true, KRAKEN_TEST_DIR: path.join(__dirname, '../') }, cwd: process.cwd(), diff --git a/integration_tests/snapshots/css/css-align/baseline-rules.ts.6b461d0a1.png b/integration_tests/snapshots/css/css-align/baseline-rules.ts.6b461d0a1.png index cc7976f265..79e4c3b0d2 100644 Binary files a/integration_tests/snapshots/css/css-align/baseline-rules.ts.6b461d0a1.png and b/integration_tests/snapshots/css/css-align/baseline-rules.ts.6b461d0a1.png differ diff --git a/integration_tests/snapshots/css/css-align/text-align.ts.8cfeee3d2.png b/integration_tests/snapshots/css/css-align/text-align.ts.8cfeee3d2.png index 6bf4ec7b10..cac5de516f 100644 Binary files a/integration_tests/snapshots/css/css-align/text-align.ts.8cfeee3d2.png and b/integration_tests/snapshots/css/css-align/text-align.ts.8cfeee3d2.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-position.ts.9a91243b1.png b/integration_tests/snapshots/css/css-backgrounds/background-position.ts.9a91243b1.png index 5085a7c6d5..ebc1dc334d 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-position.ts.9a91243b1.png and b/integration_tests/snapshots/css/css-backgrounds/background-position.ts.9a91243b1.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-position.ts.b9d68cff1.png b/integration_tests/snapshots/css/css-backgrounds/background-position.ts.b9d68cff1.png index 8ff4c904fc..2cdc1e07f1 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-position.ts.b9d68cff1.png and b/integration_tests/snapshots/css/css-backgrounds/background-position.ts.b9d68cff1.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.0506c71e1.png b/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.0506c71e1.png index e61be99f21..19872657d2 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.0506c71e1.png and b/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.0506c71e1.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.319e54341.png b/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.319e54341.png index d030549585..74ac2a16ab 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.319e54341.png and b/integration_tests/snapshots/css/css-backgrounds/background-shorthand.ts.319e54341.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-size.ts.26c3528a1.png b/integration_tests/snapshots/css/css-backgrounds/background-size.ts.26c3528a1.png index b5f561db32..30fe04db6e 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-size.ts.26c3528a1.png and b/integration_tests/snapshots/css/css-backgrounds/background-size.ts.26c3528a1.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-size.ts.567e2d931.png b/integration_tests/snapshots/css/css-backgrounds/background-size.ts.567e2d931.png index 6703c48adf..c4fa696f2a 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-size.ts.567e2d931.png and b/integration_tests/snapshots/css/css-backgrounds/background-size.ts.567e2d931.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/background-size.ts.c21f24bb1.png b/integration_tests/snapshots/css/css-backgrounds/background-size.ts.c21f24bb1.png index d3ca3c3fa0..b07f57d23c 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/background-size.ts.c21f24bb1.png and b/integration_tests/snapshots/css/css-backgrounds/background-size.ts.c21f24bb1.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.81b273f11.png b/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.81b273f11.png index f06c009cf7..9512e74a9c 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.81b273f11.png and b/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.81b273f11.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.f402f9b71.png b/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.f402f9b71.png index 17478e99be..923448dc3d 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.f402f9b71.png and b/integration_tests/snapshots/css/css-backgrounds/border-radius.ts.f402f9b71.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.1b281f111.png b/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.1b281f111.png index 4eb824e48d..c46fec7421 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.1b281f111.png and b/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.1b281f111.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.5a95d2ab1.png b/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.5a95d2ab1.png index 3b55805168..7b8e36d953 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.5a95d2ab1.png and b/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.5a95d2ab1.png differ diff --git a/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.ae22b2d61.png b/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.ae22b2d61.png index 9e09003549..cb0d683803 100644 Binary files a/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.ae22b2d61.png and b/integration_tests/snapshots/css/css-backgrounds/linear-gradient.ts.ae22b2d61.png differ diff --git a/integration_tests/snapshots/css/css-borders/border-bottom.ts.224244f71.png b/integration_tests/snapshots/css/css-borders/border-bottom.ts.224244f71.png index 44ce77c142..fee7fd7378 100644 Binary files a/integration_tests/snapshots/css/css-borders/border-bottom.ts.224244f71.png and b/integration_tests/snapshots/css/css-borders/border-bottom.ts.224244f71.png differ diff --git a/integration_tests/snapshots/css/css-box/box-shadow.ts.50213b181.png b/integration_tests/snapshots/css/css-box/box-shadow.ts.50213b181.png index 01be640866..b832edea73 100644 Binary files a/integration_tests/snapshots/css/css-box/box-shadow.ts.50213b181.png and b/integration_tests/snapshots/css/css-box/box-shadow.ts.50213b181.png differ diff --git a/integration_tests/snapshots/css/css-box/box-shadow.ts.529d3d4b1.png b/integration_tests/snapshots/css/css-box/box-shadow.ts.529d3d4b1.png index 00dbe57afd..24fe82da91 100644 Binary files a/integration_tests/snapshots/css/css-box/box-shadow.ts.529d3d4b1.png and b/integration_tests/snapshots/css/css-box/box-shadow.ts.529d3d4b1.png differ diff --git a/integration_tests/snapshots/css/css-box/box-shadow.ts.8f9635b21.png b/integration_tests/snapshots/css/css-box/box-shadow.ts.8f9635b21.png index d73602a0a9..02df269d64 100644 Binary files a/integration_tests/snapshots/css/css-box/box-shadow.ts.8f9635b21.png and b/integration_tests/snapshots/css/css-box/box-shadow.ts.8f9635b21.png differ diff --git a/integration_tests/snapshots/css/css-box/box-shadow.ts.900322241.png b/integration_tests/snapshots/css/css-box/box-shadow.ts.900322241.png index 209b75869c..d095622c57 100644 Binary files a/integration_tests/snapshots/css/css-box/box-shadow.ts.900322241.png and b/integration_tests/snapshots/css/css-box/box-shadow.ts.900322241.png differ diff --git a/integration_tests/snapshots/css/css-box/box-shadow.ts.91d600351.png b/integration_tests/snapshots/css/css-box/box-shadow.ts.91d600351.png index 4a13a445d8..07b09f2c1b 100644 Binary files a/integration_tests/snapshots/css/css-box/box-shadow.ts.91d600351.png and b/integration_tests/snapshots/css/css-box/box-shadow.ts.91d600351.png differ diff --git a/integration_tests/snapshots/css/css-box/box-shadow.ts.ab9ebe811.png b/integration_tests/snapshots/css/css-box/box-shadow.ts.ab9ebe811.png index 595d963821..27f8e10d01 100644 Binary files a/integration_tests/snapshots/css/css-box/box-shadow.ts.ab9ebe811.png and b/integration_tests/snapshots/css/css-box/box-shadow.ts.ab9ebe811.png differ diff --git a/integration_tests/snapshots/css/css-box/horizontal-formatting.ts.0ca660af1.png b/integration_tests/snapshots/css/css-box/horizontal-formatting.ts.0ca660af1.png index 4f91313aec..f09172d495 100644 Binary files a/integration_tests/snapshots/css/css-box/horizontal-formatting.ts.0ca660af1.png and b/integration_tests/snapshots/css/css-box/horizontal-formatting.ts.0ca660af1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.06020d761.png b/integration_tests/snapshots/css/css-color/text.ts.06020d761.png index a19bf65b87..a437b33996 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.06020d761.png and b/integration_tests/snapshots/css/css-color/text.ts.06020d761.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.096412841.png b/integration_tests/snapshots/css/css-color/text.ts.096412841.png index 9ec64625c7..fd5ca83e2b 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.096412841.png and b/integration_tests/snapshots/css/css-color/text.ts.096412841.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.1f75ec201.png b/integration_tests/snapshots/css/css-color/text.ts.1f75ec201.png index 3ffcb6d72e..5d900b2e68 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.1f75ec201.png and b/integration_tests/snapshots/css/css-color/text.ts.1f75ec201.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.45f1ccac1.png b/integration_tests/snapshots/css/css-color/text.ts.45f1ccac1.png index b86cd0782e..e9e28212ae 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.45f1ccac1.png and b/integration_tests/snapshots/css/css-color/text.ts.45f1ccac1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.4d554e521.png b/integration_tests/snapshots/css/css-color/text.ts.4d554e521.png index d8d671b877..a7eb5dcce4 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.4d554e521.png and b/integration_tests/snapshots/css/css-color/text.ts.4d554e521.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.4fd11e261.png b/integration_tests/snapshots/css/css-color/text.ts.4fd11e261.png index 112d25c0a9..3ce78be4dd 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.4fd11e261.png and b/integration_tests/snapshots/css/css-color/text.ts.4fd11e261.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.5b89eaa01.png b/integration_tests/snapshots/css/css-color/text.ts.5b89eaa01.png index 0e0a7807f9..587d2a2641 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.5b89eaa01.png and b/integration_tests/snapshots/css/css-color/text.ts.5b89eaa01.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.940d416d1.png b/integration_tests/snapshots/css/css-color/text.ts.940d416d1.png index 109134550e..b0ddf853dd 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.940d416d1.png and b/integration_tests/snapshots/css/css-color/text.ts.940d416d1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.c51731ca1.png b/integration_tests/snapshots/css/css-color/text.ts.c51731ca1.png index 397a5863a9..9b5cb2764d 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.c51731ca1.png and b/integration_tests/snapshots/css/css-color/text.ts.c51731ca1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.ccb41dbf1.png b/integration_tests/snapshots/css/css-color/text.ts.ccb41dbf1.png index 7c473c26b2..f3ca545599 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.ccb41dbf1.png and b/integration_tests/snapshots/css/css-color/text.ts.ccb41dbf1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.d00210ee1.png b/integration_tests/snapshots/css/css-color/text.ts.d00210ee1.png index 781ec943df..061bc37cac 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.d00210ee1.png and b/integration_tests/snapshots/css/css-color/text.ts.d00210ee1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.e9cf302e1.png b/integration_tests/snapshots/css/css-color/text.ts.e9cf302e1.png index ff4dc56971..85f84aa03a 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.e9cf302e1.png and b/integration_tests/snapshots/css/css-color/text.ts.e9cf302e1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.f2d1f32e1.png b/integration_tests/snapshots/css/css-color/text.ts.f2d1f32e1.png index 2aa3e0bf5e..0077fa9daf 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.f2d1f32e1.png and b/integration_tests/snapshots/css/css-color/text.ts.f2d1f32e1.png differ diff --git a/integration_tests/snapshots/css/css-color/text.ts.f40a51571.png b/integration_tests/snapshots/css/css-color/text.ts.f40a51571.png index ddf4a9c084..1ad3cd17d0 100644 Binary files a/integration_tests/snapshots/css/css-color/text.ts.f40a51571.png and b/integration_tests/snapshots/css/css-color/text.ts.f40a51571.png differ diff --git a/integration_tests/snapshots/css/css-display/block-in.ts.39bde26f1.png b/integration_tests/snapshots/css/css-display/block-in.ts.39bde26f1.png index be9901688e..7eb64d85b1 100644 Binary files a/integration_tests/snapshots/css/css-display/block-in.ts.39bde26f1.png and b/integration_tests/snapshots/css/css-display/block-in.ts.39bde26f1.png differ diff --git a/integration_tests/snapshots/css/css-display/block-in.ts.520006241.png b/integration_tests/snapshots/css/css-display/block-in.ts.520006241.png index be9901688e..7eb64d85b1 100644 Binary files a/integration_tests/snapshots/css/css-display/block-in.ts.520006241.png and b/integration_tests/snapshots/css/css-display/block-in.ts.520006241.png differ diff --git a/integration_tests/snapshots/css/css-display/content-visibility.ts.2bc1ba531.png b/integration_tests/snapshots/css/css-display/content-visibility.ts.2bc1ba531.png new file mode 100644 index 0000000000..b6da92f04b Binary files /dev/null and b/integration_tests/snapshots/css/css-display/content-visibility.ts.2bc1ba531.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/align-items.ts.2d1a0d721.png b/integration_tests/snapshots/css/css-flexbox/align-items.ts.2d1a0d721.png index a882f487c4..206661e9f6 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/align-items.ts.2d1a0d721.png and b/integration_tests/snapshots/css/css-flexbox/align-items.ts.2d1a0d721.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/align-self.ts.fad1228c1.png b/integration_tests/snapshots/css/css-flexbox/align-self.ts.fad1228c1.png index 77da60515c..5b1ec5562b 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/align-self.ts.fad1228c1.png and b/integration_tests/snapshots/css/css-flexbox/align-self.ts.fad1228c1.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/dynamic-change.ts.ecef70d21.png b/integration_tests/snapshots/css/css-flexbox/dynamic-change.ts.ecef70d21.png index 07852310b2..ef8d77e04c 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/dynamic-change.ts.ecef70d21.png and b/integration_tests/snapshots/css/css-flexbox/dynamic-change.ts.ecef70d21.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex-align.ts.7a24ba2d1.png b/integration_tests/snapshots/css/css-flexbox/flex-align.ts.7a24ba2d1.png index 5403d20bf6..0ffe4ce04b 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex-align.ts.7a24ba2d1.png and b/integration_tests/snapshots/css/css-flexbox/flex-align.ts.7a24ba2d1.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex-align.ts.f66f88801.png b/integration_tests/snapshots/css/css-flexbox/flex-align.ts.f66f88801.png index f7118bde0c..a104cd7308 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex-align.ts.f66f88801.png and b/integration_tests/snapshots/css/css-flexbox/flex-align.ts.f66f88801.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex-minimum.ts.fce64c8b1.png b/integration_tests/snapshots/css/css-flexbox/flex-minimum.ts.fce64c8b1.png index 0693ab8f73..c8df14be6c 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex-minimum.ts.fce64c8b1.png and b/integration_tests/snapshots/css/css-flexbox/flex-minimum.ts.fce64c8b1.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex_basis.ts.9feaa3b01.png b/integration_tests/snapshots/css/css-flexbox/flex_basis.ts.9feaa3b01.png index d0b26fff60..5e25ab59e8 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex_basis.ts.9feaa3b01.png and b/integration_tests/snapshots/css/css-flexbox/flex_basis.ts.9feaa3b01.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex_grow.ts.c325dbf81.png b/integration_tests/snapshots/css/css-flexbox/flex_grow.ts.c325dbf81.png index bc1dc5ba48..bd977be5a2 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex_grow.ts.c325dbf81.png and b/integration_tests/snapshots/css/css-flexbox/flex_grow.ts.c325dbf81.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.20336cf81.png b/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.20336cf81.png index 214e01456a..2ef9e6ddc6 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.20336cf81.png and b/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.20336cf81.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.dbdb03df1.png b/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.dbdb03df1.png index 543fecccb6..fe5583360a 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.dbdb03df1.png and b/integration_tests/snapshots/css/css-flexbox/flex_shrink.ts.dbdb03df1.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.59289a8d1.png b/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.59289a8d1.png index 23180be83d..e527f5f7b9 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.59289a8d1.png and b/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.59289a8d1.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.6fff1fb91.png b/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.6fff1fb91.png index a2cda1d70b..cb0d7e0b0b 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.6fff1fb91.png and b/integration_tests/snapshots/css/css-flexbox/flexbox_flex-natural.ts.6fff1fb91.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/flexbox_flex.ts.45c47ad81.png b/integration_tests/snapshots/css/css-flexbox/flexbox_flex.ts.45c47ad81.png index d70ad1c625..67301c1b10 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/flexbox_flex.ts.45c47ad81.png and b/integration_tests/snapshots/css/css-flexbox/flexbox_flex.ts.45c47ad81.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/justify-content_space.ts.f986e23e1.png b/integration_tests/snapshots/css/css-flexbox/justify-content_space.ts.f986e23e1.png index d8c1aac86e..84c2399286 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/justify-content_space.ts.f986e23e1.png and b/integration_tests/snapshots/css/css-flexbox/justify-content_space.ts.f986e23e1.png differ diff --git a/integration_tests/snapshots/css/css-flexbox/multiline-reverse.ts.cf282b9a1.png b/integration_tests/snapshots/css/css-flexbox/multiline-reverse.ts.cf282b9a1.png index eb14eb05cf..709850c235 100644 Binary files a/integration_tests/snapshots/css/css-flexbox/multiline-reverse.ts.cf282b9a1.png and b/integration_tests/snapshots/css/css-flexbox/multiline-reverse.ts.cf282b9a1.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-in.ts.39bde26f1.png b/integration_tests/snapshots/css/css-flow/block-in.ts.39bde26f1.png index be9901688e..7eb64d85b1 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-in.ts.39bde26f1.png and b/integration_tests/snapshots/css/css-flow/block-in.ts.39bde26f1.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-in.ts.520006241.png b/integration_tests/snapshots/css/css-flow/block-in.ts.520006241.png index be9901688e..7eb64d85b1 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-in.ts.520006241.png and b/integration_tests/snapshots/css/css-flow/block-in.ts.520006241.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-non.ts.82e1bc981.png b/integration_tests/snapshots/css/css-flow/block-non.ts.82e1bc981.png index fc3846f10d..d4ed049243 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-non.ts.82e1bc981.png and b/integration_tests/snapshots/css/css-flow/block-non.ts.82e1bc981.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-non.ts.a8c2e12b1.png b/integration_tests/snapshots/css/css-flow/block-non.ts.a8c2e12b1.png index f6eec62534..f649f77ebe 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-non.ts.a8c2e12b1.png and b/integration_tests/snapshots/css/css-flow/block-non.ts.a8c2e12b1.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-non.ts.ffbc635b1.png b/integration_tests/snapshots/css/css-flow/block-non.ts.ffbc635b1.png index f6eec62534..f649f77ebe 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-non.ts.ffbc635b1.png and b/integration_tests/snapshots/css/css-flow/block-non.ts.ffbc635b1.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-replaced.ts.3799ae211.png b/integration_tests/snapshots/css/css-flow/block-replaced.ts.3799ae211.png index e326daca63..594992bdce 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-replaced.ts.3799ae211.png and b/integration_tests/snapshots/css/css-flow/block-replaced.ts.3799ae211.png differ diff --git a/integration_tests/snapshots/css/css-flow/block-replaced.ts.6a250f881.png b/integration_tests/snapshots/css/css-flow/block-replaced.ts.6a250f881.png index df4dfb5015..9b1f1d0d45 100644 Binary files a/integration_tests/snapshots/css/css-flow/block-replaced.ts.6a250f881.png and b/integration_tests/snapshots/css/css-flow/block-replaced.ts.6a250f881.png differ diff --git a/integration_tests/snapshots/css/css-flow/blocks-013.ts.e95845821.png b/integration_tests/snapshots/css/css-flow/blocks-013.ts.e95845821.png index 4290ae5062..aabcb85ce8 100644 Binary files a/integration_tests/snapshots/css/css-flow/blocks-013.ts.e95845821.png and b/integration_tests/snapshots/css/css-flow/blocks-013.ts.e95845821.png differ diff --git a/integration_tests/snapshots/css/css-flow/blocks.ts.24b616ae1.png b/integration_tests/snapshots/css/css-flow/blocks.ts.24b616ae1.png index ee97e081ce..d477aa5f22 100644 Binary files a/integration_tests/snapshots/css/css-flow/blocks.ts.24b616ae1.png and b/integration_tests/snapshots/css/css-flow/blocks.ts.24b616ae1.png differ diff --git a/integration_tests/snapshots/css/css-flow/blocks.ts.3b2912e01.png b/integration_tests/snapshots/css/css-flow/blocks.ts.3b2912e01.png index ee97e081ce..d477aa5f22 100644 Binary files a/integration_tests/snapshots/css/css-flow/blocks.ts.3b2912e01.png and b/integration_tests/snapshots/css/css-flow/blocks.ts.3b2912e01.png differ diff --git a/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed1.png b/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed1.png index 076fa861eb..42ce0b349e 100644 Binary files a/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed1.png and b/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed1.png differ diff --git a/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed2.png b/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed2.png index ba857000e5..61ee48e550 100644 Binary files a/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed2.png and b/integration_tests/snapshots/css/css-fonts/font-family.ts.6aa7abed2.png differ diff --git a/integration_tests/snapshots/css/css-fonts/font-size.ts.ad07fea11.png b/integration_tests/snapshots/css/css-fonts/font-size.ts.ad07fea11.png new file mode 100644 index 0000000000..35d5dfa75b Binary files /dev/null and b/integration_tests/snapshots/css/css-fonts/font-size.ts.ad07fea11.png differ diff --git a/integration_tests/snapshots/css/css-fonts/font-size.ts.e8ff22021.png b/integration_tests/snapshots/css/css-fonts/font-size.ts.e8ff22021.png new file mode 100644 index 0000000000..115d0e73ef Binary files /dev/null and b/integration_tests/snapshots/css/css-fonts/font-size.ts.e8ff22021.png differ diff --git a/integration_tests/snapshots/css/css-images/css-image.ts.c81ce1841.png b/integration_tests/snapshots/css/css-images/css-image.ts.c81ce1841.png index b15dbb3e76..aaee6f6335 100644 Binary files a/integration_tests/snapshots/css/css-images/css-image.ts.c81ce1841.png and b/integration_tests/snapshots/css/css-images/css-image.ts.c81ce1841.png differ diff --git a/integration_tests/snapshots/css/css-images/gradient-move.ts.dc3b91881.png b/integration_tests/snapshots/css/css-images/gradient-move.ts.dc3b91881.png index 7f2f7f61a2..d8e649d14d 100644 Binary files a/integration_tests/snapshots/css/css-images/gradient-move.ts.dc3b91881.png and b/integration_tests/snapshots/css/css-images/gradient-move.ts.dc3b91881.png differ diff --git a/integration_tests/snapshots/css/css-images/gradient-move.ts.f025c47a1.png b/integration_tests/snapshots/css/css-images/gradient-move.ts.f025c47a1.png index 898e1b20a8..d8e649d14d 100644 Binary files a/integration_tests/snapshots/css/css-images/gradient-move.ts.f025c47a1.png and b/integration_tests/snapshots/css/css-images/gradient-move.ts.f025c47a1.png differ diff --git a/integration_tests/snapshots/css/css-images/gradients-with.ts.01f5d79e1.png b/integration_tests/snapshots/css/css-images/gradients-with.ts.01f5d79e1.png index 874c9841f4..2fb11a7cc2 100644 Binary files a/integration_tests/snapshots/css/css-images/gradients-with.ts.01f5d79e1.png and b/integration_tests/snapshots/css/css-images/gradients-with.ts.01f5d79e1.png differ diff --git a/integration_tests/snapshots/css/css-images/gradients-with.ts.11592ca21.png b/integration_tests/snapshots/css/css-images/gradients-with.ts.11592ca21.png index 02d656167a..7f6474a55d 100644 Binary files a/integration_tests/snapshots/css/css-images/gradients-with.ts.11592ca21.png and b/integration_tests/snapshots/css/css-images/gradients-with.ts.11592ca21.png differ diff --git a/integration_tests/snapshots/css/css-images/linear-gradient.ts.1bf75b8f1.png b/integration_tests/snapshots/css/css-images/linear-gradient.ts.1bf75b8f1.png index 227d6bd26e..ea67c0cb3b 100644 Binary files a/integration_tests/snapshots/css/css-images/linear-gradient.ts.1bf75b8f1.png and b/integration_tests/snapshots/css/css-images/linear-gradient.ts.1bf75b8f1.png differ diff --git a/integration_tests/snapshots/css/css-images/multiple-position.ts.9375e2321.png b/integration_tests/snapshots/css/css-images/multiple-position.ts.9375e2321.png index 318441f56b..54cf2aac22 100644 Binary files a/integration_tests/snapshots/css/css-images/multiple-position.ts.9375e2321.png and b/integration_tests/snapshots/css/css-images/multiple-position.ts.9375e2321.png differ diff --git a/integration_tests/snapshots/css/css-images/multiple-position.ts.da6da43e1.png b/integration_tests/snapshots/css/css-images/multiple-position.ts.da6da43e1.png index ab15142222..54cf2aac22 100644 Binary files a/integration_tests/snapshots/css/css-images/multiple-position.ts.da6da43e1.png and b/integration_tests/snapshots/css/css-images/multiple-position.ts.da6da43e1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.1b9ca8a61.png b/integration_tests/snapshots/css/css-images/object-fit.ts.1b9ca8a61.png index fbd2d686c8..739b8ea7f2 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.1b9ca8a61.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.1b9ca8a61.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.1e62c1a91.png b/integration_tests/snapshots/css/css-images/object-fit.ts.1e62c1a91.png index d6b428aa98..1f80096933 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.1e62c1a91.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.1e62c1a91.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.233e07761.png b/integration_tests/snapshots/css/css-images/object-fit.ts.233e07761.png index fbd2d686c8..739b8ea7f2 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.233e07761.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.233e07761.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.2f30d1191.png b/integration_tests/snapshots/css/css-images/object-fit.ts.2f30d1191.png index 1f83fb4605..beea856d7c 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.2f30d1191.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.2f30d1191.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.3404d5191.png b/integration_tests/snapshots/css/css-images/object-fit.ts.3404d5191.png index d7160bbe8c..546259d232 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.3404d5191.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.3404d5191.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.4141956a1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.4141956a1.png index 09248df131..37ae3bc1b8 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.4141956a1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.4141956a1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.451465f91.png b/integration_tests/snapshots/css/css-images/object-fit.ts.451465f91.png index 240da25385..dc58f7b03d 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.451465f91.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.451465f91.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.504e745a1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.504e745a1.png index 31c99fde77..f71684e170 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.504e745a1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.504e745a1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.5f9fbdc21.png b/integration_tests/snapshots/css/css-images/object-fit.ts.5f9fbdc21.png index 9acea13e4f..beea856d7c 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.5f9fbdc21.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.5f9fbdc21.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.675f217e1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.675f217e1.png index 0b25b61560..f71684e170 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.675f217e1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.675f217e1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.76ea674e1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.76ea674e1.png index 82af6824e6..c9e8ba76df 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.76ea674e1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.76ea674e1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.81b38c151.png b/integration_tests/snapshots/css/css-images/object-fit.ts.81b38c151.png index 970c90a384..6d7b69e89e 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.81b38c151.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.81b38c151.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.93d87b8c1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.93d87b8c1.png index 5a2293cdba..1f80096933 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.93d87b8c1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.93d87b8c1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.9e31e89e1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.9e31e89e1.png index 2e52829578..6d7b69e89e 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.9e31e89e1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.9e31e89e1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.cc78b6c41.png b/integration_tests/snapshots/css/css-images/object-fit.ts.cc78b6c41.png index b4518c37ed..546259d232 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.cc78b6c41.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.cc78b6c41.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.eddc63cc1.png b/integration_tests/snapshots/css/css-images/object-fit.ts.eddc63cc1.png index 321a3b4d5e..dc58f7b03d 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.eddc63cc1.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.eddc63cc1.png differ diff --git a/integration_tests/snapshots/css/css-images/object-fit.ts.fe830b201.png b/integration_tests/snapshots/css/css-images/object-fit.ts.fe830b201.png index 82af6824e6..c9e8ba76df 100644 Binary files a/integration_tests/snapshots/css/css-images/object-fit.ts.fe830b201.png and b/integration_tests/snapshots/css/css-images/object-fit.ts.fe830b201.png differ diff --git a/integration_tests/snapshots/css/css-inline/vertical-align.ts.7919b0971.png b/integration_tests/snapshots/css/css-inline/vertical-align.ts.7919b0971.png index a882f487c4..206661e9f6 100644 Binary files a/integration_tests/snapshots/css/css-inline/vertical-align.ts.7919b0971.png and b/integration_tests/snapshots/css/css-inline/vertical-align.ts.7919b0971.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.24e1a8b11.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.24e1a8b11.png index 391de2a154..51f379064b 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.24e1a8b11.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.24e1a8b11.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.677416b81.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.677416b81.png index 9589a6ad2a..70c5536852 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.677416b81.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.677416b81.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.78377ee51.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.78377ee51.png index 5250c27fe6..f5efe3f8a8 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.78377ee51.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.78377ee51.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.79bce9d11.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.79bce9d11.png index d8f07735ef..725e4dbb03 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.79bce9d11.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.79bce9d11.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.9c8674271.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.9c8674271.png index 8c7dd54325..ca2e930071 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.9c8674271.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.9c8674271.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.b454e4e51.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.b454e4e51.png index 0f7442cf02..953bdbde32 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.b454e4e51.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.b454e4e51.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.c8f01d891.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.c8f01d891.png index 9b132da353..97c092bf1f 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.c8f01d891.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.c8f01d891.png differ diff --git a/integration_tests/snapshots/css/css-position/absolute-non.ts.db652a221.png b/integration_tests/snapshots/css/css-position/absolute-non.ts.db652a221.png index b62b540723..6f7b60684d 100644 Binary files a/integration_tests/snapshots/css/css-position/absolute-non.ts.db652a221.png and b/integration_tests/snapshots/css/css-position/absolute-non.ts.db652a221.png differ diff --git a/integration_tests/snapshots/css/css-position/abspos-inline.ts.ee0c64241.png b/integration_tests/snapshots/css/css-position/abspos-inline.ts.ee0c64241.png index bbe0fbe915..52039a7590 100644 Binary files a/integration_tests/snapshots/css/css-position/abspos-inline.ts.ee0c64241.png and b/integration_tests/snapshots/css/css-position/abspos-inline.ts.ee0c64241.png differ diff --git a/integration_tests/snapshots/css/css-position/abspos-negative.ts.7ce6f3f81.png b/integration_tests/snapshots/css/css-position/abspos-negative.ts.7ce6f3f81.png index 0cdf2169c1..4307c231ec 100644 Binary files a/integration_tests/snapshots/css/css-position/abspos-negative.ts.7ce6f3f81.png and b/integration_tests/snapshots/css/css-position/abspos-negative.ts.7ce6f3f81.png differ diff --git a/integration_tests/snapshots/css/css-position/abspos.ts.1f92a0931.png b/integration_tests/snapshots/css/css-position/abspos.ts.1f92a0931.png index b160031c83..06f68e00cc 100644 Binary files a/integration_tests/snapshots/css/css-position/abspos.ts.1f92a0931.png and b/integration_tests/snapshots/css/css-position/abspos.ts.1f92a0931.png differ diff --git a/integration_tests/snapshots/css/css-position/change-value.ts.b442c7b51.png b/integration_tests/snapshots/css/css-position/change-value.ts.b442c7b51.png new file mode 100644 index 0000000000..3beda462e2 Binary files /dev/null and b/integration_tests/snapshots/css/css-position/change-value.ts.b442c7b51.png differ diff --git a/integration_tests/snapshots/css/css-position/change-value.ts.b442c7b52.png b/integration_tests/snapshots/css/css-position/change-value.ts.b442c7b52.png new file mode 100644 index 0000000000..f2fe5571c5 Binary files /dev/null and b/integration_tests/snapshots/css/css-position/change-value.ts.b442c7b52.png differ diff --git a/integration_tests/snapshots/css/css-position/hypothetical-box.ts.f3ef18b91.png b/integration_tests/snapshots/css/css-position/hypothetical-box.ts.f3ef18b91.png index ef69f6f074..35a20906b3 100644 Binary files a/integration_tests/snapshots/css/css-position/hypothetical-box.ts.f3ef18b91.png and b/integration_tests/snapshots/css/css-position/hypothetical-box.ts.f3ef18b91.png differ diff --git a/integration_tests/snapshots/css/css-position/hypothetical-box.ts.fc4d38c51.png b/integration_tests/snapshots/css/css-position/hypothetical-box.ts.fc4d38c51.png index b1ac6a21f5..042dcd4c0d 100644 Binary files a/integration_tests/snapshots/css/css-position/hypothetical-box.ts.fc4d38c51.png and b/integration_tests/snapshots/css/css-position/hypothetical-box.ts.fc4d38c51.png differ diff --git a/integration_tests/snapshots/css/css-position/position-legacy.ts.961829731.png b/integration_tests/snapshots/css/css-position/position-legacy.ts.961829731.png index 97d72bebe2..04cae15966 100644 Binary files a/integration_tests/snapshots/css/css-position/position-legacy.ts.961829731.png and b/integration_tests/snapshots/css/css-position/position-legacy.ts.961829731.png differ diff --git a/integration_tests/snapshots/css/css-position/position-relative.ts.3717418d1.png b/integration_tests/snapshots/css/css-position/position-relative.ts.3717418d1.png index e91f3b2426..5636029241 100644 Binary files a/integration_tests/snapshots/css/css-position/position-relative.ts.3717418d1.png and b/integration_tests/snapshots/css/css-position/position-relative.ts.3717418d1.png differ diff --git a/integration_tests/snapshots/css/css-position/position-relative.ts.48ed5b0b1.png b/integration_tests/snapshots/css/css-position/position-relative.ts.48ed5b0b1.png index aeb612baf8..1bbd1c63a3 100644 Binary files a/integration_tests/snapshots/css/css-position/position-relative.ts.48ed5b0b1.png and b/integration_tests/snapshots/css/css-position/position-relative.ts.48ed5b0b1.png differ diff --git a/integration_tests/snapshots/css/css-position/position-sticky.ts.266b77d31.png b/integration_tests/snapshots/css/css-position/position-sticky.ts.266b77d31.png index 3b12560b1d..ea3b2aabb8 100644 Binary files a/integration_tests/snapshots/css/css-position/position-sticky.ts.266b77d31.png and b/integration_tests/snapshots/css/css-position/position-sticky.ts.266b77d31.png differ diff --git a/integration_tests/snapshots/css/css-position/position-sticky.ts.5a61cec31.png b/integration_tests/snapshots/css/css-position/position-sticky.ts.5a61cec31.png index c20d93a805..c7c3d0dfdc 100644 Binary files a/integration_tests/snapshots/css/css-position/position-sticky.ts.5a61cec31.png and b/integration_tests/snapshots/css/css-position/position-sticky.ts.5a61cec31.png differ diff --git a/integration_tests/snapshots/css/css-position/position.ts.961829731.png b/integration_tests/snapshots/css/css-position/position.ts.961829731.png index 97d72bebe2..04cae15966 100644 Binary files a/integration_tests/snapshots/css/css-position/position.ts.961829731.png and b/integration_tests/snapshots/css/css-position/position.ts.961829731.png differ diff --git a/integration_tests/snapshots/css/css-sizing/min-height.ts.4f1de8991.png b/integration_tests/snapshots/css/css-sizing/min-height.ts.4f1de8991.png index 8c41419762..e684a29ceb 100644 Binary files a/integration_tests/snapshots/css/css-sizing/min-height.ts.4f1de8991.png and b/integration_tests/snapshots/css/css-sizing/min-height.ts.4f1de8991.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.0365cf511.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.0365cf511.png index 26170b34a5..4bf03ed0d6 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.0365cf511.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.0365cf511.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.044329ed1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.044329ed1.png index 9c8b0af7b0..d01d376a6b 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.044329ed1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.044329ed1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.04a3756f1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.04a3756f1.png index 13afc3cc83..0d4407c195 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.04a3756f1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.04a3756f1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.084e77061.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.084e77061.png index d687a4996c..e900e5809d 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.084e77061.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.084e77061.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.128cd3561.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.128cd3561.png index a746a737a7..80bb6e0953 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.128cd3561.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.128cd3561.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.26e8a4041.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.26e8a4041.png index 54c591c740..aa3adb074b 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.26e8a4041.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.26e8a4041.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.28a905b21.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.28a905b21.png index 5bdb045a5a..eb6cf6b26b 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.28a905b21.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.28a905b21.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2c5a34581.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2c5a34581.png index b3621d9d29..b7dd702b8e 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2c5a34581.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2c5a34581.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2fc4b05c1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2fc4b05c1.png index 3934efc074..b6f04b4d12 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2fc4b05c1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.2fc4b05c1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3482634e1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3482634e1.png index 928b368ba8..80f2d9b5b6 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3482634e1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3482634e1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3a9c747e1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3a9c747e1.png index 5b78ff1493..528c750011 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3a9c747e1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3a9c747e1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3c67dca11.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3c67dca11.png index 032b3fc2bd..bdf6d072ad 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3c67dca11.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3c67dca11.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3fda4ddb1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3fda4ddb1.png index bb35063096..c92215f870 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3fda4ddb1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.3fda4ddb1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.412eead91.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.412eead91.png index 5f722c2eef..a7745c1f9b 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.412eead91.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.412eead91.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.422fe0a01.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.422fe0a01.png index d45291215b..33904912d0 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.422fe0a01.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.422fe0a01.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4414a46e1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4414a46e1.png index b5447da8f1..a123b9a991 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4414a46e1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4414a46e1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.49551e3c1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.49551e3c1.png index 127c7489c1..d78471ff90 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.49551e3c1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.49551e3c1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4f17db861.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4f17db861.png index 6420c1cd63..fa88049730 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4f17db861.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.4f17db861.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.536e68621.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.536e68621.png index e28148cef0..837cca7770 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.536e68621.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.536e68621.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.58c338781.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.58c338781.png index 9cb5f6038d..a53c9123ca 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.58c338781.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.58c338781.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5a61086e1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5a61086e1.png index 7b734428f6..4ab9e0de9a 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5a61086e1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5a61086e1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5d8586e91.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5d8586e91.png index 266298940e..b52fa4da93 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5d8586e91.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.5d8586e91.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6bc7bd591.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6bc7bd591.png index a874a2c292..352fef8149 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6bc7bd591.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6bc7bd591.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6fd106a11.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6fd106a11.png index 3a0c2f8f0d..e202ee1ca6 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6fd106a11.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.6fd106a11.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.73f2d41c1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.73f2d41c1.png index 9e3abe5209..42af2eeef7 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.73f2d41c1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.73f2d41c1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.7a1c0cbd1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.7a1c0cbd1.png index 24add6b2b4..64ac1aecb0 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.7a1c0cbd1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.7a1c0cbd1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.807cf5981.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.807cf5981.png index 43421ef097..e38668fe3a 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.807cf5981.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.807cf5981.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8899d83b1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8899d83b1.png index 7e26829bb0..97e0d7a304 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8899d83b1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8899d83b1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8b11b45c1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8b11b45c1.png index b16ca7a7a8..0a2e53854c 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8b11b45c1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8b11b45c1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8e79d12c1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8e79d12c1.png index e2f06f5d2f..7f13f53986 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8e79d12c1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.8e79d12c1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9127ce1f1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9127ce1f1.png index 4ad2a9b882..8e704a993d 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9127ce1f1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9127ce1f1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.98e7f0eb1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.98e7f0eb1.png index 3ca8211bad..50f48dd0bf 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.98e7f0eb1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.98e7f0eb1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9a0d63a31.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9a0d63a31.png index 89b4c3c0d0..a7ca90e664 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9a0d63a31.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.9a0d63a31.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.a4ca98f81.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.a4ca98f81.png index 5a9ebe9916..8cb32b7d4e 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.a4ca98f81.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.a4ca98f81.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ab19af871.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ab19af871.png index 01077080f2..9fe36f573f 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ab19af871.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ab19af871.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.adc757a01.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.adc757a01.png index 9cb82d9d3c..afb1ec0785 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.adc757a01.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.adc757a01.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ae9f2e361.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ae9f2e361.png index 5b734e779e..6d0b1dfffd 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ae9f2e361.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ae9f2e361.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b0f7bbb01.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b0f7bbb01.png index 2146ff59c6..0c6193072f 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b0f7bbb01.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b0f7bbb01.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b6fda3581.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b6fda3581.png index 33ccb35ec0..84058bba74 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b6fda3581.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b6fda3581.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b77df5581.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b77df5581.png index c6db0e4311..2efff5e0b6 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b77df5581.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.b77df5581.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bc5146c91.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bc5146c91.png index 2ee3a8b714..c3862e347d 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bc5146c91.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bc5146c91.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bcf870381.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bcf870381.png index 7c647dbf46..2c560693ac 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bcf870381.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bcf870381.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bd3482a81.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bd3482a81.png index 0f0d36176e..8e65b2fc9d 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bd3482a81.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.bd3482a81.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.c245ffc21.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.c245ffc21.png index 9e49bb450d..64820249e2 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.c245ffc21.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.c245ffc21.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.cf84b64f1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.cf84b64f1.png index d15e0aaf4a..2db8ab3bd7 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.cf84b64f1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.cf84b64f1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d0744cb91.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d0744cb91.png index 804281aeba..2d7c3c85b1 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d0744cb91.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d0744cb91.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d8b0fea11.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d8b0fea11.png index 9e56663fac..ce1a2c8c44 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d8b0fea11.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.d8b0fea11.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.dd37837f1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.dd37837f1.png index 13c5f35d14..19befd080a 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.dd37837f1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.dd37837f1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.e9f615861.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.e9f615861.png index 5994c4a043..cbfd91064c 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.e9f615861.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.e9f615861.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ebde23601.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ebde23601.png index f1cdc03448..2a1063c6e2 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ebde23601.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ebde23601.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ee4bf2e31.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ee4bf2e31.png index 970fd3ca40..0ec8da03fc 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ee4bf2e31.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.ee4bf2e31.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f4de5c5c1.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f4de5c5c1.png index 9bd0333600..321b8dc096 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f4de5c5c1.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f4de5c5c1.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f634a3101.png b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f634a3101.png index 455bc7e47b..560b233dd1 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f634a3101.png and b/integration_tests/snapshots/css/css-text-decor/text-decoration.ts.f634a3101.png differ diff --git a/integration_tests/snapshots/css/css-text-decor/text-shadow.ts.13c9173d1.png b/integration_tests/snapshots/css/css-text-decor/text-shadow.ts.13c9173d1.png index 0c9655f7a4..555bc34166 100644 Binary files a/integration_tests/snapshots/css/css-text-decor/text-shadow.ts.13c9173d1.png and b/integration_tests/snapshots/css/css-text-decor/text-shadow.ts.13c9173d1.png differ diff --git a/integration_tests/snapshots/css/css-text/text-align.ts.151eec951.png b/integration_tests/snapshots/css/css-text/text-align.ts.151eec951.png index 5df53c781a..57ac8d127c 100644 Binary files a/integration_tests/snapshots/css/css-text/text-align.ts.151eec951.png and b/integration_tests/snapshots/css/css-text/text-align.ts.151eec951.png differ diff --git a/integration_tests/snapshots/css/css-text/text-align.ts.ec90ffe11.png b/integration_tests/snapshots/css/css-text/text-align.ts.ec90ffe11.png index 5df53c781a..57ac8d127c 100644 Binary files a/integration_tests/snapshots/css/css-text/text-align.ts.ec90ffe11.png and b/integration_tests/snapshots/css/css-text/text-align.ts.ec90ffe11.png differ diff --git a/integration_tests/snapshots/css/css-text/white-space.ts.0ba038b41.png b/integration_tests/snapshots/css/css-text/white-space.ts.0ba038b41.png index 371daa2ca6..642d577651 100644 Binary files a/integration_tests/snapshots/css/css-text/white-space.ts.0ba038b41.png and b/integration_tests/snapshots/css/css-text/white-space.ts.0ba038b41.png differ diff --git a/integration_tests/snapshots/css/filter-effects/filter.ts.b5a089141.png b/integration_tests/snapshots/css/filter-effects/filter.ts.b5a089141.png index 734fecf7cd..739c395fc4 100644 Binary files a/integration_tests/snapshots/css/filter-effects/filter.ts.b5a089141.png and b/integration_tests/snapshots/css/filter-effects/filter.ts.b5a089141.png differ diff --git a/integration_tests/snapshots/css/filter-effects/filter.ts.c4af58341.png b/integration_tests/snapshots/css/filter-effects/filter.ts.c4af58341.png index 251ffe9dba..ad84223824 100644 Binary files a/integration_tests/snapshots/css/filter-effects/filter.ts.c4af58341.png and b/integration_tests/snapshots/css/filter-effects/filter.ts.c4af58341.png differ diff --git a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.05fab60c1.png b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.05fab60c1.png index d2b958d095..e0b8eb2d34 100644 Binary files a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.05fab60c1.png and b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.05fab60c1.png differ diff --git a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.3e9e6a8e1.png b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.3e9e6a8e1.png index 0edd7c1856..854515b38b 100644 Binary files a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.3e9e6a8e1.png and b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.3e9e6a8e1.png differ diff --git a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.a14425e31.png b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.a14425e31.png index 2d109475ea..a54cd5403a 100644 Binary files a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.a14425e31.png and b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.a14425e31.png differ diff --git a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.c221919b1.png b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.c221919b1.png index e7e1f8ecf5..cfffecb605 100644 Binary files a/integration_tests/snapshots/dom/elements/canvas/context2d.ts.c221919b1.png and b/integration_tests/snapshots/dom/elements/canvas/context2d.ts.c221919b1.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.0bb0c4911.png b/integration_tests/snapshots/dom/elements/img.ts.0bb0c4911.png index 1cbe6400e6..fd14b350c2 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.0bb0c4911.png and b/integration_tests/snapshots/dom/elements/img.ts.0bb0c4911.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.1637881b1.png b/integration_tests/snapshots/dom/elements/img.ts.1637881b1.png index 969e18422c..b0e007b621 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.1637881b1.png and b/integration_tests/snapshots/dom/elements/img.ts.1637881b1.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.7bcfa1081.png b/integration_tests/snapshots/dom/elements/img.ts.7bcfa1081.png index ac7c517411..4f5b33550a 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.7bcfa1081.png and b/integration_tests/snapshots/dom/elements/img.ts.7bcfa1081.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.7fa17e651.png b/integration_tests/snapshots/dom/elements/img.ts.7fa17e651.png index 3d8be3d0e5..c1d8f0da07 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.7fa17e651.png and b/integration_tests/snapshots/dom/elements/img.ts.7fa17e651.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.bfd390a41.png b/integration_tests/snapshots/dom/elements/img.ts.bfd390a41.png index 3ae6ca4304..530ea4d793 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.bfd390a41.png and b/integration_tests/snapshots/dom/elements/img.ts.bfd390a41.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.c2bc25131.png b/integration_tests/snapshots/dom/elements/img.ts.c2bc25131.png index 84a6b807d2..6bd7a87030 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.c2bc25131.png and b/integration_tests/snapshots/dom/elements/img.ts.c2bc25131.png differ diff --git a/integration_tests/snapshots/dom/elements/img.ts.f73745501.png b/integration_tests/snapshots/dom/elements/img.ts.f73745501.png index a272a06757..d13fbf333d 100644 Binary files a/integration_tests/snapshots/dom/elements/img.ts.f73745501.png and b/integration_tests/snapshots/dom/elements/img.ts.f73745501.png differ diff --git a/integration_tests/snapshots/dom/elements/input.ts.2f2856f71.png b/integration_tests/snapshots/dom/elements/input.ts.2f2856f71.png index d800d962c6..2579748bcc 100644 Binary files a/integration_tests/snapshots/dom/elements/input.ts.2f2856f71.png and b/integration_tests/snapshots/dom/elements/input.ts.2f2856f71.png differ diff --git a/integration_tests/snapshots/dom/elements/input.ts.b3e814401.png b/integration_tests/snapshots/dom/elements/input.ts.b3e814401.png index 83dc1e437e..22f96742f0 100644 Binary files a/integration_tests/snapshots/dom/elements/input.ts.b3e814401.png and b/integration_tests/snapshots/dom/elements/input.ts.b3e814401.png differ diff --git a/integration_tests/snapshots/dom/elements/input.ts.ea8aa0621.png b/integration_tests/snapshots/dom/elements/input.ts.ea8aa0621.png index b04b6df5c0..0cf3b8e2ed 100644 Binary files a/integration_tests/snapshots/dom/elements/input.ts.ea8aa0621.png and b/integration_tests/snapshots/dom/elements/input.ts.ea8aa0621.png differ diff --git a/integration_tests/snapshots/dom/elements/link.ts.4a71e55a1.png b/integration_tests/snapshots/dom/elements/link.ts.4a71e55a1.png new file mode 100644 index 0000000000..662d311d86 Binary files /dev/null and b/integration_tests/snapshots/dom/elements/link.ts.4a71e55a1.png differ diff --git a/integration_tests/snapshots/dom/elements/textarea.ts.81c69fff2.png b/integration_tests/snapshots/dom/elements/textarea.ts.81c69fff2.png index 95c3a207ff..add24eb2d1 100644 Binary files a/integration_tests/snapshots/dom/elements/textarea.ts.81c69fff2.png and b/integration_tests/snapshots/dom/elements/textarea.ts.81c69fff2.png differ diff --git a/integration_tests/snapshots/dom/nodes/clone-node.ts.dbc7c42b1.png b/integration_tests/snapshots/dom/nodes/clone-node.ts.dbc7c42b1.png index 03b23cdeb0..940a541c2f 100644 Binary files a/integration_tests/snapshots/dom/nodes/clone-node.ts.dbc7c42b1.png and b/integration_tests/snapshots/dom/nodes/clone-node.ts.dbc7c42b1.png differ diff --git a/integration_tests/snapshots/dom/nodes/remove-child.ts.6108a5311.png b/integration_tests/snapshots/dom/nodes/remove-child.ts.6108a5311.png index b8ab3e3c60..2b82e1d356 100644 Binary files a/integration_tests/snapshots/dom/nodes/remove-child.ts.6108a5311.png and b/integration_tests/snapshots/dom/nodes/remove-child.ts.6108a5311.png differ diff --git a/integration_tests/spec_group.json b/integration_tests/spec_group.json new file mode 100644 index 0000000000..d84191a82b --- /dev/null +++ b/integration_tests/spec_group.json @@ -0,0 +1,85 @@ +[ + { + "name": "BOM", + "specs": [ + "specs/async-storage/**/*.{js,jsx,ts,tsx,html}", + "specs/blob/**/*.{js,jsx,ts,tsx,html}", + "specs/cookie/**/*.{js,jsx,ts,tsx,html}", + "specs/fetch/**/*.{js,jsx,ts,tsx,html}", + "specs/method-channel/**/*.{js,jsx,ts,tsx,html}", + "specs/navigator/**/*.{js,jsx,ts,tsx,html}", + "specs/performance/**/*.{js,jsx,ts,tsx,html}", + "specs/timer/**/*.{js,jsx,ts,tsx,html}", + "specs/window/**/*.{js,jsx,ts,tsx,html}", + "specs/xhr/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "DOM", + "specs": [ + "specs/dom/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "BoxModelAndSizing", + "specs": [ + "specs/css/css-align/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-display/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-box/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-flow/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-inline/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-sizing/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "BackgroundsAndBordersAndOverflow", + "specs": [ + "specs/css/css-backgrounds/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-borders/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-overflow/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "FlexBoxLayoutAndPositionedLayout", + "specs": [ + "specs/css/css-flexbox/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-position/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "FontsAndImages", + "specs": [ + "specs/css/css-fonts/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-images/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "TextAndColorAndFilterEffect", + "specs": [ + "specs/css/css-text/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-text-decor/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-color/**/*.{js,jsx,ts,tsx,html}", + "specs/css/filter-effects/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "TransformsAndAnimations", + "specs": [ + "specs/css/css-transforms/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-transitions/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "ValuesAndUnitAndVaraiables", + "specs": [ + "specs/css/css-values/**/*.{js,jsx,ts,tsx,html}", + "specs/css/css-variables/**/*.{js,jsx,ts,tsx,html}" + ] + }, + { + "name": "Selectors", + "specs": [ + "specs/css/css-selectors/**/*.{js,jsx,ts,tsx,html}" + ] + } +] diff --git a/integration_tests/specs/css/css-backgrounds/background-attachment.ts b/integration_tests/specs/css/css-backgrounds/background-attachment.ts index 4b464d6f05..e2d14164f3 100644 --- a/integration_tests/specs/css/css-backgrounds/background-attachment.ts +++ b/integration_tests/specs/css/css-backgrounds/background-attachment.ts @@ -5,7 +5,7 @@ describe('background-attachment', () => { 'background-attachment': 'fixed', 'background-position': '1em 5em', 'background-image': - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/cat.png)', + 'url(assets/cat.png)', 'background-repeat': 'no-repeat', border: '1px solid blue', height: '250px', @@ -25,7 +25,7 @@ describe('background-attachment', () => { let container = createElementWithStyle('div', { 'background-attachment': 'local', 'background-image': - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/cat.png)', + 'url(assets/cat.png)', 'background-repeat': 'no-repeat', 'background-color': 'yellow', border: '10px solid rgba(0, 0, 0, 0.3)', @@ -50,7 +50,7 @@ describe('background-attachment', () => { 'background-attachment': 'local', backgroundRepeat: 'no-repeat', 'background-image': - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/cat.png)', + 'url(assets/cat.png)', 'background-color': 'yellow', border: '10px solid rgba(0, 0, 0, 0.3)', height: '250px', diff --git a/integration_tests/specs/css/css-backgrounds/background-color.ts b/integration_tests/specs/css/css-backgrounds/background-color.ts index 2b17f820f3..9b71b1b9a5 100644 --- a/integration_tests/specs/css/css-backgrounds/background-color.ts +++ b/integration_tests/specs/css/css-backgrounds/background-color.ts @@ -50,7 +50,7 @@ describe('Background-color', () => { position: 'relative', bottom: '60px', backgroundImage: - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/green-60-60.png)', + 'url(assets/green-60-60.png)', backgroundRepeat: 'no-repeat', }); append(BODY, red); diff --git a/integration_tests/specs/css/css-backgrounds/background-position.ts b/integration_tests/specs/css/css-backgrounds/background-position.ts index a2424c87c6..2558f3f983 100644 --- a/integration_tests/specs/css/css-backgrounds/background-position.ts +++ b/integration_tests/specs/css/css-backgrounds/background-position.ts @@ -46,7 +46,7 @@ describe('Background-position', () => { position.appendChild(position2); append(BODY, position); - await snapshot(0.1); + await snapshot(0.5); }); it('top', async () => { diff --git a/integration_tests/specs/css/css-backgrounds/background-repeat.ts b/integration_tests/specs/css/css-backgrounds/background-repeat.ts index 64b79d96d1..6e757e9c4c 100644 --- a/integration_tests/specs/css/css-backgrounds/background-repeat.ts +++ b/integration_tests/specs/css/css-backgrounds/background-repeat.ts @@ -128,7 +128,7 @@ describe('background-repeat', () => { height: '220px', backgroundColor: 'red', backgroundImage: - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/cat.png)', + 'url(assets/cat.png)', backgroundRepeat: 'round', }); append(BODY, div); @@ -143,7 +143,7 @@ describe('background-repeat', () => { height: '220px', backgroundColor: 'red', backgroundImage: - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/cat.png)', + 'url(assets/cat.png)', backgroundRepeat: 'round', }); append(BODY, div); diff --git a/integration_tests/specs/css/css-borders/border-bottom.ts b/integration_tests/specs/css/css-borders/border-bottom.ts index 697fd207dc..69f726105d 100644 --- a/integration_tests/specs/css/css-borders/border-bottom.ts +++ b/integration_tests/specs/css/css-borders/border-bottom.ts @@ -1,31 +1,5 @@ /*auto generated*/ describe('border-bottom', () => { - it('001-ref', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'black', - height: '100px', - position: 'relative', - top: '100px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); it('001', async () => { let p; let div; @@ -52,5941 +26,6 @@ describe('border-bottom', () => { BODY.appendChild(p); BODY.appendChild(div); - await snapshot(); - }); - it('003', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a blue line.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom': 'blue', - 'border-bottom-style': 'solid', - height: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('005-ref', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if there is a filled blue square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'blue', - height: '100px', - position: 'relative', - top: '100px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('005', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled blue square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom': '100px solid blue', - height: '100px', - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('006', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom': '100px solid #000', - height: '100px', - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('008', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled blue square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom': '100px solid blue', - height: '100px', - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('010', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a dashed blue line below.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom': '5px solid blue', - height: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('016-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if there are 2 black lines.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'black', - height: '3px', - 'margin-top': '112px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'black', - height: '3px', - 'margin-top': '10px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('016', async () => { - let p; - let div1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there are 2 black lines.`)] - ); - div1 = createElement( - 'div', - { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'div1', - style: { - 'border-bottom': '4px solid #000', - 'padding-bottom': '10px', - height: '100px', - 'box-sizing': 'border-box', - }, - }, - [ - createElement('div', { - style: { - height: '100px', - 'box-sizing': 'border-box', - }, - }), - ] - ); - BODY.appendChild(p); - BODY.appendChild(div1); - - await snapshot(); - }); - it('018-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if there are 2 large blue rectangles.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'blue', - height: '96px', - 'margin-top': '112px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'blue', - height: '96px', - 'margin-top': '10px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('018', async () => { - let p; - let div1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there are 2 large blue rectangles.`)] - ); - div1 = createElement( - 'div', - { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'div1', - style: { - 'border-bottom': '100px solid blue', - 'padding-bottom': '10px', - height: '100px', - 'box-sizing': 'border-box', - }, - }, - [ - createElement('div', { - style: { - height: '100px', - 'box-sizing': 'border-box', - }, - }), - ] - ); - BODY.appendChild(p); - BODY.appendChild(div1); - - await snapshot(); - }); - it('applies-to-001-ref', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if there is a short horizontal green line.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'green', - height: '3px', - width: '96px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('applies-to-008', async () => { - let div; - div = createElement( - 'div', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom': '10px solid green', - display: 'inline', - 'font-size': '100px', - 'box-sizing': 'border-box', - }, - }, - [createText(`1111`)] - ); - BODY.appendChild(div); - - await snapshot(); - }); - it('applies-to-009', async () => { - let div; - div = createElement( - 'div', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [ - createElement('span', { - style: { - 'border-bottom': '3px solid green', - display: 'block', - width: '100px', - 'box-sizing': 'border-box', - }, - }), - ] - ); - BODY.appendChild(div); - - await snapshot(); - }); - it('applies-to-012', async () => { - let p; - let blockDescendant; - let blockDescendant_1; - let inlineBlock; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a short horizontal green line.`)] - ); - div = createElement( - 'div', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [ - (inlineBlock = createElement( - 'span', - { - id: 'inline-block', - style: { - 'border-bottom': '3px solid green', - display: 'inline-block', - 'vertical-align': 'top', - width: '100px', - 'box-sizing': 'border-box', - }, - }, - [ - (blockDescendant = createElement('span', { - class: 'block-descendant', - style: { - display: 'block', - 'box-sizing': 'border-box', - }, - })), - (blockDescendant_1 = createElement('span', { - class: 'block-descendant', - style: { - display: 'block', - 'box-sizing': 'border-box', - }, - })), - ] - )), - ] - ); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-001-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-001', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-002', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#000000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-003-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/010101_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/010101_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await sleep(0.5); - await snapshot(); - }); - it('color-003', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#010101', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#010101', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-004-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/999_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/999_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-004', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#999999', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#999999', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-005-ref', async () => { - let div; - let div_1; - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/fefefe_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/fefefe_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-005', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - color: 'white', - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#fefefe', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#fefefe', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-006-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - color: 'white', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-006', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - color: 'white', - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-007', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#1000000', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-008', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#fgfgfg', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-009-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/010000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/010000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-009', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#010000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#010000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-010-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': '#990000', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': '#990000', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-010', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#990000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#990000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-011-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/fe0000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/fe0000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-011', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#fe0000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#fe0000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-012-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/f00_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/f00_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-012', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#ff0000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#ff0000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-013', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#fg0000', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-014-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000100_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000100_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-014', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#000100', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000100', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-015-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/090_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/090_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-015', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#009900', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#009900', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-016-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/00fe00_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/00fe00_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-016', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00fe00', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#00fe00', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-017-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/0f0_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/0f0_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-017', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00ff00', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#00ff00', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-018', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00fg00', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-019-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000001_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/000001_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-019', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#000001', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000001', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-020-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/009_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/009_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-020', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#000099', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000099', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-021-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/0000fe_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/0000fe_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-021', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#0000fe', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#0000fe', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-022-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/00f_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/00f_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-022', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#0000ff', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#0000ff', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-023', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#0000fg', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-024', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-025', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#000', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#000', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-026-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/111_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/111_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-026', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#111', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#111', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-027-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/999_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/999_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-027', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#999', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#999', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-028-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/eee_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/eee_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-028', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#eee', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#eee', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-030', async () => { - let p; - let test; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [ - createText( - `Test passes if there is a filled black or transparent square surrounded by a blue border.` - ), - ] - ); - test = createElement( - 'div', - { - xmlns: 'http://www.w3.org/1999/xhtml', - class: 'test', - style: { - border: '5px solid blue', - height: '100px', - width: '100px', - 'box-sizing': 'border-box', - }, - }, - [ - createElement('div', { - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#1000', - - width: '100px', - 'box-sizing': 'border-box', - }, - }), - ] - ); - BODY.appendChild(p); - BODY.appendChild(test); - - await snapshot(); - }); - it('color-031', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#ggg', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-032-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/100_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/100_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-032', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#100', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#100', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-033', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#900', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#900', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-034-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/e00_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/e00_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-034', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#e00', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#e00', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-035', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#f00', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#f00', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-036', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#g00', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-037-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/010_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/010_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await sleep(0.5); - - await snapshot(0.1); - }); - it('color-037', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#010', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#010', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-038-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/090_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/090_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-038', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#090', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#090', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-039-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/0e0_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/0e0_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-039', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#0e0', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#0e0', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-040', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#0f0', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#0f0', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-041', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#0g0', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-042-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/001_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/001_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-042', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#001', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#001', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-043', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#009', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#009', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-044-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/00e_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/00e_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.1); - }); - it('color-044', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00e', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#00e', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-045', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00f', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': '#00f', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-046', async () => { - let p; - let div; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if there is a filled black square.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': '#00g', - - width: '100px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - - await snapshot(); - }); - it('color-047', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(-1%, -1%, -1%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-048', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-049-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1%, 1%, 1%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1%, 1%, 1%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-049', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(1%, 1%, 1%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1%, 1%, 1%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-050', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(-0%, -0%, -0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-051', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+0%, +0%, +0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-052-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 40%, 40%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 40%, 40%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-053', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+40%, +40%, +40%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 40%, 40%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-054-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - color: 'white', - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(99%, 99%, 99%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(99%, 99%, 99%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-054', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - color: 'white', - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(99%, 99%, 99%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(99%, 99%, 99%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-063-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/808080_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/808080_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.2); - }); - it('color-063', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(128, 128, 128)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(128, 128, 128)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-064', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+128, +128, +128)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(128, 128, 128)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-070-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-070', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(1%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-071', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(-0%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-073-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-073', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(40%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-074', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+40%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(40%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-075-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(99%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(99%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-075', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(99%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(99%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-076', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(100%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(100%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-077', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+100%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(100%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-078', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(101%, 0%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(100%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-079', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(-1, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-080', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(1, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(1, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-081', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(-0, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-082', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+0, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-083-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/800000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/800000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.2); - }); - it('color-083', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(128, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(128, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-084', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+128, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(128, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-085', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(254, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(254, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-086', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(255, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(255, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-087', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(+255, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(255, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-088', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(256, 0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(255, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-089', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, -1%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-090-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 1%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 1%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-090', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 1%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 1%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-093-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 40%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 40%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-093', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 40%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 40%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-094', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, +40%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 40%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-095-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 99%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 99%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-095', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 99%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 99%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-096', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 100%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 100%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-097', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, +100%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 100%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-098', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 101%, 0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 100%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-099', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, -1, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-100-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'rgb(0, 1, 0)', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'background-color': 'rgb(0, 1, 0)', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-100', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, 1, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 1, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-101', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, -0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-102', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, +0, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 0, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-103-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: {}, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/008000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - background: 'url("assets/008000_color.png")', - height: '100px', - 'margin-top': '10px', - width: '100px', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(0.2); - }); - it('color-103', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, 128, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 128, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-105', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, 254, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 254, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-106', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, 255, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 255, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-107', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, +255, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 255, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-108', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0, 256, 0)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0, 255, 0)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-109', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 0%, -1%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-110-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 1%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 1%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-110', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 0%, 1%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 1%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-111', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 0%, -0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-112', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 0%, +0%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 0%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-113-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 40%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 40%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - - await snapshot(); - }); - it('color-113', async () => { - let p; - let test; - let reference; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - test = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'test', - style: { - width: '100px', - 'border-bottom-style': 'solid', - 'border-bottom-width': '100px', - 'border-bottom-color': 'rgb(0%, 0%, 40%)', - 'box-sizing': 'border-box', - }, - }); - reference = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - id: 'reference', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 40%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(test); - BODY.appendChild(reference); - - await snapshot(); - }); - it('color-115-ref', async () => { - let p; - let div; - let div_1; - p = createElement( - 'p', - { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - 'box-sizing': 'border-box', - }, - }, - [createText(`Test passes if the boxes below are the same color.`)] - ); - div = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 99%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - div_1 = createElement('div', { - xmlns: 'http://www.w3.org/1999/xhtml', - style: { - height: '100px', - width: '100px', - 'background-color': 'rgb(0%, 0%, 99%)', - 'margin-top': '10px', - 'box-sizing': 'border-box', - }, - }); - BODY.appendChild(p); - BODY.appendChild(div); - BODY.appendChild(div_1); - await snapshot(); }); }); diff --git a/integration_tests/specs/css/css-box/horizontal-formatting.ts b/integration_tests/specs/css/css-box/horizontal-formatting.ts index d155a0b5cb..3ca5df4329 100644 --- a/integration_tests/specs/css/css-box/horizontal-formatting.ts +++ b/integration_tests/specs/css/css-box/horizontal-formatting.ts @@ -12,7 +12,7 @@ describe('Horizontal formatting', () => { ruleImg.setAttribute( 'src', - 'https://kraken.oss-cn-hangzhou.aliyuncs.com/images/scaleplate.png' + 'assets/scaleplate.png' ); setElementStyle(ruleImg, { @@ -58,7 +58,7 @@ describe('Horizontal formatting', () => { ruleImg2.setAttribute( 'src', - 'https://kraken.oss-cn-hangzhou.aliyuncs.com/images/content-area.png' + 'assets/content-area.png' ); setElementStyle(ruleImg2, { width: '640px', diff --git a/integration_tests/specs/css/css-display/content-visibility.ts b/integration_tests/specs/css/css-display/content-visibility.ts index 5340e5e0e8..e33ea1d348 100644 --- a/integration_tests/specs/css/css-display/content-visibility.ts +++ b/integration_tests/specs/css/css-display/content-visibility.ts @@ -134,4 +134,26 @@ describe('Content Visibility', () => { await snapshot(container1); }); + it('should work with null', async () => { + var container1 = document.createElement('div'); + + setElementStyle(container1, { + contentVisibility: 'hidden', + backgroundColor: 'red', + width: '200px', + height: '200px', + }); + + document.body.appendChild(container1); + + setElementStyle(container1, { + position: 'absolute', + top: '-1000px', + contentVisibility: null + }); + + + // Should be visible. + await snapshot(container1); + }); }); diff --git a/integration_tests/specs/css/css-flexbox/position-absolute.ts b/integration_tests/specs/css/css-flexbox/position-absolute.ts index d390e80632..4fe23c7874 100644 --- a/integration_tests/specs/css/css-flexbox/position-absolute.ts +++ b/integration_tests/specs/css/css-flexbox/position-absolute.ts @@ -289,7 +289,7 @@ describe('flexbox-position-absolute', () => { await snapshot(); }); - it('positioned image of no left and right should reposition when its size changed', async (done) => { + it('positioned image of no left and right should reposition when its size changed', async (done) => { const imageURL = 'assets/100x100-green.png'; const img = document.createElement('img'); img.style.position = 'absolute'; @@ -302,7 +302,7 @@ describe('flexbox-position-absolute', () => { imageURL ); img.addEventListener('load', async () => { - await snapshot(); + await snapshot(0.5); done(); }); diff --git a/integration_tests/specs/css/css-fonts/font-size.ts b/integration_tests/specs/css/css-fonts/font-size.ts index 1cd4ab4987..635ec00207 100644 --- a/integration_tests/specs/css/css-fonts/font-size.ts +++ b/integration_tests/specs/css/css-fonts/font-size.ts @@ -164,4 +164,44 @@ describe('FontSize', () => { done(); }); }); + + it('should works with absolute-size keyword', async () => { + for (const fontSize of ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large']) { + const div = createElement('div', { + style: { + fontSize: fontSize + } + }, [ + createText(fontSize) + ]); + BODY.appendChild(div); + } + + await snapshot(); + }); + + it('should works with relative-size keyword', async () => { + for (const parentSize of ['16px', '32px', '48px']) { + const div = createElement('div', { + style: { + fontSize: parentSize + } + }, [ + createElement('div', { + style: { + fontSize: 'smaller' + } + }, [createText(`${parentSize} smaller`)]), + createElement('div', {}, [createText(`${parentSize}`)]), + createElement('div', { + style: { + fontSize: 'larger' + } + }, [createText(`${parentSize} larger`)]) + ]); + BODY.appendChild(div); + } + + await snapshot(); + }); }); diff --git a/integration_tests/specs/css/css-images/object-fit.ts b/integration_tests/specs/css/css-images/object-fit.ts index 50d24240fb..d87661681f 100644 --- a/integration_tests/specs/css/css-images/object-fit.ts +++ b/integration_tests/specs/css/css-images/object-fit.ts @@ -15,7 +15,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -35,7 +35,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -55,7 +55,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -75,7 +75,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -95,7 +95,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -115,7 +115,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -135,7 +135,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -155,7 +155,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -175,7 +175,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -195,7 +195,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -216,7 +216,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -236,7 +236,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -256,7 +256,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -278,7 +278,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -299,7 +299,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -320,7 +320,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -341,7 +341,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -362,7 +362,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -383,7 +383,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -404,7 +404,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -425,7 +425,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -446,7 +446,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -467,7 +467,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -489,7 +489,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -510,7 +510,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); @@ -531,7 +531,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + await snapshot(0.1); }); }); @@ -552,7 +552,7 @@ describe('object-fit', () => { }, ); BODY.appendChild(image); - + requestAnimationFrame(async () => { image.style.objectFit = ''; await snapshot(0.1); diff --git a/integration_tests/specs/css/css-position/absolute.ts b/integration_tests/specs/css/css-position/absolute.ts index b21982528d..a36e9f62c5 100644 --- a/integration_tests/specs/css/css-position/absolute.ts +++ b/integration_tests/specs/css/css-position/absolute.ts @@ -301,16 +301,16 @@ describe('Position absolute', () => { div.style.backgroundColor = 'red'; div.style.position = 'absolute'; - setTimeout(async () => { + requestAnimationFrame(async () => { div.style.bottom = '100px'; await snapshot(); - }, 200); + requestAnimationFrame(async () => { + div.style.bottom = '-200px'; + await snapshot(); + done(); + }); + }); - setTimeout(async () => { - div.style.bottom = '-200px'; - await snapshot(); - done(); - }, 300); document.body.appendChild(div); await snapshot(); @@ -323,16 +323,15 @@ describe('Position absolute', () => { div.style.backgroundColor = 'red'; div.style.position = 'absolute'; - setTimeout(async () => { + requestAnimationFrame(async () => { div.style.width = '100px'; await snapshot(); - }, 200); - - setTimeout(async () => { - div.style.width = '400px'; - await snapshot(); - done(); - }, 300); + requestAnimationFrame(async () => { + div.style.width = '400px'; + await snapshot(); + done(); + }) + }) document.body.appendChild(div); await snapshot(); @@ -345,16 +344,16 @@ describe('Position absolute', () => { div.style.backgroundColor = 'red'; div.style.position = 'absolute'; - setTimeout(async () => { + requestAnimationFrame(async () => { div.style.height = '100px'; await snapshot(); - }, 200); - setTimeout(async () => { - div.style.height = '400px'; - await snapshot(); - done(); - }, 300); + requestAnimationFrame(async () => { + div.style.height = '400px'; + await snapshot(); + done(); + }); + }); document.body.appendChild(div); await snapshot(); @@ -367,16 +366,16 @@ describe('Position absolute', () => { div.style.backgroundColor = 'red'; div.style.position = 'absolute'; - setTimeout(async () => { + requestAnimationFrame(async () => { div.style.top = '100px'; await snapshot(); - }, 200); - setTimeout(async () => { - div.style.top = '-50px'; - await snapshot(); - done(); - }, 300); + requestAnimationFrame(async () => { + div.style.top = '-50px'; + await snapshot(); + done(); + }); + }); document.body.appendChild(div); await snapshot(); @@ -389,16 +388,16 @@ describe('Position absolute', () => { div.style.backgroundColor = 'red'; div.style.position = 'absolute'; - setTimeout(async () => { + requestAnimationFrame(async () => { div.style.left = '100px'; await snapshot(); - }, 200); - setTimeout(async () => { - div.style.left = '-50px'; - await snapshot(); - done(); - }, 300); + requestAnimationFrame(async () => { + div.style.left = '-50px'; + await snapshot(); + done(); + }); + }); document.body.appendChild(div); await snapshot(); @@ -411,16 +410,15 @@ describe('Position absolute', () => { div.style.backgroundColor = 'red'; div.style.position = 'absolute'; - setTimeout(async () => { + requestAnimationFrame(async () => { div.style.right = '100px'; await snapshot(); - }, 200); - - setTimeout(async () => { - div.style.right = '-50px'; - await snapshot(); - done(); - }, 300); + requestAnimationFrame(async () => { + div.style.right = '-50px'; + await snapshot(); + done(); + }); + }); document.body.appendChild(div); await snapshot(); @@ -739,7 +737,7 @@ describe('Position absolute', () => { backgroundColor: 'green' }, }); - + BODY.appendChild(div1); await snapshot(); }); @@ -919,17 +917,17 @@ describe('Position absolute', () => { }, [ createElement('div', { style: { - backgroundColor: '#999', - position: 'absolute', + backgroundColor: '#999', + position: 'absolute', left: 0, - right: 0, - bottom: 0, - top: 0, + right: 0, + bottom: 0, + top: 0, } }, [ createElement('div', { style: { - backgroundColor: 'green', + backgroundColor: 'green', height: '100px', } }) @@ -951,19 +949,19 @@ describe('Position absolute', () => { }, [ createElement('div', { style: { - backgroundColor: '#999', - position: 'absolute', + backgroundColor: '#999', + position: 'absolute', left: 0, - right: 0, - bottom: 0, - top: 0, - display: 'flex', - flexDirection: 'column', + right: 0, + bottom: 0, + top: 0, + display: 'flex', + flexDirection: 'column', } }, [ createElement('div', { style: { - backgroundColor: 'green', + backgroundColor: 'green', height: '100px', } }) @@ -985,18 +983,18 @@ describe('Position absolute', () => { }, [ createElement('div', { style: { - backgroundColor: '#999', - position: 'absolute', + backgroundColor: '#999', + position: 'absolute', left: 0, - right: 0, - bottom: 0, - top: 0, - display: 'flex', + right: 0, + bottom: 0, + top: 0, + display: 'flex', } }, [ createElement('div', { style: { - backgroundColor: 'green', + backgroundColor: 'green', width: '100px', } }) @@ -1023,7 +1021,7 @@ describe('Position absolute', () => { transform: 'translateX(64px)', }, }, - [ + [ createElement( 'div', { @@ -1038,7 +1036,7 @@ describe('Position absolute', () => { transform: 'translateX(64px)', }, }, - [ + [ (child = createElement('div', { style: { "display": "flex", @@ -1063,9 +1061,9 @@ describe('Position absolute', () => { "borderLeftColor": "rgba(0, 0, 0, 0.000)", transform: 'translateX(14px)', }, - })) + })) ] - ) + ) ] ); @@ -1100,14 +1098,14 @@ describe('Position absolute', () => { overflow: 'scroll' }, }, - [ - createElement('div', { + [ + createElement('div', { style: { "width": "300px", "height": "300px", "background-color": "green", }, - }), + }), (child = createElement('div', { style: { "position": "absolute", @@ -1115,7 +1113,7 @@ describe('Position absolute', () => { "height": "50px", "background-color": "yellow", }, - })) + })) ] )) ] diff --git a/integration_tests/specs/css/css-position/change-value.ts b/integration_tests/specs/css/css-position/change-value.ts new file mode 100644 index 0000000000..e72a2a1cee --- /dev/null +++ b/integration_tests/specs/css/css-position/change-value.ts @@ -0,0 +1,16 @@ +describe('CSS Position', () => { + it('change from non-null to null', async () => { + var el = document.createElement('div'); + document.body.appendChild(el); + el.style.width = '100px'; + el.style.height = '100px'; + el.style.background = 'red'; + el.style.position = 'relative'; + el.style.left = '50px'; + + await snapshot(); + + el.style.position = null; + await snapshot(); + }); +}); diff --git a/integration_tests/specs/css/css-position/position-sticky.ts b/integration_tests/specs/css/css-position/position-sticky.ts index ffd71c8011..14a12a53a8 100644 --- a/integration_tests/specs/css/css-position/position-sticky.ts +++ b/integration_tests/specs/css/css-position/position-sticky.ts @@ -79,7 +79,7 @@ describe('position-sticky', () => { spacer = createElementWithStyle('div', { height: '200vh', 'background-image': - 'url(https://kraken.oss-cn-hangzhou.aliyuncs.com/images/ruler-v-50px.png)', + 'url(assets/ruler-v-50px.png)', 'background-repeat': 'repeat', 'box-sizing': 'border-box', }); diff --git a/integration_tests/specs/css/cssom/.gitkeep b/integration_tests/specs/css/css-selectors/.gitkeep similarity index 100% rename from integration_tests/specs/css/cssom/.gitkeep rename to integration_tests/specs/css/css-selectors/.gitkeep diff --git a/integration_tests/specs/css/cssom/class-selector.ts b/integration_tests/specs/css/css-selectors/class-selector.ts similarity index 100% rename from integration_tests/specs/css/cssom/class-selector.ts rename to integration_tests/specs/css/css-selectors/class-selector.ts diff --git a/integration_tests/specs/css/css-transitions/all.ts b/integration_tests/specs/css/css-transitions/all.ts index 894858f4fb..2f802f6bb8 100644 --- a/integration_tests/specs/css/css-transitions/all.ts +++ b/integration_tests/specs/css/css-transitions/all.ts @@ -12,16 +12,15 @@ describe('Transition all', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(() => { setElementStyle(container1, { top: 0, }); - - // Wait for animation finished. - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); @@ -155,18 +154,19 @@ describe('Transition all', () => { requestAnimationFrame(() => { container.style.width = '200px'; - setTimeout(() => { + requestAnimationFrame(() => { container.style.transition = 'height 0.5s ease 0.5s'; + + container.addEventListener('transitionend', async () => { + await snapshot(); + doneFn(); + }); + requestAnimationFrame(async () => { await snapshot(); container.style.height = '200px'; - - setTimeout(async () => { - await snapshot(); - doneFn(); - }, 1200); }); - }, 100); + }); }); }); @@ -184,6 +184,10 @@ describe('Transition all', () => { [createText('1234')] ); + container.addEventListener('transitionstart', () => { + doneFn.fail('transition will not start'); + }); + BODY.appendChild(container); await snapshot(); @@ -245,16 +249,15 @@ describe('Transition all', () => { container1.appendChild(document.createTextNode('DIV')); await snapshot(); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(() => { setElementStyle(container1, { transform: 'translate3d(200px, 0, 0)', }); - - // Wait for animation finished. - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); @@ -271,17 +274,16 @@ describe('Transition all', () => { container1.appendChild(document.createTextNode('DIV')); await snapshot(); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(() => { setElementStyle(container1, { transform: 'translate3d(200px, 0, 0)', transition: 'all 1s linear', }); - - // Wait for animation finished. - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); @@ -298,17 +300,17 @@ describe('Transition all', () => { container1.appendChild(document.createTextNode('DIV')); await snapshot(); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(() => { setElementStyle(container1, { transform: 'translate3d(200px, 0, 0)', transition: 'all 1s linear', }); - // Wait for animation finished. - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transform-matrix.ts b/integration_tests/specs/css/css-transitions/transform-matrix.ts index 98310383ef..06e692793d 100644 --- a/integration_tests/specs/css/css-transitions/transform-matrix.ts +++ b/integration_tests/specs/css/css-transitions/transform-matrix.ts @@ -14,16 +14,16 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'matrix(0,1,1,1,10,10)', }); - // Wait for animation finished. - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -44,15 +44,16 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'matrix3d(0,1,1,1,10,10,1,0,0,1,1,1,1,1,0)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transform-origin.ts b/integration_tests/specs/css/css-transitions/transform-origin.ts index f4aa800517..c8ecee535b 100644 --- a/integration_tests/specs/css/css-transitions/transform-origin.ts +++ b/integration_tests/specs/css/css-transitions/transform-origin.ts @@ -14,21 +14,20 @@ describe('Transition transform origin', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { - transform: 'rotateZ(0.6turn)', transformOrigin: '10px 10px', + transform: 'rotateZ(0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); -}); -describe('Transition transform origin', () => { it('percent', done => { const container1 = document.createElement('div'); document.body.appendChild(container1); @@ -44,16 +43,17 @@ describe('Transition transform origin', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { - transform: 'rotateZ(0.6turn)', transformOrigin: '80% 80%', + transform: 'rotateZ(0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -74,16 +74,17 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'rotateZ(0.1turn)', transformOrigin: 'top left', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transform-rotate.ts b/integration_tests/specs/css/css-transitions/transform-rotate.ts index 3b05189040..7b7267c280 100644 --- a/integration_tests/specs/css/css-transitions/transform-rotate.ts +++ b/integration_tests/specs/css/css-transitions/transform-rotate.ts @@ -14,15 +14,16 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'rotateZ(0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -43,15 +44,16 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'rotate3d(10, 10, 10, 0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -71,16 +73,16 @@ describe('Transition transform', () => { transitionTimingFunction: 'ease', }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'rotateX(0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -101,15 +103,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'rotateY(0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transform-scale.ts b/integration_tests/specs/css/css-transitions/transform-scale.ts index abae5984a1..19b001314d 100644 --- a/integration_tests/specs/css/css-transitions/transform-scale.ts +++ b/integration_tests/specs/css/css-transitions/transform-scale.ts @@ -14,15 +14,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'scale(2,2)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -43,15 +43,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'scale3d(2, 2, 2)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -72,15 +72,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'scaleX(2)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -101,15 +101,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'scaleY(2)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transform-skew.ts b/integration_tests/specs/css/css-transitions/transform-skew.ts index 6fd451407b..0d8252a8e4 100644 --- a/integration_tests/specs/css/css-transitions/transform-skew.ts +++ b/integration_tests/specs/css/css-transitions/transform-skew.ts @@ -14,15 +14,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'skew(0.3turn,0.6turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -43,15 +43,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'skewX(0.3turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -72,15 +72,15 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'skewY(0.3turn)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transform-translate.ts b/integration_tests/specs/css/css-transitions/transform-translate.ts index 2713a20dda..a68803fd78 100644 --- a/integration_tests/specs/css/css-transitions/transform-translate.ts +++ b/integration_tests/specs/css/css-transitions/transform-translate.ts @@ -14,15 +14,16 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'translate(10px,20px)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -43,21 +44,22 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'translate3d(10px, 10px, 20px)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); describe('Transition transform', () => { - it('translateX', async () => { + it('translateX', async (done) => { const container1 = document.createElement('div'); document.body.appendChild(container1); setElementStyle(container1, { @@ -72,14 +74,17 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'translateX(20px)', }); }); - - await snapshot(1.1); }); }); @@ -99,15 +104,16 @@ describe('Transition transform', () => { }); container1.appendChild(document.createTextNode('DIV 1')); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { transform: 'translateY(10px)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); }); @@ -137,6 +143,11 @@ describe('Multiple transition transform', () => { div.appendChild(container1); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(async () => { await snapshot(); setElementStyle(container1, { @@ -145,10 +156,6 @@ describe('Multiple transition transform', () => { setElementStyle(container1, { transform: 'translate3d(-100px, 0px, 0px)', }); - setTimeout(async () => { - await snapshot(); - done(); - }, 1000); }); }); }); diff --git a/integration_tests/specs/css/css-transitions/transition-property.ts b/integration_tests/specs/css/css-transitions/transition-property.ts index 3cf948bfbb..30fe9e2d64 100644 --- a/integration_tests/specs/css/css-transitions/transition-property.ts +++ b/integration_tests/specs/css/css-transitions/transition-property.ts @@ -10,16 +10,15 @@ describe('Transition property', () => { container1.appendChild(document.createTextNode('DIV')); await snapshot(); + container1.addEventListener('transitionend', async () => { + await snapshot(); + done(); + }); + requestAnimationFrame(() => { setElementStyle(container1, { backgroundColor: 'red', }); - - // Wait for animation finished. - setTimeout(async () => { - await snapshot(); - done(); - }, 1100); }); }); diff --git a/integration_tests/specs/dom/elements/custom-element.ts b/integration_tests/specs/dom/elements/custom-element.ts index 80581e3ab7..65fb007351 100644 --- a/integration_tests/specs/dom/elements/custom-element.ts +++ b/integration_tests/specs/dom/elements/custom-element.ts @@ -150,6 +150,31 @@ describe('custom widget element', () => { await snapshot(); }); + it('getBoundingClientRect should work with items in waterfall-flow', async (done) => { + const flutterContainer = document.createElement('waterfall-flow'); + flutterContainer.style.height = '100vh'; + flutterContainer.style.display = 'block'; + + document.body.appendChild(flutterContainer); + + const div = document.createElement('div'); + div.style.width = '100%'; + div.style.height = '100px'; + div.style.border = `1px solid red`; + + const img = document.createElement('img'); + img.src = 'https://gw.alicdn.com/tfs/TB1CxCYq5_1gK0jSZFqXXcpaXXa-128-90.png'; + div.appendChild(img); + + flutterContainer.appendChild(div); + + requestAnimationFrame(async () => { + const rect = div.getBoundingClientRect(); + expect(rect.height).toEqual(100); + done(); + }); + }); + it('flutter widget should spread out the parent node when parent node is line-block', async () => { const fluttetText = document.createElement('flutter-text'); fluttetText.setAttribute('value', 'flutter text'); diff --git a/integration_tests/specs/dom/elements/img.ts b/integration_tests/specs/dom/elements/img.ts index a1df64e758..13d5ed46ea 100644 --- a/integration_tests/specs/dom/elements/img.ts +++ b/integration_tests/specs/dom/elements/img.ts @@ -113,7 +113,7 @@ describe('Tags img', () => { }, ); BODY.appendChild(image); - + requestAnimationFrame(async () => { image.style.objectPosition = ''; await snapshot(0.1); @@ -214,6 +214,7 @@ describe('Tags img', () => { document.body.appendChild(img); img.onload = async () => { + await sleep(0.5); await snapshot(img); done(); }; @@ -236,7 +237,7 @@ describe('Tags img', () => { img.onload = async () => { window.scroll(0, 2000); - await snapshot(0.1); + await snapshot(0.5); done(); }; img.src = 'https://gw.alicdn.com/tfs/TB1CxCYq5_1gK0jSZFqXXcpaXXa-128-90.png'; @@ -259,7 +260,7 @@ describe('Tags img', () => { ); img.addEventListener('load', async () => { - await snapshot(); + await snapshot(0.5); done(); }); @@ -279,7 +280,7 @@ describe('Tags img', () => { ); img.addEventListener('load', async () => { - await snapshot(); + await snapshot(0.5); done(); }); @@ -300,7 +301,7 @@ describe('Tags img', () => { ); img.addEventListener('load', async () => { - await snapshot(); + await snapshot(0.5); done(); }); @@ -331,7 +332,7 @@ describe('Tags img', () => { }); it('gif can not replay by remove nodes', async (done) => { - const imageURL = 'assets/sample-gif-40k.gif'; + const imageURL = 'assets/10frames-1s.gif'; const img = document.createElement('img'); img.onload = async () => { diff --git a/integration_tests/specs/dom/elements/link.ts b/integration_tests/specs/dom/elements/link.ts new file mode 100644 index 0000000000..f3da0b1ee7 --- /dev/null +++ b/integration_tests/specs/dom/elements/link.ts @@ -0,0 +1,19 @@ +describe('Link Element', () => { + it('should work with remote css', async (done) => { + let link = document.createElement('link'); + link.setAttribute('href', 'https://andycall.oss-cn-beijing.aliyuncs.com/css/a-green.css'); + link.setAttribute('rel', 'stylesheet'); + + link.addEventListener('load', async () => { + await snapshot(); + done(); + }); + + document.head.appendChild(link); + + let div = document.createElement('div'); + div.className = 'a'; + div.appendChild(document.createTextNode('helloworld')); + BODY.appendChild(div); + }); +}); \ No newline at end of file diff --git a/integration_tests/specs/dom/elements/script.ts b/integration_tests/specs/dom/elements/script.ts index a633caba06..fc5b25d806 100644 --- a/integration_tests/specs/dom/elements/script.ts +++ b/integration_tests/specs/dom/elements/script.ts @@ -17,7 +17,7 @@ describe('script element', () => { script.onerror = () => { done(); }; - script.src = 'http://127.0.0.1/path/to/a/file'; + script.src = 'http://example.com/404'; }); it('async script execute in delayed order', async (done) => { @@ -37,8 +37,36 @@ describe('script element', () => { expect(window.B).toEqual('B'); // Bundle B load earlier than A. - expect(window.bundleALoadTime - window.bundleBLoadTime > 0).toEqual(true); + expect(window.bundleALoadTime - window.bundleBLoadTime >= 0).toEqual(true); done(); }; }); + + it('Waiting order for large script loaded', (done) => { + const scriptLarge = document.createElement('script'); + scriptLarge.src = 'assets:///assets/large-script.js'; + + const scriptSmall = document.createElement('script'); + scriptSmall.src = 'assets:///assets/defineA.js'; + + function waitForLoad(script) { + return new Promise((resolve) => { + script.onload = () => { + resolve(); + }; + }); + } + + document.body.appendChild(scriptLarge); + document.body.appendChild(scriptSmall); + + Promise.all([ + waitForLoad(scriptLarge), + waitForLoad(scriptSmall), + ]).then(() => { + // Bundle C load earlier than A. + expect(window.bundleALoadTime - window.bundleCLoadTime >= 0).toEqual(true); + done(); + }); + }); }); diff --git a/integration_tests/specs/dom/events/mouseEvent.ts b/integration_tests/specs/dom/events/mouseEvent.ts index 7e5c5b9d56..94d9a91cbc 100644 --- a/integration_tests/specs/dom/events/mouseEvent.ts +++ b/integration_tests/specs/dom/events/mouseEvent.ts @@ -12,8 +12,8 @@ describe('MouseEvent', () => { div.style.width = '100px'; div.style.height = '100px'; document.body.appendChild(div); - - div.addEventListener('click', e=> { + + div.addEventListener('click', e => { done(); }) div.click(); @@ -30,8 +30,8 @@ describe('MouseEvent', () => { div.style.width = '100px'; div.style.height = '100px'; document.body.appendChild(div); - - div.addEventListener('click', e=> { + + div.addEventListener('click', e => { expect(e.clientX).toBe(1.0); done(); }) @@ -44,8 +44,8 @@ describe('MouseEvent', () => { div.style.width = '100px'; div.style.height = '100px'; document.body.appendChild(div); - - div.addEventListener('click', e=> { + + div.addEventListener('click', e => { expect(e.clientY).toBe(10.0); done(); }) @@ -58,8 +58,8 @@ describe('MouseEvent', () => { div.style.width = '100px'; div.style.height = '100px'; document.body.appendChild(div); - - div.addEventListener('click', e=> { + + div.addEventListener('click', e => { expect(e.offsetX).toBe(1.0); done(); }) @@ -72,8 +72,8 @@ describe('MouseEvent', () => { div.style.width = '100px'; div.style.height = '100px'; document.body.appendChild(div); - - div.addEventListener('click', e=> { + + div.addEventListener('click', e => { expect(e.offsetY).toBe(10.0); done(); }) @@ -103,7 +103,7 @@ describe('MouseEvent', () => { expect(e.target).toBe(span); done(); }); - + await simulateClick(10.0, 10.0); }); @@ -130,7 +130,7 @@ describe('MouseEvent', () => { expect(e.currentTarget).toBe(div); done(); }); - + await simulateClick(10.0, 10.0); }); @@ -157,7 +157,7 @@ describe('MouseEvent', () => { expect(e.target).toBe(span); done(); }); - + span.click(); }); @@ -184,7 +184,7 @@ describe('MouseEvent', () => { expect(e.currentTarget).toBe(div); done(); }); - + span.click(); }); @@ -198,7 +198,7 @@ describe('MouseEvent', () => { document.addEventListener('click', function handler(e) { done(); }); - + await simulateClick(10.0, 10.0); }); @@ -212,10 +212,10 @@ describe('MouseEvent', () => { document.body.addEventListener('click', function handler(e) { done(); }); - + await simulateClick(10.0, 10.0); }); - + it('should not crash when cloneNode img element', async (done) => { const img = document.createElement('img'); img.style.width = '100px'; @@ -225,7 +225,7 @@ describe('MouseEvent', () => { const img2 = img.cloneNode(true); document.body.appendChild(img2); - img2.addEventListener('click',()=>{ + img2.addEventListener('click', () => { done(); }) @@ -237,7 +237,7 @@ describe('MouseEvent', () => { div.style.width = '100px'; div.style.height = '100px'; div.style.backgroundColor = 'red'; - div.addEventListener('dblclick', (e)=>{ + div.addEventListener('dblclick', (e) => { done(); }); document.body.appendChild(div); @@ -245,4 +245,32 @@ describe('MouseEvent', () => { await sleep(0.1); await simulateClick(10.0, 10.0, 1); }); + + it('should work with fixed node which be scolled', async (done) => { + const div = document.createElement('div') + document.body.appendChild(div) + div.style.width = '100%'; + div.style.height = '3000px'; + div.style.backgroundColor = 'red'; + + div.appendChild(document.createTextNode('aaa')); + + + const mask = document.createElement('div'); + mask.style.width = '100%'; + mask.style.height = '100vh'; + mask.style.backgroundColor = 'rgba(0, 0, 0, 0.6)'; + mask.style.position = 'fixed'; + mask.style.top = '0px'; + mask.style.left = '0px'; + document.body.appendChild(mask); + + window.scrollTo(0, '100vh'); + + mask.addEventListener('click', function handleClick() { + mask.removeEventListener('click', handleClick); + done(); + }) + await simulateClick(10.0, 10.0, 0); + }); }); diff --git a/integration_tests/specs/dom/nodes/get-element-by-class-name.ts b/integration_tests/specs/dom/nodes/get-elements-by-class-name.ts similarity index 100% rename from integration_tests/specs/dom/nodes/get-element-by-class-name.ts rename to integration_tests/specs/dom/nodes/get-elements-by-class-name.ts diff --git a/integration_tests/specs/dom/nodes/get-element-by-tag-name.ts b/integration_tests/specs/dom/nodes/get-elements-by-name.ts similarity index 100% rename from integration_tests/specs/dom/nodes/get-element-by-tag-name.ts rename to integration_tests/specs/dom/nodes/get-elements-by-name.ts diff --git a/integration_tests/specs/dom/nodes/get-elements-by-tag-name.ts b/integration_tests/specs/dom/nodes/get-elements-by-tag-name.ts new file mode 100644 index 0000000000..4ba2e78ab3 --- /dev/null +++ b/integration_tests/specs/dom/nodes/get-elements-by-tag-name.ts @@ -0,0 +1,15 @@ +/** + * Test DOM API for + * - document.getElementsByName + */ +describe('Document getElementsByName', () => { + it('basic test', () => { + const element = document.createElement('div'); + element.setAttribute('name', 'foo'); + document.body.appendChild(element); + + const nodeList = document.getElementsByName('foo'); + expect(nodeList.length).toBe(1); + expect(nodeList[0]).toEqual(element); + }); +}); diff --git a/integration_tests/specs/fetch/fetch.ts b/integration_tests/specs/fetch/fetch.ts index 59cbf7e268..3595ed49db 100644 --- a/integration_tests/specs/fetch/fetch.ts +++ b/integration_tests/specs/fetch/fetch.ts @@ -397,7 +397,7 @@ describe('Response', function() { describe('json', () => { it('parses json response', function() { - return fetch('https://kraken.oss-cn-hangzhou.aliyuncs.com/data/data.json') + return fetch('https://andycall.oss-cn-beijing.aliyuncs.com/data/data.json') .then(function(response) { return response.json(); }) @@ -427,7 +427,7 @@ describe('Response', function() { describe('text', function() { it('resolves text promise', function() { - return fetch('https://kraken.oss-cn-hangzhou.aliyuncs.com/data/data.json') + return fetch('https://andycall.oss-cn-beijing.aliyuncs.com/data/data.json') .then(function(response) { return response.text(); }) diff --git a/integration_tests/specs/geolocation/getCurrentPosition.ts b/integration_tests/specs/geolocation/getCurrentPosition.ts deleted file mode 100644 index ef646753e2..0000000000 --- a/integration_tests/specs/geolocation/getCurrentPosition.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Authority require, which will pending tests, disable it. -xdescribe('Geolocation', () => { - it('getCurrentPosition', done => { - navigator.geolocation.getCurrentPosition( - position => { - expect(typeof position.coords).toBe('object'); - done(); - }, - err => { - done.fail(); - } - ); - }); -}); diff --git a/integration_tests/specs/navigator/navigator.ts b/integration_tests/specs/navigator/navigator.ts index 01ebf450a5..3830100acc 100644 --- a/integration_tests/specs/navigator/navigator.ts +++ b/integration_tests/specs/navigator/navigator.ts @@ -22,14 +22,13 @@ describe('Navigator', () => { }); it('language', async () => { + console.log(navigator.languages); expect(navigator.language).toBeDefined(); - expect(navigator.language.includes('-')).toBeTrue(); }); it('languages', async () => { expect(navigator.languages instanceof Array).toBeTrue(); expect(navigator.languages[0]).toBeDefined(); - expect(navigator.languages[0].includes('-')).toBeTrue(); }); it('userAgent', () => { diff --git a/integration_tests/specs/plugins/iframe.ts b/integration_tests/specs/plugins/iframe.ts deleted file mode 100644 index 6525b35bb9..0000000000 --- a/integration_tests/specs/plugins/iframe.ts +++ /dev/null @@ -1,27 +0,0 @@ -describe('IframeElement', () => { - it('basic', async () => { - const iframe = document.createElement('iframe'); - iframe.setAttribute( - 'src', - 'https://dev.g.alicdn.com/kraken/kraken-demos/todomvc/build/web/index.html' - ); - iframe.style.width = '360px'; - iframe.style.height = '375px'; - - const div = document.createElement('div'); - div.style.width = div.style.height = '200px'; - div.style.backgroundColor = 'cyan'; - document.body.appendChild(div); - document.body.appendChild(iframe); - - const div2 = document.createElement('div'); - div2.style.width = div2.style.height = '100px'; - div2.style.backgroundColor = 'red'; - document.body.appendChild(div2); - - // There are no load event fired at desktop kraken. - // MOCK async logic. - await sleep(2); - await snapshot(); - }); -}); diff --git a/integration_tests/specs/timer/timer.ts b/integration_tests/specs/timer/timer.ts index be82adc51c..59b1fab6d4 100644 --- a/integration_tests/specs/timer/timer.ts +++ b/integration_tests/specs/timer/timer.ts @@ -4,7 +4,7 @@ describe('setTimeout', () => { setTimeout(() => { const duration = Date.now() - startTime; // 20ms delay accepted - expect(duration - 100).toBeLessThanOrEqual(40); + expect(duration - 100).toBeLessThanOrEqual(100); done(); }, 100); }); diff --git a/integration_tests/specs/xhr/xhr.ts b/integration_tests/specs/xhr/xhr.ts index 96799d624a..8a7bebbfa8 100644 --- a/integration_tests/specs/xhr/xhr.ts +++ b/integration_tests/specs/xhr/xhr.ts @@ -31,7 +31,7 @@ describe('XMLHttpRequest', () => { done(); } }; - xhr.open('GET', 'https://kraken.oss-cn-hangzhou.aliyuncs.com/data/foo.json', true); + xhr.open('GET', 'https://andycall.oss-cn-beijing.aliyuncs.com/data/foo.json', true); xhr.setRequestHeader('Accept', 'application/json'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(); @@ -66,7 +66,7 @@ describe('XMLHttpRequest', () => { done(); } }; - xhr.open('POST', 'https://kraken.oss-cn-hangzhou.aliyuncs.com/data/data.json', true); + xhr.open('POST', 'https://andycall.oss-cn-beijing.aliyuncs.com/data/data.json', true); xhr.setRequestHeader('Accept', 'application/json'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('foobar'); diff --git a/integration_tests/webpack.config.js b/integration_tests/webpack.config.js index 61813e5dd8..55c0ee0a91 100644 --- a/integration_tests/webpack.config.js +++ b/integration_tests/webpack.config.js @@ -9,12 +9,32 @@ const resetRuntimePath = path.join(context, 'runtime/reset'); const buildPath = path.join(context, '.specs'); const testPath = path.join(context, 'specs'); const snapshotPath = path.join(context, 'snapshots'); -const coreSpecFiles = glob.sync('specs/**/*.{js,jsx,ts,tsx,html}', { - cwd: context, - ignore: ['node_modules/**'], -}).map((file) => './' + file).filter(name => name.indexOf('plugins') < 0); +const specGroup = require('./spec_group.json'); + +let coreSpecFiles = []; + +if (process.env.SPEC_SCOPE) { + let targetSpec = specGroup.find((item) => item.name === process.env.SPEC_SCOPE.trim()); + if (targetSpec) { + let targetSpecCollection = targetSpec.specs; + targetSpecCollection.forEach(spec => { + let files = glob.sync(spec, { + cwd: context, + ignore: ['node_modules/**'], + }).map((file) => './' + file); + coreSpecFiles = coreSpecFiles.concat(files); + }); + } else { + throw new Error('Unknown target spec scope: ' + process.env.SPEC_SCOPE); + } +} else { + coreSpecFiles = glob.sync('specs/**/*.{js,jsx,ts,tsx,html}', { + cwd: context, + ignore: ['node_modules/**'], + }).map((file) => './' + file).filter(name => name.indexOf('plugins') < 0) +} -const pluginSpecFiles = glob.sync('specs/plugins/**/*.{js,jsx,ts,tsx}', { +const pluginSpecFiles = glob.sync('specs/plugins/**/*.{js,jsx,ts,tsx}', { cwd: context, ignore: 'node_modules/**', }).map((file) => './' + file); diff --git a/kraken/lib/src/css/content_visibility.dart b/kraken/lib/src/css/content_visibility.dart index 269a0d5140..0f19adae2e 100644 --- a/kraken/lib/src/css/content_visibility.dart +++ b/kraken/lib/src/css/content_visibility.dart @@ -25,10 +25,9 @@ mixin CSSContentVisibilityMixin on RenderStyle { /// If ContentVisibility.auto, the framework will compute the intersection bounds and not to paint when child renderObject /// are no longer intersection with this renderObject. @override - ContentVisibility? get contentVisibility => _contentVisibility; + ContentVisibility get contentVisibility => _contentVisibility ?? ContentVisibility.visible; ContentVisibility? _contentVisibility; set contentVisibility(ContentVisibility? value) { - if (value == null) return; if (value == _contentVisibility) return; _contentVisibility = value; renderBoxModel?.markNeedsPaint(); diff --git a/kraken/lib/src/css/overflow.dart b/kraken/lib/src/css/overflow.dart index 58a5467db4..b780744828 100644 --- a/kraken/lib/src/css/overflow.dart +++ b/kraken/lib/src/css/overflow.dart @@ -3,6 +3,7 @@ */ import 'package:flutter/animation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'package:kraken/css.dart'; import 'package:kraken/dom.dart'; @@ -131,17 +132,20 @@ mixin ElementOverflowMixin on ElementBase { RenderBoxModel renderBoxModel = this.renderBoxModel!; CSSOverflowType overflowX = renderStyle.effectiveOverflowX; switch(overflowX) { - case CSSOverflowType.hidden: - // @TODO: Content of overflow hidden can be scrolled programmatically. - _scrollableX = null; - break; case CSSOverflowType.clip: _scrollableX = null; break; + case CSSOverflowType.hidden: case CSSOverflowType.auto: case CSSOverflowType.scroll: - _scrollableX = KrakenScrollable(axisDirection: AxisDirection.right, scrollListener: scrollListener); - renderBoxModel.scrollOffsetX = _scrollableX!.position; + // If the render has been offset when previous overflow is auto or scroll, _scrollableX should not reset. + if (_scrollableX == null) { + _scrollableX = KrakenScrollable(axisDirection: AxisDirection.right, scrollListener: scrollListener); + renderBoxModel.scrollOffsetX = _scrollableX!.position; + } + // Reset canDrag by overflow because hidden is can't drag. + bool canDrag = overflowX != CSSOverflowType.hidden; + _scrollableX!.setCanDrag(canDrag); break; case CSSOverflowType.visible: default: @@ -163,17 +167,20 @@ mixin ElementOverflowMixin on ElementBase { RenderBoxModel renderBoxModel = this.renderBoxModel!; CSSOverflowType overflowY = renderStyle.effectiveOverflowY; switch(overflowY) { - case CSSOverflowType.hidden: - // @TODO: Content of overflow hidden can be scrolled programmatically. - _scrollableY = null; - break; case CSSOverflowType.clip: _scrollableY = null; break; + case CSSOverflowType.hidden: case CSSOverflowType.auto: case CSSOverflowType.scroll: - _scrollableY = KrakenScrollable(axisDirection: AxisDirection.down, scrollListener: scrollListener); - renderBoxModel.scrollOffsetY = _scrollableY!.position; + // If the render has been offset when previous overflow is auto or scroll, _scrollableY should not reset. + if (_scrollableY == null) { + _scrollableY = KrakenScrollable(axisDirection: AxisDirection.down, scrollListener: scrollListener); + renderBoxModel.scrollOffsetY = _scrollableY!.position; + } + // Reset canDrag by overflow because hidden is can't drag. + bool canDrag = overflowY != CSSOverflowType.hidden; + _scrollableY!.setCanDrag(canDrag); break; case CSSOverflowType.visible: default: @@ -332,12 +339,11 @@ mixin ElementOverflowMixin on ElementBase { void _scrollablePointerListener(PointerEvent event) { if (event is PointerDownEvent) { - if (_scrollableX != null) { - _scrollableX!.handlePointerDown(event); - } - if (_scrollableY != null) { - _scrollableY!.handlePointerDown(event); - } + _scrollableX?.handlePointerDown(event); + _scrollableY?.handlePointerDown(event); + } else if (event is PointerSignalEvent) { + _scrollableX?.handlePinterSignal(event); + _scrollableY?.handlePinterSignal(event); } } diff --git a/kraken/lib/src/css/position.dart b/kraken/lib/src/css/position.dart index c30764f017..7dd7898576 100644 --- a/kraken/lib/src/css/position.dart +++ b/kraken/lib/src/css/position.dart @@ -86,18 +86,17 @@ mixin CSSPositionMixin on RenderStyle { _markParentNeedsPaint(); } - CSSPositionType _position = DEFAULT_POSITION_TYPE; @override - CSSPositionType get position => _position; - - set position(CSSPositionType value) { + CSSPositionType get position => _position ?? DEFAULT_POSITION_TYPE; + CSSPositionType? _position; + set position(CSSPositionType? value) { if (_position == value) return; _position = value; // Position effect the stacking context. _markNeedsSort(); - _markParentNeedsLayout(); + _markParentNeedsLayout(force: true); // Position change may affect transformed display // https://www.w3.org/TR/css-display-3/#transformations @@ -114,13 +113,15 @@ mixin CSSPositionMixin on RenderStyle { } } - void _markParentNeedsLayout() { + // Mark parent render object to layout. + // If force to true, ignoring current position type judgement of static, useful for updating position type. + void _markParentNeedsLayout({ bool force = false }) { // Should mark positioned element's containing block needs layout directly // cause RelayoutBoundary of positioned element will prevent the needsLayout flag // to bubble up in the RenderObject tree. if (renderBoxModel?.parentData is RenderLayoutParentData) { RenderStyle renderStyle = renderBoxModel!.renderStyle; - if (renderStyle.position != DEFAULT_POSITION_TYPE) { + if (force || renderStyle.position != DEFAULT_POSITION_TYPE) { AbstractNode? parent = renderBoxModel!.parent; if (parent is RenderObject) { parent.markNeedsLayout(); diff --git a/kraken/lib/src/css/positioned.dart b/kraken/lib/src/css/positioned.dart index 9d0c3cab96..b2f2835567 100644 --- a/kraken/lib/src/css/positioned.dart +++ b/kraken/lib/src/css/positioned.dart @@ -27,13 +27,13 @@ Offset? _getRenderPositionHolderScrollOffset(RenderPositionPlaceholder holder, R } // Get the offset of the RenderPlaceholder of positioned element to its parent RenderBoxModel. -Offset _getPlaceholderToParentOffset(RenderPositionPlaceholder placeholder, RenderBoxModel parent) { - if (!placeholder.attached) { +Offset _getPlaceholderToParentOffset(RenderPositionPlaceholder? placeholder, RenderBoxModel parent) { + if (placeholder == null || !placeholder.attached) { return Offset.zero; } Offset positionHolderScrollOffset = _getRenderPositionHolderScrollOffset(placeholder, parent) ?? Offset.zero; // Offset of positioned element should exclude scroll offset to its containing block. - Offset toParentOffset = placeholder.getOffsetToAncestor(parent, excludeScrollOffset: true); + Offset toParentOffset = placeholder.getOffsetToAncestor(Offset.zero, parent, excludeScrollOffset: true); Offset placeholderOffset = positionHolderScrollOffset + toParentOffset; return placeholderOffset; @@ -363,7 +363,7 @@ class CSSPositionedLayout { // The static position of positioned element is its offset when its position property had been static // which equals to the position of its placeholder renderBox. // https://www.w3.org/TR/CSS2/visudet.html#static-position - Offset staticPositionOffset = _getPlaceholderToParentOffset(child.renderPositionPlaceholder!, parent); + Offset staticPositionOffset = _getPlaceholderToParentOffset(child.renderPositionPlaceholder, parent); double x = _computePositionedOffset( Axis.horizontal, diff --git a/kraken/lib/src/css/render_style.dart b/kraken/lib/src/css/render_style.dart index cb87314a18..ec8b4c1b57 100644 --- a/kraken/lib/src/css/render_style.dart +++ b/kraken/lib/src/css/render_style.dart @@ -145,7 +145,7 @@ abstract class RenderStyle { // Misc double get opacity; Visibility get visibility; - ContentVisibility? get contentVisibility; + ContentVisibility get contentVisibility; VerticalAlign get verticalAlign; BoxFit get objectFit; bool get isHeightStretch; @@ -437,7 +437,6 @@ class CSSRenderStyle case MARGIN_TOP: case MARGIN_RIGHT: case MARGIN_BOTTOM: - case FONT_SIZE: value = CSSLength.resolveLength(propertyValue, renderStyle, propertyName); break; case FLEX_DIRECTION: @@ -557,6 +556,9 @@ class CSSRenderStyle case FONT_WEIGHT: value = CSSText.resolveFontWeight(propertyValue); break; + case FONT_SIZE: + value = CSSText.resolveFontSize(propertyValue, renderStyle, propertyName); + break; case FONT_STYLE: value = CSSText.resolveFontStyle(propertyValue); break; @@ -638,7 +640,22 @@ class CSSRenderStyle RenderStyle? ancestorRenderStyle = _findAncestorWithNoDisplayInline(); // Should ignore renderStyle of display inline when searching for ancestors to stretch width. if (ancestorRenderStyle != null) { - logicalWidth = ancestorRenderStyle.contentBoxLogicalWidth; + // If parentElement is WidgetElement, should not search for ancestors and get maxWidth of constraints for logicalWidth. + RenderObject? renderObject = renderBoxModel!.parent as RenderObject; + + + if (ancestorRenderStyle.target.renderObjectManagerType == RenderObjectManagerType.FLUTTER_ELEMENT && renderObject is RenderBox) { + try { + // When renderObject has not layouted, get constraints will trigger assert. + // Such as image resize will get _styleWidth and call this function before layout. + logicalWidth = renderObject.constraints.maxWidth; + } catch(e) { + logicalWidth = ancestorRenderStyle.contentBoxLogicalWidth; + } + } else { + logicalWidth = ancestorRenderStyle.contentBoxLogicalWidth; + } + // Should subtract horizontal margin of own from its parent content width. if (logicalWidth != null) { logicalWidth -= renderStyle.margin.horizontal; @@ -1126,7 +1143,8 @@ class CSSRenderStyle RenderStyle renderStyle = this; RenderStyle? parentRenderStyle = renderStyle.parent; while(parentRenderStyle != null) { - if (parentRenderStyle.effectiveDisplay != CSSDisplay.inline) { + // If ancestor element is WidgetElement, should return it because should get maxWidth of constraints for logicalWidth. + if (parentRenderStyle.effectiveDisplay != CSSDisplay.inline || parentRenderStyle.target.renderObjectManagerType == RenderObjectManagerType.FLUTTER_ELEMENT) { break; } parentRenderStyle = parentRenderStyle.parent; diff --git a/kraken/lib/src/css/style_property.dart b/kraken/lib/src/css/style_property.dart index 96d5530b8f..c2299a52ec 100644 --- a/kraken/lib/src/css/style_property.dart +++ b/kraken/lib/src/css/style_property.dart @@ -577,7 +577,7 @@ class CSSStyleProperty { ) { weight = value; } else if (size == null - && (isValueVariableFunction || CSSLength.isNonNegativeLength(value)) + && (isValueVariableFunction || CSSText.isValidFontSizeValue(value)) ) { size = value; } else if (value == '/') { diff --git a/kraken/lib/src/css/text.dart b/kraken/lib/src/css/text.dart index 150e45fe2f..fa5f9ce16c 100644 --- a/kraken/lib/src/css/text.dart +++ b/kraken/lib/src/css/text.dart @@ -516,6 +516,20 @@ class CSSText { } } + static bool isValidFontSizeValue(String value) { + return CSSLength.isNonNegativeLength(value) || + value == 'xx-small' || + value == 'x-small' || + value == 'small' || + value == 'medium' || + value == 'large' || + value == 'x-large' || + value == 'xx-large' || + value == 'xxx-large' || + value == 'larger' || + value == 'smaller'; + } + static bool isValidLineHeightValue(String value) { return CSSLength.isNonNegativeLength(value) || CSSPercentage.isNonNegativePercentage(value) || value == 'normal' || double.tryParse(value) != null; @@ -658,6 +672,37 @@ class CSSText { } } + // https://drafts.csswg.org/css-fonts/#absolute-size-mapping + static CSSLengthValue resolveFontSize( + String fontSize, RenderStyle renderStyle, String propertyName) { + switch (fontSize) { + case 'xx-small': + return CSSLengthValue(3 / 5 * 16, CSSLengthType.PX); + case 'x-small': + return CSSLengthValue(3 / 4 * 16, CSSLengthType.PX); + case 'small': + return CSSLengthValue(8 / 9 * 16, CSSLengthType.PX); + case 'medium': + return CSSLengthValue(16, CSSLengthType.PX); + case 'large': + return CSSLengthValue(6 / 5 * 16, CSSLengthType.PX); + case 'x-large': + return CSSLengthValue(3 / 2 * 16, CSSLengthType.PX); + case 'xx-large': + return CSSLengthValue(2 / 1 * 16, CSSLengthType.PX); + case 'xxx-large': + return CSSLengthValue(3 / 1 * 16, CSSLengthType.PX); + case 'smaller': + return CSSLengthValue( + 5 / 6, CSSLengthType.EM, renderStyle, propertyName); + case 'larger': + return CSSLengthValue( + 6 / 5, CSSLengthType.EM, renderStyle, propertyName); + default: + return CSSLength.parseLength(fontSize, renderStyle, propertyName); + } + } + static FontStyle resolveFontStyle(String? fontStyle) { switch (fontStyle) { case 'oblique': diff --git a/kraken/lib/src/css/transition.dart b/kraken/lib/src/css/transition.dart index 521fe99d46..5b8231d584 100644 --- a/kraken/lib/src/css/transition.dart +++ b/kraken/lib/src/css/transition.dart @@ -2,12 +2,10 @@ * Copyright (C) 2021-present The Kraken authors. All rights reserved. */ -import 'dart:ui'; - +import 'package:flutter/rendering.dart'; import 'package:flutter/animation.dart' show Curve; import 'package:kraken/css.dart'; import 'package:kraken/dom.dart'; -import 'package:vector_math/vector_math_64.dart'; // CSS Transitions: https://drafts.csswg.org/css-transitions/ const String _0s = '0s'; @@ -107,12 +105,23 @@ void _updateTransform(Matrix4 begin, Matrix4 end, double t, String property, CSS renderStyle.transformMatrix = newMatrix4; } +CSSOrigin? _parseTransformOrigin(String value, RenderStyle renderStyle, String property) { + return CSSOrigin.parseOrigin(value, renderStyle, property); +} + +void _updateTransformOrigin(CSSOrigin begin, CSSOrigin end, double progress, String property, CSSRenderStyle renderStyle) { + Offset offset = begin.offset + (end.offset - begin.offset) * progress; + Alignment alignment = begin.alignment + (end.alignment - begin.alignment) * progress; + renderStyle.transformOrigin = CSSOrigin(offset, alignment); +} + const List _colorHandler = [_parseColor, _updateColor]; const List _lengthHandler = [_parseLength, _updateLength]; const List _fontWeightHandler = [_parseFontWeight, _updateFontWeight]; const List _numberHandler = [_parseNumber, _updateNumber]; const List _lineHeightHandler = [_parseLineHeight, _updateLineHeight]; const List _transformHandler = [_parseTransform, _updateTransform]; +const List _transformOriginHandler = [_parseTransformOrigin, _updateTransformOrigin]; Map> CSSTransitionHandlers = { COLOR: _colorHandler, @@ -130,6 +139,7 @@ Map> CSSTransitionHandlers = { FONT_WEIGHT: _fontWeightHandler, LINE_HEIGHT: _lineHeightHandler, TRANSFORM: _transformHandler, + TRANSFORM_ORIGIN: _transformOriginHandler, BORDER_BOTTOM_LEFT_RADIUS: _lengthHandler, BORDER_BOTTOM_RIGHT_RADIUS: _lengthHandler, BORDER_TOP_LEFT_RADIUS: _lengthHandler, diff --git a/kraken/lib/src/css/value.dart b/kraken/lib/src/css/value.dart index 18f52bf336..f9c85bb4a6 100644 --- a/kraken/lib/src/css/value.dart +++ b/kraken/lib/src/css/value.dart @@ -46,6 +46,7 @@ Map CSSInitialValues = { TOP: AUTO, TEXT_SHADOW: '0px 0px 0px transparent', TRANSFORM: 'matrix3d(${CSSMatrix.initial.storage.join(',')})', + TRANSFORM_ORIGIN: '50% 50% 0', VERTICAL_ALIGN: ZERO, VISIBILITY: VISIBLE, WORD_SPACING: NORMAL, diff --git a/kraken/lib/src/dom/document.dart b/kraken/lib/src/dom/document.dart index 18764a6cc2..ad08a6e3e9 100644 --- a/kraken/lib/src/dom/document.dart +++ b/kraken/lib/src/dom/document.dart @@ -92,19 +92,19 @@ class Document extends Node { RenderViewportBox? viewport = _viewport; // When document is disposed, viewport is null. - if (viewport == null) return; - - if (element != null) { - element.attachTo(this); - // Should scrollable. - element.setRenderStyleProperty(OVERFLOW_X, CSSOverflowType.scroll); - element.setRenderStyleProperty(OVERFLOW_Y, CSSOverflowType.scroll); - // Init with viewport size. - element.renderStyle.width = CSSLengthValue(viewport.viewportSize.width, CSSLengthType.PX); - element.renderStyle.height = CSSLengthValue(viewport.viewportSize.height, CSSLengthType.PX); - } else { - // Detach document element. - viewport.child = null; + if (viewport != null) { + if (element != null) { + element.attachTo(this); + // Should scrollable. + element.setRenderStyleProperty(OVERFLOW_X, CSSOverflowType.scroll); + element.setRenderStyleProperty(OVERFLOW_Y, CSSOverflowType.scroll); + // Init with viewport size. + element.renderStyle.width = CSSLengthValue(viewport.viewportSize.width, CSSLengthType.PX); + element.renderStyle.height = CSSLengthValue(viewport.viewportSize.height, CSSLengthType.PX); + } else { + // Detach document element. + viewport.child = null; + } } _documentElement = element; diff --git a/kraken/lib/src/dom/element.dart b/kraken/lib/src/dom/element.dart index 21a03b924d..ec839b038c 100644 --- a/kraken/lib/src/dom/element.dart +++ b/kraken/lib/src/dom/element.dart @@ -499,8 +499,9 @@ abstract class Element renderBoxModel.clearIntersectionChangeListeners(); // Remove fixed children from root when element disposed. - _removeFixedChild(renderBoxModel, ownerDocument.documentElement!._renderLayoutBox!); - + if (ownerDocument.viewport != null) { + _removeFixedChild(renderBoxModel, ownerDocument.viewport!); + } // Remove renderBox. renderBoxModel.detachFromContainingBlock(); @@ -540,10 +541,10 @@ abstract class Element /// Normally element in scroll box will not repaint on scroll because of repaint boundary optimization /// So it needs to manually mark element needs paint and add scroll offset in paint stage void _applyFixedChildrenOffset(double scrollOffset, AxisDirection axisDirection) { - // Only root element has fixed children - if (this == ownerDocument.documentElement && renderBoxModel != null) { - RenderBoxModel layoutBox = (renderBoxModel as RenderLayoutBox).renderScrollingContent ?? renderBoxModel!; - for (RenderBoxModel child in layoutBox.fixedChildren) { + RenderViewportBox? viewport = ownerDocument.viewport; + // Only root element has fixed children. + if (this == ownerDocument.documentElement && viewport != null) { + for (RenderBoxModel child in viewport.fixedChildren) { // Save scrolling offset for paint if (axisDirection == AxisDirection.down) { child.scrollingOffsetY = scrollOffset; @@ -556,7 +557,7 @@ abstract class Element // Calculate sticky status according to scroll offset and scroll direction void _applyStickyChildrenOffset() { - RenderLayoutBox? scrollContainer = (renderBoxModel as RenderLayoutBox?)!; + RenderLayoutBox scrollContainer = renderBoxModel as RenderLayoutBox; for (RenderBoxModel stickyChild in scrollContainer.stickyChildren) { CSSPositionedLayout.applyStickyChildOffset(scrollContainer, stickyChild); } @@ -646,7 +647,7 @@ abstract class Element RenderBoxModel _renderBoxModel = renderBoxModel!; // Remove fixed children before convert to non repaint boundary renderObject if (currentPosition != CSSPositionType.fixed) { - _removeFixedChild(_renderBoxModel, ownerDocument.documentElement!._renderLayoutBox!); + _removeFixedChild(_renderBoxModel, ownerDocument.viewport!); } // Find the renderBox of its containing block. @@ -665,7 +666,7 @@ abstract class Element // Add fixed children after convert to repaint boundary renderObject. if (currentPosition == CSSPositionType.fixed) { - _addFixedChild(renderBoxModel!, ownerDocument.documentElement!._renderLayoutBox!); + _addFixedChild(renderBoxModel!, ownerDocument.viewport!); } } @@ -747,7 +748,11 @@ abstract class Element void attachTo(Node parent, {RenderBox? after}) { applyStyle(style); - if (!_obtainSliverChild()) { + if (_obtainSliverChild()) { + // Rebuild all the sliver children. + RenderLayoutBox? parentRenderBoxModel = parentElement!.renderBoxModel as RenderLayoutBox?; + parentRenderBoxModel?.removeAll(); + } else { willAttachRenderer(); } @@ -766,7 +771,7 @@ abstract class Element /// Unmount [renderBoxModel]. @override - void unmountRenderObject({ bool deep = true, bool keepFixedAlive = false }) { + void unmountRenderObject({ bool deep = true, bool keepFixedAlive = false, bool dispose = true }) { // Ignore the fixed element to unmount render object. // It's useful for sliver manager to unmount child render object, but excluding fixed elements. if (keepFixedAlive && renderStyle.position == CSSPositionType.fixed) { @@ -783,7 +788,10 @@ abstract class Element } didDetachRenderer(); - renderBoxModel?.dispose(); + if (dispose) { + renderBoxModel?.dispose(); + } + renderBoxModel = null; } @@ -1560,7 +1568,7 @@ abstract class Element if (ancestor == null || ancestor.renderBoxModel == null) { return Offset.zero; } - return renderBox.getOffsetToAncestor(ancestor.renderBoxModel!); + return renderBox.getOffsetToAncestor(Offset.zero, ancestor.renderBoxModel!); } void click() { @@ -1656,18 +1664,16 @@ Element? _findContainingBlock(Element child, Element viewportElement) { } // Cache fixed renderObject to root element -void _addFixedChild(RenderBoxModel childRenderBoxModel, RenderLayoutBox rootRenderLayoutBox) { - rootRenderLayoutBox = rootRenderLayoutBox.renderScrollingContent ?? rootRenderLayoutBox; - List fixedChildren = rootRenderLayoutBox.fixedChildren; +void _addFixedChild(RenderBoxModel childRenderBoxModel, RenderViewportBox viewport) { + List fixedChildren = viewport.fixedChildren; if (!fixedChildren.contains(childRenderBoxModel)) { fixedChildren.add(childRenderBoxModel); } } // Remove non fixed renderObject from root element -void _removeFixedChild(RenderBoxModel childRenderBoxModel, RenderLayoutBox rootRenderLayoutBox) { - rootRenderLayoutBox = rootRenderLayoutBox.renderScrollingContent ?? rootRenderLayoutBox; - List fixedChildren = rootRenderLayoutBox.fixedChildren; +void _removeFixedChild(RenderBoxModel childRenderBoxModel, RenderViewportBox viewport) { + List fixedChildren = viewport.fixedChildren; if (fixedChildren.contains(childRenderBoxModel)) { fixedChildren.remove(childRenderBoxModel); } diff --git a/kraken/lib/src/dom/elements/head.dart b/kraken/lib/src/dom/elements/head.dart index 71b8ac31ce..70eec0bfd4 100644 --- a/kraken/lib/src/dom/elements/head.dart +++ b/kraken/lib/src/dom/elements/head.dart @@ -32,7 +32,7 @@ class LinkElement extends Element { LinkElement([BindingContext? context]) : super(context, defaultStyle: _defaultStyle); Uri? _resolvedHyperlink; - + final Map _stylesheetLoaded = {}; // Bindings. @override @@ -81,7 +81,10 @@ class LinkElement extends Element { set href(String value) { internalSetAttribute('href', value); _resolveHyperlink(); - _fetchAndApplyCSSStyle(); + // Should waiting for all properties had set up. + Future.microtask(() { + _fetchAndApplyCSSStyle(); + }); } String get rel => getAttribute('rel') ?? ''; @@ -108,9 +111,10 @@ class LinkElement extends Element { } void _fetchAndApplyCSSStyle() async { - if (_resolvedHyperlink != null && rel == _REL_STYLESHEET && isConnected) { + if (_resolvedHyperlink != null && rel == _REL_STYLESHEET && isConnected && !_stylesheetLoaded.containsKey(_resolvedHyperlink.toString())) { String url = _resolvedHyperlink.toString(); KrakenBundle bundle = KrakenBundle.fromUrl(url); + _stylesheetLoaded[url] = true; try { // Increment count when request. ownerDocument.incrementRequestCount(); diff --git a/kraken/lib/src/dom/elements/html.dart b/kraken/lib/src/dom/elements/html.dart index 19d1222c90..6017295d65 100644 --- a/kraken/lib/src/dom/elements/html.dart +++ b/kraken/lib/src/dom/elements/html.dart @@ -27,4 +27,22 @@ class HTMLElement extends Element { } super.dispatchEvent(event); } + + @override + void setRenderStyle(String property, String present) { + switch (property) { + // Visible should be interpreted as auto and clip should be interpreted as hidden when overflow apply to html. + // https://drafts.csswg.org/css-overflow-3/#overflow-propagation + case OVERFLOW: + case OVERFLOW_X: + case OVERFLOW_Y: + if (present == VISIBLE || present == '') { + present = AUTO; + } else if (present == CLIP) { + present = HIDDEN; + } + break; + } + super.setRenderStyle(property, present); + } } diff --git a/kraken/lib/src/dom/elements/img.dart b/kraken/lib/src/dom/elements/img.dart index cbb9097e3d..3860c2bd62 100644 --- a/kraken/lib/src/dom/elements/img.dart +++ b/kraken/lib/src/dom/elements/img.dart @@ -12,7 +12,6 @@ import 'package:kraken/foundation.dart'; import 'package:kraken/painting.dart'; import 'package:kraken/rendering.dart'; - const String IMAGE = 'IMG'; const String NATURAL_WIDTH = 'naturalWidth'; const String NATURAL_HEIGHT = 'naturalHeight'; @@ -31,14 +30,13 @@ class ImageElement extends Element { // The render box to draw image. KrakenRenderImage? _renderImage; - ui.ImageDescriptor? _currentImageDescriptor; ImageProvider? _currentImageProvider; ImageStream? _cachedImageStream; ImageInfo? _cachedImageInfo; - _ImageRequest? _currentRequest; - _ImageRequest? _pendingRequest; + ImageRequest? _currentRequest; + ImageRequest? _pendingRequest; // Current image source. Uri? _resolvedUri; @@ -51,12 +49,10 @@ class ImageElement extends Element { bool _isListeningStream = false; - bool get _isInLazyLoading { - RenderReplaced? renderReplaced; - if (renderBoxModel != null) { - renderReplaced = renderBoxModel as RenderReplaced; - } - return renderReplaced != null && renderReplaced.isInLazyRendering; + // Useful for img to operate RenderPlaced is in lazy rendering. + bool get _isInLazyLoading => (renderBoxModel as RenderReplaced?)?.isInLazyRendering == true; + set _isInLazyRendering(bool value) { + (renderBoxModel as RenderReplaced?)?.isInLazyRendering = value; } // https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-complete-dev @@ -149,19 +145,8 @@ class ImageElement extends Element { @override void didAttachRenderer() { super.didAttachRenderer(); - // Should add image box after style has applied to ensure intersection observer - // attached to correct renderBoxModel - if (!_isInLazyLoading || _renderImage == null) { - // Image dimensions (width or height) should specified for performance when lazy-load. - if (_shouldLazyLoading) { - RenderReplaced renderReplaced = renderBoxModel! as RenderReplaced; - renderReplaced.isInLazyRendering = true; - - // When detach renderer, all listeners will be cleared. - renderReplaced.addIntersectionChangeListener(_handleIntersectionChange); - } else { - _loadImage(); - } + if (_resolvedUri != null) { + _updateImageData(); } } @@ -169,8 +154,6 @@ class ImageElement extends Element { _constructImage(); // Try to attach image if image is cached. _attachImage(); - _decode(); - _listenToStream(); } @override @@ -178,17 +161,30 @@ class ImageElement extends Element { super.didDetachRenderer(); style.removeStyleChangeListener(_stylePropertyChanged); + // Stop and remove image stream reference. _stopListeningStream(keepStreamAlive: true); + _cachedImageStream = null; - _currentImageProvider?.evict(); - _currentImageProvider = null; + // Dispose [ImageStreamCompleter]. + _completerHandle?.dispose(); + _completerHandle = null; - _cachedImageInfo?.dispose(); + // Remove cached image info. _cachedImageInfo = null; - _renderImage?.dispose(); - _renderImage = null; + // Dispose render object. + _dropChild(); + } + + // Drop the current [RenderImage] off to render replaced. + void _dropChild() { + if (renderBoxModel != null) { + RenderReplaced renderReplaced = renderBoxModel as RenderReplaced; + renderReplaced.child = null; + _renderImage?.dispose(); + _renderImage = null; + } } ImageStreamListener? _imageStreamListener; @@ -209,9 +205,10 @@ class ImageElement extends Element { void dispose() { super.dispose(); _stopListeningStream(); + _completerHandle?.dispose(); _completerHandle = null; - _replaceImage(info: null); + _cachedImageInfo = null; _currentImageProvider?.evict(); _currentImageProvider = null; } @@ -266,18 +263,21 @@ class ImageElement extends Element { // Read the original image width of loaded image. // The getter must be called after image had loaded, otherwise will return 0. - int get naturalWidth => _currentImageDescriptor?.width ?? 0; + int naturalWidth = 0; // Read the original image height of loaded image. // The getter must be called after image had loaded, otherwise will return 0. - int get naturalHeight => _currentImageDescriptor?.height ?? 0; + int naturalHeight = 0; void _handleIntersectionChange(IntersectionObserverEntry entry) { // When appear if (entry.isIntersecting) { // Once appear remove the listener _removeIntersectionChangeListener(); + _decode(); _loadImage(); + _listenToStream(); + _isInLazyRendering = false; } } @@ -290,6 +290,9 @@ class ImageElement extends Element { addChild(image); } + // To prevent trigger load event more than once. + bool _loaded = false; + void _dispatchLoadEvent() { dispatchEvent(Event(EVENT_LOAD)); } @@ -299,14 +302,17 @@ class ImageElement extends Element { } void _onImageError(Object exception, StackTrace? stackTrace) { - print('$exception\n$stackTrace'); - dispatchEvent(Event(EVENT_ERROR)); + debugPrint('$exception\n$stackTrace'); + scheduleMicrotask(_dispatchErrorEvent); } void _resizeImage() { // Only need to resize image after image is fully loaded. if (!complete) return; + // Resize when image render object has created. + if (_renderImage == null) return; + if (_styleWidth == null && _attrWidth != null) { // The intrinsic width of the image in pixels. Must be an integer without a unit. renderStyle.width = CSSLengthValue(_attrWidth, CSSLengthType.PX); @@ -319,11 +325,6 @@ class ImageElement extends Element { renderStyle.intrinsicWidth = naturalWidth.toDouble(); renderStyle.intrinsicHeight = naturalHeight.toDouble(); - // Try to update image size if image already resolved. - // Set size to RenderImage is needs, to avoid makeNeedsLayout when update image. - _renderImage?.width = width.toDouble(); - _renderImage?.height = height.toDouble(); - if (naturalWidth == 0.0 || naturalHeight == 0.0) { renderStyle.aspectRatio = null; } else { @@ -390,41 +391,61 @@ class ImageElement extends Element { // If imageElement has property size or width/height property on [renderStyle], // The image will be encoded into a small size for better rasterization performance. void _decode({ bool updateImageProvider = false }) { - _ImageRequest? request = _currentRequest; - if (request != null && request.available) { - ImageProvider? provider = _currentImageProvider; - if (updateImageProvider || provider == null) { - // Image should be resized based on different ratio according to object-fit value. - BoxFit objectFit = renderStyle.objectFit; - provider = _currentImageProvider = BoxFitImage(descriptor: _currentImageDescriptor!, boxFit: objectFit); - } + ImageProvider? provider = _currentImageProvider; + if (updateImageProvider || provider == null) { + // Image should be resized based on different ratio according to object-fit value. + BoxFit objectFit = renderStyle.objectFit; - // Try to make sure that this image can be encoded into a smaller size. - int? cachedWidth = width > 0 && width.isFinite ? (width * ui.window.devicePixelRatio).toInt() : null; - int? cachedHeight = height > 0 && height.isFinite ? (height * ui.window.devicePixelRatio).toInt() : null; - ImageConfiguration imageConfiguration = _shouldScaling && cachedWidth != null && cachedHeight != null - ? ImageConfiguration(size: Size(cachedWidth.toDouble(), cachedHeight.toDouble())) - : ImageConfiguration.empty; - _updateSourceStream(provider.resolve(imageConfiguration)); + // Increment load event delay count before decode. + ownerDocument.incrementLoadEventDelayCount(); + + provider = _currentImageProvider = BoxFitImage( + boxFit: objectFit, + url: _resolvedUri!, + loadImage: _obtainImage, + onImageLoad: _onImageLoad, + ); } + + // Try to make sure that this image can be encoded into a smaller size. + int? cachedWidth = width > 0 && width.isFinite ? (width * ui.window.devicePixelRatio).toInt() : null; + int? cachedHeight = height > 0 && height.isFinite ? (height * ui.window.devicePixelRatio).toInt() : null; + ImageConfiguration imageConfiguration = _shouldScaling && cachedWidth != null && cachedHeight != null + ? ImageConfiguration(size: Size(cachedWidth.toDouble(), cachedHeight.toDouble())) + : ImageConfiguration.empty; + _updateSourceStream(provider.resolve(imageConfiguration)); + } + + // Invoke when image descriptor has created. + // We can know the naturalWidth and naturalHeight of current image. + void _onImageLoad(int width, int height) { + naturalWidth = width; + naturalHeight = height; + _resizeImage(); + + // Decrement load event delay count after decode. + ownerDocument.decrementLoadEventDelayCount(); } void _replaceImage({required ImageInfo? info}) { - _cachedImageInfo?.dispose(); _cachedImageInfo = info; - if (_currentRequest?.state != _ImageRequestState.completelyAvailable) { - _currentRequest?.state = _ImageRequestState.completelyAvailable; - scheduleMicrotask(() => _dispatchLoadEvent()); + if (info != null) { + if (_currentRequest?.state != _ImageRequestState.completelyAvailable) { + _currentRequest?.state = _ImageRequestState.completelyAvailable; + } } } // Attach image to renderImage box. void _attachImage() { - assert(isRendererAttached); - assert(_renderImage != null); - if (_cachedImageInfo == null) return; - _renderImage!.image = _cachedImageInfo!.image.clone(); + // Creates a disposable handle to this image. Holders of this [ui.Image] must dispose of + // the image when they no longer need to access it or draw it. + ui.Image? clonedImage = _cachedImageInfo?.image.clone(); + if (clonedImage != null) { + _renderImage?.image = clonedImage; + _resizeImage(); + } } // Callback when image are loaded, encoded and available to use. @@ -438,16 +459,13 @@ class ImageElement extends Element { forceToRepaintBoundary = true; } - if (renderBoxModel != null) { - RenderReplaced renderReplaced = renderBoxModel! as RenderReplaced; - renderReplaced.isInLazyRendering = false; - } - - // Image may be detached when image frame loaded. - if (!isRendererAttached) return; - _attachImage(); - _resizeImage(); + + // Fire the load event at first frame come. + if (_frameCount == 1 && !_loaded) { + _loaded = true; + scheduleMicrotask(_dispatchLoadEvent); + } } String get scaling => getAttribute(SCALING) ?? ''; @@ -457,59 +475,47 @@ class ImageElement extends Element { String get src => _resolvedUri?.toString() ?? ''; set src(String value) { - internalSetAttribute('src', value); - _resolveResourceUri(value); - - _updateImageData(); + if (src != value) { + _loaded = false; + internalSetAttribute('src', value); + _resolveResourceUri(value); + if (_resolvedUri != null) { + _updateImageData(); + } + } } // https://html.spec.whatwg.org/multipage/images.html#update-the-image-data - void _updateImageData() async { - await _obtainImage(); - - // Update image source if image already attached except image is lazy loading. + void _updateImageData() { + // Should add image box after style has applied to ensure intersection observer + // attached to correct renderBoxModel if (!_isInLazyLoading) { - _listenToStream(); - _decode(updateImageProvider: true); + // Image dimensions (width or height) should specified for performance when lazy-load. + if (_shouldLazyLoading) { + RenderReplaced? renderReplaced = renderBoxModel as RenderReplaced?; + renderReplaced?..isInLazyRendering = true + // When detach renderer, all listeners will be cleared. + ..addIntersectionChangeListener(_handleIntersectionChange); + } else { + _decode(updateImageProvider: true); + _listenToStream(); + _loadImage(); + } } } // To load the resource, and dispatch load event. // https://html.spec.whatwg.org/multipage/images.html#when-to-obtain-images - Future<_ImageRequest> _obtainImage() async { - _ImageRequest request = _currentRequest = _ImageRequest(currentUri: _resolvedUri!); - try { - // Increment count when request. - ownerDocument.incrementRequestCount(); - - Uint8List data = await request._obtainImage(contextId); + Future _obtainImage(Uri url) async { + ImageRequest request = _currentRequest = ImageRequest.fromUri(url); + // Increment count when request. + ownerDocument.incrementRequestCount(); - // Decrement count when response. - ownerDocument.decrementRequestCount(); + Uint8List data = await request._obtainImage(contextId); - // Increment load event delay count before decode. - ownerDocument.incrementLoadEventDelayCount(); - - // Decode size of raw image. - final ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromUint8List(data); - _currentImageDescriptor = await ui.ImageDescriptor.encoded(buffer); - - // State available at least the image dimensions are available. - if (_currentImageDescriptor?.width != 0 && _currentImageDescriptor?.height != 0) { - request.state = _ImageRequestState.partiallyAvailable; - } else { - request.state = _ImageRequestState.broken; - } - - // Decrement load event delay count after decode. - ownerDocument.decrementLoadEventDelayCount(); - - buffer.dispose(); - } catch (error) { - _dispatchErrorEvent(); - } finally { - return request; - } + // Decrement count when response. + ownerDocument.decrementRequestCount(); + return data; } String get loading => getAttribute(LOADING) ?? ''; @@ -589,9 +595,8 @@ enum _ImageRequestState { } // https://html.spec.whatwg.org/multipage/images.html#image-request -class _ImageRequest { - _ImageRequest({ - required this.currentUri, +class ImageRequest { + ImageRequest.fromUri(this.currentUri, { this.state = _ImageRequestState.unavailable, }); @@ -606,8 +611,6 @@ class _ImageRequest { bool get available => state == _ImageRequestState.completelyAvailable || state == _ImageRequestState.partiallyAvailable; - late Uint8List _data; - Future _obtainImage(int? contextId) async { final KrakenBundle bundle = KrakenBundle.fromUrl(currentUri.toString()); @@ -617,11 +620,11 @@ class _ImageRequest { throw FlutterError('Failed to load $currentUri'); } - _data = bundle.data!; + Uint8List data = bundle.data!; // Free the bundle memory. bundle.dispose(); - return _data; + return data; } } diff --git a/kraken/lib/src/dom/elements/script.dart b/kraken/lib/src/dom/elements/script.dart index d7df336cc4..03c78fe841 100644 --- a/kraken/lib/src/dom/elements/script.dart +++ b/kraken/lib/src/dom/elements/script.dart @@ -29,7 +29,8 @@ class ScriptRunner { final int _contextId; final List _syncScriptTasks = []; - final List _asyncScriptTasks = []; + // Indicate the sync pending scripts. + int _resolvingCount = 0; static void _evaluateScriptBundle(int contextId, KrakenBundle bundle, { bool async = false }) async { // Evaluate bundle. @@ -64,18 +65,22 @@ class ScriptRunner { // The bundle execution task. void task(bool async) { // If bundle is not resolved, should wait for it resolve to prevent the next script running. - if (!bundle.isResolved) return; + assert(bundle.isResolved, '${bundle.url} is not resolved'); try { _evaluateScriptBundle(_contextId, bundle, async: async); } catch (err, stack) { debugPrint('$err\n$stack'); - bundle.dispose(); _document.decrementLoadEventDelayCount(); - rethrow; + return; + } finally { + bundle.dispose(); } - bundle.dispose(); + // Dispatch the load event. + Timer.run(() { + element.dispatchEvent(Event(EVENT_LOAD)); + }); // Decrement load event delay count after eval. _document.decrementLoadEventDelayCount(); @@ -83,66 +88,59 @@ class ScriptRunner { // @TODO: Differ async and defer. final bool shouldAsync = element.async || element.defer; - if (shouldAsync) { - _asyncScriptTasks.add(task); - } else { + if (!shouldAsync) { _syncScriptTasks.add(task); + _resolvingCount++; } // Script loading phrase. + // Increment count when request. + _document.incrementRequestCount(); try { - // Increment count when request. - _document.incrementRequestCount(); - await bundle.resolve(_contextId); - assert(bundle.isResolved, 'Failed to obtain ${bundle.url}'); - // Decrement count when response. - _document.decrementRequestCount(); + if (!bundle.isResolved) { + throw FlutterError('Network error.'); + } } catch (e, st) { // A load error occurred. - debugPrint('Failed to load script: $url, reason: $e\n$st'); + debugPrint('Failed to load: $url, reason: $e\n$st'); Timer.run(() { element.dispatchEvent(Event(EVENT_ERROR)); }); _document.decrementLoadEventDelayCount(); + // Cancel failed task. + _syncScriptTasks.remove(task); return; + } finally { + // Decrease the resolving count. + if (!shouldAsync) { + _resolvingCount--; + } + + // Decrement count when response. + _document.decrementRequestCount(); } // Script executing phrase. if (shouldAsync) { // @TODO: Use requestIdleCallback SchedulerBinding.instance!.scheduleFrameCallback((_) { - try { - _execute(_asyncScriptTasks, async: true); - } catch (error, stack) { - debugPrint('$error\n$stack'); - } finally { - Timer.run(() { - element.dispatchEvent(Event(EVENT_LOAD)); - }); - } + task(shouldAsync); }); } else { - try { - _execute(_syncScriptTasks, async: false); - } catch (error, stack) { - debugPrint('$error\n$stack'); - } finally { - // Always emit load event. - Timer.run(() { - element.dispatchEvent(Event(EVENT_LOAD)); - }); - } + scheduleMicrotask(() { + if (_resolvingCount == 0) { + _execute(_syncScriptTasks, async: false); + } + }); } } } // https://www.w3.org/TR/2011/WD-html5-author-20110809/the-link-element.html class ScriptElement extends Element { - ScriptElement([BindingContext? context]) - : super(context, defaultStyle: _defaultStyle) { - } + ScriptElement([BindingContext? context]) : super(context, defaultStyle: _defaultStyle); final String _type = _MIME_TEXT_JAVASCRIPT; diff --git a/kraken/lib/src/foundation/type.dart b/kraken/lib/src/foundation/type.dart index e25983da14..31a9a14a11 100644 --- a/kraken/lib/src/foundation/type.dart +++ b/kraken/lib/src/foundation/type.dart @@ -1,9 +1,25 @@ /* * Copyright (C) 2021-present The Kraken authors. All rights reserved. */ +import 'dart:ui'; // Cast any input type to determined type. T castToType(value) { assert(value is T, '$value is not or not a subtype of $T'); return value as T; } + +class Dimension { + const Dimension(this.width, this.height); + + final int width; + final int height; + + @override + bool operator ==(Object other) { + return other is Dimension && other.width == width && other.height == height; + } + + @override + int get hashCode => hashValues(width, height); +} diff --git a/kraken/lib/src/gesture/scroll_position.dart b/kraken/lib/src/gesture/scroll_position.dart index f4dde00042..7cd2953551 100644 --- a/kraken/lib/src/gesture/scroll_position.dart +++ b/kraken/lib/src/gesture/scroll_position.dart @@ -570,6 +570,21 @@ abstract class ScrollPosition extends ViewportOffset with ScrollMetrics { @override void jumpTo(double? value); + /// Changes the scrolling position based on a pointer signal from current + /// value to delta without animation and without checking if new value is in + /// range, taking min/max scroll extent into account. + /// + /// Any active animation is canceled. If the user is currently scrolling, that + /// action is canceled. + /// + /// This method dispatches the start/update/end sequence of scrolling + /// notifications. + /// + /// This method is very similar to [jumpTo], but [pointerScroll] will + /// update the [ScrollDirection]. + /// + void pointerScroll(double delta); + /// Calls [jumpTo] if duration is null or [Duration.zero], otherwise /// [animateTo] is called. /// diff --git a/kraken/lib/src/gesture/scroll_position_with_single_context.dart b/kraken/lib/src/gesture/scroll_position_with_single_context.dart index f158aa7507..9fd9b33cae 100644 --- a/kraken/lib/src/gesture/scroll_position_with_single_context.dart +++ b/kraken/lib/src/gesture/scroll_position_with_single_context.dart @@ -6,6 +6,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:math' as math; import 'package:flutter/animation.dart'; import 'package:flutter/gestures.dart'; @@ -148,6 +149,15 @@ class ScrollPositionWithSingleContext extends ScrollPosition implements ScrollAc ScrollDirection get userScrollDirection => _userScrollDirection; ScrollDirection _userScrollDirection = ScrollDirection.idle; + /// Set [userScrollDirection] to the given value. + /// + /// If this changes the value, then a [UserScrollNotification] is dispatched. + void updateUserScrollDirection(ScrollDirection value) { + if (userScrollDirection == value) + return; + _userScrollDirection = value; + } + @override Future animateTo( double? to, { @@ -182,6 +192,24 @@ class ScrollPositionWithSingleContext extends ScrollPosition implements ScrollAc goBallistic(0.0); } + @override + void pointerScroll(double delta) { + assert(delta != 0.0); + + final double targetPixels = + math.min(math.max(pixels + delta, minScrollExtent), maxScrollExtent); + if (targetPixels != pixels) { + goIdle(); + updateUserScrollDirection( + -delta > 0.0 ? ScrollDirection.forward : ScrollDirection.reverse, + ); + forcePixels(targetPixels); + isScrollingNotifier.value = true; + notifyListeners(); + goBallistic(0.0); + } + } + @Deprecated( 'This will lead to bugs.') // ignore: flutter_deprecation_syntax, https://github.com/flutter/flutter/issues/44609 @override diff --git a/kraken/lib/src/gesture/scrollable.dart b/kraken/lib/src/gesture/scrollable.dart index bf99efc404..0dd157dab1 100644 --- a/kraken/lib/src/gesture/scrollable.dart +++ b/kraken/lib/src/gesture/scrollable.dart @@ -3,6 +3,7 @@ */ import 'package:flutter/gestures.dart'; +import 'dart:math' as math; import 'package:flutter/physics.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/scheduler.dart'; @@ -34,6 +35,12 @@ mixin _CustomTickerProviderStateMixin implements TickerProvider { } } +const Set _kTouchLikeDeviceTypes = { + PointerDeviceKind.touch, + PointerDeviceKind.stylus, + PointerDeviceKind.invertedStylus, +}; + // This class should really be called _DisposingTicker or some such, but this // class name leaks into stack traces and error messages and that name would be // confusing. Instead we use the less precise but more anodyne "_WidgetTicker", @@ -56,11 +63,13 @@ class KrakenScrollable with _CustomTickerProviderStateMixin implements ScrollCon final ScrollPhysics _physics = ScrollPhysics.createScrollPhysics(); DragStartBehavior dragStartBehavior; ScrollListener? scrollListener; + final Set dragDevices; KrakenScrollable({ AxisDirection axisDirection = AxisDirection.down, this.dragStartBehavior = DragStartBehavior.start, this.scrollListener, + this.dragDevices = _kTouchLikeDeviceTypes }) { _axisDirection = axisDirection; position = ScrollPositionWithSingleContext(physics: _physics, context: this, oldPosition: null); @@ -77,6 +86,10 @@ class KrakenScrollable with _CustomTickerProviderStateMixin implements ScrollCon } } + void handlePinterSignal(PointerSignalEvent event) { + _receivedPointerSignal(event); + } + @override AxisDirection get axisDirection => _axisDirection; @@ -97,7 +110,7 @@ class KrakenScrollable with _CustomTickerProviderStateMixin implements ScrollCon // Vertical drag gesture recognizer to trigger vertical scroll. _gestureRecognizers = { ScrollVerticalDragGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => ScrollVerticalDragGestureRecognizer(), + () => ScrollVerticalDragGestureRecognizer(supportedDevices: dragDevices), (ScrollVerticalDragGestureRecognizer instance) { instance ..isAcceptedDrag = _isAcceptedVerticalDrag @@ -118,7 +131,7 @@ class KrakenScrollable with _CustomTickerProviderStateMixin implements ScrollCon // Horizontal drag gesture recognizer to horizontal vertical scroll. _gestureRecognizers = { ScrollHorizontalDragGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => ScrollHorizontalDragGestureRecognizer(), + () => ScrollHorizontalDragGestureRecognizer(supportedDevices: dragDevices), (ScrollHorizontalDragGestureRecognizer instance) { instance ..isAcceptedDrag = _isAcceptedHorizontalDrag @@ -205,6 +218,46 @@ class KrakenScrollable with _CustomTickerProviderStateMixin implements ScrollCon _drag?.update(details); } + void _receivedPointerSignal(PointerSignalEvent event) { + if (event is PointerScrollEvent && position != null) { + if (!_physics.shouldAcceptUserOffset(position!)) { + return; + } + final double delta = _pointerSignalEventDelta(event); + final double targetScrollOffset = _targetScrollOffsetForPointerScroll(delta); + // Only express interest in the event if it would actually result in a scroll. + if (delta != 0.0 && targetScrollOffset != position?.pixels) { + GestureBinding.instance!.pointerSignalResolver.register(event, _handlePointerScroll); + } + } + } + double _pointerSignalEventDelta(PointerScrollEvent event) { + double delta = axis == Axis.horizontal + ? event.scrollDelta.dx + : event.scrollDelta.dy; + + if (axisDirectionIsReversed(axisDirection)) { + delta *= -1; + } + return delta; + } + + double _targetScrollOffsetForPointerScroll(double delta) { + return math.min( + math.max(position!.pixels + delta, position!.minScrollExtent), + position!.maxScrollExtent, + ); + } + + void _handlePointerScroll(PointerSignalEvent event) { + assert(event is PointerScrollEvent); + final double delta = _pointerSignalEventDelta(event as PointerScrollEvent); + final double targetScrollOffset = _targetScrollOffsetForPointerScroll(delta); + if (delta != 0.0 && targetScrollOffset != position!.pixels) { + position!.pointerScroll(delta); + } + } + void _handleDragEnd(DragEndDetails details) { // _drag might be null if the drag activity ended and called _disposeDrag. assert(_hold == null || _drag == null); diff --git a/kraken/lib/src/launcher/controller.dart b/kraken/lib/src/launcher/controller.dart index 45386ef0c6..47d07085fd 100644 --- a/kraken/lib/src/launcher/controller.dart +++ b/kraken/lib/src/launcher/controller.dart @@ -1034,12 +1034,12 @@ class KrakenController { return completer.future; } - Uri? get _uri { + String? get _url { HistoryModule historyModule = module.moduleManager.getModule('History')!; - return historyModule.stackTop?.resolvedUri; + return historyModule.stackTop?.url; } - String get url => _uri?.toString() ?? ''; + String get url => _url ?? ''; _addHistory(KrakenBundle bundle) { HistoryModule historyModule = @@ -1125,9 +1125,7 @@ class KrakenController { _controllerMap.remove(_view.contextId); _nameIdMap.remove(name); - if (devToolsService != null) { - devToolsService!.dispose(); - } + devToolsService?.dispose(); } String get origin => Uri.parse(url).origin; diff --git a/kraken/lib/src/painting/box_fit_image.dart b/kraken/lib/src/painting/box_fit_image.dart index 7ffef03e14..b2c2d071fc 100644 --- a/kraken/lib/src/painting/box_fit_image.dart +++ b/kraken/lib/src/painting/box_fit_image.dart @@ -2,21 +2,21 @@ * Copyright (C) 2022-present The Kraken authors. All rights reserved. */ +import 'dart:typed_data'; import 'dart:ui'; import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/painting.dart'; +import 'package:kraken/foundation.dart'; class BoxFitImageKey { const BoxFitImageKey({ - required this.descriptor, - this.scale = 1.0, + required this.url, this.configuration, }); - final ImageDescriptor descriptor; - final double scale; + final Uri url; final ImageConfiguration? configuration; @override @@ -24,40 +24,68 @@ class BoxFitImageKey { if (other.runtimeType != runtimeType) return false; return other is BoxFitImageKey - && other.descriptor == descriptor + && other.url == url && other.configuration == configuration; } @override - int get hashCode => hashValues(configuration, descriptor); + int get hashCode => hashValues(configuration, url); + + @override + String toString() => 'BoxFitImageKey($url, $configuration)'; } +typedef LoadImage = Future Function(Uri url); +typedef OnImageLoad = void Function(int naturalWidth, int naturalHeight); + class BoxFitImage extends ImageProvider { - const BoxFitImage({ - required this.descriptor, + BoxFitImage({ + required this.loadImage, + required this.url, required this.boxFit, + this.onImageLoad, }); - final ImageDescriptor descriptor; + final LoadImage loadImage; + final Uri url; final BoxFit boxFit; + final OnImageLoad? onImageLoad; @override Future obtainKey(ImageConfiguration configuration) { return SynchronousFuture(BoxFitImageKey( - descriptor: descriptor, + url: url, configuration: configuration, )); } + Future _loadAsync(BoxFitImageKey key) async { + Uint8List bytes = await loadImage(url); + final ImmutableBuffer buffer = await ImmutableBuffer.fromUint8List(bytes); + final ImageDescriptor descriptor = await ImageDescriptor.encoded(buffer); + final Codec codec = await _instantiateImageCodec(descriptor, + boxFit: boxFit, + preferredWidth: key.configuration?.size?.width.toInt(), + preferredHeight: key.configuration?.size?.height.toInt(), + ); + + // Fire image on load after codec created. + scheduleMicrotask(() { + if (onImageLoad != null) { + onImageLoad!(descriptor.width, descriptor.height); + } + _imageStreamCompleter!.setDimension(Dimension(descriptor.width, descriptor.height)); + }); + return codec; + } + + DimensionedMultiFrameImageStreamCompleter? _imageStreamCompleter; + @override ImageStreamCompleter load(BoxFitImageKey key, DecoderCallback decode) { - return MultiFrameImageStreamCompleter( - codec: _instantiateImageCodec(key.descriptor, - boxFit: boxFit, - preferredWidth: key.configuration?.size?.width.toInt(), - preferredHeight: key.configuration?.size?.height.toInt(), - ), - scale: key.scale, + return _imageStreamCompleter = DimensionedMultiFrameImageStreamCompleter( + codec: _loadAsync(key), + scale: 1.0, informationCollector: () { return [ DiagnosticsProperty('Image provider', this), @@ -67,6 +95,32 @@ class BoxFitImage extends ImageProvider { ); } + @override + void resolveStreamForKey(ImageConfiguration configuration, ImageStream stream, BoxFitImageKey key, ImageErrorListener handleError) { + if (stream.completer != null) { + final ImageStreamCompleter? completer = PaintingBinding.instance!.imageCache!.putIfAbsent( + key, + () => stream.completer!, + onError: handleError, + ); + assert(identical(completer, stream.completer)); + return; + } + final ImageStreamCompleter? completer = PaintingBinding.instance!.imageCache!.putIfAbsent( + key, + () => load(key, PaintingBinding.instance!.instantiateImageCodec), + onError: handleError, + ); + if (_imageStreamCompleter == null && completer is DimensionedMultiFrameImageStreamCompleter && onImageLoad != null) { + completer.dimension.then((Dimension dimension) { + onImageLoad!(dimension.width, dimension.height); + }); + } + if (completer != null) { + stream.setCompleter(completer); + } + } + static Future _instantiateImageCodec(ImageDescriptor descriptor, { BoxFit? boxFit = BoxFit.none, int? preferredWidth, @@ -146,3 +200,38 @@ class BoxFitImage extends ImageProvider { ); } } + +// The [MultiFrameImageStreamCompleter] that saved the natural dimention of image. +class DimensionedMultiFrameImageStreamCompleter extends MultiFrameImageStreamCompleter { + DimensionedMultiFrameImageStreamCompleter({ + required Future codec, + required double scale, + String? debugLabel, + Stream? chunkEvents, + InformationCollector? informationCollector, + }) : super(codec: codec, scale: scale, debugLabel: debugLabel, + chunkEvents: chunkEvents, informationCollector: informationCollector); + + final List> _dimensionCompleter = []; + Dimension? _dimension; + + Future get dimension async { + if (_dimension != null) { + return _dimension!; + } else { + Completer completer = Completer(); + _dimensionCompleter.add(completer); + return completer.future; + } + } + + void setDimension(Dimension dimension) { + _dimension = dimension; + if (_dimensionCompleter.isNotEmpty) { + _dimensionCompleter.forEach((Completer completer) { + completer.complete(dimension); + }); + _dimensionCompleter.clear(); + } + } +} diff --git a/kraken/lib/src/rendering/box_model.dart b/kraken/lib/src/rendering/box_model.dart index 1525f96820..0253842e86 100644 --- a/kraken/lib/src/rendering/box_model.dart +++ b/kraken/lib/src/rendering/box_model.dart @@ -31,9 +31,11 @@ class RenderLayoutParentData extends ContainerBoxParentData { } } -// Compute the layout offset of renderObject to its ancestor which does not include the paint offset -// such as scroll or transform. -Offset computeOffsetToAncestor(RenderObject current, RenderObject ancestor, { bool excludeScrollOffset = false }) { +// Applies the layout transform up the tree to `ancestor`. +// +// ReturgetLayoutTransformTolocal layout coordinate system to the +// coordinate system of `ancestor`. +Matrix4 getLayoutTransformTo(RenderObject current, RenderObject ancestor, { bool excludeScrollOffset = false }) { final List renderers = []; for (RenderObject renderer = current; renderer != ancestor; renderer = renderer.parent! as RenderObject) { renderers.add(renderer); @@ -41,18 +43,19 @@ Offset computeOffsetToAncestor(RenderObject current, RenderObject ancestor, { bo } renderers.add(ancestor); - Offset offset = Offset(0, 0); + final Matrix4 transform = Matrix4.identity(); for (int index = renderers.length - 1; index > 0; index -= 1) { - final BoxParentData childParentData = renderers[index - 1].parentData! as BoxParentData; - final Offset childOffset = childParentData.offset; - offset += childOffset; - if (excludeScrollOffset) { - RenderBoxModel renderer = renderers[index] as RenderBoxModel; - offset -= Offset(renderer.scrollLeft, renderer.scrollTop); + RenderObject parentRenderer = renderers[index]; + RenderObject childRenderer = renderers[index - 1]; + // Apply the layout transform for renderBoxModel and fallback to paint transform for other renderObject type. + if (parentRenderer is RenderBoxModel) { + parentRenderer.applyLayoutTransform(childRenderer, transform, excludeScrollOffset); + } else { + parentRenderer.applyPaintTransform(childRenderer, transform); } } - return offset; + return transform; } /// Modified from Flutter rendering/box.dart. @@ -711,9 +714,6 @@ class RenderBoxModel extends RenderBox } } - // Cache all the fixed children of renderBoxModel of root element - List fixedChildren = []; - // Position of sticky element changes between relative and fixed of scroll container StickyPositionType stickyStatus = StickyPositionType.relative; @@ -1085,6 +1085,18 @@ class RenderBoxModel extends RenderBox applyEffectiveTransform(child, transform); } + // Forked from RenderBox.applyPaintTransform, add scroll offset exclude logic. + void applyLayoutTransform(RenderObject child, Matrix4 transform, bool excludeScrollOffset) { + assert(child.parent == this); + assert(child.parentData is BoxParentData); + final BoxParentData childParentData = child.parentData! as BoxParentData; + Offset offset = childParentData.offset; + if (excludeScrollOffset) { + offset -= Offset(scrollLeft, scrollTop); + } + transform.translate(offset.dx, offset.dy); + } + // The max scrollable size. Size _maxScrollableSize = Size.zero; Size get scrollableSize => _maxScrollableSize; @@ -1275,9 +1287,9 @@ class RenderBoxModel extends RenderBox } // Get the layout offset of renderObject to its ancestor which does not include the paint offset - // such as scroll or transform. - Offset getOffsetToAncestor(RenderObject ancestor) { - return computeOffsetToAncestor(this, ancestor); + // such as scroll or transform.getLayoutTransformTo + Offset getOffsetToAncestor(Offset point, RenderObject ancestor, { bool excludeScrollOffset = false }) { + return MatrixUtils.transformPoint(getLayoutTransformTo(this, ancestor, excludeScrollOffset: excludeScrollOffset), point); } bool _hasLocalBackgroundImage(CSSRenderStyle renderStyle) { @@ -1386,11 +1398,6 @@ class RenderBoxModel extends RenderBox super.dispose(); }); - // Clear renderObjects in list when disposed to avoid memory leak - if (fixedChildren.isNotEmpty) { - fixedChildren.clear(); - } - // Dispose scroll behavior disposeScrollable(); @@ -1463,26 +1470,28 @@ class RenderBoxModel extends RenderBox bool isHit = result.addWithPaintTransform( transform: renderStyle.effectiveTransformMatrix, position: position, - hitTest: (BoxHitTestResult result, Offset trasformPosition) { + hitTest: (BoxHitTestResult result, Offset transformPosition) { return result.addWithPaintOffset( offset: (scrollLeft != 0.0 || scrollTop != 0.0) ? Offset(-scrollLeft, -scrollTop) : null, - position: trasformPosition, + position: transformPosition, hitTest: (BoxHitTestResult result, Offset position) { CSSPositionType positionType = renderStyle.position; if (positionType == CSSPositionType.fixed) { - position -= getTotalScrollOffset(); + Offset totalScrollOffset = getTotalScrollOffset(); + position -= totalScrollOffset; + transformPosition -= totalScrollOffset; } // Determine whether the hittest position is within the visible area of the node in scroll. - if ((clipX || clipY) && !size.contains(trasformPosition)) { + if ((clipX || clipY) && !size.contains(transformPosition)) { return false; } // addWithPaintOffset is to add an offset to the child node, the calculation itself does not need to bring an offset. if (hitTestChildren(result, position: position) || - hitTestSelf(trasformPosition)) { + hitTestSelf(transformPosition)) { result.add(BoxHitTestEntry(this, position)); return true; } diff --git a/kraken/lib/src/rendering/content_visibility.dart b/kraken/lib/src/rendering/content_visibility.dart index fe44e8909a..716d134900 100644 --- a/kraken/lib/src/rendering/content_visibility.dart +++ b/kraken/lib/src/rendering/content_visibility.dart @@ -25,9 +25,6 @@ mixin RenderContentVisibilityMixin on RenderBoxModelBase { } void debugVisibilityProperties(DiagnosticPropertiesBuilder properties) { - ContentVisibility? contentVisibility = renderStyle.contentVisibility; - if (contentVisibility != null) - properties.add(DiagnosticsProperty( - 'contentVisibility', contentVisibility)); + properties.add(DiagnosticsProperty('contentVisibility', renderStyle.contentVisibility)); } } diff --git a/kraken/lib/src/rendering/preferred_size.dart b/kraken/lib/src/rendering/preferred_size.dart index 730e4345de..ca96a6df3c 100644 --- a/kraken/lib/src/rendering/preferred_size.dart +++ b/kraken/lib/src/rendering/preferred_size.dart @@ -74,8 +74,8 @@ class RenderPositionPlaceholder extends RenderPreferredSize { // Get the layout offset of renderObject to its ancestor which does not include the paint offset // such as scroll or transform. - Offset getOffsetToAncestor(RenderObject ancestor, { bool excludeScrollOffset = false }) { - return computeOffsetToAncestor(this, ancestor, excludeScrollOffset: excludeScrollOffset); + Offset getOffsetToAncestor(Offset point, RenderObject ancestor, { bool excludeScrollOffset = false }) { + return MatrixUtils.transformPoint(getLayoutTransformTo(this, ancestor, excludeScrollOffset: excludeScrollOffset), point); } } diff --git a/kraken/lib/src/rendering/replaced.dart b/kraken/lib/src/rendering/replaced.dart index e6373d1099..ed95923e63 100644 --- a/kraken/lib/src/rendering/replaced.dart +++ b/kraken/lib/src/rendering/replaced.dart @@ -31,7 +31,14 @@ class RenderReplaced extends RenderBoxModel // Whether the renderObject of replaced element is in lazy rendering. // Set true when the renderObject is not rendered yet and set false after // the renderObject is rendered. - bool isInLazyRendering = false; + bool _isInLazyRendering = false; + bool get isInLazyRendering => _isInLazyRendering; + set isInLazyRendering(bool value) { + if (value != _isInLazyRendering) { + _isInLazyRendering = value; + markNeedsPaint(); + } + } @override void setupParentData(RenderBox child) { @@ -119,18 +126,18 @@ class RenderReplaced extends RenderBoxModel return marginTop + boxSize!.height + marginBottom; } + // Should not paint when renderObject is in lazy loading and not rendered yet. + @override + bool get shouldPaint => !_isInLazyRendering && super.shouldPaint; + /// This class mixin [RenderProxyBoxMixin], which has its' own paint method, /// override it to layout box model paint. @override void paint(PaintingContext context, Offset offset) { - // Should not paint other style such as box decoration when renderObject - // is in lazy loading and not rendered yet. - if (isInLazyRendering) { - paintIntersectionObserver(context, offset, performPaint); - return; - } - - if (shouldPaint) { + // In lazy rendering, only paint intersection observer for triggering intersection change callback. + if (_isInLazyRendering) { + paintIntersectionObserver(context, offset, paintNothing); + } else if (shouldPaint) { paintBoxModel(context, offset); } } diff --git a/kraken/lib/src/rendering/sliver_list.dart b/kraken/lib/src/rendering/sliver_list.dart index 5cac0129dc..4c6ab31193 100644 --- a/kraken/lib/src/rendering/sliver_list.dart +++ b/kraken/lib/src/rendering/sliver_list.dart @@ -5,6 +5,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'package:kraken/css.dart'; import 'package:kraken/gesture.dart'; @@ -124,6 +125,8 @@ class RenderSliverListLayout extends RenderLayoutBox { void _scrollablePointerListener(PointerEvent event) { if (event is PointerDownEvent) { scrollable.handlePointerDown(event); + } else if (event is PointerSignalEvent) { + scrollable.handlePinterSignal(event); } } @@ -255,6 +258,13 @@ class RenderSliverListLayout extends RenderLayoutBox { return false; } + + @override + void applyPaintTransform(RenderBox child, Matrix4 transform) { + super.applyPaintTransform(child, transform); + transform.translate(scrollLeft, scrollTop); + } + Offset getChildScrollOffset(RenderObject child, Offset offset) { final RenderLayoutParentData? childParentData = child.parentData as RenderLayoutParentData?; diff --git a/kraken/lib/src/rendering/text_control.dart b/kraken/lib/src/rendering/text_control.dart index 082920b152..de6cc69105 100644 --- a/kraken/lib/src/rendering/text_control.dart +++ b/kraken/lib/src/rendering/text_control.dart @@ -3,6 +3,7 @@ */ import 'dart:math' as math; +import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'package:kraken/css.dart'; import 'package:kraken/dom.dart'; @@ -26,6 +27,8 @@ class RenderTextControlLeaderLayer extends RenderLeaderLayer { void _pointerListener(PointerEvent event) { if (event is PointerDownEvent) { scrollable.handlePointerDown(event); + } else if (event is PointerSignalEvent) { + scrollable.handlePinterSignal(event); } } diff --git a/kraken/lib/src/rendering/viewport.dart b/kraken/lib/src/rendering/viewport.dart index d0798299b3..3bdae36001 100644 --- a/kraken/lib/src/rendering/viewport.dart +++ b/kraken/lib/src/rendering/viewport.dart @@ -17,6 +17,9 @@ class RenderViewportBox extends RenderProxyBox this.controller = controller; } + // Cache all the fixed children of renderBoxModel of root element. + List fixedChildren = []; + @override bool get isRepaintBoundary => true; @@ -92,4 +95,13 @@ class RenderViewportBox extends RenderProxyBox context.paintChild(child!, offset); } } + + @override + void dispose() { + if (child != null) { + dropChild(child!); + } + fixedChildren.clear(); + super.dispose(); + } } diff --git a/kraken/lib/src/widget/element_to_widget_adaptor.dart b/kraken/lib/src/widget/element_to_widget_adaptor.dart index c545e13a5e..378dfb292c 100644 --- a/kraken/lib/src/widget/element_to_widget_adaptor.dart +++ b/kraken/lib/src/widget/element_to_widget_adaptor.dart @@ -2,7 +2,9 @@ * Copyright (C) 2022-present The Kraken authors. All rights reserved. */ import 'package:flutter/widgets.dart'; +import 'package:kraken/css.dart'; import 'package:kraken/dom.dart' as dom; +import 'package:kraken/rendering.dart'; class KrakenElementToWidgetAdaptor extends RenderObjectWidget { final dom.Node _krakenNode; @@ -19,7 +21,16 @@ class KrakenElementToWidgetAdaptor extends RenderObjectWidget { @override RenderObject createRenderObject(BuildContext context) { - return _krakenNode.renderer!; + // Children of custom element need RenderFlowLayout nesting, + // otherwise the parent render layout will not be called when setting properties. + if (_krakenNode is dom.Element) { + CSSRenderStyle renderStyle = CSSRenderStyle(target: _krakenNode as dom.Element); + RenderFlowLayout renderFlowLayout = RenderFlowLayout(renderStyle: renderStyle); + renderFlowLayout.insert(_krakenNode.renderer!); + return renderFlowLayout; + } else { + return _krakenNode.renderer!; + } } } @@ -49,10 +60,16 @@ class KrakenElementToFlutterElementAdaptor extends RenderObjectElement { @override void unmount() { + // Flutter element unmount call dispose of _renderObject, so we should not call dispose in unmountRenderObject. + dom.Element element = (widget._krakenNode as dom.Element); + element.unmountRenderObject(dispose: false); + super.unmount(); - (widget._krakenNode as dom.Element).unmountRenderObject(); } @override void insertRenderObjectChild(RenderObject child, Object? slot) {} + + @override + void moveRenderObjectChild(covariant RenderObject child, covariant Object? oldSlot, covariant Object? newSlot) {} } diff --git a/kraken/lib/src/widget/text_control.dart b/kraken/lib/src/widget/text_control.dart index 21cdf879d0..c68b7b9077 100644 --- a/kraken/lib/src/widget/text_control.dart +++ b/kraken/lib/src/widget/text_control.dart @@ -27,23 +27,23 @@ typedef OnControllerCreated = void Function(KrakenController controller); /// Delegate methods of widget class WidgetDelegate { - GetContext getContext; - RequestFocus requestFocus; - GetTargetPlatform getTargetPlatform; - GetCursorColor getCursorColor; - GetSelectionColor getSelectionColor; - GetCursorRadius getCursorRadius; - GetTextSelectionControls getTextSelectionControls; - - WidgetDelegate( - this.getContext, - this.requestFocus, - this.getTargetPlatform, - this.getCursorColor, - this.getSelectionColor, - this.getCursorRadius, - this.getTextSelectionControls, - ); + final GetContext getContext; + final RequestFocus requestFocus; + final GetTargetPlatform getTargetPlatform; + final GetCursorColor getCursorColor; + final GetSelectionColor getSelectionColor; + final GetCursorRadius getCursorRadius; + final GetTextSelectionControls getTextSelectionControls; + + const WidgetDelegate( + this.getContext, + this.requestFocus, + this.getTargetPlatform, + this.getCursorColor, + this.getSelectionColor, + this.getCursorRadius, + this.getTextSelectionControls, + ); } // Widget involves actions of text control elements(input, textarea). diff --git a/package.json b/package.json index 5d9dbe35a5..3f9eed2557 100644 --- a/package.json +++ b/package.json @@ -43,5 +43,8 @@ "uuid": "^8.3.2", "ws": "^7.3.0", "http-server": "^14.1.0" + }, + "dependencies": { + "prepend-file": "^2.0.1" } } diff --git a/scripts/pre_publish_kraken.js b/scripts/pre_publish_kraken.js new file mode 100644 index 0000000000..40a04fe118 --- /dev/null +++ b/scripts/pre_publish_kraken.js @@ -0,0 +1,41 @@ +const exec = require("child_process").execSync; +const fs = require("fs"); +const PATH = require("path"); + +function symbolicToRealFile(path) { + let realPath = PATH.join(path, "../", fs.readlinkSync(path)); + + if (fs.lstatSync(realPath).isDirectory()) { + exec(`rm ${path}`); + exec(`cp -r ${realPath} ${path}`); + } else { + let buffer = fs.readFileSync(realPath); + fs.rmSync(path); + fs.writeFileSync(path, buffer); + } +} + +const krakenDir = PATH.join(__dirname, "../kraken"); + +const files = [ + "android/jniLibs/arm64-v8a/libc++_shared.so", + "android/jniLibs/arm64-v8a/libkraken.so", + "android/jniLibs/arm64-v8a/libquickjs.so", + "android/jniLibs/armeabi-v7a/libc++_shared.so", + "android/jniLibs/armeabi-v7a/libkraken.so", + "android/jniLibs/armeabi-v7a/libquickjs.so", + "android/jniLibs/x86/libc++_shared.so", + "android/jniLibs/x86/libkraken.so", + "android/jniLibs/x86/libquickjs.so", + "ios/kraken_bridge.xcframework", + "ios/quickjs.xcframework", + "linux/libkraken.so", + "linux/libquickjs.so", + "macos/libkraken.dylib", + "macos/libquickjs.dylib", +]; + +for (let file of files) { + symbolicToRealFile(PATH.join(krakenDir, file)); +} + diff --git a/scripts/set_up_nightly_release.js b/scripts/set_up_nightly_release.js index 753a248698..cfce10e36f 100644 --- a/scripts/set_up_nightly_release.js +++ b/scripts/set_up_nightly_release.js @@ -1,19 +1,48 @@ -const exec = require('child_process').execSync; -const fs = require('fs'); -const path = require('path'); +const exec = require("child_process").execSync; +const fs = require("fs"); +const path = require("path"); +const prependFile = require('prepend-file'); function getCurrentGitRev() { - return exec('git rev-parse --short HEAD', {encoding: 'utf-8'}).trim(); + return exec("git rev-parse --short HEAD", { encoding: "utf-8" }).trim(); } function setPubVersion(version) { - const pubSepcPath = path.join(__dirname, '../kraken/pubspec.yaml'); - const pubSpec = fs.readFileSync(pubSepcPath, {encoding: 'utf-8'}) - const replaced = pubSpec.replace(/version: ([\d\w.+]+)/, 'version: $1-nightly.' + version); + const pubSepcPath = path.join(__dirname, "../kraken/pubspec.yaml"); + const pubSpec = fs.readFileSync(pubSepcPath, { encoding: "utf-8" }); + const replaced = pubSpec.replace( + /version: ([\d\w.+]+)/, + "version: $1-nightly." + version + ); fs.writeFileSync(pubSepcPath, replaced); + + return replaced; +} + +function setChangeLog(version) { + const pubSepcPath = path.join(__dirname, "../kraken/pubspec.yaml"); + const pubSpec = fs.readFileSync(pubSepcPath, { encoding: "utf-8" }); + const baseVersion = pubSpec.match( + /version: ([\d\w.+]+)/, + ); + + const changeLogpath = path.join(__dirname, '../kraken/CHANGELOG.md'); + prependFile(changeLogpath, `## ${baseVersion[1]}-nightly.${version} +nightly version. +`); +} + +function getDate() { + var today = new Date(); + var dd = String(today.getDate()).padStart(2, "0"); + var mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0! + var yyyy = today.getFullYear(); + + return mm + "-" + dd + "-" + yyyy; } +let nightlyVersion = getDate() + '-' + getCurrentGitRev(); -let currentGitRev = getCurrentGitRev(); -setPubVersion(currentGitRev); +setPubVersion(nightlyVersion); +setChangeLog(nightlyVersion); diff --git a/scripts/tasks.js b/scripts/tasks.js index 982afb8f54..21706f1c16 100644 --- a/scripts/tasks.js +++ b/scripts/tasks.js @@ -626,11 +626,11 @@ task('build-android-kraken-lib', (done) => { } else { androidHome = path.join(process.env.HOME, 'Library/Android/sdk') } - const ndkVersion = '21.4.7075529'; + const ndkVersion = '23.2.8568313'; ndkDir = path.join(androidHome, 'ndk', ndkVersion); if (!fs.existsSync(ndkDir)) { - throw new Error('Android NDK version (21.4.7075529) not installed.'); + throw new Error('Android NDK version (23.2.8568313) not installed.'); } } @@ -699,8 +699,8 @@ task('build-android-kraken-lib', (done) => { // Strip release binary in release mode. if (buildMode === 'Release' || buildMode === 'RelWithDebInfo') { - const strip = path.join(ndkDir, `./toolchains/llvm/prebuilt/${os.platform()}-x86_64/${toolChainMap[arch]}/bin/strip`); - const objcopy = path.join(ndkDir, `./toolchains/llvm/prebuilt/${os.platform()}-x86_64/${toolChainMap[arch]}/bin/objcopy`); + const strip = path.join(ndkDir, `./toolchains/llvm/prebuilt/${os.platform()}-x86_64/bin/llvm-strip`); + const objcopy = path.join(ndkDir, `./toolchains/llvm/prebuilt/${os.platform()}-x86_64/bin/llvm-objcopy`); for (let soFileName of soFileNames) { const soBinaryFile = path.join(soBinaryDirectory, soFileName + '.so');