Title: [126256] trunk/Source/WebCore
Revision
126256
Author
[email protected]
Date
2012-08-21 20:11:50 -0700 (Tue, 21 Aug 2012)

Log Message

Make an event object clonable to support an event propagation across seamless iframes.
https://bugs.webkit.org/show_bug.cgi?id=93678

Reviewed by Dimitri Glazkov.

We should clone an event object when a event propagates across
seamless iframes.  Currently Event and MouseEvent are
supported. Support for other kinds of events will be addressed
later.

This is one of the pre-requirements to support an event
propagation across seamless iframes.

No new tests, no behavior change.

* dom/Event.cpp:
(WebCore::Event::cloneFor):
(WebCore):
* dom/Event.h:
(WebCore):
(Event):
* dom/MouseEvent.cpp:
(WebCore::adjustedClinetX):
(WebCore):
(WebCore::adjustedClinetY):
(WebCore::MouseEvent::cloneFor):
* dom/MouseEvent.h:
(MouseEvent):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (126255 => 126256)


--- trunk/Source/WebCore/ChangeLog	2012-08-22 03:10:55 UTC (rev 126255)
+++ trunk/Source/WebCore/ChangeLog	2012-08-22 03:11:50 UTC (rev 126256)
@@ -1,3 +1,34 @@
+2012-08-21  Hayato Ito  <[email protected]>
+
+        Make an event object clonable to support an event propagation across seamless iframes.
+        https://bugs.webkit.org/show_bug.cgi?id=93678
+
+        Reviewed by Dimitri Glazkov.
+
+        We should clone an event object when a event propagates across
+        seamless iframes.  Currently Event and MouseEvent are
+        supported. Support for other kinds of events will be addressed
+        later.
+
+        This is one of the pre-requirements to support an event
+        propagation across seamless iframes.
+
+        No new tests, no behavior change.
+
+        * dom/Event.cpp:
+        (WebCore::Event::cloneFor):
+        (WebCore):
+        * dom/Event.h:
+        (WebCore):
+        (Event):
+        * dom/MouseEvent.cpp:
+        (WebCore::adjustedClinetX):
+        (WebCore):
+        (WebCore::adjustedClinetY):
+        (WebCore::MouseEvent::cloneFor):
+        * dom/MouseEvent.h:
+        (MouseEvent):
+
 2012-08-21  Joshua Bell  <[email protected]>
 
         IndexedDB: IDBRequest can be GCd during event dispatch

Modified: trunk/Source/WebCore/dom/Event.cpp (126255 => 126256)


--- trunk/Source/WebCore/dom/Event.cpp	2012-08-22 03:10:55 UTC (rev 126255)
+++ trunk/Source/WebCore/dom/Event.cpp	2012-08-22 03:11:50 UTC (rev 126256)
@@ -164,6 +164,11 @@
     info.addInstrumentedMember(m_underlyingEvent);
 }
 
+PassRefPtr<Event> Event::cloneFor(HTMLIFrameElement*) const
+{
+    return Event::create(type(), bubbles(), cancelable());
+}
+
 void Event::setTarget(PassRefPtr<EventTarget> target)
 {
     if (m_target == target)

Modified: trunk/Source/WebCore/dom/Event.h (126255 => 126256)


--- trunk/Source/WebCore/dom/Event.h	2012-08-22 03:10:55 UTC (rev 126255)
+++ trunk/Source/WebCore/dom/Event.h	2012-08-22 03:11:50 UTC (rev 126256)
@@ -31,9 +31,10 @@
 
 namespace WebCore {
 
-    class MemoryInstrumentation;
     class EventTarget;
     class EventDispatcher;
+    class HTMLIFrameElement;
+    class MemoryInstrumentation;
 
     struct EventInit {
         EventInit();
@@ -155,6 +156,8 @@
 
         virtual void reportMemoryUsage(MemoryObjectInfo*) const;
 
+        virtual PassRefPtr<Event> cloneFor(HTMLIFrameElement*) const;
+
     protected:
         Event();
         Event(const AtomicString& type, bool canBubble, bool cancelable);

Modified: trunk/Source/WebCore/dom/MouseEvent.cpp (126255 => 126256)


--- trunk/Source/WebCore/dom/MouseEvent.cpp	2012-08-22 03:10:55 UTC (rev 126255)
+++ trunk/Source/WebCore/dom/MouseEvent.cpp	2012-08-22 03:11:50 UTC (rev 126256)
@@ -27,6 +27,7 @@
 #include "EventNames.h"
 #include "Frame.h"
 #include "FrameView.h"
+#include "HTMLIFrameElement.h"
 #include "PlatformMouseEvent.h"
 
 namespace WebCore {
@@ -147,6 +148,36 @@
     return target() ? target()->toNode() : 0;
 }
 
+// FIXME: Fix positioning. e.g. We need to consider border/padding.
+// https://bugs.webkit.org/show_bug.cgi?id=93696
+inline static int adjustedClientX(int innerClientX, HTMLIFrameElement* iframe, FrameView* frameView)
+{
+    return iframe->offsetLeft() - frameView->scrollX() + innerClientX;
+}
+
+inline static int adjustedClientY(int innerClientY, HTMLIFrameElement* iframe, FrameView* frameView)
+{
+    return iframe->offsetTop() - frameView->scrollY() + innerClientY;
+}
+
+PassRefPtr<Event> MouseEvent::cloneFor(HTMLIFrameElement* iframe) const
+{
+    ASSERT(iframe);
+    RefPtr<MouseEvent> clonedMouseEvent = MouseEvent::create();
+    Frame* frame = iframe->document()->frame();
+    FrameView* frameView = frame ? frame->view() : 0;
+    clonedMouseEvent->initMouseEvent(type(), bubbles(), cancelable(),
+            iframe->document()->defaultView(),
+            detail(), screenX(), screenY(),
+            frameView ? adjustedClientX(clientX(), iframe, frameView) : 0,
+            frameView ? adjustedClientY(clientY(), iframe, frameView) : 0,
+            ctrlKey(), altKey(), shiftKey(), metaKey(),
+            button(),
+            // Nullifies relatedTarget.
+            0);
+    return clonedMouseEvent.release();
+}
+
 PassRefPtr<SimulatedMouseEvent> SimulatedMouseEvent::create(const AtomicString& eventType, PassRefPtr<AbstractView> view, PassRefPtr<Event> underlyingEvent)
 {
     return adoptRef(new SimulatedMouseEvent(eventType, view, underlyingEvent));

Modified: trunk/Source/WebCore/dom/MouseEvent.h (126255 => 126256)


--- trunk/Source/WebCore/dom/MouseEvent.h	2012-08-22 03:10:55 UTC (rev 126255)
+++ trunk/Source/WebCore/dom/MouseEvent.h	2012-08-22 03:11:50 UTC (rev 126256)
@@ -83,6 +83,8 @@
         virtual bool isDragEvent() const;
         virtual int which() const;
 
+        virtual PassRefPtr<Event> cloneFor(HTMLIFrameElement*) const OVERRIDE;
+
     protected:
         MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<AbstractView>,
                    int detail, int screenX, int screenY, int pageX, int pageY,
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to