| Index: third_party/WebKit/Source/web/WebViewImpl.cpp | 
| diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp | 
| index 8fb1989aeac1d01e1a82051d1e5c418a1f46c09a..0182e4b293e80de8c07ecc742d74afeaa8ac965c 100644 | 
| --- a/third_party/WebKit/Source/web/WebViewImpl.cpp | 
| +++ b/third_party/WebKit/Source/web/WebViewImpl.cpp | 
| @@ -34,6 +34,7 @@ | 
| #include "core/HTMLNames.h" | 
| #include "core/clipboard/DataObject.h" | 
| #include "core/dom/Document.h" | 
| +#include "core/dom/DocumentUserGestureToken.h" | 
| #include "core/dom/Fullscreen.h" | 
| #include "core/dom/LayoutTreeBuilderTraversal.h" | 
| #include "core/dom/Text.h" | 
| @@ -260,26 +261,26 @@ class UserGestureNotifier { | 
| // If a UserGestureIndicator is created for a user gesture since the last | 
| // page load and *userGestureObserved is false, the UserGestureNotifier | 
| // will notify the client and set *userGestureObserved to true. | 
| -  UserGestureNotifier(WebAutofillClient*, bool* userGestureObserved); | 
| +  UserGestureNotifier(WebLocalFrameImpl*, bool* userGestureObserved); | 
| ~UserGestureNotifier(); | 
|  | 
| private: | 
| -  WebAutofillClient* const m_client; | 
| +  Persistent<WebLocalFrameImpl> m_frame; | 
| bool* const m_userGestureObserved; | 
| }; | 
|  | 
| -UserGestureNotifier::UserGestureNotifier(WebAutofillClient* client, | 
| +UserGestureNotifier::UserGestureNotifier(WebLocalFrameImpl* frame, | 
| bool* userGestureObserved) | 
| -    : m_client(client), m_userGestureObserved(userGestureObserved) { | 
| +    : m_frame(frame), m_userGestureObserved(userGestureObserved) { | 
| DCHECK(m_userGestureObserved); | 
| } | 
|  | 
| UserGestureNotifier::~UserGestureNotifier() { | 
| if (!*m_userGestureObserved && | 
| -      UserGestureIndicator::processedUserGestureSinceLoad()) { | 
| +      m_frame->frame()->document()->hasReceivedUserGesture()) { | 
| *m_userGestureObserved = true; | 
| -    if (m_client) | 
| -      m_client->firstUserGestureObserved(); | 
| +    if (m_frame && m_frame->autofillClient()) | 
| +      m_frame->autofillClient()->firstUserGestureObserved(); | 
| } | 
| } | 
|  | 
| @@ -2223,7 +2224,7 @@ WebInputEventResult WebViewImpl::handleInputEvent( | 
| return WebInputEventResult::NotHandled; | 
|  | 
| WebAutofillClient* autofillClient = mainFrameImpl()->autofillClient(); | 
| -  UserGestureNotifier notifier(autofillClient, &m_userGestureObserved); | 
| +  UserGestureNotifier notifier(mainFrameImpl(), &m_userGestureObserved); | 
| // On the first input event since page load, |notifier| instructs the | 
| // autofill client to unblock values of password input fields of any forms | 
| // on the page. There is a single input event, GestureTap, which can both | 
| @@ -2294,8 +2295,9 @@ WebInputEventResult WebViewImpl::handleInputEvent( | 
| break; | 
| case WebInputEvent::MouseDown: | 
| eventType = EventTypeNames::mousedown; | 
| -        gestureIndicator = wrapUnique(new UserGestureIndicator( | 
| -            UserGestureToken::create(UserGestureToken::NewGesture))); | 
| +        gestureIndicator = wrapUnique( | 
| +            new UserGestureIndicator(DocumentUserGestureToken::create( | 
| +                &node->document(), UserGestureToken::NewGesture))); | 
| m_mouseCaptureGestureToken = gestureIndicator->currentToken(); | 
| break; | 
| case WebInputEvent::MouseUp: | 
| @@ -2468,8 +2470,8 @@ bool WebViewImpl::setComposition( | 
| if (m_suppressNextKeypressEvent && !inputMethodController.hasComposition()) | 
| return text.isEmpty(); | 
|  | 
| -  UserGestureIndicator gestureIndicator( | 
| -      UserGestureToken::create(UserGestureToken::NewGesture)); | 
| +  UserGestureIndicator gestureIndicator(DocumentUserGestureToken::create( | 
| +      focused->document(), UserGestureToken::NewGesture)); | 
|  | 
| // When the range of composition underlines overlap with the range between | 
| // selectionStart and selectionEnd, WebKit somehow won't paint the selection | 
| @@ -2500,13 +2502,13 @@ bool WebViewImpl::finishComposingText( | 
| } | 
|  | 
| bool WebViewImpl::commitText(const WebString& text, int relativeCaretPosition) { | 
| -  UserGestureIndicator gestureIndicator( | 
| -      UserGestureToken::create(UserGestureToken::NewGesture)); | 
| - | 
| LocalFrame* focused = focusedLocalFrameAvailableForIme(); | 
| if (!focused) | 
| return false; | 
|  | 
| +  UserGestureIndicator gestureIndicator(DocumentUserGestureToken::create( | 
| +      focused->document(), UserGestureToken::NewGesture)); | 
| + | 
| if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused)) | 
| return plugin->commitText(text, relativeCaretPosition); | 
|  | 
| @@ -3661,10 +3663,7 @@ void WebViewImpl::dragTargetDrop(const WebDragData& webDragData, | 
|  | 
| DCHECK(m_currentDragData); | 
| m_currentDragData = DataObject::create(webDragData); | 
| - | 
| -  WebAutofillClient* autofillClient = | 
| -      mainFrameImpl() ? mainFrameImpl()->autofillClient() : 0; | 
| -  UserGestureNotifier notifier(autofillClient, &m_userGestureObserved); | 
| +  UserGestureNotifier notifier(mainFrameImpl(), &m_userGestureObserved); | 
|  | 
| // If this webview transitions from the "drop accepting" state to the "not | 
| // accepting" state, then our IPC message reply indicating that may be in- | 
| @@ -3683,8 +3682,6 @@ void WebViewImpl::dragTargetDrop(const WebDragData& webDragData, | 
| DragData dragData(m_currentDragData.get(), pointInRootFrame, screenPoint, | 
| static_cast<DragOperation>(m_operationsAllowed)); | 
|  | 
| -  UserGestureIndicator gesture( | 
| -      UserGestureToken::create(UserGestureToken::NewGesture)); | 
| m_page->dragController().performDrag(&dragData); | 
|  | 
| m_dragOperation = WebDragOperationNone; | 
| @@ -4481,8 +4478,12 @@ void WebViewImpl::pointerLockMouseEvent(const WebInputEvent& event) { | 
| switch (event.type) { | 
| case WebInputEvent::MouseDown: | 
| eventType = EventTypeNames::mousedown; | 
| -      gestureIndicator = wrapUnique(new UserGestureIndicator( | 
| -          UserGestureToken::create(UserGestureToken::NewGesture))); | 
| +      if (!page() || !page()->pointerLockController().element()) | 
| +        break; | 
| +      gestureIndicator = | 
| +          wrapUnique(new UserGestureIndicator(DocumentUserGestureToken::create( | 
| +              &page()->pointerLockController().element()->document(), | 
| +              UserGestureToken::NewGesture))); | 
| m_pointerLockGestureToken = gestureIndicator->currentToken(); | 
| break; | 
| case WebInputEvent::MouseUp: | 
|  |