summaryrefslogtreecommitdiffstats
path: root/WebCore
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-01-22 10:39:19 +0000
committerBen Murdoch <benm@google.com>2010-01-27 11:22:26 +0000
commitd1919980a4bbb7f3aa73a6a83110fbec0c220e59 (patch)
treee0b2113b83c604a6e3e4cb47dab5a83bdf89122f /WebCore
parenta1b54e49e6889c50c6cad8c7162db86ad27f430d (diff)
downloadexternal_webkit-d1919980a4bbb7f3aa73a6a83110fbec0c220e59.zip
external_webkit-d1919980a4bbb7f3aa73a6a83110fbec0c220e59.tar.gz
external_webkit-d1919980a4bbb7f3aa73a6a83110fbec0c220e59.tar.bz2
Stop forwarding touch events from Java when the top level document is detached rather than when eventHandlers are cleared for a frame.
Also no longer keep track of the number of touch event handlers that a page has registered. If a page requests touch events, always send them from Java until a new page is loaded. This simplifies the logic when dealing with the page cache as otherwise as well as restoring the forwarding of touch events when a page is restored from the page cache, we would need to restore the number of touch handlers that have been registered. Change-Id: I0269e1632a37ccbf105bac658c2cb7f1d5cd3052
Diffstat (limited to 'WebCore')
-rw-r--r--WebCore/dom/Document.cpp11
-rw-r--r--WebCore/dom/Node.cpp12
-rw-r--r--WebCore/history/CachedFrame.cpp14
-rw-r--r--WebCore/loader/EmptyClients.h4
-rw-r--r--WebCore/page/ChromeClient.h2
-rw-r--r--WebCore/page/EventHandler.cpp8
6 files changed, 30 insertions, 21 deletions
diff --git a/WebCore/dom/Document.cpp b/WebCore/dom/Document.cpp
index d031853..5bae60e 100644
--- a/WebCore/dom/Document.cpp
+++ b/WebCore/dom/Document.cpp
@@ -1487,6 +1487,17 @@ void Document::detach()
FrameView* view = m_frame->view();
if (view)
view->detachCustomScrollbars();
+
+#if ENABLE(TOUCH_EVENTS)
+ Page* ownerPage = page();
+ if (ownerPage && (m_frame == ownerPage->mainFrame())) {
+ // Inform the Chrome Client that it no longer needs to
+ // foward touch events to WebCore as the document is being
+ // destroyed. It may start again if a subsequent page
+ // registers a touch event listener.
+ ownerPage->chrome()->client()->needTouchEvents(false);
+ }
+#endif
}
// indicate destruction mode, i.e. attached() but renderer == 0
diff --git a/WebCore/dom/Node.cpp b/WebCore/dom/Node.cpp
index c2d5281..b48819a 100644
--- a/WebCore/dom/Node.cpp
+++ b/WebCore/dom/Node.cpp
@@ -2438,18 +2438,6 @@ bool Node::removeEventListener(const AtomicString& eventType, EventListener* lis
updateSVGElementInstancesAfterEventListenerChange(this);
-#if ENABLE(TOUCH_EVENTS)
- if (Document* document = this->document()) {
- if (document->page()
- && (eventType == eventNames().touchstartEvent
- || eventType == eventNames().touchmoveEvent
- || eventType == eventNames().touchendEvent
- || eventType == eventNames().touchcancelEvent))
- // Note the corresponding needTouchEvents(true) is called in Document::addListenerTypeIfNeeded().
- document->page()->chrome()->client()->needTouchEvents(false);
-
- }
-#endif
return true;
}
diff --git a/WebCore/history/CachedFrame.cpp b/WebCore/history/CachedFrame.cpp
index a868134..7d69195 100644
--- a/WebCore/history/CachedFrame.cpp
+++ b/WebCore/history/CachedFrame.cpp
@@ -42,6 +42,11 @@
#include "SVGDocumentExtensions.h"
#endif
+#if ENABLE(TOUCH_EVENTS)
+#include "ChromeClient.h"
+#include "Page.h"
+#endif
+
namespace WebCore {
#ifndef NDEBUG
@@ -104,6 +109,10 @@ void CachedFrameBase::restore()
m_document->dispatchWindowLoadEvent();
#endif
m_document->dispatchWindowEvent(PageTransitionEvent::create(eventNames().pageshowEvent, true), m_document);
+#if ENABLE(TOUCH_EVENTS)
+ if (m_document->hasListenerType(Document::TOUCH_LISTENER))
+ m_document->page()->chrome()->client()->needTouchEvents(true);
+#endif
}
CachedFrame::CachedFrame(Frame* frame)
@@ -146,6 +155,11 @@ CachedFrame::CachedFrame(Frame* frame)
else
LOG(PageCache, "Finished creating CachedFrame for child frame with url '%s' and DocumentLoader %p\n", m_url.string().utf8().data(), m_documentLoader.get());
#endif
+
+#if ENABLE(TOUCH_EVENTS)
+ if (m_document->hasListenerType(Document::TOUCH_LISTENER))
+ m_document->page()->chrome()->client()->needTouchEvents(false);
+#endif
}
void CachedFrame::open()
diff --git a/WebCore/loader/EmptyClients.h b/WebCore/loader/EmptyClients.h
index e4b9af5..e5385c5 100644
--- a/WebCore/loader/EmptyClients.h
+++ b/WebCore/loader/EmptyClients.h
@@ -169,6 +169,10 @@ public:
virtual void setNeedsOneShotDrawingSynchronization() {};
virtual void scheduleCompositingLayerSync() {};
#endif
+
+#if ENABLE(TOUCH_EVENTS)
+ virtual void needTouchEvents(bool) { }
+#endif
};
class EmptyFrameLoaderClient : public FrameLoaderClient {
diff --git a/WebCore/page/ChromeClient.h b/WebCore/page/ChromeClient.h
index b28473b..d4af73b 100644
--- a/WebCore/page/ChromeClient.h
+++ b/WebCore/page/ChromeClient.h
@@ -226,7 +226,7 @@ namespace WebCore {
#endif
#if ENABLE(TOUCH_EVENTS)
- virtual void needTouchEvents(bool, bool force = false) = 0;
+ virtual void needTouchEvents(bool) = 0;
#endif
protected:
diff --git a/WebCore/page/EventHandler.cpp b/WebCore/page/EventHandler.cpp
index 1d5941b..e4274c2 100644
--- a/WebCore/page/EventHandler.cpp
+++ b/WebCore/page/EventHandler.cpp
@@ -210,14 +210,6 @@ void EventHandler::clear()
m_clickNode = 0;
#if ENABLE(TOUCH_EVENTS)
m_touchEventTarget = 0;
- if (Document* doc = m_frame->document()) {
- if (Page* page = doc->page()) {
- // We are clearing event handlers, which includes any touch
- // event handlers so force webkit to tell the chrome client to
- // stop forwarding the events.
- page->chrome()->client()->needTouchEvents(false, true);
- }
- }
#endif
m_frameSetBeingResized = 0;
#if ENABLE(DRAG_SUPPORT)