- Revision
- 102424
- Author
- [email protected]
- Date
- 2011-12-08 20:19:48 -0800 (Thu, 08 Dec 2011)
Log Message
[MutationObservers] V8LazyEventHandler breaks microtask delivery semantics
https://bugs.webkit.org/show_bug.cgi?id=73492
Reviewed by Adam Barth.
Source/WebCore:
Test: fast/mutation/inline-event-listener.html
* bindings/v8/V8LazyEventListener.cpp:
(WebCore::V8LazyEventListener::prepareListenerObject): Call v8::Script::Run directly instead of going through V8Proxy.
Tools:
Add eventSender.scheduleAsynchronousKeyDown, needed to cause a
keypress event without any script on the stack.
* DumpRenderTree/chromium/EventSender.cpp:
(EventSender::EventSender):
(EventSender::keyDown):
(KeyDownTask::KeyDownTask):
(KeyDownTask::runIfValid):
(EventSender::scheduleAsynchronousKeyDown):
* DumpRenderTree/chromium/EventSender.h:
LayoutTests:
* fast/mutation/inline-event-listener-expected.txt: Added.
* fast/mutation/inline-event-listener.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (102423 => 102424)
--- trunk/LayoutTests/ChangeLog 2011-12-09 04:16:26 UTC (rev 102423)
+++ trunk/LayoutTests/ChangeLog 2011-12-09 04:19:48 UTC (rev 102424)
@@ -1,3 +1,13 @@
+2011-12-08 Adam Klein <[email protected]>
+
+ [MutationObservers] V8LazyEventHandler breaks microtask delivery semantics
+ https://bugs.webkit.org/show_bug.cgi?id=73492
+
+ Reviewed by Adam Barth.
+
+ * fast/mutation/inline-event-listener-expected.txt: Added.
+ * fast/mutation/inline-event-listener.html: Added.
+
2011-12-08 Hayato Ito <[email protected]>
Suppress rendering of light children when ShadowRoot is dynamically created.
Added: trunk/LayoutTests/fast/mutation/inline-event-listener-expected.txt (0 => 102424)
--- trunk/LayoutTests/fast/mutation/inline-event-listener-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mutation/inline-event-listener-expected.txt 2011-12-09 04:19:48 UTC (rev 102424)
@@ -0,0 +1 @@
+PASSED
Added: trunk/LayoutTests/fast/mutation/inline-event-listener.html (0 => 102424)
--- trunk/LayoutTests/fast/mutation/inline-event-listener.html (rev 0)
+++ trunk/LayoutTests/fast/mutation/inline-event-listener.html 2011-12-09 04:19:48 UTC (rev 102424)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<ol contenteditable _oninput_="document.body.innerHTML = observerRan ? 'FAILED' : 'PASSED'; if (window.layoutTestController) layoutTestController.notifyDone()">
+ <li>Press enter
+</ol>
+<script>
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+ }
+
+ var list = document.querySelector('ol');
+ var observerRan = false;
+ var observer = new WebKitMutationObserver(function() { observerRan = true; });
+ observer.observe(list, {childList: true, characterData: true});
+ list.focus();
+ if (window.eventSender)
+ eventSender.scheduleAsynchronousKeyDown('\n');
+</script>
Modified: trunk/Source/WebCore/ChangeLog (102423 => 102424)
--- trunk/Source/WebCore/ChangeLog 2011-12-09 04:16:26 UTC (rev 102423)
+++ trunk/Source/WebCore/ChangeLog 2011-12-09 04:19:48 UTC (rev 102424)
@@ -1,3 +1,15 @@
+2011-12-08 Adam Klein <[email protected]>
+
+ [MutationObservers] V8LazyEventHandler breaks microtask delivery semantics
+ https://bugs.webkit.org/show_bug.cgi?id=73492
+
+ Reviewed by Adam Barth.
+
+ Test: fast/mutation/inline-event-listener.html
+
+ * bindings/v8/V8LazyEventListener.cpp:
+ (WebCore::V8LazyEventListener::prepareListenerObject): Call v8::Script::Run directly instead of going through V8Proxy.
+
2011-12-08 Hayato Ito <[email protected]>
Suppress rendering of light children when ShadowRoot is dynamically created.
Modified: trunk/Source/WebCore/bindings/v8/V8LazyEventListener.cpp (102423 => 102424)
--- trunk/Source/WebCore/bindings/v8/V8LazyEventListener.cpp 2011-12-09 04:16:26 UTC (rev 102423)
+++ trunk/Source/WebCore/bindings/v8/V8LazyEventListener.cpp 2011-12-09 04:19:48 UTC (rev 102424)
@@ -123,7 +123,9 @@
v8::Handle<v8::String> codeExternalString = v8ExternalString(code);
v8::Handle<v8::Script> script = V8Proxy::compileScript(codeExternalString, m_sourceURL, m_position);
if (!script.IsEmpty()) {
- v8::Local<v8::Value> value = proxy->runScript(script);
+ // Call v8::Script::Run() directly to avoid an erroneous call to V8RecursionScope::didLeaveScriptContext().
+ // FIXME: Remove this code when we stop doing the 'with' hack above.
+ v8::Local<v8::Value> value = script->Run();
if (!value.IsEmpty()) {
ASSERT(value->IsFunction());
Modified: trunk/Tools/ChangeLog (102423 => 102424)
--- trunk/Tools/ChangeLog 2011-12-09 04:16:26 UTC (rev 102423)
+++ trunk/Tools/ChangeLog 2011-12-09 04:19:48 UTC (rev 102424)
@@ -1,3 +1,21 @@
+2011-12-08 Adam Klein <[email protected]>
+
+ [MutationObservers] V8LazyEventHandler breaks microtask delivery semantics
+ https://bugs.webkit.org/show_bug.cgi?id=73492
+
+ Reviewed by Adam Barth.
+
+ Add eventSender.scheduleAsynchronousKeyDown, needed to cause a
+ keypress event without any script on the stack.
+
+ * DumpRenderTree/chromium/EventSender.cpp:
+ (EventSender::EventSender):
+ (EventSender::keyDown):
+ (KeyDownTask::KeyDownTask):
+ (KeyDownTask::runIfValid):
+ (EventSender::scheduleAsynchronousKeyDown):
+ * DumpRenderTree/chromium/EventSender.h:
+
2011-12-08 Hayato Ito <[email protected]>
[gdb] Pretty printer for a 8-bit version of WTF::StringImpl and LChar*.
Modified: trunk/Tools/DumpRenderTree/chromium/EventSender.cpp (102423 => 102424)
--- trunk/Tools/DumpRenderTree/chromium/EventSender.cpp 2011-12-09 04:16:26 UTC (rev 102423)
+++ trunk/Tools/DumpRenderTree/chromium/EventSender.cpp 2011-12-09 04:19:48 UTC (rev 102424)
@@ -270,6 +270,7 @@
bindMethod("mouseUp", &EventSender::mouseUp);
bindMethod("releaseTouchPoint", &EventSender::releaseTouchPoint);
bindMethod("scheduleAsynchronousClick", &EventSender::scheduleAsynchronousClick);
+ bindMethod("scheduleAsynchronousKeyDown", &EventSender::scheduleAsynchronousKeyDown);
bindMethod("setTouchModifier", &EventSender::setTouchModifier);
bindMethod("textZoomIn", &EventSender::textZoomIn);
bindMethod("textZoomOut", &EventSender::textZoomOut);
@@ -500,7 +501,8 @@
void EventSender::keyDown(const CppArgumentList& arguments, CppVariant* result)
{
- result->setNull();
+ if (result)
+ result->setNull();
if (arguments.size() < 1 || !arguments[0].isString())
return;
bool generateChar = false;
@@ -847,6 +849,22 @@
postTask(new MouseUpTask(this, arguments));
}
+class KeyDownTask : public MethodTask<EventSender> {
+public:
+ KeyDownTask(EventSender* obj, const CppArgumentList& arg)
+ : MethodTask<EventSender>(obj), m_arguments(arg) { }
+ virtual void runIfValid() { m_object->keyDown(m_arguments, 0); }
+
+private:
+ CppArgumentList m_arguments;
+};
+
+void EventSender::scheduleAsynchronousKeyDown(const CppArgumentList& arguments, CppVariant* result)
+{
+ result->setNull();
+ postTask(new KeyDownTask(this, arguments));
+}
+
void EventSender::beginDragWithFiles(const CppArgumentList& arguments, CppVariant* result)
{
currentDragData.initialize();
Modified: trunk/Tools/DumpRenderTree/chromium/EventSender.h (102423 => 102424)
--- trunk/Tools/DumpRenderTree/chromium/EventSender.h 2011-12-09 04:16:26 UTC (rev 102423)
+++ trunk/Tools/DumpRenderTree/chromium/EventSender.h 2011-12-09 04:19:48 UTC (rev 102424)
@@ -82,6 +82,7 @@
void mouseScrollBy(const CppArgumentList&, CppVariant*);
void continuousMouseScrollBy(const CppArgumentList&, CppVariant*);
void scheduleAsynchronousClick(const CppArgumentList&, CppVariant*);
+ void scheduleAsynchronousKeyDown(const CppArgumentList&, CppVariant*);
void beginDragWithFiles(const CppArgumentList&, CppVariant*);
CppVariant dragMode;