Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp

Issue 2043863003: Speculatively launch Service Workers on mouse/touch events. [1/5] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
diff --git a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
index e74548006ea6219402dacb1a555a086e67eb9440..d558657db03f6cb78806914cd7d40b54095c303e 100644
--- a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
@@ -37,11 +37,79 @@
#include "core/page/ChromeClient.h"
#include "platform/network/NetworkHints.h"
#include "platform/weborigin/SecurityPolicy.h"
+#include "public/platform/WebNavigationHintType.h"
namespace blink {
using namespace HTMLNames;
+class HTMLAnchorElement::NavigationHintSender : public GarbageCollected<HTMLAnchorElement::NavigationHintSender> {
+public:
+ static NavigationHintSender* create(HTMLAnchorElement* anchorElement)
+ {
+ return new NavigationHintSender(anchorElement);
+ }
+ void handleEvent(Event*);
+
+ DECLARE_VIRTUAL_TRACE();
+
+private:
+ explicit NavigationHintSender(HTMLAnchorElement*);
+ bool shouldSendNavigationHint() const;
+ void maybeSendNavigationHint(WebNavigationHintType);
+
+ Member<HTMLAnchorElement> m_anchorElement;
+};
+
+void HTMLAnchorElement::NavigationHintSender::handleEvent(Event* event)
+{
+ if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton)
+ maybeSendNavigationHint(WebNavigationHintType::LinkMouseDown);
+ else if (event->type() == EventTypeNames::gesturetapunconfirmed)
+ maybeSendNavigationHint(WebNavigationHintType::LinkTapUnconfirmed);
+ else if (event->type() == EventTypeNames::gestureshowpress)
+ maybeSendNavigationHint(WebNavigationHintType::LinkTapDown);
+}
+
+DEFINE_TRACE(HTMLAnchorElement::NavigationHintSender)
+{
+ visitor->trace(m_anchorElement);
+}
+
+HTMLAnchorElement::NavigationHintSender::NavigationHintSender(HTMLAnchorElement* anchorElement)
+ : m_anchorElement(anchorElement)
+{
+}
+
+bool HTMLAnchorElement::NavigationHintSender::shouldSendNavigationHint() const
+{
+ const KURL& url = m_anchorElement->href();
+ if (!url.protocolIsInHTTPFamily())
kinuko 2016/06/20 04:53:59 nit: please add a brief comment about this conditi
horo 2016/06/21 04:04:31 Done.
+ return false;
+
+ Document& document = m_anchorElement->document();
+ // If the element was detached from the frame, handleClick() doesn't cause
+ // the navigation.
+ if (!document.frame())
+ return false;
+
+ // When the user clicks a link which is to the current document with a hash,
+ // the network request is not fetched. So we don't send the navigation hint
+ // to the browser process.
+ if (url.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier(document.url(), url))
+ return false;
+
+ return true;
+}
+
+void HTMLAnchorElement::NavigationHintSender::maybeSendNavigationHint(WebNavigationHintType type)
+{
+ if (!shouldSendNavigationHint())
+ return;
+
+ // TODO(horo): Send the navigation hint message to the browser process.
+}
+
HTMLAnchorElement::HTMLAnchorElement(const QualifiedName& tagName, Document& document)
: HTMLElement(tagName, document)
, m_linkRelations(0)
@@ -59,6 +127,12 @@ HTMLAnchorElement::~HTMLAnchorElement()
{
}
+DEFINE_TRACE(HTMLAnchorElement)
+{
+ visitor->trace(m_navigationHintSender);
+ HTMLElement::trace(visitor);
+}
+
bool HTMLAnchorElement::supportsFocus() const
{
if (hasEditableStyle())
@@ -162,6 +236,10 @@ void HTMLAnchorElement::defaultEventHandler(Event* event)
return;
}
+ // TODO(horo): Call NavigationHintSender::handleEvent() when
+ // SpeculativeLaunchServiceWorker feature is enabled.
+ // ensureNavigationHintSender()->handleEvent(event);
+
if (isLinkClick(event) && isLiveLink()) {
handleClick(event);
return;
@@ -396,4 +474,11 @@ Node::InsertionNotificationRequest HTMLAnchorElement::insertedInto(ContainerNode
return request;
}
+HTMLAnchorElement::NavigationHintSender* HTMLAnchorElement::ensureNavigationHintSender()
+{
+ if (!m_navigationHintSender)
+ m_navigationHintSender = NavigationHintSender::create(this);
+ return m_navigationHintSender;
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698