Title: [220077] trunk/Source/WebCore
- Revision
- 220077
- Author
- [email protected]
- Date
- 2017-07-31 15:34:47 -0700 (Mon, 31 Jul 2017)
Log Message
Propagate user gesture tokens when script elements are loaded.
https://bugs.webkit.org/show_bug.cgi?id=174959
Reviewed by Eric Carlson.
Propagate user gesture tokens when script elements are loaded (i.e. between the time an
element is created and its onload handler is invoked).
* dom/ScriptElement.cpp:
(WebCore::ScriptElement::ScriptElement):
(WebCore::ScriptElement::dispatchLoadEventRespectingUserGestureIndicator):
(WebCore::ScriptElement::executeScriptAndDispatchEvent):
(WebCore::ScriptElement::executePendingScript):
* dom/ScriptElement.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (220076 => 220077)
--- trunk/Source/WebCore/ChangeLog 2017-07-31 21:45:47 UTC (rev 220076)
+++ trunk/Source/WebCore/ChangeLog 2017-07-31 22:34:47 UTC (rev 220077)
@@ -1,3 +1,20 @@
+2017-07-28 Matt Rajca <[email protected]>
+
+ Propagate user gesture tokens when script elements are loaded.
+ https://bugs.webkit.org/show_bug.cgi?id=174959
+
+ Reviewed by Eric Carlson.
+
+ Propagate user gesture tokens when script elements are loaded (i.e. between the time an
+ element is created and its onload handler is invoked).
+
+ * dom/ScriptElement.cpp:
+ (WebCore::ScriptElement::ScriptElement):
+ (WebCore::ScriptElement::dispatchLoadEventRespectingUserGestureIndicator):
+ (WebCore::ScriptElement::executeScriptAndDispatchEvent):
+ (WebCore::ScriptElement::executePendingScript):
+ * dom/ScriptElement.h:
+
2017-07-31 Matt Lewis <[email protected]>
Unreviewed, rolling out r220048.
Modified: trunk/Source/WebCore/dom/ScriptElement.cpp (220076 => 220077)
--- trunk/Source/WebCore/dom/ScriptElement.cpp 2017-07-31 21:45:47 UTC (rev 220076)
+++ trunk/Source/WebCore/dom/ScriptElement.cpp 2017-07-31 22:34:47 UTC (rev 220077)
@@ -56,6 +56,8 @@
namespace WebCore {
+static const auto maxUserGesturePropagationTime = 1_s;
+
ScriptElement::ScriptElement(Element& element, bool parserInserted, bool alreadyStarted)
: m_element(element)
, m_startLineNumber(WTF::OrdinalNumber::beforeFirst())
@@ -69,6 +71,8 @@
, m_forceAsync(!parserInserted)
, m_willExecuteInOrder(false)
, m_isModuleScript(false)
+ , m_creationTime(MonotonicTime::now())
+ , m_userGestureToken(UserGestureIndicator::currentUserGesture())
{
if (parserInserted && m_element.document().scriptableDocumentParser() && !m_element.document().isInDocumentWrite())
m_startLineNumber = m_element.document().scriptableDocumentParser()->textPosition().m_line;
@@ -398,6 +402,17 @@
frame->script().linkAndEvaluateModuleScript(loadableModuleScript);
}
+void ScriptElement::dispatchLoadEventRespectingUserGestureIndicator()
+{
+ if (MonotonicTime::now() - m_creationTime > maxUserGesturePropagationTime) {
+ dispatchLoadEvent();
+ return;
+ }
+
+ UserGestureIndicator indicator(m_userGestureToken);
+ dispatchLoadEvent();
+}
+
void ScriptElement::executeScriptAndDispatchEvent(LoadableScript& loadableScript)
{
if (std::optional<LoadableScript::Error> error = loadableScript.error()) {
@@ -407,7 +422,7 @@
} else if (!loadableScript.wasCanceled()) {
ASSERT(!loadableScript.error());
loadableScript.execute(*this);
- dispatchLoadEvent();
+ dispatchLoadEventRespectingUserGestureIndicator();
}
}
@@ -419,7 +434,7 @@
ASSERT(!pendingScript.error());
ASSERT_WITH_MESSAGE(scriptType() == ScriptType::Classic, "Module script always have a loadableScript pointer.");
executeClassicScript(ScriptSourceCode(scriptContent(), m_element.document().url(), pendingScript.startingPosition(), JSC::SourceProviderSourceType::Program, InlineClassicScript::create(*this)));
- dispatchLoadEvent();
+ dispatchLoadEventRespectingUserGestureIndicator();
}
}
Modified: trunk/Source/WebCore/dom/ScriptElement.h (220076 => 220077)
--- trunk/Source/WebCore/dom/ScriptElement.h 2017-07-31 21:45:47 UTC (rev 220076)
+++ trunk/Source/WebCore/dom/ScriptElement.h 2017-07-31 22:34:47 UTC (rev 220077)
@@ -23,6 +23,8 @@
#include "ContainerNode.h"
#include "LoadableScript.h"
+#include "UserGestureIndicator.h"
+#include <wtf/MonotonicTime.h>
#include <wtf/text/TextPosition.h>
namespace WebCore {
@@ -91,6 +93,7 @@
std::optional<ScriptType> determineScriptType(LegacyTypeSupport) const;
bool ignoresLoadRequest() const;
bool isScriptForEventSupported() const;
+ void dispatchLoadEventRespectingUserGestureIndicator();
bool requestClassicScript(const String& sourceURL);
bool requestModuleScript(const TextPosition& scriptStartPosition);
@@ -121,6 +124,9 @@
String m_characterEncoding;
String m_fallbackCharacterEncoding;
RefPtr<LoadableScript> m_loadableScript;
+
+ MonotonicTime m_creationTime;
+ RefPtr<UserGestureToken> m_userGestureToken;
};
// FIXME: replace with is/downcast<ScriptElement>.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes