Skip to content

Commit

Permalink
Cherry-pick aa0c3c8. rdar://123854529
Browse files Browse the repository at this point in the history
    [@starting-style] Add CSSOM
    https://bugs.webkit.org/show_bug.cgi?id=268306
    rdar://problem/121862449

    Reviewed by Tim Nguyen.

    Add CSSStartingStyleRule interface.

    https://drafts.csswg.org/css-transitions-2/#the-cssstartingstylerule-interface

    * LayoutTests/imported/w3c/web-platform-tests/css/css-transitions/idlharness-2-expected.txt:
    * LayoutTests/imported/w3c/web-platform-tests/interfaces/css-transitions-2.idl:
    * Source/WebCore/DerivedSources-input.xcfilelist:
    * Source/WebCore/DerivedSources-output.xcfilelist:
    * Source/WebCore/DerivedSources.make:
    * Source/WebCore/Sources.txt:
    * Source/WebCore/WebCore.xcodeproj/project.pbxproj:
    * Source/WebCore/bindings/js/JSCSSRuleCustom.cpp:
    (WebCore::toJSNewlyCreated):
    * Source/WebCore/bindings/js/WebCoreBuiltinNames.h:
    * Source/WebCore/css/CSSStartingStyleRule.cpp: Added.
    (WebCore::CSSStartingStyleRule::CSSStartingStyleRule):
    (WebCore::CSSStartingStyleRule::cssText const):
    * Source/WebCore/css/CSSStartingStyleRule.h: Added.
    * Source/WebCore/css/CSSStartingStyleRule.idl: Added.
    * Source/WebCore/css/StyleRule.cpp:
    (WebCore::StyleRuleBase::createCSSOMWrapper const):
    * Source/WebCore/css/StyleRuleImport.cpp:
    * Source/WebCore/inspector/InspectorStyleSheet.cpp:
    (WebCore::flatteningStrategyForStyleRuleType):

    Canonical link: https://commits.webkit.org/273690@main

Canonical link: https://commits.webkit.org/272448.661@safari-7618-branch
  • Loading branch information
anttijk authored and Dan Robson committed Mar 1, 2024
1 parent 109047f commit a3ef1a9
Show file tree
Hide file tree
Showing 16 changed files with 164 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@

PASS idl_test setup
PASS idl_test validation
PASS CSSStartingStyleRule interface: existence and properties of interface object
PASS CSSStartingStyleRule interface object length
PASS CSSStartingStyleRule interface object name
PASS CSSStartingStyleRule interface: existence and properties of interface prototype object
PASS CSSStartingStyleRule interface: existence and properties of interface prototype object's "constructor" property
PASS CSSStartingStyleRule interface: existence and properties of interface prototype object's @@unscopables property
PASS CSSStartingStyleRule must be primary interface of sheet.cssRules[0]
PASS Stringification of sheet.cssRules[0]
PASS CSSTransition interface: existence and properties of interface object
PASS CSSTransition interface object length
PASS CSSTransition interface object name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
// (https://github.com/w3c/webref)
// Source: CSS Transitions Level 2 (https://drafts.csswg.org/css-transitions-2/)

[Exposed=Window]
interface CSSStartingStyleRule : CSSGroupingRule {
};

[Exposed=Window]
interface CSSTransition : Animation {
readonly attribute CSSOMString transitionProperty;
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,7 @@ set(WebCore_NON_SVG_IDL_FILES
css/CSSRule.idl
css/CSSRuleList.idl
css/CSSScopeRule.idl
css/CSSStartingStyleRule.idl
css/CSSStyleDeclaration.idl
css/CSSStyleRule.idl
css/CSSStyleSheet.idl
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/DerivedSources-input.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -1210,6 +1210,7 @@ $(PROJECT_DIR)/css/CSSPropertyRule.idl
$(PROJECT_DIR)/css/CSSRule.idl
$(PROJECT_DIR)/css/CSSRuleList.idl
$(PROJECT_DIR)/css/CSSScopeRule.idl
$(PROJECT_DIR)/css/CSSStartingStyleRule.idl
$(PROJECT_DIR)/css/CSSStyleDeclaration.idl
$(PROJECT_DIR)/css/CSSStyleRule.idl
$(PROJECT_DIR)/css/CSSStyleSheet.idl
Expand Down
2 changes: 2 additions & 0 deletions Source/WebCore/DerivedSources-output.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,8 @@ $(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSSkewX.cpp
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSSkewX.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSSkewY.cpp
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSSkewY.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSStartingStyleRule.cpp
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSStartingStyleRule.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSStyleDeclaration+PropertyNames.cpp
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSStyleDeclaration+PropertyNames.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSStyleDeclaration.cpp
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/DerivedSources.make
Original file line number Diff line number Diff line change
Expand Up @@ -935,6 +935,7 @@ JS_BINDING_IDLS := \
$(WebCore)/css/CSSRule.idl \
$(WebCore)/css/CSSRuleList.idl \
$(WebCore)/css/CSSScopeRule.idl \
$(WebCore)/css/CSSStartingStyleRule.idl \
$(WebCore)/css/CSSStyleDeclaration.idl \
$(WebCore)/css/CSSStyleRule.idl \
$(WebCore)/css/CSSStyleSheet.idl \
Expand Down
2 changes: 2 additions & 0 deletions Source/WebCore/Sources.txt
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,7 @@ css/CSSSegmentedFontFace.cpp
css/CSSSelector.cpp
css/CSSSelectorList.cpp
css/CSSShadowValue.cpp
css/CSSStartingStyleRule.cpp
css/CSSStyleDeclaration.cpp
css/CSSStyleRule.cpp
css/CSSStyleSheet.cpp
Expand Down Expand Up @@ -3278,6 +3279,7 @@ JSCSSRule.cpp
JSCSSRuleList.cpp
JSCSSStyleDeclaration.cpp
JSCSSScopeRule.cpp
JSCSSStartingStyleRule.cpp
JSCSSStyleRule.cpp
JSCSSStyleSheet.cpp
JSCSSSupportsRule.cpp
Expand Down
8 changes: 8 additions & 0 deletions Source/WebCore/WebCore.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6081,6 +6081,7 @@
E4DA5E4028A288F800849BCF /* GenericMediaQueryEvaluator.h in Headers */ = {isa = PBXBuildFile; fileRef = E4DA5E3F28A288F800849BCF /* GenericMediaQueryEvaluator.h */; };
E4DACE6A1D12E10B0075980F /* StylePendingResources.h in Headers */ = {isa = PBXBuildFile; fileRef = E4DACE691D12E10B0075980F /* StylePendingResources.h */; };
E4DEAA1817A93DC3000E0430 /* StyleTreeResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */; settings = {ATTRIBUTES = (Private, ); }; };
E4E364742B67DF0000734648 /* CSSStartingStyleRule.h in Headers */ = {isa = PBXBuildFile; fileRef = E4E364722B67DEDA00734648 /* CSSStartingStyleRule.h */; };
E4E387FE294E147800C6EC1B /* CSSPropertyRule.h in Headers */ = {isa = PBXBuildFile; fileRef = E4E387FC294E147700C6EC1B /* CSSPropertyRule.h */; };
E4E38803294E226B00C6EC1B /* JSCSSPropertyRule.h in Headers */ = {isa = PBXBuildFile; fileRef = E4E38801294E226A00C6EC1B /* JSCSSPropertyRule.h */; };
E4E39AFB1330EFA8003AB274 /* LegacyTileLayerPool.h in Headers */ = {isa = PBXBuildFile; fileRef = E4E39AFA1330EFA8003AB274 /* LegacyTileLayerPool.h */; };
Expand Down Expand Up @@ -19690,6 +19691,9 @@
E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleTreeResolver.cpp; sourceTree = "<group>"; };
E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleTreeResolver.h; sourceTree = "<group>"; };
E4E243821DAB953E00C26E4B /* meterElementShadow.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = meterElementShadow.css; sourceTree = "<group>"; };
E4E364722B67DEDA00734648 /* CSSStartingStyleRule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSSStartingStyleRule.h; sourceTree = "<group>"; };
E4E364732B67DEE800734648 /* CSSStartingStyleRule.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = CSSStartingStyleRule.idl; sourceTree = "<group>"; };
E4E364752B67E05500734648 /* CSSStartingStyleRule.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CSSStartingStyleRule.cpp; sourceTree = "<group>"; };
E4E387FB294E147700C6EC1B /* CSSPropertyRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSPropertyRule.cpp; sourceTree = "<group>"; };
E4E387FC294E147700C6EC1B /* CSSPropertyRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSPropertyRule.h; sourceTree = "<group>"; };
E4E387FF294E15A100C6EC1B /* CSSPropertyRule.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CSSPropertyRule.idl; sourceTree = "<group>"; };
Expand Down Expand Up @@ -35547,6 +35551,9 @@
E4C178960EE6903800824D69 /* CSSSelectorList.h */,
A80E6CCA0A1989CA007FB8C5 /* CSSShadowValue.cpp */,
A80E6CBE0A1989CA007FB8C5 /* CSSShadowValue.h */,
E4E364752B67E05500734648 /* CSSStartingStyleRule.cpp */,
E4E364722B67DEDA00734648 /* CSSStartingStyleRule.h */,
E4E364732B67DEE800734648 /* CSSStartingStyleRule.idl */,
7CDE8EBC1F193BC500168FE7 /* CSSStyleDeclaration.cpp */,
A80E6E0D0A19911C007FB8C5 /* CSSStyleDeclaration.h */,
142011AE0A003117008303F9 /* CSSStyleDeclaration.idl */,
Expand Down Expand Up @@ -38195,6 +38202,7 @@
2A538A2A26F0104200965FC8 /* CSSSkew.h in Headers */,
2A538A2B26F0104500965FC8 /* CSSSkewX.h in Headers */,
2A538A2C26F0104800965FC8 /* CSSSkewY.h in Headers */,
E4E364742B67DF0000734648 /* CSSStartingStyleRule.h in Headers */,
A80E6E0F0A19911C007FB8C5 /* CSSStyleDeclaration.h in Headers */,
4B438650219CD56100F8D3C5 /* CSSStyleImageValue.h in Headers */,
A80E6D0C0A1989CA007FB8C5 /* CSSStyleRule.h in Headers */,
Expand Down
5 changes: 3 additions & 2 deletions Source/WebCore/bindings/js/JSCSSRuleCustom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "CSSPageRule.h"
#include "CSSPropertyRule.h"
#include "CSSScopeRule.h"
#include "CSSStartingStyleRule.h"
#include "CSSStyleRule.h"
#include "CSSSupportsRule.h"
#include "JSCSSContainerRule.h"
Expand All @@ -58,6 +59,7 @@
#include "JSCSSPageRule.h"
#include "JSCSSPropertyRule.h"
#include "JSCSSScopeRule.h"
#include "JSCSSStartingStyleRule.h"
#include "JSCSSStyleRule.h"
#include "JSCSSSupportsRule.h"
#include "JSNode.h"
Expand Down Expand Up @@ -116,8 +118,7 @@ JSValue toJSNewlyCreated(JSGlobalObject*, JSDOMGlobalObject* globalObject, Ref<C
case StyleRuleType::Scope:
return createWrapper<CSSScopeRule>(globalObject, WTFMove(rule));
case StyleRuleType::StartingStyle:
// FIXME: Implement.
return createWrapper<CSSRule>(globalObject, WTFMove(rule));
return createWrapper<CSSStartingStyleRule>(globalObject, WTFMove(rule));
case StyleRuleType::Unknown:
case StyleRuleType::Charset:
case StyleRuleType::Margin:
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/bindings/js/WebCoreBuiltinNames.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ namespace WebCore {
macro(CSSSkew) \
macro(CSSSkewX) \
macro(CSSSkewY) \
macro(CSSStartingStyleRule) \
macro(CSSStyleValue) \
macro(CSSTransformComponent) \
macro(CSSTransformValue) \
Expand Down
46 changes: 46 additions & 0 deletions Source/WebCore/css/CSSStartingStyleRule.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (C) 2024 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "config.h"
#include "CSSStartingStyleRule.h"

#include "StyleRule.h"

namespace WebCore {

CSSStartingStyleRule::CSSStartingStyleRule(StyleRuleStartingStyle& rule, CSSStyleSheet* parent)
: CSSGroupingRule(rule, parent)
{
}

String CSSStartingStyleRule::cssText() const
{
StringBuilder builder;
builder.append("@starting-style ");
appendCSSTextForItems(builder);
return builder.toString();
}

}
52 changes: 52 additions & 0 deletions Source/WebCore/css/CSSStartingStyleRule.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright (C) 2024 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#pragma once

#include "CSSGroupingRule.h"

namespace WebCore {

class StyleRuleStartingStyle;

class CSSStartingStyleRule final : public CSSGroupingRule {
public:
static Ref<CSSStartingStyleRule> create(StyleRuleStartingStyle& rule, CSSStyleSheet* parent)
{
return adoptRef(*new CSSStartingStyleRule(rule, parent));
}

String cssText() const final;

private:
CSSStartingStyleRule(StyleRuleStartingStyle&, CSSStyleSheet*);

StyleRuleType styleRuleType() const final { return StyleRuleType::StartingStyle; }
};

} // namespace WebCore

SPECIALIZE_TYPE_TRAITS_CSS_RULE(CSSStartingStyleRule, StyleRuleType::StartingStyle)

30 changes: 30 additions & 0 deletions Source/WebCore/css/CSSStartingStyleRule.idl
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright (C) 2024 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

[
EnabledBySetting=CSSStartingStyleAtRuleEnabled,
Exposed=Window
] interface CSSStartingStyleRule : CSSGroupingRule {
};
6 changes: 3 additions & 3 deletions Source/WebCore/css/StyleRule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "CSSParserSelector.h"
#include "CSSPropertyRule.h"
#include "CSSScopeRule.h"
#include "CSSStartingStyleRule.h"
#include "CSSStyleRule.h"
#include "CSSSupportsRule.h"
#include "MediaList.h"
Expand Down Expand Up @@ -213,9 +214,8 @@ Ref<CSSRule> StyleRuleBase::createCSSOMWrapper(CSSStyleSheet* parentSheet, CSSRu
[&](StyleRuleScope& rule) -> Ref<CSSRule> {
return CSSScopeRule::create(rule, parentSheet);
},
[&](StyleRuleStartingStyle&) -> Ref<CSSRule> {
// FIXME: Implement.
RELEASE_ASSERT_NOT_REACHED();
[&](StyleRuleStartingStyle& rule) -> Ref<CSSRule> {
return CSSStartingStyleRule::create(rule, parentSheet);
},
[](StyleRuleCharset&) -> Ref<CSSRule> {
RELEASE_ASSERT_NOT_REACHED();
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/css/StyleRuleImport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "CachedResourceRequest.h"
#include "CachedResourceRequestInitiatorTypes.h"
#include "Document.h"
#include "DocumentInlines.h"
#include "MediaList.h"
#include "MediaQueryParserContext.h"
#include "Page.h"
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/inspector/InspectorStyleSheet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ static RuleFlatteningStrategy flatteningStrategyForStyleRuleType(StyleRuleType s
case StyleRuleType::Supports:
case StyleRuleType::LayerBlock:
case StyleRuleType::Container:
case StyleRuleType::StartingStyle:
// These rules MUST be handled by the static `isValidRuleHeaderText`, `protocolGroupingTypeForStyleRuleType`,
// and `asCSSRuleList` in order to provide functionality in Web Inspector. Additionally, they MUST have a CSSOM
// representation created in `StyleRuleBase::createCSSOMWrapper`, otherwise we will end up with a mismatched
Expand All @@ -100,7 +101,6 @@ static RuleFlatteningStrategy flatteningStrategyForStyleRuleType(StyleRuleType s
// FIXME: implement support for this and move this case up.
// https://bugs.webkit.org/show_bug.cgi?id=264496
case StyleRuleType::Scope:
case StyleRuleType::StartingStyle:

case StyleRuleType::Unknown:
case StyleRuleType::Charset:
Expand Down

0 comments on commit a3ef1a9

Please sign in to comment.