Title: [102424] trunk
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;
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to