- 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,