Diff
Modified: trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt (217238 => 217239)
--- trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button-expected.txt 2017-05-22 19:44:54 UTC (rev 217239)
@@ -7,53 +7,9 @@
PASS airplayButton.element.classList.contains("icon") is true
PASS airplayButton.element.classList.contains("airplay") is true
PASS airplayButton.iconName is Icons.Airplay
-PASS airplayButton.width is 0
-PASS airplayButton.height is 0
-PASS airplayButton._image is iconService.imageForIconNameAndLayoutTraits(Icons.Airplay.name, LayoutTraits.macOS)
-PASS airplayButton._image.src is not ""
-PASS airplayButton._image.complete is false
-scheduleLayout() - start
-_requestFrameIfNeeded()
-[ScriptedAnimationController] raf-register-callback
-[ScriptedAnimationController] raf-schedule-animation
-_requestFrameIfNeeded() - registered rAF, _frameID = 1
-scheduleLayout() - _layoutCallbacks.size = 1
-scheduleLayout() - end
-scheduleLayout() - start
-_requestFrameIfNeeded()
-_requestFrameIfNeeded() - failed to register rAF call, _frameID = 1, _layoutCallbacks.size = 1
-scheduleLayout() - _layoutCallbacks.size = 1
-scheduleLayout() - end
-scheduleLayout() - start
-_requestFrameIfNeeded()
-_requestFrameIfNeeded() - failed to register rAF call, _frameID = 1, _layoutCallbacks.size = 1
-scheduleLayout() - _layoutCallbacks.size = 1
-scheduleLayout() - end
-PASS airplayButton.width is not 0
-PASS airplayButton.height is not 0
-PASS airplayButton.needsLayout is true
-PASS scheduler.hasScheduledLayoutCallbacks is true
-PASS scheduler._layoutCallbacks.size is 1
-PASS scheduler._frameID is not -1
-PASS dirtyNodes.has(airplayButton) is true
PASS airplayButton.element.style.webkitMaskImage.includes("macOS/airplay@") became true
-[ScriptedAnimationController] raf-service-scripted-animations
-[ScriptedAnimationController] raf-will-fire
-_frameDidFire() - start
-frameWillFire()
-PASS dirtyNodes.has(airplayButton) is true
-PASS airplayButton.needsLayout is true
-_layout() - start
-_layout() - layoutCallbacks.size = 1
-_layout() - end
-_requestFrameIfNeeded()
-_requestFrameIfNeeded() - failed to register rAF call, _frameID = -1, _layoutCallbacks.size = 0
-frameDidFire()
-PASS dirtyNodes.has(airplayButton) is false
-PASS airplayButton.needsLayout is false
-PASS airplayButton.element.getAttribute('aria-label') is "AirPlay"
-_frameDidFire() - end
-[ScriptedAnimationController] raf-did-fire
+PASS macOSFullscreenAirplayButton.element.style.webkitMaskImage.includes("macOS/airplay-fullscreen@") became true
+PASS iOSAirplayButton.element.style.webkitMaskImage.includes("iOS/airplay@") became true
PASS successfullyParsed is true
TEST COMPLETE
Modified: trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html (217238 => 217239)
--- trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/LayoutTests/media/modern-media-controls/airplay-button/airplay-button.html 2017-05-22 19:44:54 UTC (rev 217239)
@@ -5,48 +5,10 @@
<body>
<script type="text/_javascript_">
-let reachedEndOfTest = false;
-let receivedRAFDidFireEvent = false;
-
window.jsTestIsAsync = true;
-scheduler.debug = debug;
description("Testing the <code>AirplayButton</code> class.");
-document.addEventListener("visibilitychange", (event) => {
- debug("visibilitychange");
- dumpVisibility();
-});
-
-function dumpVisibility()
-{
- debug(`document.hidden = ${document.hidden}`);
- debug(`document.visibilityState = ${document.visibilityState}`);
-}
-
-dumpVisibility();
-
-if (window.internals) {
- ["raf-suspend", "raf-resume", "raf-add-throttling-reason", "raf-remove-throttling-reason", "raf-register-callback", "raf-cancel-callback", "raf-did-cancel-callback", "raf-service-scripted-animations", "raf-will-fire", "raf-did-fire", "raf-schedule-animation", "raf-schedule-animation-display-refresh-monitor", "raf-schedule-animation-timer", "raf-schedule-animation-frame-view", "raf-no-page", "raf-scripted-animations-suspended-on-page"].forEach(eventType => document.addEventListener(eventType, handleRAFEvent));
- window.internals.settings.setShouldDispatchRequestAnimationFrameEvents(true);
-}
-
-function handleRAFEvent(event)
-{
- debug(`[ScriptedAnimationController] ${event.type}`);
- if (event.type === "raf-did-fire") {
- receivedRAFDidFireEvent = true;
- considerFinishingTest();
- } else if (event.type === "raf-suspend")
- dumpVisibility();
-}
-
-function considerFinishingTest()
-{
- if (reachedEndOfTest && receivedRAFDidFireEvent)
- finishJSTest();
-}
-
const airplayButton = new AirplayButton({ layoutTraits: LayoutTraits.macOS });
shouldBeEqualToString("airplayButton.element.localName", "button");
@@ -53,43 +15,14 @@
shouldBeTrue('airplayButton.element.classList.contains("icon")');
shouldBeTrue('airplayButton.element.classList.contains("airplay")');
shouldBe("airplayButton.iconName", "Icons.Airplay");
-shouldBe("airplayButton.width", "0");
-shouldBe("airplayButton.height", "0");
-shouldBe("airplayButton._image", "iconService.imageForIconNameAndLayoutTraits(Icons.Airplay.name, LayoutTraits.macOS)");
-shouldNotBeEqualToString("airplayButton._image.src", "");
-shouldBeFalse("airplayButton._image.complete");
-// const macOSFullscreenAirplayButton = new AirplayButton({ layoutTraits: LayoutTraits.macOS | LayoutTraits.Fullscreen });
-// const iOSAirplayButton = new AirplayButton({ layoutTraits: LayoutTraits.iOS });
+const macOSFullscreenAirplayButton = new AirplayButton({ layoutTraits: LayoutTraits.macOS | LayoutTraits.Fullscreen });
+const iOSAirplayButton = new AirplayButton({ layoutTraits: LayoutTraits.iOS });
-airplayButton._image.addEventListener("load", event => {
- shouldNotBe("airplayButton.width", "0");
- shouldNotBe("airplayButton.height", "0");
- shouldBeTrue("airplayButton.needsLayout");
- shouldBeTrue("scheduler.hasScheduledLayoutCallbacks");
- shouldBe("scheduler._layoutCallbacks.size", "1");
- shouldNotBe("scheduler._frameID", "-1");
- shouldBeTrue("dirtyNodes.has(airplayButton)");
- scheduler.frameWillFire = function() {
- debug("frameWillFire()");
- shouldBeTrue("dirtyNodes.has(airplayButton)");
- shouldBeTrue("airplayButton.needsLayout");
- }
- scheduler.frameDidFire = function() {
- debug("frameDidFire()");
- shouldBeFalse("dirtyNodes.has(airplayButton)");
- shouldBeFalse("airplayButton.needsLayout");
- shouldBeEqualToString("airplayButton.element.getAttribute('aria-label')", "AirPlay");
- }
- shouldBecomeEqual('airplayButton.element.style.webkitMaskImage.includes("macOS/airplay@")', "true", () => {
- reachedEndOfTest = true;
- considerFinishingTest();
+shouldBecomeEqual('airplayButton.element.style.webkitMaskImage.includes("macOS/airplay@")', "true", () => {
+ shouldBecomeEqual('macOSFullscreenAirplayButton.element.style.webkitMaskImage.includes("macOS/airplay-fullscreen@")', "true", () => {
+ shouldBecomeEqual('iOSAirplayButton.element.style.webkitMaskImage.includes("iOS/airplay@")', "true", finishJSTest);
});
- // shouldBecomeEqual('airplayButton.element.style.webkitMaskImage.includes("macOS/airplay@")', "true", () => {
- // shouldBecomeEqual('macOSFullscreenAirplayButton.element.style.webkitMaskImage.includes("macOS/airplay-fullscreen@")', "true", () => {
- // shouldBecomeEqual('iOSAirplayButton.element.style.webkitMaskImage.includes("iOS/airplay@")', "true", finishJSTest);
- // });
- // });
});
</script>
Modified: trunk/Source/WebCore/ChangeLog (217238 => 217239)
--- trunk/Source/WebCore/ChangeLog 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/ChangeLog 2017-05-22 19:44:54 UTC (rev 217239)
@@ -1,3 +1,43 @@
+2017-05-22 Antoine Quint <[email protected]>
+
+ [mac-wk1] LayoutTest media/modern-media-controls/airplay-button/airplay-button.html is a flaky timeout
+ https://bugs.webkit.org/show_bug.cgi?id=168409
+
+ Reviewed by Simon Fraser.
+
+ Remove all the custom logging code we wrote to diagnose why this specific test failed and instead
+ log the backtrace when the ScriptedAnimationController gets suspended, which should allow us to
+ identify which test actually leads to suspension and affects this particular test.
+
+ * Modules/modern-media-controls/controls/scheduler.js:
+ (const.scheduler.new.prototype.scheduleLayout):
+ (const.scheduler.new.prototype.unscheduleLayout):
+ (const.scheduler.new.prototype._requestFrameIfNeeded):
+ (const.scheduler.new.prototype._frameDidFire):
+ (const.scheduler.new.prototype._layout):
+ * dom/Document.cpp:
+ (WebCore::Document::requestAnimationFrame):
+ * dom/ScriptedAnimationController.cpp:
+ (WebCore::ScriptedAnimationController::suspend):
+ (WebCore::ScriptedAnimationController::resume):
+ (WebCore::ScriptedAnimationController::addThrottlingReason):
+ (WebCore::ScriptedAnimationController::removeThrottlingReason):
+ (WebCore::ScriptedAnimationController::registerCallback):
+ (WebCore::ScriptedAnimationController::cancelCallback):
+ (WebCore::ScriptedAnimationController::serviceScriptedAnimations):
+ (WebCore::ScriptedAnimationController::scheduleAnimation):
+ (WebCore::ScriptedAnimationController::dispatchLoggingEventIfRequired): Deleted.
+ * dom/ScriptedAnimationController.h:
+ * page/Page.cpp:
+ (WebCore::Page::suspendScriptedAnimations):
+ * page/Settings.in:
+ * testing/InternalSettings.cpp:
+ (WebCore::InternalSettings::resetToConsistentState):
+ (WebCore::InternalSettings::shouldDispatchRequestAnimationFrameEvents): Deleted.
+ (WebCore::InternalSettings::setShouldDispatchRequestAnimationFrameEvents): Deleted.
+ * testing/InternalSettings.h:
+ * testing/InternalSettings.idl:
+
2017-05-22 Emilio Cobos Álvarez <[email protected]>
Don't unconditionally reset TextIterator::m_handledChildren for display: contents nodes.
Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/scheduler.js (217238 => 217239)
--- trunk/Source/WebCore/Modules/modern-media-controls/controls/scheduler.js 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/scheduler.js 2017-05-22 19:44:54 UTC (rev 217239)
@@ -6,7 +6,6 @@
{
this._frameID = -1;
this._layoutCallbacks = new Set;
- this.debug = new Function;
}
// Public
@@ -18,29 +17,19 @@
scheduleLayout(callback)
{
- this.debug("scheduleLayout() - start");
- if (typeof callback !== "function") {
- this.debug("scheduleLayout() - end - callback was not a function");
+ if (typeof callback !== "function")
return;
- }
this._layoutCallbacks.add(callback);
this._requestFrameIfNeeded();
- this.debug(`scheduleLayout() - _layoutCallbacks.size = ${this._layoutCallbacks.size}`);
- this.debug("scheduleLayout() - end");
}
unscheduleLayout(callback)
{
- this.debug("unscheduleLayout() - start");
- if (typeof callback !== "function") {
- this.debug("unscheduleLayout() - end - callback was not a function");
+ if (typeof callback !== "function")
return;
- }
this._layoutCallbacks.delete(callback);
- this.debug(`unscheduleLayout() - this._layoutCallbacks.size = ${this._layoutCallbacks.size}`);
- this.debug("unscheduleLayout() - end");
}
flushScheduledLayoutCallbacks()
@@ -52,17 +41,12 @@
_requestFrameIfNeeded()
{
- this.debug("_requestFrameIfNeeded()");
- if (this._frameID === -1 && this._layoutCallbacks.size > 0) {
+ if (this._frameID === -1 && this._layoutCallbacks.size > 0)
this._frameID = window.requestAnimationFrame(this._frameDidFire.bind(this));
- this.debug(`_requestFrameIfNeeded() - registered rAF, _frameID = ${this._frameID}`);
- } else
- this.debug(`_requestFrameIfNeeded() - failed to register rAF call, _frameID = ${this._frameID}, _layoutCallbacks.size = ${this._layoutCallbacks.size}`);
}
_frameDidFire()
{
- this.debug("_frameDidFire() - start");
if (typeof scheduler.frameWillFire === "function")
scheduler.frameWillFire();
@@ -72,21 +56,16 @@
if (typeof scheduler.frameDidFire === "function")
scheduler.frameDidFire();
- this.debug("_frameDidFire() - end");
}
_layout()
{
- this.debug("_layout() - start");
// Layouts are not re-entrant.
const layoutCallbacks = this._layoutCallbacks;
this._layoutCallbacks = new Set;
- this.debug(`_layout() - layoutCallbacks.size = ${layoutCallbacks.size}`);
-
for (let callback of layoutCallbacks)
callback();
- this.debug("_layout() - end");
}
};
Modified: trunk/Source/WebCore/dom/Document.cpp (217238 => 217239)
--- trunk/Source/WebCore/dom/Document.cpp 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/dom/Document.cpp 2017-05-22 19:44:54 UTC (rev 217239)
@@ -6065,13 +6065,6 @@
if (!topOrigin().canAccess(securityOrigin()) && !hasHadUserInteraction())
m_scriptedAnimationController->addThrottlingReason(ScriptedAnimationController::ThrottlingReason::NonInteractedCrossOriginFrame);
-
- if (settings().shouldDispatchRequestAnimationFrameEvents()) {
- if (!page())
- dispatchEvent(Event::create("raf-no-page", false, false));
- else if (page()->scriptedAnimationsSuspended())
- dispatchEvent(Event::create("raf-scripted-animations-suspended-on-page", false, false));
- }
}
return m_scriptedAnimationController->registerCallback(WTFMove(callback));
Modified: trunk/Source/WebCore/dom/ScriptedAnimationController.cpp (217238 => 217239)
--- trunk/Source/WebCore/dom/ScriptedAnimationController.cpp 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/dom/ScriptedAnimationController.cpp 2017-05-22 19:44:54 UTC (rev 217239)
@@ -77,15 +77,11 @@
void ScriptedAnimationController::suspend()
{
- dispatchLoggingEventIfRequired("raf-suspend");
- if (m_document && m_document->frame() && m_document->frame()->settings().shouldDispatchRequestAnimationFrameEvents())
- WTFReportBacktrace();
++m_suspendCount;
}
void ScriptedAnimationController::resume()
{
- dispatchLoggingEventIfRequired("raf-resume");
// It would be nice to put an ASSERT(m_suspendCount > 0) here, but in WK1 resume() can be called
// even when suspend hasn't (if a tab was created in the background).
if (m_suspendCount > 0)
@@ -136,7 +132,6 @@
m_throttlingReasons |= reason;
RELEASE_LOG_IF_ALLOWED("addThrottlingReason(%s) -> %s", throttlingReasonToString(reason), throttlingReasonsToString(m_throttlingReasons).utf8().data());
- dispatchLoggingEventIfRequired("raf-add-throttling-reason");
if (m_animationTimer.isActive()) {
m_animationTimer.stop();
@@ -156,7 +151,6 @@
m_throttlingReasons -= reason;
RELEASE_LOG_IF_ALLOWED("removeThrottlingReason(%s) -> %s", throttlingReasonToString(reason), throttlingReasonsToString(m_throttlingReasons).utf8().data());
- dispatchLoggingEventIfRequired("raf-remove-throttling-reason");
if (m_animationTimer.isActive()) {
m_animationTimer.stop();
@@ -184,7 +178,6 @@
m_callbacks.append(WTFMove(callback));
InspectorInstrumentation::didRequestAnimationFrame(m_document, id);
- dispatchLoggingEventIfRequired("raf-register-callback");
if (!m_suspendCount)
scheduleAnimation();
@@ -193,13 +186,11 @@
void ScriptedAnimationController::cancelCallback(CallbackId id)
{
- dispatchLoggingEventIfRequired("raf-cancel-callback");
for (size_t i = 0; i < m_callbacks.size(); ++i) {
if (m_callbacks[i]->m_id == id) {
m_callbacks[i]->m_firedOrCancelled = true;
InspectorInstrumentation::didCancelAnimationFrame(m_document, id);
m_callbacks.remove(i);
- dispatchLoggingEventIfRequired("raf-did-cancel-callback");
return;
}
}
@@ -207,7 +198,6 @@
void ScriptedAnimationController::serviceScriptedAnimations(double timestamp)
{
- dispatchLoggingEventIfRequired("raf-service-scripted-animations");
if (!m_callbacks.size() || m_suspendCount || !requestAnimationFrameEnabled())
return;
@@ -228,13 +218,11 @@
if (!callback->m_firedOrCancelled) {
callback->m_firedOrCancelled = true;
InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireAnimationFrame(m_document, callback->m_id);
- dispatchLoggingEventIfRequired("raf-will-fire");
if (callback->m_useLegacyTimeBase)
callback->handleEvent(legacyHighResNowMs);
else
callback->handleEvent(highResNowMs);
InspectorInstrumentation::didFireAnimationFrame(cookie);
- dispatchLoggingEventIfRequired("raf-did-fire");
}
}
@@ -285,7 +273,6 @@
void ScriptedAnimationController::scheduleAnimation()
{
- dispatchLoggingEventIfRequired("raf-schedule-animation");
if (!requestAnimationFrameEnabled())
return;
@@ -296,7 +283,6 @@
return;
m_isUsingTimer = true;
- dispatchLoggingEventIfRequired("raf-schedule-animation-display-refresh-monitor");
}
#endif
if (m_animationTimer.isActive())
@@ -319,11 +305,9 @@
m_animationTimer.startOneShot(scheduleDelay);
- dispatchLoggingEventIfRequired("raf-schedule-animation-timer");
#else
if (FrameView* frameView = m_document->view())
frameView->scheduleAnimation();
- dispatchLoggingEventIfRequired("raf-schedule-animation-frame-view");
#endif
}
@@ -355,10 +339,4 @@
}
#endif
-void ScriptedAnimationController::dispatchLoggingEventIfRequired(const AtomicString& type)
-{
- if (m_document && m_document->frame() && m_document->frame()->settings().shouldDispatchRequestAnimationFrameEvents())
- m_document->dispatchEvent(Event::create(type, false, false));
}
-
-}
Modified: trunk/Source/WebCore/dom/ScriptedAnimationController.h (217238 => 217239)
--- trunk/Source/WebCore/dom/ScriptedAnimationController.h 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/dom/ScriptedAnimationController.h 2017-05-22 19:44:54 UTC (rev 217239)
@@ -98,7 +98,6 @@
int m_suspendCount { 0 };
void scheduleAnimation();
- void dispatchLoggingEventIfRequired(const AtomicString&);
#if USE(REQUEST_ANIMATION_FRAME_TIMER)
void animationTimerFired();
Modified: trunk/Source/WebCore/page/Page.cpp (217238 => 217239)
--- trunk/Source/WebCore/page/Page.cpp 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/page/Page.cpp 2017-05-22 19:44:54 UTC (rev 217239)
@@ -1141,8 +1141,10 @@
void Page::suspendScriptedAnimations()
{
- if (settings().shouldDispatchRequestAnimationFrameEvents())
- WTFReportBacktrace();
+ // Temporarily report the backtrace so we might gather insight as to why
+ // some tests fail due to rAF callbacks not being serviced (webkit.org/b/168409).
+ WTFLogAlways("Page::suspendScriptedAnimations() – webkit.org/b/168409");
+ WTFReportBacktrace();
m_scriptedAnimationsSuspended = true;
for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
if (frame->document())
Modified: trunk/Source/WebCore/page/Settings.in (217238 => 217239)
--- trunk/Source/WebCore/page/Settings.in 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/page/Settings.in 2017-05-22 19:44:54 UTC (rev 217239)
@@ -275,8 +275,6 @@
inputEventsEnabled initial=true
-shouldDispatchRequestAnimationFrameEvents initial=false
-
quickTimePluginReplacementEnabled initial=defaultQuickTimePluginReplacementEnabled
youTubeFlashPluginReplacementEnabled initial=defaultYouTubeFlashPluginReplacementEnabled
Modified: trunk/Source/WebCore/testing/InternalSettings.cpp (217238 => 217239)
--- trunk/Source/WebCore/testing/InternalSettings.cpp 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/testing/InternalSettings.cpp 2017-05-22 19:44:54 UTC (rev 217239)
@@ -253,8 +253,6 @@
m_page->mainFrame().setPageAndTextZoomFactors(1, 1);
m_page->setCanStartMedia(true);
- settings().setShouldDispatchRequestAnimationFrameEvents(false);
-
settings().setForcePendingWebGLPolicy(false);
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
settings().setAllowsAirPlayForMediaPlayback(false);
@@ -711,16 +709,6 @@
#endif
}
-bool InternalSettings::shouldDispatchRequestAnimationFrameEvents()
-{
- return settings().shouldDispatchRequestAnimationFrameEvents();
-}
-
-void InternalSettings::setShouldDispatchRequestAnimationFrameEvents(bool shouldDispatchRequestAnimationFrameEvents)
-{
- settings().setShouldDispatchRequestAnimationFrameEvents(shouldDispatchRequestAnimationFrameEvents);
-}
-
ExceptionOr<String> InternalSettings::userInterfaceDirectionPolicy()
{
if (!m_page)
Modified: trunk/Source/WebCore/testing/InternalSettings.h (217238 => 217239)
--- trunk/Source/WebCore/testing/InternalSettings.h 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/testing/InternalSettings.h 2017-05-22 19:44:54 UTC (rev 217239)
@@ -109,9 +109,6 @@
ForcedAccessibilityValue forcedPrefersReducedMotionAccessibilityValue() const;
void setForcedPrefersReducedMotionAccessibilityValue(ForcedAccessibilityValue);
- bool shouldDispatchRequestAnimationFrameEvents();
- void setShouldDispatchRequestAnimationFrameEvents(bool);
-
// RuntimeEnabledFeatures.
static void setIndexedDBWorkersEnabled(bool);
static void setCSSGridLayoutEnabled(bool);
Modified: trunk/Source/WebCore/testing/InternalSettings.idl (217238 => 217239)
--- trunk/Source/WebCore/testing/InternalSettings.idl 2017-05-22 19:43:39 UTC (rev 217238)
+++ trunk/Source/WebCore/testing/InternalSettings.idl 2017-05-22 19:44:54 UTC (rev 217239)
@@ -96,9 +96,6 @@
[MayThrowException] boolean deferredCSSParserEnabled();
[MayThrowException] void setDeferredCSSParserEnabled(boolean enabled);
- boolean shouldDispatchRequestAnimationFrameEvents();
- void setShouldDispatchRequestAnimationFrameEvents(boolean shouldDispatchRequestAnimationFrameEvents);
-
attribute ForcedAccessibilityValue forcedColorsAreInvertedAccessibilityValue;
attribute ForcedAccessibilityValue forcedDisplayIsMonochromeAccessibilityValue;
attribute ForcedAccessibilityValue forcedPrefersReducedMotionAccessibilityValue;