Changeset 203338 in webkit


Ignore:
Timestamp:
Jul 17, 2016 6:07:11 PM (8 years ago)
Author:
weinig@apple.com
Message:

[WebKit API] Add SPI to track multiple navigations caused by a single user gesture
<rdar://problem/26554137>
https://bugs.webkit.org/show_bug.cgi?id=159856

Reviewed by Dan Bernstein.

Source/WebCore:

  • Adds a new RefCounted object to represent a unique user gesture, called UserGestureToken.
  • Makes UserGestureIndicator track UserGestureToken.
  • Refines UserGestureIndicator's interface to use Optional and a smaller enum set to represent the different initial states.
  • Stores UserGestureTokens on objects that want to forward user gesture state (DOMTimer, postMessage, and ScheduledNavigation) rather than just a boolean.
  • accessibility/AccessibilityNodeObject.cpp:

(WebCore::AccessibilityNodeObject::increment):
(WebCore::AccessibilityNodeObject::decrement):

  • accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::press):

  • bindings/js/ScriptController.cpp:

(WebCore::ScriptController::executeScriptInWorld):
(WebCore::ScriptController::executeScript):
Update for new UserGestureIndicator interface.

  • dom/UserGestureIndicator.cpp:

(WebCore::currentToken):
(WebCore::UserGestureToken::~UserGestureToken):
(WebCore::UserGestureIndicator::UserGestureIndicator):
(WebCore::UserGestureIndicator::~UserGestureIndicator):
(WebCore::UserGestureIndicator::currentUserGesture):
(WebCore::UserGestureIndicator::processingUserGesture):
(WebCore::UserGestureIndicator::processingUserGestureForMedia):
(WebCore::isDefinite): Deleted.

  • dom/UserGestureIndicator.h:

(WebCore::UserGestureToken::create):
(WebCore::UserGestureToken::state):
(WebCore::UserGestureToken::processingUserGesture):
(WebCore::UserGestureToken::processingUserGestureForMedia):
(WebCore::UserGestureToken::addDestructionObserver):
(WebCore::UserGestureToken::UserGestureToken):
Add UserGestureToken and track the current one explicitly.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::didReceiveRemoteControlCommand):

  • inspector/InspectorFrontendClientLocal.cpp:

(WebCore::InspectorFrontendClientLocal::openInNewTab):

  • inspector/InspectorFrontendHost.cpp:
  • inspector/InspectorPageAgent.cpp:

(WebCore::InspectorPageAgent::navigate):
Update for new UserGestureIndicator interface.

  • loader/NavigationAction.cpp:

(WebCore::NavigationAction::NavigationAction):

  • loader/NavigationAction.h:

(WebCore::NavigationAction::userGestureToken):
(WebCore::NavigationAction::processingUserGesture):

  • loader/NavigationScheduler.cpp:

(WebCore::ScheduledNavigation::ScheduledNavigation):
(WebCore::ScheduledNavigation::~ScheduledNavigation):
(WebCore::ScheduledNavigation::lockBackForwardList):
(WebCore::ScheduledNavigation::wasDuringLoad):
(WebCore::ScheduledNavigation::isLocationChange):
(WebCore::ScheduledNavigation::userGestureToForward):
(WebCore::ScheduledNavigation::clearUserGesture):
(WebCore::NavigationScheduler::mustLockBackForwardList):
(WebCore::NavigationScheduler::scheduleFormSubmission):
(WebCore::ScheduledNavigation::wasUserGesture): Deleted.

  • page/DOMTimer.cpp:

(WebCore::shouldForwardUserGesture):
(WebCore::userGestureTokenToForward):
(WebCore::DOMTimer::DOMTimer):
(WebCore::DOMTimer::fired):

  • page/DOMTimer.h:
  • page/DOMWindow.cpp:

(WebCore::PostMessageTimer::PostMessageTimer):
Store the active UserGestureToken rather than just a bit.

  • page/EventHandler.cpp:

(WebCore::EventHandler::handleMousePressEvent):
(WebCore::EventHandler::handleMouseDoubleClickEvent):
(WebCore::EventHandler::handleMouseReleaseEvent):
(WebCore::EventHandler::keyEvent):
(WebCore::EventHandler::handleTouchEvent):

  • rendering/HitTestResult.cpp:

(WebCore::HitTestResult::toggleMediaFullscreenState):
(WebCore::HitTestResult::enterFullscreenForVideo):
(WebCore::HitTestResult::toggleEnhancedFullscreenForVideo):
Update for new UserGestureIndicator interface.

Source/WebKit/mac:

  • Plugins/Hosted/NetscapePluginInstanceProxy.mm:

(WebKit::NetscapePluginInstanceProxy::evaluate):

  • Plugins/WebNetscapePluginView.mm:

(-[WebNetscapePluginView sendEvent:isDrawRect:]):
Update for new UserGestureIndicator interface.

Source/WebKit/win:

  • Plugins/PluginView.cpp:

(WebCore::PluginView::performRequest):

  • WebCoreSupport/WebContextMenuClient.cpp:

(WebContextMenuClient::searchWithGoogle):
Update for new UserGestureIndicator interface.

Source/WebKit2:

  • Shared/API/APIObject.h:
  • Shared/Cocoa/APIObject.mm:

(API::Object::newObject):

  • UIProcess/API/APIUserInitiatedAction.h: Added.

Add new APIObject type, UserInitiatedAction.

  • UIProcess/API/Cocoa/WKNavigationAction.mm:
  • UIProcess/API/Cocoa/WKNavigationActionPrivate.h:

Expose a _WKUserInitiatedAction on the WKNavigationAction.

  • UIProcess/API/Cocoa/_WKUserInitiatedAction.h: Added.
  • UIProcess/API/Cocoa/_WKUserInitiatedAction.mm: Added.

(-[_WKUserInitiatedAction consume]):
(-[_WKUserInitiatedAction isConsumed]):
(-[_WKUserInitiatedAction _apiObject]):

  • UIProcess/API/Cocoa/_WKUserInitiatedActionInternal.h: Added.

Add new _WKUserInitiatedAction type wrapping API::UserInitiatedAction.

  • Shared/NavigationActionData.cpp:

(WebKit::NavigationActionData::encode):
(WebKit::NavigationActionData::decode):

  • Shared/NavigationActionData.h:

Store the userGestureTokenIdentifier (as determined from the WebProcess's map) rather
than just a single bit. This allows us to track if a user gesture is used for multiple navigations.

  • UIProcess/API/APINavigationAction.h:

Add UserInitiatedAction member and re-implement isProcessingUserGesture in terms of it.

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageUIClient):

  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::UIDelegate::UIClient::createNewPage):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::WebPageProxy::decidePolicyForNewWindowAction):
Get the API::UserInitiatedAction from the WebProcessProxy (if it exists), and pass
it along to the API::NavigationAction.

  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::shutDown):
(WebKit::WebProcessProxy::userInitiatedActivity):
(WebKit::WebProcessProxy::didDestroyUserGestureToken):

  • UIProcess/WebProcessProxy.h:

Keep a map of active userInitiatedActivity objects.

  • UIProcess/WebProcessProxy.messages.in:

Add DidDestroyUserGestureToken message to manager API::UserInitiatedActivity lifetimes.

  • WebKit2.xcodeproj/project.pbxproj:

Add new files.

  • WebProcess/Notifications/WebNotificationManager.cpp:

(WebKit::WebNotificationManager::didClickNotification):

  • WebProcess/Plugins/PluginView.cpp:

(WebKit::PluginView::performFrameLoadURLRequest):
(WebKit::PluginView::evaluate):

  • WebProcess/WebCoreSupport/WebContextMenuClient.cpp:

(WebKit::WebContextMenuClient::searchWithGoogle):

  • WebProcess/cocoa/WebPlaybackSessionManager.mm:

(WebKit::WebPlaybackSessionManager::play):
(WebKit::WebPlaybackSessionManager::pause):
(WebKit::WebPlaybackSessionManager::togglePlayState):
(WebKit::WebPlaybackSessionManager::beginScrubbing):
(WebKit::WebPlaybackSessionManager::endScrubbing):
(WebKit::WebPlaybackSessionManager::seekToTime):
(WebKit::WebPlaybackSessionManager::fastSeek):
(WebKit::WebPlaybackSessionManager::beginScanningForward):
(WebKit::WebPlaybackSessionManager::beginScanningBackward):
(WebKit::WebPlaybackSessionManager::endScanning):
(WebKit::WebPlaybackSessionManager::selectAudioMediaOption):
(WebKit::WebPlaybackSessionManager::selectLegibleMediaOption):
Update for new UserGestureIndicator interface.

  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::createWindow):

  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction):
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
Get an identifier for the UserGestureToken from the WebProcess singleton
to pass to the WebProcess.

  • WebProcess/WebProcess.cpp:

(WebKit::nextUserGestureTokenIdentifier):
(WebKit::WebProcess::userGestureTokenIdentifier):
(WebKit::WebProcess::userGestureTokenDestroyed):

  • WebProcess/WebProcess.h:

Track UserGestureToken lifetimes utilizing the destructionObserver mechanism
off the tokens to indicate destruction. When destroyed, notify the UIProcess
to avoid leaks.

Tools:

  • MiniBrowser/mac/WK2BrowserWindowController.m:

(-[WK2BrowserWindowController webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
Add basic window.open implementation.

(-[WK2BrowserWindowController webView:decidePolicyForNavigationAction:decisionHandler:]):
Add basic navigation policy implementation which implements a rule where a user gesture is only allowed
to open a single non-web URL, all others are dropped.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit2Cocoa/UserInitiatedActionInNavigationAction.mm: Added.
  • TestWebKitAPI/Tests/WebKit2Cocoa/open-multiple-external-url.html: Added.

Add API for the new SPI.

Location:
trunk
Files:
6 added
51 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r203337 r203338  
     12016-07-16  Sam Weinig  <sam@webkit.org>
     2
     3        [WebKit API] Add SPI to track multiple navigations caused by a single user gesture
     4        <rdar://problem/26554137>
     5        https://bugs.webkit.org/show_bug.cgi?id=159856
     6
     7        Reviewed by Dan Bernstein.
     8
     9        - Adds a new RefCounted object to represent a unique user gesture, called UserGestureToken.
     10        - Makes UserGestureIndicator track UserGestureToken.
     11        - Refines UserGestureIndicator's interface to use Optional and a smaller enum set
     12          to represent the different initial states.
     13        - Stores UserGestureTokens on objects that want to forward user gesture state (DOMTimer,
     14          postMessage, and ScheduledNavigation) rather than just a boolean.
     15
     16        * accessibility/AccessibilityNodeObject.cpp:
     17        (WebCore::AccessibilityNodeObject::increment):
     18        (WebCore::AccessibilityNodeObject::decrement):
     19        * accessibility/AccessibilityObject.cpp:
     20        (WebCore::AccessibilityObject::press):
     21        * bindings/js/ScriptController.cpp:
     22        (WebCore::ScriptController::executeScriptInWorld):
     23        (WebCore::ScriptController::executeScript):
     24        Update for new UserGestureIndicator interface.
     25
     26        * dom/UserGestureIndicator.cpp:
     27        (WebCore::currentToken):
     28        (WebCore::UserGestureToken::~UserGestureToken):
     29        (WebCore::UserGestureIndicator::UserGestureIndicator):
     30        (WebCore::UserGestureIndicator::~UserGestureIndicator):
     31        (WebCore::UserGestureIndicator::currentUserGesture):
     32        (WebCore::UserGestureIndicator::processingUserGesture):
     33        (WebCore::UserGestureIndicator::processingUserGestureForMedia):
     34        (WebCore::isDefinite): Deleted.
     35        * dom/UserGestureIndicator.h:
     36        (WebCore::UserGestureToken::create):
     37        (WebCore::UserGestureToken::state):
     38        (WebCore::UserGestureToken::processingUserGesture):
     39        (WebCore::UserGestureToken::processingUserGestureForMedia):
     40        (WebCore::UserGestureToken::addDestructionObserver):
     41        (WebCore::UserGestureToken::UserGestureToken):
     42        Add UserGestureToken and track the current one explicitly.
     43
     44        * html/HTMLMediaElement.cpp:
     45        (WebCore::HTMLMediaElement::didReceiveRemoteControlCommand):
     46        * inspector/InspectorFrontendClientLocal.cpp:
     47        (WebCore::InspectorFrontendClientLocal::openInNewTab):
     48        * inspector/InspectorFrontendHost.cpp:
     49        * inspector/InspectorPageAgent.cpp:
     50        (WebCore::InspectorPageAgent::navigate):
     51        Update for new UserGestureIndicator interface.
     52
     53        * loader/NavigationAction.cpp:
     54        (WebCore::NavigationAction::NavigationAction):
     55        * loader/NavigationAction.h:
     56        (WebCore::NavigationAction::userGestureToken):
     57        (WebCore::NavigationAction::processingUserGesture):
     58        * loader/NavigationScheduler.cpp:
     59        (WebCore::ScheduledNavigation::ScheduledNavigation):
     60        (WebCore::ScheduledNavigation::~ScheduledNavigation):
     61        (WebCore::ScheduledNavigation::lockBackForwardList):
     62        (WebCore::ScheduledNavigation::wasDuringLoad):
     63        (WebCore::ScheduledNavigation::isLocationChange):
     64        (WebCore::ScheduledNavigation::userGestureToForward):
     65        (WebCore::ScheduledNavigation::clearUserGesture):
     66        (WebCore::NavigationScheduler::mustLockBackForwardList):
     67        (WebCore::NavigationScheduler::scheduleFormSubmission):
     68        (WebCore::ScheduledNavigation::wasUserGesture): Deleted.
     69        * page/DOMTimer.cpp:
     70        (WebCore::shouldForwardUserGesture):
     71        (WebCore::userGestureTokenToForward):
     72        (WebCore::DOMTimer::DOMTimer):
     73        (WebCore::DOMTimer::fired):
     74        * page/DOMTimer.h:
     75        * page/DOMWindow.cpp:
     76        (WebCore::PostMessageTimer::PostMessageTimer):
     77        Store the active UserGestureToken rather than just a bit.
     78
     79        * page/EventHandler.cpp:
     80        (WebCore::EventHandler::handleMousePressEvent):
     81        (WebCore::EventHandler::handleMouseDoubleClickEvent):
     82        (WebCore::EventHandler::handleMouseReleaseEvent):
     83        (WebCore::EventHandler::keyEvent):
     84        (WebCore::EventHandler::handleTouchEvent):
     85        * rendering/HitTestResult.cpp:
     86        (WebCore::HitTestResult::toggleMediaFullscreenState):
     87        (WebCore::HitTestResult::enterFullscreenForVideo):
     88        (WebCore::HitTestResult::toggleEnhancedFullscreenForVideo):
     89        Update for new UserGestureIndicator interface.
     90
    1912016-07-17  Ryosuke Niwa  <rniwa@webkit.org>
    292
  • trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp

    r203324 r203338  
    10711071void AccessibilityNodeObject::increment()
    10721072{
    1073     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, document());
     1073    UserGestureIndicator gestureIndicator(ProcessingUserGesture, document());
    10741074    alterSliderValue(true);
    10751075}
     
    10771077void AccessibilityNodeObject::decrement()
    10781078{
    1079     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, document());
     1079    UserGestureIndicator gestureIndicator(ProcessingUserGesture, document());
    10801080    alterSliderValue(false);
    10811081}
  • trunk/Source/WebCore/accessibility/AccessibilityObject.cpp

    r203337 r203338  
    921921        pressElement = hitTestElement;
    922922   
    923     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, document);
     923    UserGestureIndicator gestureIndicator(ProcessingUserGesture, document);
    924924   
    925925    bool dispatchedTouchEvent = dispatchTouchEvent();
  • trunk/Source/WebCore/bindings/js/ScriptController.cpp

    r201237 r203338  
    498498JSValue ScriptController::executeScriptInWorld(DOMWrapperWorld& world, const String& script, bool forceUserGesture)
    499499{
    500     UserGestureIndicator gestureIndicator(forceUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     500    UserGestureIndicator gestureIndicator(forceUserGesture ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    501501    ScriptSourceCode sourceCode(script, m_frame.document()->url());
    502502
     
    524524JSValue ScriptController::executeScript(const String& script, bool forceUserGesture, ExceptionDetails* exceptionDetails)
    525525{
    526     UserGestureIndicator gestureIndicator(forceUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     526    UserGestureIndicator gestureIndicator(forceUserGesture ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    527527    return executeScript(ScriptSourceCode(script, m_frame.document()->url()), exceptionDetails);
    528528}
  • trunk/Source/WebCore/dom/UserGestureIndicator.cpp

    r187694 r203338  
    2929#include "Document.h"
    3030#include <wtf/MainThread.h>
     31#include <wtf/NeverDestroyed.h>
    3132
    3233namespace WebCore {
    3334
    34 static bool isDefinite(ProcessingUserGestureState state)
     35static RefPtr<UserGestureToken>& currentToken()
    3536{
    36     return state == DefinitelyProcessingUserGesture || state == DefinitelyNotProcessingUserGesture || state == DefinitelyProcessingPotentialUserGesture;
     37    static NeverDestroyed<RefPtr<UserGestureToken>> token;
     38    return token;
    3739}
    3840
    39 ProcessingUserGestureState UserGestureIndicator::s_state = DefinitelyNotProcessingUserGesture;
     41UserGestureToken::~UserGestureToken()
     42{
     43    for (auto& observer : m_destructionObservers)
     44        observer(*this);
     45}
    4046
    41 UserGestureIndicator::UserGestureIndicator(ProcessingUserGestureState state, Document* document)
    42     : m_previousState(s_state)
     47UserGestureIndicator::UserGestureIndicator(Optional<ProcessingUserGestureState> state, Document* document)
     48    : m_previousToken(currentToken())
    4349{
    4450    // Silently ignore UserGestureIndicators on non main threads.
    4551    if (!isMainThread())
    4652        return;
    47     // We overwrite s_state only if the caller is definite about the gesture state.
    48     if (isDefinite(state))
    49         s_state = state;
    50     ASSERT(isDefinite(s_state));
    5153
    52     if (document && s_state == DefinitelyProcessingUserGesture)
     54    if (state)
     55        currentToken() = UserGestureToken::create(state.value());
     56
     57    if (document && currentToken()->processingUserGesture())
    5358        document->topDocument().updateLastHandledUserGestureTimestamp();
     59}
     60
     61UserGestureIndicator::UserGestureIndicator(RefPtr<UserGestureToken> token)
     62    : m_previousToken(currentToken())
     63{
     64    if (!isMainThread())
     65        return;
     66
     67    if (token)
     68        currentToken() = token;
    5469}
    5570
     
    5873    if (!isMainThread())
    5974        return;
    60     s_state = m_previousState;
    61     ASSERT(isDefinite(s_state));
     75   
     76    currentToken() = m_previousToken;
     77}
     78
     79RefPtr<UserGestureToken> UserGestureIndicator::currentUserGesture()
     80{
     81    if (!isMainThread())
     82        return nullptr;
     83
     84    return currentToken();
    6285}
    6386
    6487bool UserGestureIndicator::processingUserGesture()
    6588{
    66     return isMainThread() ? s_state == DefinitelyProcessingUserGesture : false;
     89    if (!isMainThread())
     90        return false;
     91
     92    return currentToken() ? currentToken()->processingUserGesture() : false;
    6793}
    6894
     
    7298        return false;
    7399
    74     return s_state == DefinitelyProcessingUserGesture || s_state == DefinitelyProcessingPotentialUserGesture;
     100    return currentToken() ? currentToken()->processingUserGestureForMedia() : false;
    75101}
    76102
  • trunk/Source/WebCore/dom/UserGestureIndicator.h

    r200908 r203338  
    2424 */
    2525
    26 #ifndef UserGestureIndicator_h
    27 #define UserGestureIndicator_h
     26#pragma once
    2827
     28#include <wtf/Function.h>
    2929#include <wtf/Noncopyable.h>
     30#include <wtf/Optional.h>
     31#include <wtf/RefCounted.h>
     32#include <wtf/RefPtr.h>
     33#include <wtf/Vector.h>
    3034
    3135namespace WebCore {
     
    3438
    3539enum ProcessingUserGestureState {
    36     DefinitelyProcessingUserGesture,
    37     DefinitelyProcessingPotentialUserGesture,
    38     PossiblyProcessingUserGesture,
    39     DefinitelyNotProcessingUserGesture
     40    ProcessingUserGesture,
     41    ProcessingPotentialUserGesture,
     42    NotProcessingUserGesture
     43};
     44
     45class UserGestureToken : public RefCounted<UserGestureToken> {
     46public:
     47    static RefPtr<UserGestureToken> create(ProcessingUserGestureState state)
     48    {
     49        return adoptRef(new UserGestureToken(state));
     50    }
     51
     52    WEBCORE_EXPORT ~UserGestureToken();
     53
     54    ProcessingUserGestureState state() const { return m_state; }
     55    bool processingUserGesture() const { return m_state == ProcessingUserGesture; }
     56    bool processingUserGestureForMedia() const { return m_state == ProcessingUserGesture || m_state == ProcessingPotentialUserGesture; }
     57
     58    void addDestructionObserver(Function<void (UserGestureToken&)>&& observer)
     59    {
     60        m_destructionObservers.append(WTFMove(observer));
     61    }
     62
     63private:
     64    UserGestureToken(ProcessingUserGestureState state)
     65        : m_state(state)
     66    {
     67    }
     68
     69    ProcessingUserGestureState m_state = NotProcessingUserGesture;
     70    Vector<Function<void (UserGestureToken&)>> m_destructionObservers;
    4071};
    4172
     
    4374    WTF_MAKE_NONCOPYABLE(UserGestureIndicator);
    4475public:
     76    WEBCORE_EXPORT static RefPtr<UserGestureToken> currentUserGesture();
     77
    4578    WEBCORE_EXPORT static bool processingUserGesture();
    46     static bool processingUserGestureForMedia();
     79    WEBCORE_EXPORT static bool processingUserGestureForMedia();
    4780
    4881    // If a document is provided, its last known user gesture timestamp is updated.
    49     WEBCORE_EXPORT explicit UserGestureIndicator(ProcessingUserGestureState, Document* = nullptr);
     82    WEBCORE_EXPORT explicit UserGestureIndicator(Optional<ProcessingUserGestureState>, Document* = nullptr);
     83    WEBCORE_EXPORT explicit UserGestureIndicator(RefPtr<UserGestureToken>);
    5084    WEBCORE_EXPORT ~UserGestureIndicator();
    5185
    5286private:
    53     WEBCORE_EXPORT static ProcessingUserGestureState s_state;
    54     ProcessingUserGestureState m_previousState;
     87    RefPtr<UserGestureToken> m_previousToken;
    5588};
    5689
    5790}
    58 
    59 #endif
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r203337 r203338  
    68326832    LOG(Media, "HTMLMediaElement::didReceiveRemoteControlCommand(%p) - %i", this, static_cast<int>(command));
    68336833
    6834     UserGestureIndicator remoteControlUserGesture(DefinitelyProcessingUserGesture, &document());
     6834    UserGestureIndicator remoteControlUserGesture(ProcessingUserGesture, &document());
    68356835    switch (command) {
    68366836    case PlatformMediaSession::PlayCommand:
  • trunk/Source/WebCore/inspector/InspectorFrontendClientLocal.cpp

    r200895 r203338  
    222222void InspectorFrontendClientLocal::openInNewTab(const String& url)
    223223{
    224     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     224    UserGestureIndicator indicator(ProcessingUserGesture);
    225225    Frame& mainFrame = m_inspectedPageController->inspectedPage().mainFrame();
    226226    FrameLoadRequest request(mainFrame.document()->securityOrigin(), ResourceRequest(), "_blank", LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Allow, ReplaceDocumentIfJavaScriptURL, ShouldOpenExternalURLsPolicy::ShouldNotAllow);
  • trunk/Source/WebCore/inspector/InspectorFrontendHost.cpp

    r203322 r203338  
    9595    {
    9696        if (m_frontendHost) {
    97             UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
     97            UserGestureIndicator gestureIndicator(ProcessingUserGesture);
    9898            int itemNumber = action - ContextMenuItemBaseCustomTag;
    9999
  • trunk/Source/WebCore/inspector/InspectorPageAgent.cpp

    r203324 r203338  
    426426void InspectorPageAgent::navigate(ErrorString&, const String& url)
    427427{
    428     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     428    UserGestureIndicator indicator(ProcessingUserGesture);
    429429    Frame& frame = m_page.mainFrame();
    430430
  • trunk/Source/WebCore/loader/NavigationAction.cpp

    r198893 r203338  
    5353    , m_type(type)
    5454    , m_event(event)
    55     , m_processingUserGesture(ScriptController::processingUserGesture())
     55    , m_userGestureToken(UserGestureIndicator::currentUserGesture())
    5656    , m_shouldOpenExternalURLsPolicy(shouldOpenExternalURLsPolicy)
    5757    , m_downloadAttribute(downloadAttribute)
  • trunk/Source/WebCore/loader/NavigationAction.h

    r198893 r203338  
    3434#include "URL.h"
    3535#include "ResourceRequest.h"
     36#include "UserGestureIndicator.h"
    3637#include <wtf/Forward.h>
    3738
     
    6465    const Event* event() const { return m_event.get(); }
    6566
    66     bool processingUserGesture() const { return m_processingUserGesture; }
     67    bool processingUserGesture() const { return m_userGestureToken ? m_userGestureToken->processingUserGesture() : false; }
     68    RefPtr<UserGestureToken> userGestureToken() const { return m_userGestureToken; }
    6769
    6870    ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy() const { return m_shouldOpenExternalURLsPolicy; }
     
    7476    NavigationType m_type { NavigationType::Other };
    7577    RefPtr<Event> m_event;
    76     bool m_processingUserGesture;
     78    RefPtr<UserGestureToken> m_userGestureToken;
    7779    ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow };
    7880    AtomicString m_downloadAttribute;
  • trunk/Source/WebCore/loader/NavigationScheduler.cpp

    r203003 r203338  
    6767        , m_wasDuringLoad(wasDuringLoad)
    6868        , m_isLocationChange(isLocationChange)
    69         , m_wasUserGesture(ScriptController::processingUserGesture())
     69        , m_userGestureToForward(UserGestureIndicator::currentUserGesture())
    7070    {
    7171    }
     
    8383    bool wasDuringLoad() const { return m_wasDuringLoad; }
    8484    bool isLocationChange() const { return m_isLocationChange; }
    85     bool wasUserGesture() const { return m_wasUserGesture; }
     85    RefPtr<UserGestureToken> userGestureToForward() const { return m_userGestureToForward; }
    8686
    8787protected:
    88     void clearUserGesture() { m_wasUserGesture = false; }
     88    void clearUserGesture() { m_userGestureToForward = nullptr; }
    8989
    9090    ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow };
     
    9696    bool m_wasDuringLoad;
    9797    bool m_isLocationChange;
    98     bool m_wasUserGesture;
     98    RefPtr<UserGestureToken> m_userGestureToForward;
    9999};
    100100
     
    114114    void fire(Frame& frame) override
    115115    {
    116         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     116        UserGestureIndicator gestureIndicator(userGestureToForward());
    117117
    118118        ResourceRequest resourceRequest(m_url, m_referrer, UseProtocolCachePolicy);
     
    128128        m_haveToldClient = true;
    129129
    130         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     130        UserGestureIndicator gestureIndicator(userGestureToForward());
    131131        frame.loader().clientRedirected(m_url, delay(), currentTime() + timer.nextFireInterval(), lockBackForwardList());
    132132    }
     
    172172    void fire(Frame& frame) override
    173173    {
    174         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     174        UserGestureIndicator gestureIndicator(userGestureToForward());
    175175        bool refresh = equalIgnoringFragmentIdentifier(frame.document()->url(), url());
    176176        ResourceRequest resourceRequest(url(), referrer(), refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy);
     
    188188    void fire(Frame& frame) override
    189189    {
    190         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     190        UserGestureIndicator gestureIndicator(userGestureToForward());
    191191
    192192        ResourceRequest resourceRequest(url(), referrer(), UseProtocolCachePolicy);
     
    205205    void fire(Frame& frame) override
    206206    {
    207         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     207        UserGestureIndicator gestureIndicator(userGestureToForward());
    208208
    209209        ResourceRequest resourceRequest(url(), referrer(), ReloadIgnoringCacheData);
     
    223223    void fire(Frame& frame) override
    224224    {
    225         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     225        UserGestureIndicator gestureIndicator(userGestureToForward());
    226226
    227227        if (!m_historySteps) {
     
    256256    void fire(Frame& frame) override
    257257    {
    258         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     258        UserGestureIndicator gestureIndicator(userGestureToForward());
    259259
    260260        // The submitForm function will find a target frame before using the redirection timer.
     
    276276        m_haveToldClient = true;
    277277
    278         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     278        UserGestureIndicator gestureIndicator(userGestureToForward());
    279279        frame.loader().clientRedirected(m_submission->requestURL(), delay(), currentTime() + timer.nextFireInterval(), lockBackForwardList());
    280280    }
     
    309309    void fire(Frame& frame) override
    310310    {
    311         UserGestureIndicator gestureIndicator(wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     311        UserGestureIndicator gestureIndicator(userGestureToForward());
    312312
    313313        ResourceResponse replacementResponse(m_originDocument.url(), ASCIILiteral("text/plain"), 0, ASCIILiteral("UTF-8"));
     
    386386    // Non-user navigation before the page has finished firing onload should not create a new back/forward item.
    387387    // See https://webkit.org/b/42861 for the original motivation for this.   
    388     if (!ScriptController::processingUserGesture() && targetFrame.loader().documentLoader() && !targetFrame.loader().documentLoader()->wasOnloadDispatched())
     388    if (!UserGestureIndicator::processingUserGesture() && targetFrame.loader().documentLoader() && !targetFrame.loader().documentLoader()->wasOnloadDispatched())
    389389        return LockBackForwardList::Yes;
    390390   
     
    445445    LockBackForwardList lockBackForwardList = mustLockBackForwardList(m_frame);
    446446    if (lockBackForwardList == LockBackForwardList::No
    447         && (submission->state()->formSubmissionTrigger() == SubmittedByJavaScript && m_frame.tree().parent() && !ScriptController::processingUserGesture())) {
     447        && (submission->state()->formSubmissionTrigger() == SubmittedByJavaScript && m_frame.tree().parent() && !UserGestureIndicator::processingUserGesture())) {
    448448        lockBackForwardList = LockBackForwardList::Yes;
    449449    }
  • trunk/Source/WebCore/page/DOMTimer.cpp

    r202198 r203338  
    3636#include "ScriptExecutionContext.h"
    3737#include "Settings.h"
    38 #include "UserGestureIndicator.h"
    3938#include <wtf/CurrentTime.h>
    4039#include <wtf/HashMap.h>
     
    169168}
    170169
     170static inline RefPtr<UserGestureToken> userGestureTokenToForward(std::chrono::milliseconds interval, int nestingLevel)
     171{
     172    if (!shouldForwardUserGesture(interval, nestingLevel))
     173        return nullptr;
     174
     175    return UserGestureIndicator::currentUserGesture();
     176}
     177
    171178DOMTimer::DOMTimer(ScriptExecutionContext& context, std::unique_ptr<ScheduledAction> action, std::chrono::milliseconds interval, bool singleShot)
    172179    : SuspendableTimer(context)
     
    176183    , m_throttleState(Undetermined)
    177184    , m_currentTimerInterval(intervalClampedToMinimum())
    178     , m_shouldForwardUserGesture(shouldForwardUserGesture(interval, m_nestingLevel))
     185    , m_userGestureTokenToForward(userGestureTokenToForward(interval, m_nestingLevel))
    179186{
    180187    RefPtr<DOMTimer> reference = adoptRef(this);
     
    301308    ASSERT(!isSuspended());
    302309    ASSERT(!context.activeDOMObjectsAreSuspended());
    303     UserGestureIndicator gestureIndicator(m_shouldForwardUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     310    UserGestureIndicator gestureIndicator(m_userGestureTokenToForward);
    304311    // Only the first execution of a multi-shot timer should get an affirmative user gesture indicator.
    305     m_shouldForwardUserGesture = false;
     312    m_userGestureTokenToForward = nullptr;
    306313
    307314    InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireTimer(&context, m_timeoutId);
  • trunk/Source/WebCore/page/DOMTimer.h

    r202198 r203338  
    2929
    3030#include "SuspendableTimer.h"
     31#include "UserGestureIndicator.h"
    3132#include <memory>
    3233#include <wtf/RefCounted.h>
     
    9192    TimerThrottleState m_throttleState;
    9293    std::chrono::milliseconds m_currentTimerInterval;
    93     bool m_shouldForwardUserGesture;
     94    RefPtr<UserGestureToken> m_userGestureTokenToForward;
    9495};
    9596
  • trunk/Source/WebCore/page/DOMWindow.cpp

    r202761 r203338  
    151151        , m_targetOrigin(WTFMove(targetOrigin))
    152152        , m_stackTrace(stackTrace)
    153         , m_wasProcessingUserGesture(UserGestureIndicator::processingUserGesture())
     153        , m_userGestureToForward(UserGestureIndicator::currentUserGesture())
    154154    {
    155155    }
     
    169169        std::unique_ptr<PostMessageTimer> timer(this);
    170170       
    171         UserGestureIndicator userGestureIndicator(m_wasProcessingUserGesture ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);
     171        UserGestureIndicator userGestureIndicator(m_userGestureToForward);
    172172        m_window->postMessageTimerFired(*timer);
    173173    }
     
    180180    RefPtr<SecurityOrigin> m_targetOrigin;
    181181    RefPtr<ScriptCallStack> m_stackTrace;
    182     bool m_wasProcessingUserGesture;
     182    RefPtr<UserGestureToken> m_userGestureToForward;
    183183};
    184184
  • trunk/Source/WebCore/page/EventHandler.cpp

    r203324 r203338  
    16191619#endif
    16201620
    1621     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, m_frame.document());
     1621    UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
    16221622
    16231623    // FIXME (bug 68185): this call should be made at another abstraction layer
     
    17471747    m_frame.selection().setCaretBlinkingSuspended(false);
    17481748
    1749     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, m_frame.document());
     1749    UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
    17501750
    17511751    // We get this instead of a second mouse-up
     
    19881988#endif
    19891989
    1990     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, m_frame.document());
     1990    UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
    19911991
    19921992#if ENABLE(PAN_SCROLLING)
     
    30483048        return false;
    30493049
    3050     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, m_frame.document());
     3050    UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
    30513051    UserTypingGestureIndicator typingGestureIndicator(m_frame);
    30523052
     
    38013801    const Vector<PlatformTouchPoint>& points = event.touchPoints();
    38023802
    3803     UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture, m_frame.document());
     3803    UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
    38043804
    38053805    bool freshTouchEvents = true;
  • trunk/Source/WebCore/rendering/HitTestResult.cpp

    r203324 r203338  
    471471    if (HTMLMediaElement* mediaElement = this->mediaElement()) {
    472472        if (mediaElement->isVideo() && mediaElement->supportsFullscreen(HTMLMediaElementEnums::VideoFullscreenModeStandard)) {
    473             UserGestureIndicator indicator(DefinitelyProcessingUserGesture, &mediaElement->document());
     473            UserGestureIndicator indicator(ProcessingUserGesture, &mediaElement->document());
    474474            mediaElement->toggleStandardFullscreenState();
    475475        }
     
    485485        HTMLVideoElement& videoElement = downcast<HTMLVideoElement>(*mediaElement);
    486486        if (!videoElement.isFullscreen() && mediaElement->supportsFullscreen(HTMLMediaElementEnums::VideoFullscreenModeStandard)) {
    487             UserGestureIndicator indicator(DefinitelyProcessingUserGesture, &mediaElement->document());
     487            UserGestureIndicator indicator(ProcessingUserGesture, &mediaElement->document());
    488488            videoElement.enterFullscreen();
    489489        }
     
    815815
    816816    HTMLVideoElement& videoElement = downcast<HTMLVideoElement>(*mediaElement);
    817     UserGestureIndicator indicator(DefinitelyProcessingUserGesture, &mediaElement->document());
     817    UserGestureIndicator indicator(ProcessingUserGesture, &mediaElement->document());
    818818    if (videoElement.fullscreenMode() == HTMLMediaElementEnums::VideoFullscreenModePictureInPicture)
    819819        videoElement.exitFullscreen();
  • trunk/Source/WebKit/mac/ChangeLog

    r203324 r203338  
     12016-07-17  Sam Weinig  <sam@webkit.org>
     2
     3        [WebKit API] Add SPI to track multiple navigations caused by a single user gesture
     4        <rdar://problem/26554137>
     5        https://bugs.webkit.org/show_bug.cgi?id=159856
     6
     7        Reviewed by Dan Bernstein.
     8
     9        * Plugins/Hosted/NetscapePluginInstanceProxy.mm:
     10        (WebKit::NetscapePluginInstanceProxy::evaluate):
     11        * Plugins/WebNetscapePluginView.mm:
     12        (-[WebNetscapePluginView sendEvent:isDrawRect:]):
     13        Update for new UserGestureIndicator interface.
     14
    1152016-07-16  Ryosuke Niwa  <rniwa@webkit.org>
    216
  • trunk/Source/WebKit/mac/Plugins/Hosted/NetscapePluginInstanceProxy.mm

    r202242 r203338  
    890890    ExecState* exec = globalObject->globalExec();
    891891
    892     UserGestureIndicator gestureIndicator(allowPopups ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     892    UserGestureIndicator gestureIndicator(allowPopups ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    893893   
    894894    JSValue result = JSC::evaluate(exec, makeSource(script));
  • trunk/Source/WebKit/mac/Plugins/WebNetscapePluginView.mm

    r201689 r203338  
    665665    {
    666666        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
    667         UserGestureIndicator gestureIndicator(_eventHandler->currentEventIsUserGesture() ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     667        UserGestureIndicator gestureIndicator(_eventHandler->currentEventIsUserGesture() ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    668668        acceptedEvent = [_pluginPackage.get() pluginFuncs]->event(plugin, event);
    669669    }
  • trunk/Source/WebKit/win/ChangeLog

    r203324 r203338  
     12016-07-17  Sam Weinig  <sam@webkit.org>
     2
     3        [WebKit API] Add SPI to track multiple navigations caused by a single user gesture
     4        <rdar://problem/26554137>
     5        https://bugs.webkit.org/show_bug.cgi?id=159856
     6
     7        Reviewed by Dan Bernstein.
     8
     9        * Plugins/PluginView.cpp:
     10        (WebCore::PluginView::performRequest):
     11        * WebCoreSupport/WebContextMenuClient.cpp:
     12        (WebContextMenuClient::searchWithGoogle):
     13        Update for new UserGestureIndicator interface.
     14
    1152016-07-16  Ryosuke Niwa  <rniwa@webkit.org>
    216
  • trunk/Source/WebKit/win/Plugins/PluginView.cpp

    r203250 r203338  
    403403    String jsString = scriptStringIfJavaScriptURL(requestURL);
    404404
    405     UserGestureIndicator gestureIndicator(request->shouldAllowPopups() ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     405    UserGestureIndicator gestureIndicator(request->shouldAllowPopups() ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    406406
    407407    if (jsString.isNull()) {
  • trunk/Source/WebKit/win/WebCoreSupport/WebContextMenuClient.cpp

    r192378 r203338  
    7070
    7171    if (Page* page = frame->page()) {
    72         UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     72        UserGestureIndicator indicator(ProcessingUserGesture);
    7373        page->mainFrame().loader().urlSelected(URL(ParsedURLString, url), String(), 0, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, ShouldOpenExternalURLsPolicy::ShouldNotAllow);
    7474    }
  • trunk/Source/WebKit2/ChangeLog

    r203337 r203338  
     12016-07-16  Sam Weinig  <sam@webkit.org>
     2
     3        [WebKit API] Add SPI to track multiple navigations caused by a single user gesture
     4        <rdar://problem/26554137>
     5        https://bugs.webkit.org/show_bug.cgi?id=159856
     6
     7        Reviewed by Dan Bernstein.
     8
     9        * Shared/API/APIObject.h:
     10        * Shared/Cocoa/APIObject.mm:
     11        (API::Object::newObject):
     12        * UIProcess/API/APIUserInitiatedAction.h: Added.
     13        Add new APIObject type, UserInitiatedAction.
     14
     15        * UIProcess/API/Cocoa/WKNavigationAction.mm:
     16        * UIProcess/API/Cocoa/WKNavigationActionPrivate.h:
     17        Expose a _WKUserInitiatedAction on the WKNavigationAction.
     18
     19        * UIProcess/API/Cocoa/_WKUserInitiatedAction.h: Added.
     20        * UIProcess/API/Cocoa/_WKUserInitiatedAction.mm: Added.
     21        (-[_WKUserInitiatedAction consume]):
     22        (-[_WKUserInitiatedAction isConsumed]):
     23        (-[_WKUserInitiatedAction _apiObject]):
     24        * UIProcess/API/Cocoa/_WKUserInitiatedActionInternal.h: Added.
     25        Add new _WKUserInitiatedAction type wrapping API::UserInitiatedAction.
     26
     27        * Shared/NavigationActionData.cpp:
     28        (WebKit::NavigationActionData::encode):
     29        (WebKit::NavigationActionData::decode):
     30        * Shared/NavigationActionData.h:
     31        Store the userGestureTokenIdentifier (as determined from the WebProcess's map) rather
     32        than just a single bit. This allows us to track if a user gesture is used for multiple navigations.
     33
     34        * UIProcess/API/APINavigationAction.h:
     35        Add UserInitiatedAction member and re-implement isProcessingUserGesture in terms of it.
     36
     37        * UIProcess/API/C/WKPage.cpp:
     38        (WKPageSetPageUIClient):
     39        * UIProcess/Cocoa/UIDelegate.mm:
     40        (WebKit::UIDelegate::UIClient::createNewPage):
     41        * UIProcess/WebPageProxy.cpp:
     42        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     43        (WebKit::WebPageProxy::decidePolicyForNewWindowAction):
     44        Get the API::UserInitiatedAction from the WebProcessProxy (if it exists), and pass
     45        it along to the API::NavigationAction.
     46
     47        * UIProcess/WebProcessProxy.cpp:
     48        (WebKit::WebProcessProxy::shutDown):
     49        (WebKit::WebProcessProxy::userInitiatedActivity):
     50        (WebKit::WebProcessProxy::didDestroyUserGestureToken):
     51        * UIProcess/WebProcessProxy.h:
     52        Keep a map of active userInitiatedActivity objects.
     53
     54        * UIProcess/WebProcessProxy.messages.in:
     55        Add DidDestroyUserGestureToken message to manager API::UserInitiatedActivity lifetimes.
     56
     57        * WebKit2.xcodeproj/project.pbxproj:
     58        Add new files.
     59
     60        * WebProcess/Notifications/WebNotificationManager.cpp:
     61        (WebKit::WebNotificationManager::didClickNotification):
     62        * WebProcess/Plugins/PluginView.cpp:
     63        (WebKit::PluginView::performFrameLoadURLRequest):
     64        (WebKit::PluginView::evaluate):
     65        * WebProcess/WebCoreSupport/WebContextMenuClient.cpp:
     66        (WebKit::WebContextMenuClient::searchWithGoogle):
     67        * WebProcess/cocoa/WebPlaybackSessionManager.mm:
     68        (WebKit::WebPlaybackSessionManager::play):
     69        (WebKit::WebPlaybackSessionManager::pause):
     70        (WebKit::WebPlaybackSessionManager::togglePlayState):
     71        (WebKit::WebPlaybackSessionManager::beginScrubbing):
     72        (WebKit::WebPlaybackSessionManager::endScrubbing):
     73        (WebKit::WebPlaybackSessionManager::seekToTime):
     74        (WebKit::WebPlaybackSessionManager::fastSeek):
     75        (WebKit::WebPlaybackSessionManager::beginScanningForward):
     76        (WebKit::WebPlaybackSessionManager::beginScanningBackward):
     77        (WebKit::WebPlaybackSessionManager::endScanning):
     78        (WebKit::WebPlaybackSessionManager::selectAudioMediaOption):
     79        (WebKit::WebPlaybackSessionManager::selectLegibleMediaOption):
     80        Update for new UserGestureIndicator interface.
     81
     82        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     83        (WebKit::WebChromeClient::createWindow):
     84        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     85        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction):
     86        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
     87        Get an identifier for the UserGestureToken from the WebProcess singleton
     88        to pass to the WebProcess.
     89
     90        * WebProcess/WebProcess.cpp:
     91        (WebKit::nextUserGestureTokenIdentifier):
     92        (WebKit::WebProcess::userGestureTokenIdentifier):
     93        (WebKit::WebProcess::userGestureTokenDestroyed):
     94        * WebProcess/WebProcess.h:
     95        Track UserGestureToken lifetimes utilizing the destructionObserver mechanism
     96        off the tokens to indicate destruction. When destroyed, notify the UIProcess
     97        to avoid leaks.
     98
    1992016-07-17  Ryosuke Niwa  <rniwa@webkit.org>
    2100
  • trunk/Source/WebKit2/Shared/API/APIObject.h

    r199700 r203338  
    151151        UserContentExtensionStore,
    152152        UserContentWorld,
     153        UserInitiatedAction,
    153154        UserMediaPermissionCheck,
    154155        UserMediaPermissionRequest,
  • trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm

    r202793 r203338  
    7272#import "_WKUserContentFilterInternal.h"
    7373#import "_WKUserContentWorldInternal.h"
     74#import "_WKUserInitiatedActionInternal.h"
    7475#import "_WKUserStyleSheetInternal.h"
    7576#import "_WKVisitedLinkStoreInternal.h"
     
    232233        break;
    233234
     235    case Type::UserInitiatedAction:
     236        wrapper = [_WKUserInitiatedAction alloc];
     237        break;
     238
    234239    case Type::UserScript:
    235240        wrapper = [WKUserScript alloc];
  • trunk/Source/WebKit2/Shared/NavigationActionData.cpp

    r203085 r203338  
    4141    encoder.encodeEnum(mouseButton);
    4242    encoder.encodeEnum(syntheticClickType);
    43     encoder << isProcessingUserGesture;
     43    encoder << userGestureTokenIdentifier;
    4444    encoder << canHandleRequest;
    4545    encoder.encodeEnum(shouldOpenExternalURLsPolicy);
     
    5757    if (!decoder.decodeEnum(result.syntheticClickType))
    5858        return false;
    59     if (!decoder.decode(result.isProcessingUserGesture))
     59    if (!decoder.decode(result.userGestureTokenIdentifier))
    6060        return false;
    6161    if (!decoder.decode(result.canHandleRequest))
  • trunk/Source/WebKit2/Shared/NavigationActionData.h

    r203085 r203338  
    4545    WebMouseEvent::Button mouseButton { WebMouseEvent::NoButton };
    4646    WebMouseEvent::SyntheticClickType syntheticClickType { WebMouseEvent::NoTap };
    47     bool isProcessingUserGesture { false };
     47    uint64_t userGestureTokenIdentifier;
    4848    bool canHandleRequest { false };
    4949    WebCore::ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy { WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow };
  • trunk/Source/WebKit2/UIProcess/API/APINavigationAction.h

    r203085 r203338  
    2929#include "APIFrameInfo.h"
    3030#include "APIObject.h"
     31#include "APIUserInitiatedAction.h"
    3132#include "NavigationActionData.h"
    3233#include <WebCore/ResourceRequest.h>
     
    3536namespace API {
    3637
    37 class FrameInfo;
    38 
    3938class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction> {
    4039public:
    41     static Ref<NavigationAction> create(const WebKit::NavigationActionData& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WebCore::ResourceRequest& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks)
     40    static Ref<NavigationAction> create(const WebKit::NavigationActionData& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WebCore::ResourceRequest& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction> userInitiatedAction)
    4241    {
    43         return adoptRef(*new NavigationAction(navigationActionData, sourceFrame, targetFrame, request, originalURL, shouldOpenAppLinks));
     42        return adoptRef(*new NavigationAction(navigationActionData, sourceFrame, targetFrame, request, originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction)));
    4443    }
    4544
    46     NavigationAction(const WebKit::NavigationActionData& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WebCore::ResourceRequest& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks)
     45    NavigationAction(const WebKit::NavigationActionData& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WebCore::ResourceRequest& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction> userInitiatedAction)
    4746        : m_sourceFrame(sourceFrame)
    4847        , m_targetFrame(targetFrame)
     
    5049        , m_originalURL(originalURL)
    5150        , m_shouldOpenAppLinks(shouldOpenAppLinks)
     51        , m_userInitiatedAction(WTFMove(userInitiatedAction))
    5252        , m_navigationActionData(navigationActionData)
    5353    {
     
    6464    WebKit::WebMouseEvent::Button mouseButton() const { return m_navigationActionData.mouseButton; }
    6565    WebKit::WebMouseEvent::SyntheticClickType syntheticClickType() const { return m_navigationActionData.syntheticClickType; }
    66     bool isProcessingUserGesture() const { return m_navigationActionData.isProcessingUserGesture; }
    6766    bool canHandleRequest() const { return m_navigationActionData.canHandleRequest; }
    6867    bool shouldOpenExternalSchemes() const { return m_navigationActionData.shouldOpenExternalURLsPolicy == WebCore::ShouldOpenExternalURLsPolicy::ShouldAllow || m_navigationActionData.shouldOpenExternalURLsPolicy == WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes; }
    6968    bool shouldOpenAppLinks() const { return m_shouldOpenAppLinks && m_navigationActionData.shouldOpenExternalURLsPolicy == WebCore::ShouldOpenExternalURLsPolicy::ShouldAllow; }
    7069    bool shouldPerformDownload() const { return !m_navigationActionData.downloadAttribute.isNull(); }
     70
     71    bool isProcessingUserGesture() const { return m_userInitiatedAction; }
     72    UserInitiatedAction* userInitiatedAction() const { return m_userInitiatedAction.get(); }
    7173
    7274private:
     
    7981    bool m_shouldOpenAppLinks;
    8082
     83    RefPtr<UserInitiatedAction> m_userInitiatedAction;
     84
    8185    WebKit::NavigationActionData m_navigationActionData;
    8286};
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r203075 r203338  
    16981698                auto sourceFrameInfo = API::FrameInfo::create(*initiatingFrame, securityOriginData.securityOrigin());
    16991699
     1700                auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    17001701                bool shouldOpenAppLinks = !hostsAreEqual(WebCore::URL(WebCore::ParsedURLString, initiatingFrame->url()), resourceRequest.url());
    1701                 auto apiNavigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.ptr(), nullptr, resourceRequest, WebCore::URL(), shouldOpenAppLinks);
     1702                auto apiNavigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.ptr(), nullptr, resourceRequest, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);
    17021703
    17031704                auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures);
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationAction.mm

    r203089 r203338  
    3131#import "NavigationActionData.h"
    3232#import "WKFrameInfoInternal.h"
     33#import "_WKUserInitiatedActionInternal.h"
    3334#import <wtf/RetainPtr.h>
    3435
     
    219220}
    220221
     222- (_WKUserInitiatedAction *)_userInitiatedAction
     223{
     224    auto userInitiatedAction = _navigationAction->userInitiatedAction();
     225    if (userInitiatedAction)
     226        return wrapper(*userInitiatedAction);
     227    return nil;
     228}
     229
    221230@end
    222231
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationActionPrivate.h

    r203086 r203338  
    2828#if WK_API_ENABLED
    2929
     30@class _WKUserInitiatedAction;
     31
    3032#if TARGET_OS_IPHONE
    3133typedef NS_ENUM(NSInteger, WKSyntheticClickType) {
     
    4648@property (nonatomic, readonly) BOOL _shouldOpenExternalURLs WK_API_DEPRECATED("use _shouldOpenExternalSchemes and _shouldOpenAppLinks", macosx(10.11, 10.11), ios(9.0, 9.0));
    4749
     50@property (nonatomic, readonly) _WKUserInitiatedAction *_userInitiatedAction WK_API_AVAILABLE(macosx(10.12), ios(10.0));
     51
    4852#if TARGET_OS_IPHONE
    4953@property (nonatomic, readonly) WKSyntheticClickType _syntheticClickType WK_API_AVAILABLE(ios(10.0));
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNavigationActionPrivate.h

    r170702 r203338  
    3030        , mouseButton(toWebKitMouseButton(navigationActionData.mouseButton))
    3131        , modifiers(toGdkModifiers(navigationActionData.modifiers))
    32         , isUserGesture(navigationActionData.isProcessingUserGesture)
     32        , isUserGesture(navigationActionData.userGestureTokenIdentifier)
    3333        , request(uriRequest)
    3434    {
  • trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm

    r202889 r203338  
    3535#import "WKOpenPanelParametersInternal.h"
    3636#import "WKSecurityOriginInternal.h"
     37#import "WKUIDelegatePrivate.h"
    3738#import "WKWebViewConfigurationInternal.h"
    3839#import "WKWebViewInternal.h"
    3940#import "WKWindowFeaturesInternal.h"
    40 #import "WKUIDelegatePrivate.h"
    4141#import "WebOpenPanelResultListenerProxy.h"
     42#import "WebProcessProxy.h"
    4243#import "_WKContextMenuElementInfo.h"
    4344#import "_WKFrameHandleInternal.h"
     
    148149}
    149150
    150 PassRefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy* initiatingFrame, const WebCore::SecurityOriginData& securityOriginData, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData)
     151PassRefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy* page, WebKit::WebFrameProxy* initiatingFrame, const WebCore::SecurityOriginData& securityOriginData, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData)
    151152{
    152153    if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures)
     
    162163    auto sourceFrameInfo = API::FrameInfo::create(*initiatingFrame, securityOriginData.securityOrigin());
    163164
     165    auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    164166    bool shouldOpenAppLinks = !hostsAreEqual(WebCore::URL(WebCore::ParsedURLString, initiatingFrame->url()), request.url());
    165     auto apiNavigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.ptr(), nullptr, request, WebCore::URL(), shouldOpenAppLinks);
     167    auto apiNavigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.ptr(), nullptr, request, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);
    166168
    167169    auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r203312 r203338  
    35893589            sourceFrameInfo = API::FrameInfo::create(*originatingFrame, originatingFrameSecurityOrigin.securityOrigin());
    35903590
     3591        auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    35913592        bool shouldOpenAppLinks = !m_shouldSuppressAppLinksInNextNavigationPolicyDecision && (!destinationFrameInfo || destinationFrameInfo->isMainFrame()) && !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url());
    35923593
    3593         auto navigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.get(), destinationFrameInfo.get(), request, originalRequest.url(), shouldOpenAppLinks);
     3594        auto navigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.get(), destinationFrameInfo.get(), request, originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
    35943595
    35953596        m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());
     
    36233624            sourceFrameInfo = API::FrameInfo::create(*frame, frameSecurityOrigin.securityOrigin());
    36243625
     3626        auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    36253627        bool shouldOpenAppLinks = !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url());
    3626         auto navigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.get(), nullptr, request, request.url(), shouldOpenAppLinks);
     3628        auto navigationAction = API::NavigationAction::create(navigationActionData, sourceFrameInfo.get(), nullptr, request, request.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
    36273629
    36283630        m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp

    r203003 r203338  
    210210    m_webUserContentControllerProxies.clear();
    211211
     212    m_userInitiatedActionMap.clear();
     213
    212214    m_processPool->disconnectProcess(this);
    213215}
     
    664666    }
    665667    return result;
     668}
     669
     670RefPtr<API::UserInitiatedAction> WebProcessProxy::userInitiatedActivity(uint64_t identifier)
     671{
     672    if (!UserInitiatedActionMap::isValidKey(identifier) || !identifier)
     673        return nullptr;
     674
     675    auto result = m_userInitiatedActionMap.ensure(identifier, [] { return API::UserInitiatedAction::create(); });
     676    return result.iterator->value;
     677}
     678
     679void WebProcessProxy::didDestroyUserGestureToken(uint64_t identifier)
     680{
     681    ASSERT(UserInitiatedActionMap::isValidKey(identifier));
     682    m_userInitiatedActionMap.remove(identifier);
    666683}
    667684
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r203003 r203338  
    2727
    2828#include "APISession.h"
     29#include "APIUserInitiatedAction.h"
    2930#include "ChildProcessProxy.h"
    3031#include "CustomProtocolManagerProxy.h"
     
    6869    typedef HashMap<uint64_t, RefPtr<WebFrameProxy>> WebFrameProxyMap;
    6970    typedef HashMap<uint64_t, WebPageProxy*> WebPageProxyMap;
     71    typedef HashMap<uint64_t, RefPtr<API::UserInitiatedAction>> UserInitiatedActionMap;
    7072
    7173    static Ref<WebProcessProxy> create(WebProcessPool&);
     
    9597
    9698    WebBackForwardListItem* webBackForwardItem(uint64_t itemID) const;
     99    RefPtr<API::UserInitiatedAction> userInitiatedActivity(uint64_t);
    97100
    98101    ResponsivenessTimer& responsivenessTimer() { return m_responsivenessTimer; }
     
    168171    void addBackForwardItem(uint64_t itemID, uint64_t pageID, const PageState&);
    169172    void didDestroyFrame(uint64_t);
    170    
     173    void didDestroyUserGestureToken(uint64_t);
     174
    171175    void shouldTerminate(bool& shouldTerminate);
    172176
     
    235239    WebFrameProxyMap m_frameMap;
    236240    WebBackForwardListItemMap m_backForwardListItemMap;
     241    UserInitiatedActionMap m_userInitiatedActionMap;
    237242
    238243    HashSet<VisitedLinkStore*> m_visitedLinkStores;
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in

    r192702 r203338  
    2424    AddBackForwardItem(uint64_t itemID, uint64_t pageID, struct WebKit::PageState pageState)
    2525    DidDestroyFrame(uint64_t frameID)
     26
     27    DidDestroyUserGestureToken(uint64_t userGestureTokenID)
    2628
    2729    ShouldTerminate() -> (bool shouldTerminate)
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r202930 r203338  
    11381138                7CB16FF31724BA2F007A0A95 /* com.microsoft.SilverlightPlugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 7CB16FE61724B9B5007A0A95 /* com.microsoft.SilverlightPlugin.sb */; };
    11391139                7CB16FF41724BA30007A0A95 /* com.oracle.java.JavaAppletPlugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 7CB16FE71724B9B5007A0A95 /* com.oracle.java.JavaAppletPlugin.sb */; };
     1140                7CB365AA1D31DB70007158CA /* _WKUserInitiatedAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CB365A81D31DB70007158CA /* _WKUserInitiatedAction.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1141                7CB365AB1D31DB70007158CA /* _WKUserInitiatedAction.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CB365A91D31DB70007158CA /* _WKUserInitiatedAction.mm */; };
     1142                7CB365AD1D31DC10007158CA /* _WKUserInitiatedActionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CB365AC1D31DC10007158CA /* _WKUserInitiatedActionInternal.h */; };
     1143                7CB365B11D31DD1E007158CA /* APIUserInitiatedAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CB365AF1D31DD1E007158CA /* APIUserInitiatedAction.h */; };
    11401144                7CBB811C1AA0F8B1006B1942 /* InjectedBundleFileHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CBB811A1AA0F8B1006B1942 /* InjectedBundleFileHandle.cpp */; };
    11411145                7CBB811D1AA0F8B1006B1942 /* InjectedBundleFileHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CBB811B1AA0F8B1006B1942 /* InjectedBundleFileHandle.h */; };
     
    32013205                7CB16FE61724B9B5007A0A95 /* com.microsoft.SilverlightPlugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.microsoft.SilverlightPlugin.sb; sourceTree = "<group>"; };
    32023206                7CB16FE71724B9B5007A0A95 /* com.oracle.java.JavaAppletPlugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.oracle.java.JavaAppletPlugin.sb; sourceTree = "<group>"; };
     3207                7CB365A81D31DB70007158CA /* _WKUserInitiatedAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKUserInitiatedAction.h; sourceTree = "<group>"; };
     3208                7CB365A91D31DB70007158CA /* _WKUserInitiatedAction.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKUserInitiatedAction.mm; sourceTree = "<group>"; };
     3209                7CB365AC1D31DC10007158CA /* _WKUserInitiatedActionInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKUserInitiatedActionInternal.h; sourceTree = "<group>"; };
     3210                7CB365AF1D31DD1E007158CA /* APIUserInitiatedAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIUserInitiatedAction.h; sourceTree = "<group>"; };
    32033211                7CBB811A1AA0F8B1006B1942 /* InjectedBundleFileHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleFileHandle.cpp; sourceTree = "<group>"; };
    32043212                7CBB811B1AA0F8B1006B1942 /* InjectedBundleFileHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundleFileHandle.h; sourceTree = "<group>"; };
     
    51355143                                7C882DF41C7E995E006BF731 /* _WKUserContentWorld.mm */,
    51365144                                7C882DF51C7E995E006BF731 /* _WKUserContentWorldInternal.h */,
     5145                                7CB365A81D31DB70007158CA /* _WKUserInitiatedAction.h */,
     5146                                7CB365A91D31DB70007158CA /* _WKUserInitiatedAction.mm */,
     5147                                7CB365AC1D31DC10007158CA /* _WKUserInitiatedActionInternal.h */,
    51375148                                2D87861B1BDB54BF00D02ABB /* _WKUserStyleSheet.h */,
    51385149                                2D87861C1BDB54BF00D02ABB /* _WKUserStyleSheet.mm */,
     
    61306141                                7C882DFB1C7E99A6006BF731 /* APIUserContentWorld.cpp */,
    61316142                                7C882DFC1C7E99A6006BF731 /* APIUserContentWorld.h */,
     6143                                7CB365AF1D31DD1E007158CA /* APIUserInitiatedAction.h */,
    61326144                                7C89D2A51A6789EA003A5FDE /* APIUserScript.cpp */,
    61336145                                7C89D2921A67122F003A5FDE /* APIUserScript.h */,
     
    76447656                                1A043B5E124D5E9D00FFBFB5 /* PluginProcessProxyMessages.h in Headers */,
    76457657                                1A043DC1124FF87500FFBFB5 /* PluginProxy.h in Headers */,
     7658                                7CB365AD1D31DC10007158CA /* _WKUserInitiatedActionInternal.h in Headers */,
    76467659                                1A8EFA711252B84100F7067F /* PluginProxyMessages.h in Headers */,
    76477660                                1A4A9F3312B844E2008FE984 /* PluginQuirks.h in Headers */,
     
    77867799                                BC032D7F10F4378D0058C15A /* WebFrameLoaderClient.h in Headers */,
    77877800                                9391F2CB121B67AD00EBF7E8 /* WebFrameNetworkingContext.h in Headers */,
     7801                                7CB365AA1D31DB70007158CA /* _WKUserInitiatedAction.h in Headers */,
    77887802                                BCB9F6A01123A84B00A137E0 /* WebFramePolicyListenerProxy.h in Headers */,
    77897803                                BC9B38A110F538BE00443A15 /* WebFrameProxy.h in Headers */,
     
    82168230                                1A4832CE1A9BC484008B4DFE /* WKWebsiteDataRecordInternal.h in Headers */,
    82178231                                1AA654D11B14F71400BF1D3E /* WKWebsiteDataRecordPrivate.h in Headers */,
     8232                                7CB365B11D31DD1E007158CA /* APIUserInitiatedAction.h in Headers */,
    82188233                                75A8D2C8187CCFAB00C39C9E /* WKWebsiteDataStore.h in Headers */,
    82198234                                75A8D2D6187D1C0E00C39C9E /* WKWebsiteDataStoreInternal.h in Headers */,
     
    93479362                                BC7B6207129A0A6700D174A4 /* WebPageGroup.cpp in Sources */,
    93489363                                BC7B625312A43C9600D174A4 /* WebPageGroupData.cpp in Sources */,
     9364                                7CB365AB1D31DB70007158CA /* _WKUserInitiatedAction.mm in Sources */,
    93499365                                BC7B621612A4219A00D174A4 /* WebPageGroupProxy.cpp in Sources */,
    93509366                                2D9EA3111A96D9EB002D2807 /* WebPageInjectedBundleClient.cpp in Sources */,
  • trunk/Source/WebKit2/WebProcess/Notifications/WebNotificationManager.cpp

    r160464 r203338  
    250250
    251251    // Indicate that this event is being dispatched in reaction to a user's interaction with a platform notification.
    252     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     252    UserGestureIndicator indicator(ProcessingUserGesture);
    253253    notification->dispatchClickEvent();
    254254#else
  • trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp

    r202611 r203338  
    12191219    }
    12201220
    1221     UserGestureIndicator gestureIndicator(request->allowPopups() ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     1221    UserGestureIndicator gestureIndicator(request->allowPopups() ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    12221222
    12231223    // First, try to find a target frame.
     
    15141514    NPRuntimeObjectMap::PluginProtector pluginProtector(&m_npRuntimeObjectMap);
    15151515
    1516     UserGestureIndicator gestureIndicator(allowPopups ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);
     1516    UserGestureIndicator gestureIndicator(allowPopups ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt);
    15171517    return m_npRuntimeObjectMap.evaluate(npObject, scriptString, result);
    15181518}
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r203312 r203338  
    225225#endif
    226226
     227    auto& webProcess = WebProcess::singleton();
     228
    227229    WebFrame* webFrame = WebFrame::fromCoreFrame(*frame);
    228230
     
    232234    navigationActionData.mouseButton = InjectedBundleNavigationAction::mouseButtonForNavigationAction(navigationAction);
    233235    navigationActionData.syntheticClickType = InjectedBundleNavigationAction::syntheticClickTypeForNavigationAction(navigationAction);
    234     navigationActionData.isProcessingUserGesture = navigationAction.processingUserGesture();
     236    navigationActionData.userGestureTokenIdentifier = webProcess.userGestureTokenIdentifier(navigationAction.userGestureToken());
    235237    navigationActionData.canHandleRequest = m_page->canHandleRequest(request.resourceRequest());
    236238    navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy();
     
    239241    uint64_t newPageID = 0;
    240242    WebPageCreationParameters parameters;
    241     auto& webProcess = WebProcess::singleton();
    242243    if (!webProcess.parentProcessConnection()->sendSync(Messages::WebPageProxy::CreateNewPage(webFrame->frameID(), SecurityOriginData::fromFrame(frame), request.resourceRequest(), windowFeatures, navigationActionData), Messages::WebPageProxy::CreateNewPage::Reply(newPageID, parameters), m_page->pageID()))
    243244        return nullptr;
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.cpp

    r192378 r203338  
    6767
    6868    if (Page* page = frame->page()) {
    69         UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     69        UserGestureIndicator indicator(ProcessingUserGesture);
    7070        page->mainFrame().loader().urlSelected(URL(ParsedURLString, url), String(), 0, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, ShouldOpenExternalURLsPolicy::ShouldNotAllow);
    7171    }
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r203085 r203338  
    728728    navigationActionData.mouseButton = action->mouseButton();
    729729    navigationActionData.syntheticClickType = action->syntheticClickType();
    730     navigationActionData.isProcessingUserGesture = navigationAction.processingUserGesture();
     730    navigationActionData.userGestureTokenIdentifier = WebProcess::singleton().userGestureTokenIdentifier(navigationAction.userGestureToken());
    731731    navigationActionData.canHandleRequest = webPage->canHandleRequest(request);
    732732    navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy();
     
    795795    navigationActionData.mouseButton = action->mouseButton();
    796796    navigationActionData.syntheticClickType = action->syntheticClickType();
    797     navigationActionData.isProcessingUserGesture = navigationAction.processingUserGesture();
     797    navigationActionData.userGestureTokenIdentifier = WebProcess::singleton().userGestureTokenIdentifier(navigationAction.userGestureToken());
    798798    navigationActionData.canHandleRequest = webPage->canHandleRequest(request);
    799799    navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy();
  • trunk/Source/WebKit2/WebProcess/WebProcess.cpp

    r203196 r203338  
    9898#include <WebCore/SecurityOrigin.h>
    9999#include <WebCore/Settings.h>
     100#include <WebCore/UserGestureIndicator.h>
    100101#include <unistd.h>
    101102#include <wtf/CurrentTime.h>
     
    718719
    719720    return result.iterator->value.get();
     721}
     722
     723static uint64_t nextUserGestureTokenIdentifier()
     724{
     725    static uint64_t identifier = 1;
     726    return identifier++;
     727}
     728
     729uint64_t WebProcess::userGestureTokenIdentifier(RefPtr<UserGestureToken> token)
     730{
     731    if (!token || !token->processingUserGesture())
     732        return 0;
     733
     734    auto result = m_userGestureTokens.ensure(token.get(), [] { return nextUserGestureTokenIdentifier(); });
     735    if (result.isNewEntry) {
     736        result.iterator->key->addDestructionObserver([] (UserGestureToken& tokenBeingDestroyed) {
     737            WebProcess::singleton().userGestureTokenDestroyed(tokenBeingDestroyed);
     738        });
     739    }
     740   
     741    return result.iterator->value;
     742}
     743
     744void WebProcess::userGestureTokenDestroyed(UserGestureToken& token)
     745{
     746    auto identifier = m_userGestureTokens.take(&token);
     747    parentProcessConnection()->send(Messages::WebProcessProxy::DidDestroyUserGestureToken(identifier), 0);
    720748}
    721749
  • trunk/Source/WebKit2/WebProcess/WebProcess.h

    r203196 r203338  
    6767class ResourceRequest;
    6868class SessionID;
     69class UserGestureToken;
    6970struct PluginInfo;
    7071struct SecurityOriginData;
     
    141142    WebPageGroupProxy* webPageGroup(const WebPageGroupData&);
    142143
     144    uint64_t userGestureTokenIdentifier(RefPtr<WebCore::UserGestureToken>);
     145    void userGestureTokenDestroyed(WebCore::UserGestureToken&);
     146
    143147#if PLATFORM(COCOA)
    144148    pid_t presenterApplicationPid() const { return m_presenterApplicationPid; }
     
    394398    unsigned m_pagesMarkingLayersAsVolatile { 0 };
    395399    bool m_suppressMemoryPressureHandler { false };
     400
     401    HashMap<WebCore::UserGestureToken *, uint64_t> m_userGestureTokens;
    396402};
    397403
  • trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm

    r202425 r203338  
    348348void WebPlaybackSessionManager::play(uint64_t contextId)
    349349{
    350     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     350    UserGestureIndicator indicator(ProcessingUserGesture);
    351351    ensureModel(contextId).play();
    352352}
     
    354354void WebPlaybackSessionManager::pause(uint64_t contextId)
    355355{
    356     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     356    UserGestureIndicator indicator(ProcessingUserGesture);
    357357    ensureModel(contextId).pause();
    358358}
     
    360360void WebPlaybackSessionManager::togglePlayState(uint64_t contextId)
    361361{
    362     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     362    UserGestureIndicator indicator(ProcessingUserGesture);
    363363    ensureModel(contextId).togglePlayState();
    364364}
     
    366366void WebPlaybackSessionManager::beginScrubbing(uint64_t contextId)
    367367{
    368     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     368    UserGestureIndicator indicator(ProcessingUserGesture);
    369369    ensureModel(contextId).beginScrubbing();
    370370}
     
    372372void WebPlaybackSessionManager::endScrubbing(uint64_t contextId)
    373373{
    374     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     374    UserGestureIndicator indicator(ProcessingUserGesture);
    375375    ensureModel(contextId).endScrubbing();
    376376}
     
    378378void WebPlaybackSessionManager::seekToTime(uint64_t contextId, double time)
    379379{
    380     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     380    UserGestureIndicator indicator(ProcessingUserGesture);
    381381    ensureModel(contextId).seekToTime(time);
    382382}
     
    384384void WebPlaybackSessionManager::fastSeek(uint64_t contextId, double time)
    385385{
    386     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     386    UserGestureIndicator indicator(ProcessingUserGesture);
    387387    ensureModel(contextId).fastSeek(time);
    388388}
     
    390390void WebPlaybackSessionManager::beginScanningForward(uint64_t contextId)
    391391{
    392     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     392    UserGestureIndicator indicator(ProcessingUserGesture);
    393393    ensureModel(contextId).beginScanningForward();
    394394}
     
    396396void WebPlaybackSessionManager::beginScanningBackward(uint64_t contextId)
    397397{
    398     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     398    UserGestureIndicator indicator(ProcessingUserGesture);
    399399    ensureModel(contextId).beginScanningBackward();
    400400}
     
    402402void WebPlaybackSessionManager::endScanning(uint64_t contextId)
    403403{
    404     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     404    UserGestureIndicator indicator(ProcessingUserGesture);
    405405    ensureModel(contextId).endScanning();
    406406}
     
    408408void WebPlaybackSessionManager::selectAudioMediaOption(uint64_t contextId, uint64_t index)
    409409{
    410     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     410    UserGestureIndicator indicator(ProcessingUserGesture);
    411411    ensureModel(contextId).selectAudioMediaOption(index);
    412412}
     
    414414void WebPlaybackSessionManager::selectLegibleMediaOption(uint64_t contextId, uint64_t index)
    415415{
    416     UserGestureIndicator indicator(DefinitelyProcessingUserGesture);
     416    UserGestureIndicator indicator(ProcessingUserGesture);
    417417    ensureModel(contextId).selectLegibleMediaOption(index);
    418418}
  • trunk/Tools/ChangeLog

    r203332 r203338  
     12016-07-17  Sam Weinig  <sam@webkit.org>
     2
     3        [WebKit API] Add SPI to track multiple navigations caused by a single user gesture
     4        <rdar://problem/26554137>
     5        https://bugs.webkit.org/show_bug.cgi?id=159856
     6
     7        Reviewed by Dan Bernstein.
     8
     9        * MiniBrowser/mac/WK2BrowserWindowController.m:
     10        (-[WK2BrowserWindowController webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:]):
     11        Add basic window.open implementation.
     12
     13        (-[WK2BrowserWindowController webView:decidePolicyForNavigationAction:decisionHandler:]):
     14        Add basic navigation policy implementation which implements a rule where a user gesture is only allowed
     15        to open a single non-web URL, all others are dropped.
     16
     17        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     18        * TestWebKitAPI/Tests/WebKit2Cocoa/UserInitiatedActionInNavigationAction.mm: Added.
     19        * TestWebKitAPI/Tests/WebKit2Cocoa/open-multiple-external-url.html: Added.
     20        Add API for the new SPI.
     21
    1222016-07-17  Yusuke Suzuki  <utatane.tea@gmail.com>
    223
  • trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m

    r202640 r203338  
    3131#import "SettingsController.h"
    3232#import <WebKit/WKFrameInfo.h>
     33#import <WebKit/WKNavigationActionPrivate.h>
    3334#import <WebKit/WKNavigationDelegate.h>
    3435#import <WebKit/WKPreferencesPrivate.h>
     
    3839#import <WebKit/WKWebsiteDataStorePrivate.h>
    3940#import <WebKit/WebNSURLExtras.h>
     41#import <WebKit/_WKUserInitiatedAction.h>
    4042
    4143static void* keyValueObservingContext = &keyValueObservingContext;
     
    403405}
    404406
     407- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
     408{
     409    WK2BrowserWindowController *controller = [[WK2BrowserWindowController alloc] initWithConfiguration:configuration];
     410    [controller awakeFromNib];
     411    [controller.window makeKeyAndOrderFront:self];
     412
     413    return controller->_webView;
     414}
     415
    405416- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
    406417{
     
    536547#pragma mark WKNavigationDelegate
    537548
     549- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
     550{
     551    LOG(@"decidePolicyForNavigationAction");
     552
     553    if (navigationAction._canHandleRequest) {
     554        decisionHandler(WKNavigationActionPolicyAllow);
     555        return;
     556    }
     557
     558    if (navigationAction._userInitiatedAction && !navigationAction._userInitiatedAction.isConsumed) {
     559        [navigationAction._userInitiatedAction consume];
     560        [[NSWorkspace sharedWorkspace] openURL:navigationAction.request.URL];
     561    }
     562
     563    decisionHandler(WKNavigationActionPolicyCancel);
     564}
     565
    538566- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
    539567{
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r203203 r203338  
    202202                7CB184C61AA3F2100066EDFD /* ContentExtensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CB184C41AA3F2100066EDFD /* ContentExtensions.cpp */; };
    203203                7CCB4DA91C83AE7300CC6918 /* PageGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCB4DA71C83AE7300CC6918 /* PageGroup.cpp */; };
     204                7CCB99211D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCB99201D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm */; };
     205                7CCB99231D3B4A46003922F6 /* open-multiple-external-url.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 7CCB99221D3B44E7003922F6 /* open-multiple-external-url.html */; };
    204206                7CCE7EA41A4119F300447C4C /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587FF13FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm */; };
    205207                7CCE7EA51A411A0800447C4C /* JavaScriptTestMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C081224013FC172400DC39AE /* JavaScriptTestMac.mm */; };
     
    487489                        dstSubfolderSpec = 7;
    488490                        files = (
     491                                7CCB99231D3B4A46003922F6 /* open-multiple-external-url.html in Copy Resources */,
    489492                                932AE53D1D371047005DFFAF /* focus-inputs.html in Copy Resources */,
    490493                                46C519E61D3563FD00DAA51A /* LocalStorageNullEntries.html in Copy Resources */,
     
    823826                7CC3E1FA197E234100BE6252 /* UserContentController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserContentController.mm; sourceTree = "<group>"; };
    824827                7CCB4DA71C83AE7300CC6918 /* PageGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageGroup.cpp; sourceTree = "<group>"; };
     828                7CCB99201D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserInitiatedActionInNavigationAction.mm; sourceTree = "<group>"; };
     829                7CCB99221D3B44E7003922F6 /* open-multiple-external-url.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "open-multiple-external-url.html"; sourceTree = "<group>"; };
    825830                7CCE7E8C1A41144E00447C4C /* libTestWebKitAPI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libTestWebKitAPI.a; sourceTree = BUILT_PRODUCTS_DIR; };
    826831                7CCE7EA31A4115CB00447C4C /* TestWebKitAPILibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = TestWebKitAPILibrary.xcconfig; sourceTree = "<group>"; };
     
    12191224                                7C882E041C80C624006BF731 /* UserContentWorldPlugIn.mm */,
    12201225                                7C882E051C80C624006BF731 /* UserContentWorldProtocol.h */,
     1226                                7CCB99201D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm */,
    12211227                                93E943F11CD3E87E00AC08C2 /* VideoControlsManager.mm */,
    12221228                                2D00065D1C1F58940088E6A7 /* WKPDFViewResizeCrash.mm */,
     
    12991305                        isa = PBXGroup;
    13001306                        children = (
    1301                                 93575C551D30366E000D604D /* focus-inputs.html */,
    13021307                                93CFA8661CEB9DE1000565A8 /* autofocused-text-input.html */,
    1303                                 9984FACD1CFFB038008D198C /* editable-body.html */,
    1304                                 CDE195B21CFE0ADE0053D256 /* FullscreenTopContentInset.html */,
    13051308                                A16F66B91C40EA2000BD4D24 /* ContentFiltering.html */,
    13061309                                5714ECB81CA8B58800051AC8 /* DownloadRequestOriginalURL.html */,
    13071310                                5714ECBC1CA8C21800051AC8 /* DownloadRequestOriginalURL2.html */,
    13081311                                5714ECBA1CA8BFD100051AC8 /* DownloadRequestOriginalURLFrame.html */,
    1309                                 51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */,
     1312                                9984FACD1CFFB038008D198C /* editable-body.html */,
     1313                                93575C551D30366E000D604D /* focus-inputs.html */,
     1314                                CDE195B21CFE0ADE0053D256 /* FullscreenTopContentInset.html */,
    13101315                                510477761D298E57009747EB /* IDBDeleteRecovery.html */,
    13111316                                5104776F1D298D85009747EB /* IDBDeleteRecovery.sqlite3 */,
    13121317                                510477701D298D85009747EB /* IDBDeleteRecovery.sqlite3-shm */,
    13131318                                510477711D298D85009747EB /* IDBDeleteRecovery.sqlite3-wal */,
     1319                                51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */,
    13141320                                51BCEE4C1C84F52C0042C82E /* IndexedDBMultiProcess-1.html */,
    13151321                                51BCEE4D1C84F52C0042C82E /* IndexedDBMultiProcess-2.html */,
     
    13171323                                51B1EE941C80FADD0064FB98 /* IndexedDBPersistence-1.html */,
    13181324                                51B1EE951C80FADD0064FB98 /* IndexedDBPersistence-2.html */,
     1325                                936F727E1CD7D9D00068A0FB /* large-video-with-audio.html */,
     1326                                936F727F1CD7D9D00068A0FB /* large-video-with-audio.mp4 */,
     1327                                93625D261CD973AF006DC1F1 /* large-video-without-audio.html */,
    13191328                                51E6A8951D2F1C7700C004B6 /* LocalStorageClear.html */,
    13201329                                46C519E21D35629600DAA51A /* LocalStorageNullEntries.html */,
    13211330                                46C519E31D35629600DAA51A /* LocalStorageNullEntries.localstorage */,
    13221331                                46C519E41D35629600DAA51A /* LocalStorageNullEntries.localstorage-shm */,
     1332                                7CCB99221D3B44E7003922F6 /* open-multiple-external-url.html */,
    13231333                                51714EB21CF8C761004723C4 /* WebProcessKillIDBCleanup-1.html */,
    13241334                                51714EB31CF8C761004723C4 /* WebProcessKillIDBCleanup-2.html */,
    1325                                 936F727E1CD7D9D00068A0FB /* large-video-with-audio.html */,
    1326                                 936F727F1CD7D9D00068A0FB /* large-video-with-audio.mp4 */,
    1327                                 93625D261CD973AF006DC1F1 /* large-video-without-audio.html */,
    13281335                        );
    13291336                        name = Resources;
     
    19721979                        targets = (
    19731980                                7C83E02B1D0A5E1000FEBCF3 /* All */,
     1981                                7CCE7E8B1A41144E00447C4C /* TestWebKitAPILibrary */,
     1982                                7C83DE951D0A590C00FEBCF3 /* TestWTFLibrary */,
    19741983                                8DD76F960486AA7600D96B5E /* TestWebKitAPI */,
    1975                                 7CCE7E8B1A41144E00447C4C /* TestWebKitAPILibrary */,
    19761984                                7C83DF951D0A5AE400FEBCF3 /* TestWTF */,
    1977                                 7C83DE951D0A590C00FEBCF3 /* TestWTFLibrary */,
    19781985                                BC57597F126E74AF006F0F12 /* InjectedBundleTestWebKitAPI */,
    19791986                                A13EBB481B87339E00097110 /* WebProcessPlugIn */,
     
    22332240                                7CCE7F171A411AE600447C4C /* UserMedia.cpp in Sources */,
    22342241                                7C83E0C41D0A654200FEBCF3 /* RequiresUserActionForPlayback.mm in Sources */,
     2242                                7CCB99211D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm in Sources */,
    22352243                                7CCE7F181A411AE600447C4C /* UserMessage.cpp in Sources */,
    22362244                                0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.