Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (250583 => 250584)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,3 +1,13 @@
+2019-10-01 Antti Koivisto <an...@apple.com>
+
+ [CSS Shadow Parts] Parse 'part' attribute
+ https://bugs.webkit.org/show_bug.cgi?id=202409
+
+ Reviewed by Ryosuke Niwa.
+
+ * web-platform-tests/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist-expected.txt:
+ * web-platform-tests/css/css-shadow-parts/part-name-idl-expected.txt:
+
2019-10-01 Rob Buis <rb...@igalia.com>
[Mac] Layout Test imported/w3c/web-platform-tests/fetch/api/redirect/redirect-location.any.html fails
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist-expected.txt (250583 => 250584)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist-expected.txt 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist-expected.txt 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,4 +1,4 @@
The following text should be green:
-FAIL Part in selected host changed color via part IDL DOMTokenList attribute. undefined is not an object (evaluating 'el.part.remove')
+FAIL Part in selected host changed color via part IDL DOMTokenList attribute. assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 255)"
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-name-idl-expected.txt (250583 => 250584)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-name-idl-expected.txt 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-shadow-parts/part-name-idl-expected.txt 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,6 +1,6 @@
-FAIL Access to .part returns an empty DOMTokenList. undefined is not an object (evaluating 'parts.length')
-FAIL Multiple names give a DOMTokenList with multiple entries. undefined is not an object (evaluating 'parts.length')
-FAIL DOMTokenList created by access is persisted. undefined is not an object (evaluating 'parts.length')
-FAIL Changes in DOMTokenList are refected in attribute. undefined is not an object (evaluating 'parts.length')
+PASS Access to .part returns an empty DOMTokenList.
+PASS Multiple names give a DOMTokenList with multiple entries.
+PASS DOMTokenList created by access is persisted.
+PASS Changes in DOMTokenList are refected in attribute.
Modified: trunk/LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt (250583 => 250584)
--- trunk/LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt 2019-10-01 22:47:57 UTC (rev 250584)
@@ -137,6 +137,7 @@
PASS a["className"] is
PASS a["classList"] is
PASS a["slot"] is
+PASS a["part"] is
PASS a["attributes"] is [object NamedNodeMap]
PASS a["shadowRoot"] is null
PASS a["scrollTop"] is 0
Modified: trunk/LayoutTests/platform/mac-wk2/js/dom/dom-static-property-for-in-iteration-expected.txt (250583 => 250584)
--- trunk/LayoutTests/platform/mac-wk2/js/dom/dom-static-property-for-in-iteration-expected.txt 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/LayoutTests/platform/mac-wk2/js/dom/dom-static-property-for-in-iteration-expected.txt 2019-10-01 22:47:57 UTC (rev 250584)
@@ -140,6 +140,7 @@
PASS a["className"] is
PASS a["classList"] is
PASS a["slot"] is
+PASS a["part"] is
PASS a["attributes"] is [object NamedNodeMap]
PASS a["shadowRoot"] is null
PASS a["scrollTop"] is 0
Modified: trunk/Source/WebCore/ChangeLog (250583 => 250584)
--- trunk/Source/WebCore/ChangeLog 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/ChangeLog 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,3 +1,34 @@
+2019-10-01 Antti Koivisto <an...@apple.com>
+
+ [CSS Shadow Parts] Parse 'part' attribute
+ https://bugs.webkit.org/show_bug.cgi?id=202409
+
+ Reviewed by Ryosuke Niwa.
+
+ Add parsing for Element 'part' attribute and the IDL interface.
+ Also add a feature flag for CSS Shadow Parts.
+
+ * dom/Element.cpp:
+ (WebCore::Element::attributeChanged):
+ (WebCore::isNonEmptyTokenList):
+ (WebCore::Element::classAttributeChanged):
+ (WebCore::Element::partAttributeChanged):
+ (WebCore::Element::partNames const):
+ (WebCore::Element::part):
+ (WebCore::classStringHasClassName): Deleted.
+ * dom/Element.h:
+ * dom/Element.idl:
+ * dom/ElementRareData.cpp:
+ * dom/ElementRareData.h:
+ (WebCore::ElementRareData::partList const):
+ (WebCore::ElementRareData::setPartList):
+ (WebCore::ElementRareData::partNames const):
+ (WebCore::ElementRareData::setPartNames):
+ * html/HTMLAttributeNames.in:
+ * page/RuntimeEnabledFeatures.h:
+ (WebCore::RuntimeEnabledFeatures::setCSSShadowPartsEnabled):
+ (WebCore::RuntimeEnabledFeatures::cssShadowPartsEnabled const):
+
2019-10-01 Yusuke Suzuki <ysuz...@apple.com>
[JSC] Place VM* in TLS
Modified: trunk/Source/WebCore/dom/Element.cpp (250583 => 250584)
--- trunk/Source/WebCore/dom/Element.cpp 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/dom/Element.cpp 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1719,6 +1719,8 @@
document().invalidateAccessKeyCache();
else if (name == HTMLNames::classAttr)
classAttributeChanged(newValue);
+ else if (name == HTMLNames::partAttr)
+ partAttributeChanged(newValue);
else if (name == HTMLNames::idAttr) {
AtomString oldId = elementData()->idForStyleResolution();
AtomString newId = makeIdForStyleResolution(newValue, document().inQuirksMode());
@@ -1761,7 +1763,7 @@
}
template <typename CharacterType>
-static inline bool classStringHasClassName(const CharacterType* characters, unsigned length)
+static inline bool isNonEmptyTokenList(const CharacterType* characters, unsigned length)
{
ASSERT(length > 0);
@@ -1775,16 +1777,16 @@
return i < length;
}
-static inline bool classStringHasClassName(const AtomString& newClassString)
+static inline bool isNonEmptyTokenList(const AtomString& stringValue)
{
- unsigned length = newClassString.length();
+ unsigned length = stringValue.length();
if (!length)
return false;
- if (newClassString.is8Bit())
- return classStringHasClassName(newClassString.characters8(), length);
- return classStringHasClassName(newClassString.characters16(), length);
+ if (stringValue.is8Bit())
+ return isNonEmptyTokenList(stringValue.characters8(), length);
+ return isNonEmptyTokenList(stringValue.characters16(), length);
}
void Element::classAttributeChanged(const AtomString& newClassString)
@@ -1794,7 +1796,7 @@
ensureUniqueElementData();
bool shouldFoldCase = document().inQuirksMode();
- bool newStringHasClasses = classStringHasClassName(newClassString);
+ bool newStringHasClasses = isNonEmptyTokenList(newClassString);
auto oldClassNames = elementData()->classNames();
auto newClassNames = newStringHasClasses ? SpaceSplitString(newClassString, shouldFoldCase) : SpaceSplitString();
@@ -1809,6 +1811,23 @@
}
}
+void Element::partAttributeChanged(const AtomString& newValue)
+{
+ if (!RuntimeEnabledFeatures::sharedFeatures().cssShadowPartsEnabled())
+ return;
+
+ bool hasParts = isNonEmptyTokenList(newValue);
+ if (hasParts || !partNames().isEmpty()) {
+ auto newParts = hasParts ? SpaceSplitString(newValue, false) : SpaceSplitString();
+ ensureElementRareData().setPartNames(WTFMove(newParts));
+ }
+
+ if (hasRareData()) {
+ if (auto* partList = elementRareData()->partList())
+ partList->associatedAttributeValueChanged(newValue);
+ }
+}
+
URL Element::absoluteLinkURL() const
{
if (!isLink())
@@ -3414,6 +3433,19 @@
return *data.classList();
}
+inline SpaceSplitString Element::partNames() const
+{
+ return elementRareData() ? elementRareData()->partNames() : SpaceSplitString();
+}
+
+DOMTokenList& Element::part()
+{
+ auto& data = ""
+ if (!data.partList())
+ data.setPartList(makeUnique<DOMTokenList>(*this, HTMLNames::partAttr));
+ return *data.partList();
+}
+
DatasetDOMStringMap& Element::dataset()
{
ElementRareData& data = ""
Modified: trunk/Source/WebCore/dom/Element.h (250583 => 250584)
--- trunk/Source/WebCore/dom/Element.h 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/dom/Element.h 2019-10-01 22:47:57 UTC (rev 250584)
@@ -451,6 +451,9 @@
WEBCORE_EXPORT DOMTokenList& classList();
+ SpaceSplitString partNames() const;
+ DOMTokenList& part();
+
DatasetDOMStringMap& dataset();
#if ENABLE(VIDEO)
@@ -613,10 +616,8 @@
void clearTabIndexExplicitlyIfNeeded();
void setTabIndexExplicitly(int);
- // classAttributeChanged() exists to share code between
- // parseAttribute (called via setAttribute()) and
- // svgAttributeChanged (called when element.className.baseValue is set)
void classAttributeChanged(const AtomString& newClassString);
+ void partAttributeChanged(const AtomString& newValue);
void addShadowRoot(Ref<ShadowRoot>&&);
Modified: trunk/Source/WebCore/dom/Element.idl (250583 => 250584)
--- trunk/Source/WebCore/dom/Element.idl 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/dom/Element.idl 2019-10-01 22:47:57 UTC (rev 250584)
@@ -34,6 +34,7 @@
[CEReactions, Reflect=class] attribute DOMString className;
[PutForwards=value] readonly attribute DOMTokenList classList; // FIXME: Should be [SameObject].
[CEReactions, EnabledAtRuntime=ShadowDOM, Reflect, Unscopable] attribute DOMString slot;
+ [EnabledAtRuntime=CSSShadowParts, SameObject, PutForwards=value] readonly attribute DOMTokenList part;
[DOMJIT=ReadDOM] boolean hasAttributes();
readonly attribute NamedNodeMap attributes; // FIXME: Should be [SameObject].
Modified: trunk/Source/WebCore/dom/ElementRareData.cpp (250583 => 250584)
--- trunk/Source/WebCore/dom/ElementRareData.cpp 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/dom/ElementRareData.cpp 2019-10-01 22:47:57 UTC (rev 250584)
@@ -43,7 +43,7 @@
#endif
LayoutSize sizeForResizing;
IntPoint savedLayerScrollPosition;
- void* pointers[8];
+ void* pointers[10];
#if ENABLE(INTERSECTION_OBSERVER)
void* intersectionObserverData;
#endif
Modified: trunk/Source/WebCore/dom/ElementRareData.h (250583 => 250584)
--- trunk/Source/WebCore/dom/ElementRareData.h 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/dom/ElementRareData.h 2019-10-01 22:47:57 UTC (rev 250584)
@@ -31,6 +31,7 @@
#include "RenderElement.h"
#include "ResizeObserver.h"
#include "ShadowRoot.h"
+#include "SpaceSplitString.h"
#include "StylePropertyMap.h"
namespace WebCore {
@@ -102,6 +103,12 @@
bool hasElementIdentifier() const { return m_hasElementIdentifier; }
void setHasElementIdentifier(bool value) { m_hasElementIdentifier = value; }
+ DOMTokenList* partList() const { return m_partList.get(); }
+ void setPartList(std::unique_ptr<DOMTokenList> partList) { m_partList = WTFMove(partList); }
+
+ const SpaceSplitString& partNames() const { return m_partNames; }
+ void setPartNames(SpaceSplitString&& partNames) { m_partNames = WTFMove(partNames); }
+
#if ENABLE(INTERSECTION_OBSERVER)
IntersectionObserverData* intersectionObserverData() { return m_intersectionObserverData.get(); }
void setIntersectionObserverData(std::unique_ptr<IntersectionObserverData>&& data) { m_intersectionObserverData = WTFMove(data); }
@@ -186,6 +193,9 @@
RefPtr<StylePropertyMap> m_attributeStyleMap;
#endif
+ std::unique_ptr<DOMTokenList> m_partList;
+ SpaceSplitString m_partNames;
+
void releasePseudoElement(PseudoElement*);
};
Modified: trunk/Source/WebCore/html/HTMLAttributeNames.in (250583 => 250584)
--- trunk/Source/WebCore/html/HTMLAttributeNames.in 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/html/HTMLAttributeNames.in 2019-10-01 22:47:57 UTC (rev 250584)
@@ -333,6 +333,7 @@
onwebkitwillrevealtop
open
optimum
+part
pattern
placeholder
playsinline
Modified: trunk/Source/WebCore/page/RuntimeEnabledFeatures.h (250583 => 250584)
--- trunk/Source/WebCore/page/RuntimeEnabledFeatures.h 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebCore/page/RuntimeEnabledFeatures.h 2019-10-01 22:47:57 UTC (rev 250584)
@@ -373,6 +373,9 @@
void setLazyImageLoadingEnabled(bool areEnabled) { m_lazyImageLoadingEnabled = areEnabled; }
bool lazyImageLoadingEnabled() const { return m_lazyImageLoadingEnabled; }
+ void setCSSShadowPartsEnabled(bool isEnabled) { m_isCSSShadowPartsEnabled = isEnabled; }
+ bool cssShadowPartsEnabled() const { return m_isCSSShadowPartsEnabled; }
+
WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures();
#if HAVE(NSURLSESSION_WEBSOCKET)
@@ -574,6 +577,7 @@
bool m_lazyImageLoadingEnabled { false };
bool m_secureContextChecksEnabled { true };
+ bool m_isCSSShadowPartsEnabled { false };
friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
};
Modified: trunk/Source/WebKit/ChangeLog (250583 => 250584)
--- trunk/Source/WebKit/ChangeLog 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKit/ChangeLog 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,3 +1,14 @@
+2019-10-01 Antti Koivisto <an...@apple.com>
+
+ [CSS Shadow Parts] Parse 'part' attribute
+ https://bugs.webkit.org/show_bug.cgi?id=202409
+
+ Reviewed by Ryosuke Niwa.
+
+ * Shared/WebPreferences.yaml:
+
+ Add experimental feature, default to disabled for now.
+
2019-10-01 Alex Christensen <achristen...@webkit.org>
Progress towards successful CMake build on Mac
Modified: trunk/Source/WebKit/Shared/WebPreferences.yaml (250583 => 250584)
--- trunk/Source/WebKit/Shared/WebPreferences.yaml 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKit/Shared/WebPreferences.yaml 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1441,6 +1441,14 @@
webcoreBinding: RuntimeEnabledFeatures
webcoreName: fetchAPIKeepAliveEnabled
+CSSShadowPartsEnabled:
+ type: bool
+ defaultValue: false
+ humanReadableName: "CSS Shadow Parts"
+ humanReadableDescription: "Enable CSS Shadow Parts"
+ category: experimental
+ webcoreBinding: RuntimeEnabledFeatures
+
# For internal features:
# The type should be boolean.
# You must provide a humanReadableName and humanReadableDescription for all debug features. They
Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (250583 => 250584)
--- trunk/Source/WebKitLegacy/mac/ChangeLog 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,3 +1,19 @@
+2019-10-01 Antti Koivisto <an...@apple.com>
+
+ [CSS Shadow Parts] Parse 'part' attribute
+ https://bugs.webkit.org/show_bug.cgi?id=202409
+
+ Reviewed by Ryosuke Niwa.
+
+ * WebView/WebPreferenceKeysPrivate.h:
+ * WebView/WebPreferences.mm:
+ (+[WebPreferences initialize]):
+ (-[WebPreferences cssShadowPartsEnabled]):
+ (-[WebPreferences setCSSShadowPartsEnabled:]):
+ * WebView/WebPreferencesPrivate.h:
+ * WebView/WebView.mm:
+ (-[WebView _preferencesChanged:]):
+
2019-10-01 Alex Christensen <achristen...@webkit.org>
Progress towards successful CMake build on Mac
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h (250583 => 250584)
--- trunk/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h 2019-10-01 22:47:57 UTC (rev 250584)
@@ -201,6 +201,7 @@
#define WebKitPunchOutWhiteBackgroundsInDarkModePreferenceKey @"WebKitPunchOutWhiteBackgroundsInDarkMode"
#define WebKitFetchAPIKeepAliveEnabledPreferenceKey @"WebKitFetchAPIKeepAliveEnabled"
#define WebKitWebAnimationsCSSIntegrationEnabledPreferenceKey @"WebKitWebAnimationsCSSIntegrationEnabled"
+#define WebKitCSSShadowPartsEnabledPreferenceKey @"WebKitCSSShadowPartsEnabled"
#if !TARGET_OS_IPHONE
// These are private both because callers should be using the cover methods and because the
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebPreferences.mm (250583 => 250584)
--- trunk/Source/WebKitLegacy/mac/WebView/WebPreferences.mm 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebPreferences.mm 2019-10-01 22:47:57 UTC (rev 250584)
@@ -691,6 +691,7 @@
#endif
@NO, WebKitCoreMathMLEnabledPreferenceKey,
@NO, WebKitLinkPreloadResponsiveImagesEnabledPreferenceKey,
+ @NO, WebKitCSSShadowPartsEnabledPreferenceKey,
nil];
#if !PLATFORM(IOS_FAMILY)
@@ -3507,6 +3508,16 @@
[self _setBoolValue:flag forKey:WebKitLinkPreloadResponsiveImagesEnabledPreferenceKey];
}
+- (BOOL)cssShadowPartsEnabled
+{
+ return [self _boolValueForKey:WebKitCSSShadowPartsEnabledPreferenceKey];
+}
+
+- (void)setCSSShadowPartsEnabled:(BOOL)flag
+{
+ [self _setBoolValue:flag forKey:WebKitCSSShadowPartsEnabledPreferenceKey];
+}
+
@end
@implementation WebPreferences (WebInternal)
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h (250583 => 250584)
--- trunk/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h 2019-10-01 22:47:57 UTC (rev 250584)
@@ -615,6 +615,9 @@
- (void)setLinkPreloadResponsiveImagesEnabled:(BOOL)flag;
- (BOOL)linkPreloadResponsiveImagesEnabled;
+- (void)setCSSShadowPartsEnabled:(BOOL)flag;
+- (BOOL)cssShadowPartsEnabled;
+
@property (nonatomic) BOOL visualViewportAPIEnabled;
@property (nonatomic) BOOL CSSOMViewScrollingAPIEnabled;
@property (nonatomic) BOOL largeImageAsyncDecodingEnabled;
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebView.mm (250583 => 250584)
--- trunk/Source/WebKitLegacy/mac/WebView/WebView.mm 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebView.mm 2019-10-01 22:47:57 UTC (rev 250584)
@@ -3187,6 +3187,7 @@
RuntimeEnabledFeatures::sharedFeatures().setLinkPreloadResponsiveImagesEnabled([preferences linkPreloadResponsiveImagesEnabled]);
RuntimeEnabledFeatures::sharedFeatures().setDialogElementEnabled([preferences dialogElementEnabled]);
RuntimeEnabledFeatures::sharedFeatures().setKeygenElementEnabled([preferences keygenElementEnabled]);
+ RuntimeEnabledFeatures::sharedFeatures().setCSSShadowPartsEnabled([preferences cssShadowPartsEnabled]);
#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
RuntimeEnabledFeatures::sharedFeatures().setLegacyEncryptedMediaAPIEnabled(preferences.legacyEncryptedMediaAPIEnabled);
Modified: trunk/Tools/ChangeLog (250583 => 250584)
--- trunk/Tools/ChangeLog 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Tools/ChangeLog 2019-10-01 22:47:57 UTC (rev 250584)
@@ -1,3 +1,13 @@
+2019-10-01 Antti Koivisto <an...@apple.com>
+
+ [CSS Shadow Parts] Parse 'part' attribute
+ https://bugs.webkit.org/show_bug.cgi?id=202409
+
+ Reviewed by Ryosuke Niwa.
+
+ * DumpRenderTree/mac/DumpRenderTree.mm:
+ (enableExperimentalFeatures):
+
2019-10-01 Aakash Jain <aakash_j...@apple.com>
Follow-up fix to r250572 to fix a typo.
Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (250583 => 250584)
--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm 2019-10-01 22:21:41 UTC (rev 250583)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm 2019-10-01 22:47:57 UTC (rev 250584)
@@ -880,6 +880,7 @@
[preferences setMediaRecorderEnabled:YES];
[preferences setReferrerPolicyAttributeEnabled:YES];
[preferences setLinkPreloadResponsiveImagesEnabled:YES];
+ [preferences setCSSShadowPartsEnabled:YES];
}
// Called before each test.