Skip to content
Permalink
Browse files
Add separate settings and preferences to enable/disable async decodin…
…g for large images and animated images

https://bugs.webkit.org/show_bug.cgi?id=165177

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-11-30
Reviewed by Simon Fraser.
Source/WebCore:

Instead of having the async image decoding be controlled by one setting,
two separate settings are added:
    largeImageAsyncDecodingEnabled
    animatedImageAsyncDecodingEnabled

And an existing setting is removed:
    asyncImageDecodingEnabled

* loader/cache/CachedImage.cpp:
(WebCore::CachedImage::load):
* loader/cache/CachedImage.h:
* page/Settings.in:
* platform/graphics/BitmapImage.cpp:
(WebCore::BitmapImage::internalStartAnimation):
* platform/graphics/BitmapImage.h:
* platform/graphics/ImageObserver.h:

Source/WebKit/mac:

Hook up the async image decoding settings for WebKit1.

* WebView/WebPreferenceKeysPrivate.h:
* WebView/WebPreferences.mm:
(+[WebPreferences initialize]):
(-[WebPreferences largeImageAsyncDecodingEnabled]):
(-[WebPreferences setLargeImageAsyncDecodingEnabled:]):
(-[WebPreferences animatedImageAsyncDecodingEnabled]):
(-[WebPreferences setAnimatedImageAsyncDecodingEnabled:]):
(-[WebPreferences asyncImageDecodingEnabled]): Deleted.
(-[WebPreferences setAsyncImageDecodingEnabled:]): Deleted.
* WebView/WebPreferencesPrivate.h:
* WebView/WebView.mm:
(-[WebView _preferencesChanged:]):

Source/WebKit2:

Hook up the async image decoding settings for WebKit2.

* Shared/WebPreferencesDefinitions.h:
* UIProcess/API/Cocoa/WKPreferences.mm:
(-[WKPreferences _largeImageAsyncDecodingEnabled]):
(-[WKPreferences _setLargeImageAsyncDecodingEnabled:]):
(-[WKPreferences _animatedImageAsyncDecodingEnabled]):
(-[WKPreferences _setAnimatedImageAsyncDecodingEnabled:]):
(-[WKPreferences _asyncImageDecodingEnabled]): Deleted.
(-[WKPreferences _setAsyncImageDecodingEnabled:]): Deleted.
* UIProcess/API/Cocoa/WKPreferencesPrivate.h:
* WebProcess/InjectedBundle/InjectedBundle.cpp:
(WebKit::InjectedBundle::overrideBoolPreferenceForTestRunner):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updatePreferences):

Tools:

Pref and a menu item to toggle async image decoding settings for WebKits 1 and 2.

* MiniBrowser/mac/SettingsController.h:
* MiniBrowser/mac/SettingsController.m:
(-[SettingsController _populateMenu]):
(-[SettingsController validateMenuItem:]):
(-[SettingsController toggleLargeImageAsyncDecodingEnabled:]):
(-[SettingsController largeImageAsyncDecodingEnabled]):
(-[SettingsController toggleAnimatedImageAsyncDecodingEnabled:]):
(-[SettingsController animatedImageAsyncDecodingEnabled]):
(-[SettingsController toggleAsyncImageDecodingEnabled:]): Deleted.
(-[SettingsController asyncImageDecodingEnabled]): Deleted.
* MiniBrowser/mac/WK1BrowserWindowController.m:
(-[WK1BrowserWindowController didChangeSettings]):
* MiniBrowser/mac/WK2BrowserWindowController.m:
(-[WK2BrowserWindowController didChangeSettings]):

Canonical link: https://commits.webkit.org/182845@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@209159 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
Said Abou-Hallawa authored and webkit-commit-queue committed Nov 30, 2016
1 parent 9420ed5 commit 9fc67aad8f65ce28d710b3de52e06e51a2814f8e
@@ -1,3 +1,27 @@
2016-11-30 Said Abou-Hallawa <sabouhallawa@apple.com>

Add separate settings and preferences to enable/disable async decoding for large images and animated images
https://bugs.webkit.org/show_bug.cgi?id=165177

Reviewed by Simon Fraser.

Instead of having the async image decoding be controlled by one setting,
two separate settings are added:
largeImageAsyncDecodingEnabled
animatedImageAsyncDecodingEnabled

And an existing setting is removed:
asyncImageDecodingEnabled

* loader/cache/CachedImage.cpp:
(WebCore::CachedImage::load):
* loader/cache/CachedImage.h:
* page/Settings.in:
* platform/graphics/BitmapImage.cpp:
(WebCore::BitmapImage::internalStartAnimation):
* platform/graphics/BitmapImage.h:
* platform/graphics/ImageObserver.h:

2016-11-30 Zalan Bujtas <zalan@apple.com>

ASSERTION FAILED: layoutState->m_renderer == this in WebCore::RenderBlock::offsetFromLogicalTopOfFirstPage
@@ -92,7 +92,8 @@ void CachedImage::load(CachedResourceLoader& loader)

if (m_loader) {
m_allowSubsampling = m_loader->frameLoader()->frame().settings().imageSubsamplingEnabled();
m_allowAsyncImageDecoding = m_loader->frameLoader()->frame().settings().asyncImageDecodingEnabled();
m_allowLargeImageAsyncDecoding = m_loader->frameLoader()->frame().settings().largeImageAsyncDecodingEnabled();
m_allowAnimatedImageAsyncDecoding = m_loader->frameLoader()->frame().settings().animatedImageAsyncDecodingEnabled();
m_showDebugBackground = m_loader->frameLoader()->frame().settings().showDebugBorders();
}
}
@@ -118,7 +118,8 @@ class CachedImage final : public CachedResource, public ImageObserver {

// ImageObserver
bool allowSubsampling() const override { return m_allowSubsampling; }
bool allowAsyncImageDecoding() const override { return m_allowAsyncImageDecoding; }
bool allowLargeImageAsyncDecoding() const override { return m_allowLargeImageAsyncDecoding; }
bool allowAnimatedImageAsyncDecoding() const override { return m_allowAnimatedImageAsyncDecoding; }
bool showDebugBackground() const override { return m_showDebugBackground; }
void decodedSizeChanged(const Image*, long long delta) override;
void didDraw(const Image*) override;
@@ -145,7 +146,8 @@ class CachedImage final : public CachedResource, public ImageObserver {
#else
bool m_allowSubsampling { false };
#endif
bool m_allowAsyncImageDecoding { true };
bool m_allowLargeImageAsyncDecoding { true };
bool m_allowAnimatedImageAsyncDecoding { true };
bool m_showDebugBackground { false };
};

@@ -289,7 +289,8 @@ forcedColorsAreInvertedAccessibilityValue type=ForcedAccessibilityValue, initial
forcedDisplayIsMonochromeAccessibilityValue type=ForcedAccessibilityValue, initial=defaultForcedDisplayIsMonochromeAccessibilityValue
forcedPrefersReducedMotionAccessibilityValue type=ForcedAccessibilityValue, initial=defaultForcedPrefersReducedMotionAccessibilityValue

asyncImageDecodingEnabled initial=true
largeImageAsyncDecodingEnabled initial=true
animatedImageAsyncDecodingEnabled initial=true

es6ModulesEnabled initial=false
pointerLockEnabled initial=false
@@ -278,7 +278,7 @@ BitmapImage::StartAnimationResult BitmapImage::internalStartAnimation()
// it will be decoded on a separate work queue. When decoding nextFrame finishes, we will be notified
// through the callback newFrameNativeImageAvailableAtIndex(). Otherwise, advanceAnimation() will be called
// when the timer fires and m_currentFrame will be advanced to nextFrame since it is not being decoded.
if ((allowAsyncImageDecoding() && m_source.isAsyncDecodingRequired()) || isAsyncDecodingForcedForTesting()) {
if ((allowAnimatedImageAsyncDecoding() && m_source.isAsyncDecodingRequired()) || isAsyncDecodingForcedForTesting()) {
if (!m_source.requestFrameAsyncDecodingAtIndex(nextFrame, m_currentSubsamplingLevel))
LOG(Images, "BitmapImage %p %s - cachedFrameCount %ld nextFrame %ld", this, __FUNCTION__, ++m_cachedFrameCount, nextFrame);
m_desiredFrameDecodeTimeForTesting = time + std::max(m_frameDecodingDurationForTesting, 0.0f);
@@ -134,7 +134,8 @@ class BitmapImage final : public Image {
NativeImagePtr frameImageAtIndex(size_t, SubsamplingLevel = SubsamplingLevel::Default, const GraphicsContext* = nullptr);

bool allowSubsampling() const { return imageObserver() && imageObserver()->allowSubsampling(); }
bool allowAsyncImageDecoding() const { return imageObserver() && imageObserver()->allowAsyncImageDecoding(); }
bool allowLargeImageAsyncDecoding() const { return imageObserver() && imageObserver()->allowLargeImageAsyncDecoding(); }
bool allowAnimatedImageAsyncDecoding() const { return imageObserver() && imageObserver()->allowAnimatedImageAsyncDecoding(); }
bool showDebugBackground() const { return imageObserver() && imageObserver()->showDebugBackground(); }

// Called to invalidate cached data. When |destroyAll| is true, we wipe out
@@ -38,7 +38,8 @@ class ImageObserver {
virtual ~ImageObserver() {}
public:
virtual bool allowSubsampling() const = 0;
virtual bool allowAsyncImageDecoding() const = 0;
virtual bool allowLargeImageAsyncDecoding() const = 0;
virtual bool allowAnimatedImageAsyncDecoding() const = 0;
virtual bool showDebugBackground() const = 0;
virtual void decodedSizeChanged(const Image*, long long delta) = 0;

@@ -1,3 +1,25 @@
2016-11-30 Said Abou-Hallawa <sabouhallawa@apple.com>

Add separate settings and preferences to enable/disable async decoding for large images and animated images
https://bugs.webkit.org/show_bug.cgi?id=165177

Reviewed by Simon Fraser.

Hook up the async image decoding settings for WebKit1.

* WebView/WebPreferenceKeysPrivate.h:
* WebView/WebPreferences.mm:
(+[WebPreferences initialize]):
(-[WebPreferences largeImageAsyncDecodingEnabled]):
(-[WebPreferences setLargeImageAsyncDecodingEnabled:]):
(-[WebPreferences animatedImageAsyncDecodingEnabled]):
(-[WebPreferences setAnimatedImageAsyncDecodingEnabled:]):
(-[WebPreferences asyncImageDecodingEnabled]): Deleted.
(-[WebPreferences setAsyncImageDecodingEnabled:]): Deleted.
* WebView/WebPreferencesPrivate.h:
* WebView/WebView.mm:
(-[WebView _preferencesChanged:]):

2016-11-29 Andy Estes <aestes@apple.com>

[Cocoa] Enable two clang warnings recommended by Xcode
@@ -141,7 +141,8 @@
#define WebKitSuppressesIncrementalRenderingKey @"WebKitSuppressesIncrementalRendering"
#define WebKitSubpixelCSSOMElementMetricsEnabledPreferenceKey @"WebKitSubpixelCSSOMElementMetricsEnabled"
#define WebKitResourceLoadStatisticsEnabledPreferenceKey @"WebKitResourceLoadStatisticsEnabled"
#define WebKitAsyncImageDecodingEnabledPreferenceKey @"WebKitAsyncImageDecodingEnabledEnabled"
#define WebKitLargeImageAsyncDecodingEnabledPreferenceKey @"WebKitLargeImageAsyncDecodingEnabled"
#define WebKitAnimatedImageAsyncDecodingEnabledPreferenceKey @"WebKitAnimatedImageAsyncDecodingEnabled"
#if TARGET_OS_IPHONE
#define WebKitAudioSessionCategoryOverride @"WebKitAudioSessionCategoryOverride"
#define WebKitAVKitEnabled @"WebKitAVKitEnabled"
@@ -507,7 +507,8 @@ + (void)initialize
[NSNumber numberWithBool:NO], WebKitAccelerated2dCanvasEnabledPreferenceKey,
[NSNumber numberWithBool:NO], WebKitSubpixelCSSOMElementMetricsEnabledPreferenceKey,
[NSNumber numberWithBool:NO], WebKitResourceLoadStatisticsEnabledPreferenceKey,
[NSNumber numberWithBool:YES], WebKitAsyncImageDecodingEnabledPreferenceKey,
[NSNumber numberWithBool:YES], WebKitLargeImageAsyncDecodingEnabledPreferenceKey,
[NSNumber numberWithBool:YES], WebKitAnimatedImageAsyncDecodingEnabledPreferenceKey,
#if PLATFORM(IOS)
[NSNumber numberWithBool:YES], WebKitFrameFlatteningEnabledPreferenceKey,
#else
@@ -1887,14 +1888,24 @@ - (void)setResourceLoadStatisticsEnabled:(BOOL)enabled
[self _setBoolValue:enabled forKey:WebKitResourceLoadStatisticsEnabledPreferenceKey];
}

- (BOOL)asyncImageDecodingEnabled
- (BOOL)largeImageAsyncDecodingEnabled
{
return [self _boolValueForKey:WebKitAsyncImageDecodingEnabledPreferenceKey];
return [self _boolValueForKey:WebKitLargeImageAsyncDecodingEnabledPreferenceKey];
}

- (void)setAsyncImageDecodingEnabled:(BOOL)enabled
- (void)setLargeImageAsyncDecodingEnabled:(BOOL)enabled
{
[self _setBoolValue:enabled forKey:WebKitAsyncImageDecodingEnabledPreferenceKey];
[self _setBoolValue:enabled forKey:WebKitLargeImageAsyncDecodingEnabledPreferenceKey];
}

- (BOOL)animatedImageAsyncDecodingEnabled
{
return [self _boolValueForKey:WebKitAnimatedImageAsyncDecodingEnabledPreferenceKey];
}

- (void)setAnimatedImageAsyncDecodingEnabled:(BOOL)enabled
{
[self _setBoolValue:enabled forKey:WebKitAnimatedImageAsyncDecodingEnabledPreferenceKey];
}

- (BOOL)canvasUsesAcceleratedDrawing
@@ -513,7 +513,8 @@ extern NSString *WebPreferencesCacheModelChangedInternalNotification;
- (BOOL)modernMediaControlsEnabled;

@property (nonatomic) BOOL visualViewportEnabled;
@property (nonatomic) BOOL asyncImageDecodingEnabled;
@property (nonatomic) BOOL largeImageAsyncDecodingEnabled;
@property (nonatomic) BOOL animatedImageAsyncDecodingEnabled;
@property (nonatomic) BOOL javaScriptMarkupEnabled;
@property (nonatomic) BOOL mediaDataLoadsAutomatically;
@property (nonatomic) BOOL attachmentElementEnabled;
@@ -2900,7 +2900,8 @@ - (void)_preferencesChanged:(WebPreferences *)preferences

settings.setShouldConvertInvalidURLsToBlank(shouldConvertInvalidURLsToBlank());

settings.setAsyncImageDecodingEnabled([preferences asyncImageDecodingEnabled]);
settings.setLargeImageAsyncDecodingEnabled([preferences largeImageAsyncDecodingEnabled]);
settings.setAnimatedImageAsyncDecodingEnabled([preferences animatedImageAsyncDecodingEnabled]);
}

static inline IMP getMethod(id o, SEL s)
@@ -1,3 +1,26 @@
2016-11-30 Said Abou-Hallawa <sabouhallawa@apple.com>

Add separate settings and preferences to enable/disable async decoding for large images and animated images
https://bugs.webkit.org/show_bug.cgi?id=165177

Reviewed by Simon Fraser.

Hook up the async image decoding settings for WebKit2.

* Shared/WebPreferencesDefinitions.h:
* UIProcess/API/Cocoa/WKPreferences.mm:
(-[WKPreferences _largeImageAsyncDecodingEnabled]):
(-[WKPreferences _setLargeImageAsyncDecodingEnabled:]):
(-[WKPreferences _animatedImageAsyncDecodingEnabled]):
(-[WKPreferences _setAnimatedImageAsyncDecodingEnabled:]):
(-[WKPreferences _asyncImageDecodingEnabled]): Deleted.
(-[WKPreferences _setAsyncImageDecodingEnabled:]): Deleted.
* UIProcess/API/Cocoa/WKPreferencesPrivate.h:
* WebProcess/InjectedBundle/InjectedBundle.cpp:
(WebKit::InjectedBundle::overrideBoolPreferenceForTestRunner):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updatePreferences):

2016-11-30 Chris Dumez <cdumez@apple.com>

[iOS][WK2] Turn on HTML interactive form validation feature
@@ -240,7 +240,8 @@
macro(ApplePayCapabilityDisclosureAllowed, applePayCapabilityDisclosureAllowed, Bool, bool, true, "", "") \
macro(VisualViewportEnabled, visualViewportEnabled, Bool, bool, false, "", "") \
macro(NeedsStorageAccessFromFileURLsQuirk, needsStorageAccessFromFileURLsQuirk, Bool, bool, true, "", "") \
macro(AsyncImageDecodingEnabled, asyncImageDecodingEnabled, Bool, bool, true, "", "") \
macro(LargeImageAsyncDecodingEnabled, largeImageAsyncDecodingEnabled, Bool, bool, true, "", "") \
macro(AnimatedImageAsyncDecodingEnabled, animatedImageAsyncDecodingEnabled, Bool, bool, true, "", "") \
macro(CustomElementsEnabled, customElementsEnabled, Bool, bool, true, "", "") \
macro(EncryptedMediaAPIEnabled, encryptedMediaAPIEnabled, Bool, bool, false, "", "") \
macro(IntersectionObserverEnabled, intersectionObserverEnabled, Bool, bool, false, "Intersection Observer", "Enable Intersection Observer support") \
@@ -325,14 +325,24 @@ - (void)_setVisualViewportEnabled:(BOOL)_visualViewportEnabled
_preferences->setVisualViewportEnabled(_visualViewportEnabled);
}

- (BOOL)_asyncImageDecodingEnabled
- (BOOL)_largeImageAsyncDecodingEnabled
{
return _preferences->asyncImageDecodingEnabled();
return _preferences->largeImageAsyncDecodingEnabled();
}

- (void)_setAsyncImageDecodingEnabled:(BOOL)_asyncImageDecodingEnabled
- (void)_setLargeImageAsyncDecodingEnabled:(BOOL)_largeImageAsyncDecodingEnabled
{
_preferences->setAsyncImageDecodingEnabled(_asyncImageDecodingEnabled);
_preferences->setLargeImageAsyncDecodingEnabled(_largeImageAsyncDecodingEnabled);
}

- (BOOL)_animatedImageAsyncDecodingEnabled
{
return _preferences->animatedImageAsyncDecodingEnabled();
}

- (void)_setAnimatedImageAsyncDecodingEnabled:(BOOL)_animatedImageAsyncDecodingEnabled
{
_preferences->setAnimatedImageAsyncDecodingEnabled(_animatedImageAsyncDecodingEnabled);
}

- (BOOL)_textAutosizingEnabled
@@ -64,7 +64,8 @@ typedef NS_OPTIONS(NSUInteger, _WKJavaScriptRuntimeFlags) {
@property (nonatomic, setter=_setAcceleratedDrawingEnabled:) BOOL _acceleratedDrawingEnabled WK_API_AVAILABLE(macosx(10.12), ios(10.0));
@property (nonatomic, setter=_setDisplayListDrawingEnabled:) BOOL _displayListDrawingEnabled WK_API_AVAILABLE(macosx(10.12), ios(10.0));
@property (nonatomic, setter=_setVisualViewportEnabled:) BOOL _visualViewportEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, setter=_setAsyncImageDecodingEnabled:) BOOL _asyncImageDecodingEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, setter=_setLargeImageAsyncDecodingEnabled:) BOOL _largeImageAsyncDecodingEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, setter=_setAnimatedImageAsyncDecodingEnabled:) BOOL _animatedImageAsyncDecodingEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, setter=_setTextAutosizingEnabled:) BOOL _textAutosizingEnabled WK_API_AVAILABLE(macosx(10.12), ios(10.0));

@property (nonatomic, setter=_setDeveloperExtrasEnabled:) BOOL _developerExtrasEnabled WK_API_AVAILABLE(macosx(10.11), ios(9.0));
@@ -242,7 +242,8 @@ void InjectedBundle::overrideBoolPreferenceForTestRunner(WebPageGroupProxy* page
macro(WebKitMediaStreamEnabled, MediaStreamEnabled, mediaStreamEnabled) \
macro(WebKitHTTPEquivEnabled, HttpEquivEnabled, httpEquivEnabled) \
macro(WebKitVisualViewportEnabled, VisualViewportEnabled, visualViewportEnabled) \
macro(WebKitAsyncImageDecodingEnabled, AsyncImageDecodingEnabled, asyncImageDecodingEnabled) \
macro(WebKitLargeImageAsyncDecodingEnabled, LargeImageAsyncDecodingEnabled, largeImageAsyncDecodingEnabled) \
macro(WebKitAnimatedImageAsyncDecodingEnabled, AnimatedImageAsyncDecodingEnabled, animatedImageAsyncDecodingEnabled) \
macro(WebKitES6ModulesEnabled, Es6ModulesEnabled, es6ModulesEnabled) \
\

@@ -3219,7 +3219,8 @@ void WebPage::updatePreferences(const WebPreferencesStore& store)
m_viewportConfiguration.setCanIgnoreScalingConstraints(m_ignoreViewportScalingConstraints);
setForceAlwaysUserScalable(m_forceAlwaysUserScalable || store.getBoolValueForKey(WebPreferencesKey::forceAlwaysUserScalableKey()));
#endif
settings.setAsyncImageDecodingEnabled(store.getBoolValueForKey(WebPreferencesKey::asyncImageDecodingEnabledKey()));
settings.setLargeImageAsyncDecodingEnabled(store.getBoolValueForKey(WebPreferencesKey::largeImageAsyncDecodingEnabledKey()));
settings.setAnimatedImageAsyncDecodingEnabled(store.getBoolValueForKey(WebPreferencesKey::animatedImageAsyncDecodingEnabledKey()));
}

#if ENABLE(DATA_DETECTION)
@@ -1,3 +1,27 @@
2016-11-30 Said Abou-Hallawa <sabouhallawa@apple.com>

Add separate settings and preferences to enable/disable async decoding for large images and animated images
https://bugs.webkit.org/show_bug.cgi?id=165177

Reviewed by Simon Fraser.

Pref and a menu item to toggle async image decoding settings for WebKits 1 and 2.

* MiniBrowser/mac/SettingsController.h:
* MiniBrowser/mac/SettingsController.m:
(-[SettingsController _populateMenu]):
(-[SettingsController validateMenuItem:]):
(-[SettingsController toggleLargeImageAsyncDecodingEnabled:]):
(-[SettingsController largeImageAsyncDecodingEnabled]):
(-[SettingsController toggleAnimatedImageAsyncDecodingEnabled:]):
(-[SettingsController animatedImageAsyncDecodingEnabled]):
(-[SettingsController toggleAsyncImageDecodingEnabled:]): Deleted.
(-[SettingsController asyncImageDecodingEnabled]): Deleted.
* MiniBrowser/mac/WK1BrowserWindowController.m:
(-[WK1BrowserWindowController didChangeSettings]):
* MiniBrowser/mac/WK2BrowserWindowController.m:
(-[WK2BrowserWindowController didChangeSettings]):

2016-11-30 Jonathan Bedard <jbedard@apple.com>

Make it possible to use an existing simulator instance for one-off testing
@@ -50,7 +50,8 @@
@property (nonatomic, readonly) BOOL displayListDrawingEnabled;
@property (nonatomic, readonly) BOOL resourceLoadStatisticsEnabled;
@property (nonatomic, readonly) BOOL visualViewportEnabled;
@property (nonatomic, readonly) BOOL asyncImageDecodingEnabled;
@property (nonatomic, readonly) BOOL largeImageAsyncDecodingEnabled;
@property (nonatomic, readonly) BOOL animatedImageAsyncDecodingEnabled;
@property (nonatomic, readonly) BOOL loadsAllSiteIcons;
@property (nonatomic, readonly) BOOL usesGameControllerFramework;

0 comments on commit 9fc67aa

Please sign in to comment.