Changeset 203338 in webkit
- Timestamp:
- Jul 17, 2016, 6:07:11 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 51 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r203337 r203338 1 2016-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 1 91 2016-07-17 Ryosuke Niwa <rniwa@webkit.org> 2 92 -
trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp
r203324 r203338 1071 1071 void AccessibilityNodeObject::increment() 1072 1072 { 1073 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, document());1073 UserGestureIndicator gestureIndicator(ProcessingUserGesture, document()); 1074 1074 alterSliderValue(true); 1075 1075 } … … 1077 1077 void AccessibilityNodeObject::decrement() 1078 1078 { 1079 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, document());1079 UserGestureIndicator gestureIndicator(ProcessingUserGesture, document()); 1080 1080 alterSliderValue(false); 1081 1081 } -
trunk/Source/WebCore/accessibility/AccessibilityObject.cpp
r203337 r203338 921 921 pressElement = hitTestElement; 922 922 923 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, document);923 UserGestureIndicator gestureIndicator(ProcessingUserGesture, document); 924 924 925 925 bool dispatchedTouchEvent = dispatchTouchEvent(); -
trunk/Source/WebCore/bindings/js/ScriptController.cpp
r201237 r203338 498 498 JSValue ScriptController::executeScriptInWorld(DOMWrapperWorld& world, const String& script, bool forceUserGesture) 499 499 { 500 UserGestureIndicator gestureIndicator(forceUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);500 UserGestureIndicator gestureIndicator(forceUserGesture ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 501 501 ScriptSourceCode sourceCode(script, m_frame.document()->url()); 502 502 … … 524 524 JSValue ScriptController::executeScript(const String& script, bool forceUserGesture, ExceptionDetails* exceptionDetails) 525 525 { 526 UserGestureIndicator gestureIndicator(forceUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);526 UserGestureIndicator gestureIndicator(forceUserGesture ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 527 527 return executeScript(ScriptSourceCode(script, m_frame.document()->url()), exceptionDetails); 528 528 } -
trunk/Source/WebCore/dom/UserGestureIndicator.cpp
r187694 r203338 29 29 #include "Document.h" 30 30 #include <wtf/MainThread.h> 31 #include <wtf/NeverDestroyed.h> 31 32 32 33 namespace WebCore { 33 34 34 static bool isDefinite(ProcessingUserGestureState state)35 static RefPtr<UserGestureToken>& currentToken() 35 36 { 36 return state == DefinitelyProcessingUserGesture || state == DefinitelyNotProcessingUserGesture || state == DefinitelyProcessingPotentialUserGesture; 37 static NeverDestroyed<RefPtr<UserGestureToken>> token; 38 return token; 37 39 } 38 40 39 ProcessingUserGestureState UserGestureIndicator::s_state = DefinitelyNotProcessingUserGesture; 41 UserGestureToken::~UserGestureToken() 42 { 43 for (auto& observer : m_destructionObservers) 44 observer(*this); 45 } 40 46 41 UserGestureIndicator::UserGestureIndicator( ProcessingUserGestureStatestate, Document* document)42 : m_previous State(s_state)47 UserGestureIndicator::UserGestureIndicator(Optional<ProcessingUserGestureState> state, Document* document) 48 : m_previousToken(currentToken()) 43 49 { 44 50 // Silently ignore UserGestureIndicators on non main threads. 45 51 if (!isMainThread()) 46 52 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));51 53 52 if (document && s_state == DefinitelyProcessingUserGesture) 54 if (state) 55 currentToken() = UserGestureToken::create(state.value()); 56 57 if (document && currentToken()->processingUserGesture()) 53 58 document->topDocument().updateLastHandledUserGestureTimestamp(); 59 } 60 61 UserGestureIndicator::UserGestureIndicator(RefPtr<UserGestureToken> token) 62 : m_previousToken(currentToken()) 63 { 64 if (!isMainThread()) 65 return; 66 67 if (token) 68 currentToken() = token; 54 69 } 55 70 … … 58 73 if (!isMainThread()) 59 74 return; 60 s_state = m_previousState; 61 ASSERT(isDefinite(s_state)); 75 76 currentToken() = m_previousToken; 77 } 78 79 RefPtr<UserGestureToken> UserGestureIndicator::currentUserGesture() 80 { 81 if (!isMainThread()) 82 return nullptr; 83 84 return currentToken(); 62 85 } 63 86 64 87 bool UserGestureIndicator::processingUserGesture() 65 88 { 66 return isMainThread() ? s_state == DefinitelyProcessingUserGesture : false; 89 if (!isMainThread()) 90 return false; 91 92 return currentToken() ? currentToken()->processingUserGesture() : false; 67 93 } 68 94 … … 72 98 return false; 73 99 74 return s_state == DefinitelyProcessingUserGesture || s_state == DefinitelyProcessingPotentialUserGesture;100 return currentToken() ? currentToken()->processingUserGestureForMedia() : false; 75 101 } 76 102 -
trunk/Source/WebCore/dom/UserGestureIndicator.h
r200908 r203338 24 24 */ 25 25 26 #ifndef UserGestureIndicator_h 27 #define UserGestureIndicator_h 26 #pragma once 28 27 28 #include <wtf/Function.h> 29 29 #include <wtf/Noncopyable.h> 30 #include <wtf/Optional.h> 31 #include <wtf/RefCounted.h> 32 #include <wtf/RefPtr.h> 33 #include <wtf/Vector.h> 30 34 31 35 namespace WebCore { … … 34 38 35 39 enum ProcessingUserGestureState { 36 DefinitelyProcessingUserGesture, 37 DefinitelyProcessingPotentialUserGesture, 38 PossiblyProcessingUserGesture, 39 DefinitelyNotProcessingUserGesture 40 ProcessingUserGesture, 41 ProcessingPotentialUserGesture, 42 NotProcessingUserGesture 43 }; 44 45 class UserGestureToken : public RefCounted<UserGestureToken> { 46 public: 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 63 private: 64 UserGestureToken(ProcessingUserGestureState state) 65 : m_state(state) 66 { 67 } 68 69 ProcessingUserGestureState m_state = NotProcessingUserGesture; 70 Vector<Function<void (UserGestureToken&)>> m_destructionObservers; 40 71 }; 41 72 … … 43 74 WTF_MAKE_NONCOPYABLE(UserGestureIndicator); 44 75 public: 76 WEBCORE_EXPORT static RefPtr<UserGestureToken> currentUserGesture(); 77 45 78 WEBCORE_EXPORT static bool processingUserGesture(); 46 static bool processingUserGestureForMedia();79 WEBCORE_EXPORT static bool processingUserGestureForMedia(); 47 80 48 81 // 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>); 50 84 WEBCORE_EXPORT ~UserGestureIndicator(); 51 85 52 86 private: 53 WEBCORE_EXPORT static ProcessingUserGestureState s_state; 54 ProcessingUserGestureState m_previousState; 87 RefPtr<UserGestureToken> m_previousToken; 55 88 }; 56 89 57 90 } 58 59 #endif -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r203337 r203338 6832 6832 LOG(Media, "HTMLMediaElement::didReceiveRemoteControlCommand(%p) - %i", this, static_cast<int>(command)); 6833 6833 6834 UserGestureIndicator remoteControlUserGesture( DefinitelyProcessingUserGesture, &document());6834 UserGestureIndicator remoteControlUserGesture(ProcessingUserGesture, &document()); 6835 6835 switch (command) { 6836 6836 case PlatformMediaSession::PlayCommand: -
trunk/Source/WebCore/inspector/InspectorFrontendClientLocal.cpp
r200895 r203338 222 222 void InspectorFrontendClientLocal::openInNewTab(const String& url) 223 223 { 224 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);224 UserGestureIndicator indicator(ProcessingUserGesture); 225 225 Frame& mainFrame = m_inspectedPageController->inspectedPage().mainFrame(); 226 226 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 95 95 { 96 96 if (m_frontendHost) { 97 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture);97 UserGestureIndicator gestureIndicator(ProcessingUserGesture); 98 98 int itemNumber = action - ContextMenuItemBaseCustomTag; 99 99 -
trunk/Source/WebCore/inspector/InspectorPageAgent.cpp
r203324 r203338 426 426 void InspectorPageAgent::navigate(ErrorString&, const String& url) 427 427 { 428 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);428 UserGestureIndicator indicator(ProcessingUserGesture); 429 429 Frame& frame = m_page.mainFrame(); 430 430 -
trunk/Source/WebCore/loader/NavigationAction.cpp
r198893 r203338 53 53 , m_type(type) 54 54 , m_event(event) 55 , m_ processingUserGesture(ScriptController::processingUserGesture())55 , m_userGestureToken(UserGestureIndicator::currentUserGesture()) 56 56 , m_shouldOpenExternalURLsPolicy(shouldOpenExternalURLsPolicy) 57 57 , m_downloadAttribute(downloadAttribute) -
trunk/Source/WebCore/loader/NavigationAction.h
r198893 r203338 34 34 #include "URL.h" 35 35 #include "ResourceRequest.h" 36 #include "UserGestureIndicator.h" 36 37 #include <wtf/Forward.h> 37 38 … … 64 65 const Event* event() const { return m_event.get(); } 65 66 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; } 67 69 68 70 ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy() const { return m_shouldOpenExternalURLsPolicy; } … … 74 76 NavigationType m_type { NavigationType::Other }; 75 77 RefPtr<Event> m_event; 76 bool m_processingUserGesture;78 RefPtr<UserGestureToken> m_userGestureToken; 77 79 ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow }; 78 80 AtomicString m_downloadAttribute; -
trunk/Source/WebCore/loader/NavigationScheduler.cpp
r203003 r203338 67 67 , m_wasDuringLoad(wasDuringLoad) 68 68 , m_isLocationChange(isLocationChange) 69 , m_ wasUserGesture(ScriptController::processingUserGesture())69 , m_userGestureToForward(UserGestureIndicator::currentUserGesture()) 70 70 { 71 71 } … … 83 83 bool wasDuringLoad() const { return m_wasDuringLoad; } 84 84 bool isLocationChange() const { return m_isLocationChange; } 85 bool wasUserGesture() const { return m_wasUserGesture; }85 RefPtr<UserGestureToken> userGestureToForward() const { return m_userGestureToForward; } 86 86 87 87 protected: 88 void clearUserGesture() { m_ wasUserGesture = false; }88 void clearUserGesture() { m_userGestureToForward = nullptr; } 89 89 90 90 ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow }; … … 96 96 bool m_wasDuringLoad; 97 97 bool m_isLocationChange; 98 bool m_wasUserGesture;98 RefPtr<UserGestureToken> m_userGestureToForward; 99 99 }; 100 100 … … 114 114 void fire(Frame& frame) override 115 115 { 116 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);116 UserGestureIndicator gestureIndicator(userGestureToForward()); 117 117 118 118 ResourceRequest resourceRequest(m_url, m_referrer, UseProtocolCachePolicy); … … 128 128 m_haveToldClient = true; 129 129 130 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);130 UserGestureIndicator gestureIndicator(userGestureToForward()); 131 131 frame.loader().clientRedirected(m_url, delay(), currentTime() + timer.nextFireInterval(), lockBackForwardList()); 132 132 } … … 172 172 void fire(Frame& frame) override 173 173 { 174 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);174 UserGestureIndicator gestureIndicator(userGestureToForward()); 175 175 bool refresh = equalIgnoringFragmentIdentifier(frame.document()->url(), url()); 176 176 ResourceRequest resourceRequest(url(), referrer(), refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy); … … 188 188 void fire(Frame& frame) override 189 189 { 190 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);190 UserGestureIndicator gestureIndicator(userGestureToForward()); 191 191 192 192 ResourceRequest resourceRequest(url(), referrer(), UseProtocolCachePolicy); … … 205 205 void fire(Frame& frame) override 206 206 { 207 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);207 UserGestureIndicator gestureIndicator(userGestureToForward()); 208 208 209 209 ResourceRequest resourceRequest(url(), referrer(), ReloadIgnoringCacheData); … … 223 223 void fire(Frame& frame) override 224 224 { 225 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);225 UserGestureIndicator gestureIndicator(userGestureToForward()); 226 226 227 227 if (!m_historySteps) { … … 256 256 void fire(Frame& frame) override 257 257 { 258 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);258 UserGestureIndicator gestureIndicator(userGestureToForward()); 259 259 260 260 // The submitForm function will find a target frame before using the redirection timer. … … 276 276 m_haveToldClient = true; 277 277 278 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);278 UserGestureIndicator gestureIndicator(userGestureToForward()); 279 279 frame.loader().clientRedirected(m_submission->requestURL(), delay(), currentTime() + timer.nextFireInterval(), lockBackForwardList()); 280 280 } … … 309 309 void fire(Frame& frame) override 310 310 { 311 UserGestureIndicator gestureIndicator( wasUserGesture() ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);311 UserGestureIndicator gestureIndicator(userGestureToForward()); 312 312 313 313 ResourceResponse replacementResponse(m_originDocument.url(), ASCIILiteral("text/plain"), 0, ASCIILiteral("UTF-8")); … … 386 386 // Non-user navigation before the page has finished firing onload should not create a new back/forward item. 387 387 // 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()) 389 389 return LockBackForwardList::Yes; 390 390 … … 445 445 LockBackForwardList lockBackForwardList = mustLockBackForwardList(m_frame); 446 446 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())) { 448 448 lockBackForwardList = LockBackForwardList::Yes; 449 449 } -
trunk/Source/WebCore/page/DOMTimer.cpp
r202198 r203338 36 36 #include "ScriptExecutionContext.h" 37 37 #include "Settings.h" 38 #include "UserGestureIndicator.h"39 38 #include <wtf/CurrentTime.h> 40 39 #include <wtf/HashMap.h> … … 169 168 } 170 169 170 static 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 171 178 DOMTimer::DOMTimer(ScriptExecutionContext& context, std::unique_ptr<ScheduledAction> action, std::chrono::milliseconds interval, bool singleShot) 172 179 : SuspendableTimer(context) … … 176 183 , m_throttleState(Undetermined) 177 184 , m_currentTimerInterval(intervalClampedToMinimum()) 178 , m_ shouldForwardUserGesture(shouldForwardUserGesture(interval, m_nestingLevel))185 , m_userGestureTokenToForward(userGestureTokenToForward(interval, m_nestingLevel)) 179 186 { 180 187 RefPtr<DOMTimer> reference = adoptRef(this); … … 301 308 ASSERT(!isSuspended()); 302 309 ASSERT(!context.activeDOMObjectsAreSuspended()); 303 UserGestureIndicator gestureIndicator(m_ shouldForwardUserGesture ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);310 UserGestureIndicator gestureIndicator(m_userGestureTokenToForward); 304 311 // Only the first execution of a multi-shot timer should get an affirmative user gesture indicator. 305 m_ shouldForwardUserGesture = false;312 m_userGestureTokenToForward = nullptr; 306 313 307 314 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireTimer(&context, m_timeoutId); -
trunk/Source/WebCore/page/DOMTimer.h
r202198 r203338 29 29 30 30 #include "SuspendableTimer.h" 31 #include "UserGestureIndicator.h" 31 32 #include <memory> 32 33 #include <wtf/RefCounted.h> … … 91 92 TimerThrottleState m_throttleState; 92 93 std::chrono::milliseconds m_currentTimerInterval; 93 bool m_shouldForwardUserGesture;94 RefPtr<UserGestureToken> m_userGestureTokenToForward; 94 95 }; 95 96 -
trunk/Source/WebCore/page/DOMWindow.cpp
r202761 r203338 151 151 , m_targetOrigin(WTFMove(targetOrigin)) 152 152 , m_stackTrace(stackTrace) 153 , m_ wasProcessingUserGesture(UserGestureIndicator::processingUserGesture())153 , m_userGestureToForward(UserGestureIndicator::currentUserGesture()) 154 154 { 155 155 } … … 169 169 std::unique_ptr<PostMessageTimer> timer(this); 170 170 171 UserGestureIndicator userGestureIndicator(m_ wasProcessingUserGesture ? DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture);171 UserGestureIndicator userGestureIndicator(m_userGestureToForward); 172 172 m_window->postMessageTimerFired(*timer); 173 173 } … … 180 180 RefPtr<SecurityOrigin> m_targetOrigin; 181 181 RefPtr<ScriptCallStack> m_stackTrace; 182 bool m_wasProcessingUserGesture;182 RefPtr<UserGestureToken> m_userGestureToForward; 183 183 }; 184 184 -
trunk/Source/WebCore/page/EventHandler.cpp
r203324 r203338 1619 1619 #endif 1620 1620 1621 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, m_frame.document());1621 UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document()); 1622 1622 1623 1623 // FIXME (bug 68185): this call should be made at another abstraction layer … … 1747 1747 m_frame.selection().setCaretBlinkingSuspended(false); 1748 1748 1749 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, m_frame.document());1749 UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document()); 1750 1750 1751 1751 // We get this instead of a second mouse-up … … 1988 1988 #endif 1989 1989 1990 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, m_frame.document());1990 UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document()); 1991 1991 1992 1992 #if ENABLE(PAN_SCROLLING) … … 3048 3048 return false; 3049 3049 3050 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, m_frame.document());3050 UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document()); 3051 3051 UserTypingGestureIndicator typingGestureIndicator(m_frame); 3052 3052 … … 3801 3801 const Vector<PlatformTouchPoint>& points = event.touchPoints(); 3802 3802 3803 UserGestureIndicator gestureIndicator( DefinitelyProcessingUserGesture, m_frame.document());3803 UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document()); 3804 3804 3805 3805 bool freshTouchEvents = true; -
trunk/Source/WebCore/rendering/HitTestResult.cpp
r203324 r203338 471 471 if (HTMLMediaElement* mediaElement = this->mediaElement()) { 472 472 if (mediaElement->isVideo() && mediaElement->supportsFullscreen(HTMLMediaElementEnums::VideoFullscreenModeStandard)) { 473 UserGestureIndicator indicator( DefinitelyProcessingUserGesture, &mediaElement->document());473 UserGestureIndicator indicator(ProcessingUserGesture, &mediaElement->document()); 474 474 mediaElement->toggleStandardFullscreenState(); 475 475 } … … 485 485 HTMLVideoElement& videoElement = downcast<HTMLVideoElement>(*mediaElement); 486 486 if (!videoElement.isFullscreen() && mediaElement->supportsFullscreen(HTMLMediaElementEnums::VideoFullscreenModeStandard)) { 487 UserGestureIndicator indicator( DefinitelyProcessingUserGesture, &mediaElement->document());487 UserGestureIndicator indicator(ProcessingUserGesture, &mediaElement->document()); 488 488 videoElement.enterFullscreen(); 489 489 } … … 815 815 816 816 HTMLVideoElement& videoElement = downcast<HTMLVideoElement>(*mediaElement); 817 UserGestureIndicator indicator( DefinitelyProcessingUserGesture, &mediaElement->document());817 UserGestureIndicator indicator(ProcessingUserGesture, &mediaElement->document()); 818 818 if (videoElement.fullscreenMode() == HTMLMediaElementEnums::VideoFullscreenModePictureInPicture) 819 819 videoElement.exitFullscreen(); -
trunk/Source/WebKit/mac/ChangeLog
r203324 r203338 1 2016-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 1 15 2016-07-16 Ryosuke Niwa <rniwa@webkit.org> 2 16 -
trunk/Source/WebKit/mac/Plugins/Hosted/NetscapePluginInstanceProxy.mm
r202242 r203338 890 890 ExecState* exec = globalObject->globalExec(); 891 891 892 UserGestureIndicator gestureIndicator(allowPopups ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);892 UserGestureIndicator gestureIndicator(allowPopups ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 893 893 894 894 JSValue result = JSC::evaluate(exec, makeSource(script)); -
trunk/Source/WebKit/mac/Plugins/WebNetscapePluginView.mm
r201689 r203338 665 665 { 666 666 JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM()); 667 UserGestureIndicator gestureIndicator(_eventHandler->currentEventIsUserGesture() ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);667 UserGestureIndicator gestureIndicator(_eventHandler->currentEventIsUserGesture() ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 668 668 acceptedEvent = [_pluginPackage.get() pluginFuncs]->event(plugin, event); 669 669 } -
trunk/Source/WebKit/win/ChangeLog
r203324 r203338 1 2016-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 1 15 2016-07-16 Ryosuke Niwa <rniwa@webkit.org> 2 16 -
trunk/Source/WebKit/win/Plugins/PluginView.cpp
r203250 r203338 403 403 String jsString = scriptStringIfJavaScriptURL(requestURL); 404 404 405 UserGestureIndicator gestureIndicator(request->shouldAllowPopups() ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);405 UserGestureIndicator gestureIndicator(request->shouldAllowPopups() ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 406 406 407 407 if (jsString.isNull()) { -
trunk/Source/WebKit/win/WebCoreSupport/WebContextMenuClient.cpp
r192378 r203338 70 70 71 71 if (Page* page = frame->page()) { 72 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);72 UserGestureIndicator indicator(ProcessingUserGesture); 73 73 page->mainFrame().loader().urlSelected(URL(ParsedURLString, url), String(), 0, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, ShouldOpenExternalURLsPolicy::ShouldNotAllow); 74 74 } -
trunk/Source/WebKit2/ChangeLog
r203337 r203338 1 2016-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 1 99 2016-07-17 Ryosuke Niwa <rniwa@webkit.org> 2 100 -
trunk/Source/WebKit2/Shared/API/APIObject.h
r199700 r203338 151 151 UserContentExtensionStore, 152 152 UserContentWorld, 153 UserInitiatedAction, 153 154 UserMediaPermissionCheck, 154 155 UserMediaPermissionRequest, -
trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm
r202793 r203338 72 72 #import "_WKUserContentFilterInternal.h" 73 73 #import "_WKUserContentWorldInternal.h" 74 #import "_WKUserInitiatedActionInternal.h" 74 75 #import "_WKUserStyleSheetInternal.h" 75 76 #import "_WKVisitedLinkStoreInternal.h" … … 232 233 break; 233 234 235 case Type::UserInitiatedAction: 236 wrapper = [_WKUserInitiatedAction alloc]; 237 break; 238 234 239 case Type::UserScript: 235 240 wrapper = [WKUserScript alloc]; -
trunk/Source/WebKit2/Shared/NavigationActionData.cpp
r203085 r203338 41 41 encoder.encodeEnum(mouseButton); 42 42 encoder.encodeEnum(syntheticClickType); 43 encoder << isProcessingUserGesture;43 encoder << userGestureTokenIdentifier; 44 44 encoder << canHandleRequest; 45 45 encoder.encodeEnum(shouldOpenExternalURLsPolicy); … … 57 57 if (!decoder.decodeEnum(result.syntheticClickType)) 58 58 return false; 59 if (!decoder.decode(result. isProcessingUserGesture))59 if (!decoder.decode(result.userGestureTokenIdentifier)) 60 60 return false; 61 61 if (!decoder.decode(result.canHandleRequest)) -
trunk/Source/WebKit2/Shared/NavigationActionData.h
r203085 r203338 45 45 WebMouseEvent::Button mouseButton { WebMouseEvent::NoButton }; 46 46 WebMouseEvent::SyntheticClickType syntheticClickType { WebMouseEvent::NoTap }; 47 bool isProcessingUserGesture { false };47 uint64_t userGestureTokenIdentifier; 48 48 bool canHandleRequest { false }; 49 49 WebCore::ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy { WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow }; -
trunk/Source/WebKit2/UIProcess/API/APINavigationAction.h
r203085 r203338 29 29 #include "APIFrameInfo.h" 30 30 #include "APIObject.h" 31 #include "APIUserInitiatedAction.h" 31 32 #include "NavigationActionData.h" 32 33 #include <WebCore/ResourceRequest.h> … … 35 36 namespace API { 36 37 37 class FrameInfo;38 39 38 class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction> { 40 39 public: 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) 42 41 { 43 return adoptRef(*new NavigationAction(navigationActionData, sourceFrame, targetFrame, request, originalURL, shouldOpenAppLinks ));42 return adoptRef(*new NavigationAction(navigationActionData, sourceFrame, targetFrame, request, originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction))); 44 43 } 45 44 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) 47 46 : m_sourceFrame(sourceFrame) 48 47 , m_targetFrame(targetFrame) … … 50 49 , m_originalURL(originalURL) 51 50 , m_shouldOpenAppLinks(shouldOpenAppLinks) 51 , m_userInitiatedAction(WTFMove(userInitiatedAction)) 52 52 , m_navigationActionData(navigationActionData) 53 53 { … … 64 64 WebKit::WebMouseEvent::Button mouseButton() const { return m_navigationActionData.mouseButton; } 65 65 WebKit::WebMouseEvent::SyntheticClickType syntheticClickType() const { return m_navigationActionData.syntheticClickType; } 66 bool isProcessingUserGesture() const { return m_navigationActionData.isProcessingUserGesture; }67 66 bool canHandleRequest() const { return m_navigationActionData.canHandleRequest; } 68 67 bool shouldOpenExternalSchemes() const { return m_navigationActionData.shouldOpenExternalURLsPolicy == WebCore::ShouldOpenExternalURLsPolicy::ShouldAllow || m_navigationActionData.shouldOpenExternalURLsPolicy == WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes; } 69 68 bool shouldOpenAppLinks() const { return m_shouldOpenAppLinks && m_navigationActionData.shouldOpenExternalURLsPolicy == WebCore::ShouldOpenExternalURLsPolicy::ShouldAllow; } 70 69 bool shouldPerformDownload() const { return !m_navigationActionData.downloadAttribute.isNull(); } 70 71 bool isProcessingUserGesture() const { return m_userInitiatedAction; } 72 UserInitiatedAction* userInitiatedAction() const { return m_userInitiatedAction.get(); } 71 73 72 74 private: … … 79 81 bool m_shouldOpenAppLinks; 80 82 83 RefPtr<UserInitiatedAction> m_userInitiatedAction; 84 81 85 WebKit::NavigationActionData m_navigationActionData; 82 86 }; -
trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp
r203075 r203338 1698 1698 auto sourceFrameInfo = API::FrameInfo::create(*initiatingFrame, securityOriginData.securityOrigin()); 1699 1699 1700 auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 1700 1701 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); 1702 1703 1703 1704 auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures); -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationAction.mm
r203089 r203338 31 31 #import "NavigationActionData.h" 32 32 #import "WKFrameInfoInternal.h" 33 #import "_WKUserInitiatedActionInternal.h" 33 34 #import <wtf/RetainPtr.h> 34 35 … … 219 220 } 220 221 222 - (_WKUserInitiatedAction *)_userInitiatedAction 223 { 224 auto userInitiatedAction = _navigationAction->userInitiatedAction(); 225 if (userInitiatedAction) 226 return wrapper(*userInitiatedAction); 227 return nil; 228 } 229 221 230 @end 222 231 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationActionPrivate.h
r203086 r203338 28 28 #if WK_API_ENABLED 29 29 30 @class _WKUserInitiatedAction; 31 30 32 #if TARGET_OS_IPHONE 31 33 typedef NS_ENUM(NSInteger, WKSyntheticClickType) { … … 46 48 @property (nonatomic, readonly) BOOL _shouldOpenExternalURLs WK_API_DEPRECATED("use _shouldOpenExternalSchemes and _shouldOpenAppLinks", macosx(10.11, 10.11), ios(9.0, 9.0)); 47 49 50 @property (nonatomic, readonly) _WKUserInitiatedAction *_userInitiatedAction WK_API_AVAILABLE(macosx(10.12), ios(10.0)); 51 48 52 #if TARGET_OS_IPHONE 49 53 @property (nonatomic, readonly) WKSyntheticClickType _syntheticClickType WK_API_AVAILABLE(ios(10.0)); -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNavigationActionPrivate.h
r170702 r203338 30 30 , mouseButton(toWebKitMouseButton(navigationActionData.mouseButton)) 31 31 , modifiers(toGdkModifiers(navigationActionData.modifiers)) 32 , isUserGesture(navigationActionData. isProcessingUserGesture)32 , isUserGesture(navigationActionData.userGestureTokenIdentifier) 33 33 , request(uriRequest) 34 34 { -
trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm
r202889 r203338 35 35 #import "WKOpenPanelParametersInternal.h" 36 36 #import "WKSecurityOriginInternal.h" 37 #import "WKUIDelegatePrivate.h" 37 38 #import "WKWebViewConfigurationInternal.h" 38 39 #import "WKWebViewInternal.h" 39 40 #import "WKWindowFeaturesInternal.h" 40 #import "WKUIDelegatePrivate.h"41 41 #import "WebOpenPanelResultListenerProxy.h" 42 #import "WebProcessProxy.h" 42 43 #import "_WKContextMenuElementInfo.h" 43 44 #import "_WKFrameHandleInternal.h" … … 148 149 } 149 150 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)151 PassRefPtr<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) 151 152 { 152 153 if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures) … … 162 163 auto sourceFrameInfo = API::FrameInfo::create(*initiatingFrame, securityOriginData.securityOrigin()); 163 164 165 auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 164 166 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); 166 168 167 169 auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures); -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r203312 r203338 3589 3589 sourceFrameInfo = API::FrameInfo::create(*originatingFrame, originatingFrameSecurityOrigin.securityOrigin()); 3590 3590 3591 auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 3591 3592 bool shouldOpenAppLinks = !m_shouldSuppressAppLinksInNextNavigationPolicyDecision && (!destinationFrameInfo || destinationFrameInfo->isMainFrame()) && !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url()); 3592 3593 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)); 3594 3595 3595 3596 m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get()); … … 3623 3624 sourceFrameInfo = API::FrameInfo::create(*frame, frameSecurityOrigin.securityOrigin()); 3624 3625 3626 auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 3625 3627 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)); 3627 3629 3628 3630 m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get()); -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp
r203003 r203338 210 210 m_webUserContentControllerProxies.clear(); 211 211 212 m_userInitiatedActionMap.clear(); 213 212 214 m_processPool->disconnectProcess(this); 213 215 } … … 664 666 } 665 667 return result; 668 } 669 670 RefPtr<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 679 void WebProcessProxy::didDestroyUserGestureToken(uint64_t identifier) 680 { 681 ASSERT(UserInitiatedActionMap::isValidKey(identifier)); 682 m_userInitiatedActionMap.remove(identifier); 666 683 } 667 684 -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.h
r203003 r203338 27 27 28 28 #include "APISession.h" 29 #include "APIUserInitiatedAction.h" 29 30 #include "ChildProcessProxy.h" 30 31 #include "CustomProtocolManagerProxy.h" … … 68 69 typedef HashMap<uint64_t, RefPtr<WebFrameProxy>> WebFrameProxyMap; 69 70 typedef HashMap<uint64_t, WebPageProxy*> WebPageProxyMap; 71 typedef HashMap<uint64_t, RefPtr<API::UserInitiatedAction>> UserInitiatedActionMap; 70 72 71 73 static Ref<WebProcessProxy> create(WebProcessPool&); … … 95 97 96 98 WebBackForwardListItem* webBackForwardItem(uint64_t itemID) const; 99 RefPtr<API::UserInitiatedAction> userInitiatedActivity(uint64_t); 97 100 98 101 ResponsivenessTimer& responsivenessTimer() { return m_responsivenessTimer; } … … 168 171 void addBackForwardItem(uint64_t itemID, uint64_t pageID, const PageState&); 169 172 void didDestroyFrame(uint64_t); 170 173 void didDestroyUserGestureToken(uint64_t); 174 171 175 void shouldTerminate(bool& shouldTerminate); 172 176 … … 235 239 WebFrameProxyMap m_frameMap; 236 240 WebBackForwardListItemMap m_backForwardListItemMap; 241 UserInitiatedActionMap m_userInitiatedActionMap; 237 242 238 243 HashSet<VisitedLinkStore*> m_visitedLinkStores; -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.messages.in
r192702 r203338 24 24 AddBackForwardItem(uint64_t itemID, uint64_t pageID, struct WebKit::PageState pageState) 25 25 DidDestroyFrame(uint64_t frameID) 26 27 DidDestroyUserGestureToken(uint64_t userGestureTokenID) 26 28 27 29 ShouldTerminate() -> (bool shouldTerminate) -
trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
r202930 r203338 1138 1138 7CB16FF31724BA2F007A0A95 /* com.microsoft.SilverlightPlugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 7CB16FE61724B9B5007A0A95 /* com.microsoft.SilverlightPlugin.sb */; }; 1139 1139 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 */; }; 1140 1144 7CBB811C1AA0F8B1006B1942 /* InjectedBundleFileHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CBB811A1AA0F8B1006B1942 /* InjectedBundleFileHandle.cpp */; }; 1141 1145 7CBB811D1AA0F8B1006B1942 /* InjectedBundleFileHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CBB811B1AA0F8B1006B1942 /* InjectedBundleFileHandle.h */; }; … … 3201 3205 7CB16FE61724B9B5007A0A95 /* com.microsoft.SilverlightPlugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.microsoft.SilverlightPlugin.sb; sourceTree = "<group>"; }; 3202 3206 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>"; }; 3203 3211 7CBB811A1AA0F8B1006B1942 /* InjectedBundleFileHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleFileHandle.cpp; sourceTree = "<group>"; }; 3204 3212 7CBB811B1AA0F8B1006B1942 /* InjectedBundleFileHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundleFileHandle.h; sourceTree = "<group>"; }; … … 5135 5143 7C882DF41C7E995E006BF731 /* _WKUserContentWorld.mm */, 5136 5144 7C882DF51C7E995E006BF731 /* _WKUserContentWorldInternal.h */, 5145 7CB365A81D31DB70007158CA /* _WKUserInitiatedAction.h */, 5146 7CB365A91D31DB70007158CA /* _WKUserInitiatedAction.mm */, 5147 7CB365AC1D31DC10007158CA /* _WKUserInitiatedActionInternal.h */, 5137 5148 2D87861B1BDB54BF00D02ABB /* _WKUserStyleSheet.h */, 5138 5149 2D87861C1BDB54BF00D02ABB /* _WKUserStyleSheet.mm */, … … 6130 6141 7C882DFB1C7E99A6006BF731 /* APIUserContentWorld.cpp */, 6131 6142 7C882DFC1C7E99A6006BF731 /* APIUserContentWorld.h */, 6143 7CB365AF1D31DD1E007158CA /* APIUserInitiatedAction.h */, 6132 6144 7C89D2A51A6789EA003A5FDE /* APIUserScript.cpp */, 6133 6145 7C89D2921A67122F003A5FDE /* APIUserScript.h */, … … 7644 7656 1A043B5E124D5E9D00FFBFB5 /* PluginProcessProxyMessages.h in Headers */, 7645 7657 1A043DC1124FF87500FFBFB5 /* PluginProxy.h in Headers */, 7658 7CB365AD1D31DC10007158CA /* _WKUserInitiatedActionInternal.h in Headers */, 7646 7659 1A8EFA711252B84100F7067F /* PluginProxyMessages.h in Headers */, 7647 7660 1A4A9F3312B844E2008FE984 /* PluginQuirks.h in Headers */, … … 7786 7799 BC032D7F10F4378D0058C15A /* WebFrameLoaderClient.h in Headers */, 7787 7800 9391F2CB121B67AD00EBF7E8 /* WebFrameNetworkingContext.h in Headers */, 7801 7CB365AA1D31DB70007158CA /* _WKUserInitiatedAction.h in Headers */, 7788 7802 BCB9F6A01123A84B00A137E0 /* WebFramePolicyListenerProxy.h in Headers */, 7789 7803 BC9B38A110F538BE00443A15 /* WebFrameProxy.h in Headers */, … … 8216 8230 1A4832CE1A9BC484008B4DFE /* WKWebsiteDataRecordInternal.h in Headers */, 8217 8231 1AA654D11B14F71400BF1D3E /* WKWebsiteDataRecordPrivate.h in Headers */, 8232 7CB365B11D31DD1E007158CA /* APIUserInitiatedAction.h in Headers */, 8218 8233 75A8D2C8187CCFAB00C39C9E /* WKWebsiteDataStore.h in Headers */, 8219 8234 75A8D2D6187D1C0E00C39C9E /* WKWebsiteDataStoreInternal.h in Headers */, … … 9347 9362 BC7B6207129A0A6700D174A4 /* WebPageGroup.cpp in Sources */, 9348 9363 BC7B625312A43C9600D174A4 /* WebPageGroupData.cpp in Sources */, 9364 7CB365AB1D31DB70007158CA /* _WKUserInitiatedAction.mm in Sources */, 9349 9365 BC7B621612A4219A00D174A4 /* WebPageGroupProxy.cpp in Sources */, 9350 9366 2D9EA3111A96D9EB002D2807 /* WebPageInjectedBundleClient.cpp in Sources */, -
trunk/Source/WebKit2/WebProcess/Notifications/WebNotificationManager.cpp
r160464 r203338 250 250 251 251 // 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); 253 253 notification->dispatchClickEvent(); 254 254 #else -
trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp
r202611 r203338 1219 1219 } 1220 1220 1221 UserGestureIndicator gestureIndicator(request->allowPopups() ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);1221 UserGestureIndicator gestureIndicator(request->allowPopups() ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 1222 1222 1223 1223 // First, try to find a target frame. … … 1514 1514 NPRuntimeObjectMap::PluginProtector pluginProtector(&m_npRuntimeObjectMap); 1515 1515 1516 UserGestureIndicator gestureIndicator(allowPopups ? DefinitelyProcessingUserGesture : PossiblyProcessingUserGesture);1516 UserGestureIndicator gestureIndicator(allowPopups ? Optional<ProcessingUserGestureState>(ProcessingUserGesture) : Nullopt); 1517 1517 return m_npRuntimeObjectMap.evaluate(npObject, scriptString, result); 1518 1518 } -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
r203312 r203338 225 225 #endif 226 226 227 auto& webProcess = WebProcess::singleton(); 228 227 229 WebFrame* webFrame = WebFrame::fromCoreFrame(*frame); 228 230 … … 232 234 navigationActionData.mouseButton = InjectedBundleNavigationAction::mouseButtonForNavigationAction(navigationAction); 233 235 navigationActionData.syntheticClickType = InjectedBundleNavigationAction::syntheticClickTypeForNavigationAction(navigationAction); 234 navigationActionData. isProcessingUserGesture = navigationAction.processingUserGesture();236 navigationActionData.userGestureTokenIdentifier = webProcess.userGestureTokenIdentifier(navigationAction.userGestureToken()); 235 237 navigationActionData.canHandleRequest = m_page->canHandleRequest(request.resourceRequest()); 236 238 navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy(); … … 239 241 uint64_t newPageID = 0; 240 242 WebPageCreationParameters parameters; 241 auto& webProcess = WebProcess::singleton();242 243 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())) 243 244 return nullptr; -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebContextMenuClient.cpp
r192378 r203338 67 67 68 68 if (Page* page = frame->page()) { 69 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);69 UserGestureIndicator indicator(ProcessingUserGesture); 70 70 page->mainFrame().loader().urlSelected(URL(ParsedURLString, url), String(), 0, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, ShouldOpenExternalURLsPolicy::ShouldNotAllow); 71 71 } -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
r203085 r203338 728 728 navigationActionData.mouseButton = action->mouseButton(); 729 729 navigationActionData.syntheticClickType = action->syntheticClickType(); 730 navigationActionData. isProcessingUserGesture = navigationAction.processingUserGesture();730 navigationActionData.userGestureTokenIdentifier = WebProcess::singleton().userGestureTokenIdentifier(navigationAction.userGestureToken()); 731 731 navigationActionData.canHandleRequest = webPage->canHandleRequest(request); 732 732 navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy(); … … 795 795 navigationActionData.mouseButton = action->mouseButton(); 796 796 navigationActionData.syntheticClickType = action->syntheticClickType(); 797 navigationActionData. isProcessingUserGesture = navigationAction.processingUserGesture();797 navigationActionData.userGestureTokenIdentifier = WebProcess::singleton().userGestureTokenIdentifier(navigationAction.userGestureToken()); 798 798 navigationActionData.canHandleRequest = webPage->canHandleRequest(request); 799 799 navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy(); -
trunk/Source/WebKit2/WebProcess/WebProcess.cpp
r203196 r203338 98 98 #include <WebCore/SecurityOrigin.h> 99 99 #include <WebCore/Settings.h> 100 #include <WebCore/UserGestureIndicator.h> 100 101 #include <unistd.h> 101 102 #include <wtf/CurrentTime.h> … … 718 719 719 720 return result.iterator->value.get(); 721 } 722 723 static uint64_t nextUserGestureTokenIdentifier() 724 { 725 static uint64_t identifier = 1; 726 return identifier++; 727 } 728 729 uint64_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 744 void WebProcess::userGestureTokenDestroyed(UserGestureToken& token) 745 { 746 auto identifier = m_userGestureTokens.take(&token); 747 parentProcessConnection()->send(Messages::WebProcessProxy::DidDestroyUserGestureToken(identifier), 0); 720 748 } 721 749 -
trunk/Source/WebKit2/WebProcess/WebProcess.h
r203196 r203338 67 67 class ResourceRequest; 68 68 class SessionID; 69 class UserGestureToken; 69 70 struct PluginInfo; 70 71 struct SecurityOriginData; … … 141 142 WebPageGroupProxy* webPageGroup(const WebPageGroupData&); 142 143 144 uint64_t userGestureTokenIdentifier(RefPtr<WebCore::UserGestureToken>); 145 void userGestureTokenDestroyed(WebCore::UserGestureToken&); 146 143 147 #if PLATFORM(COCOA) 144 148 pid_t presenterApplicationPid() const { return m_presenterApplicationPid; } … … 394 398 unsigned m_pagesMarkingLayersAsVolatile { 0 }; 395 399 bool m_suppressMemoryPressureHandler { false }; 400 401 HashMap<WebCore::UserGestureToken *, uint64_t> m_userGestureTokens; 396 402 }; 397 403 -
trunk/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm
r202425 r203338 348 348 void WebPlaybackSessionManager::play(uint64_t contextId) 349 349 { 350 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);350 UserGestureIndicator indicator(ProcessingUserGesture); 351 351 ensureModel(contextId).play(); 352 352 } … … 354 354 void WebPlaybackSessionManager::pause(uint64_t contextId) 355 355 { 356 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);356 UserGestureIndicator indicator(ProcessingUserGesture); 357 357 ensureModel(contextId).pause(); 358 358 } … … 360 360 void WebPlaybackSessionManager::togglePlayState(uint64_t contextId) 361 361 { 362 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);362 UserGestureIndicator indicator(ProcessingUserGesture); 363 363 ensureModel(contextId).togglePlayState(); 364 364 } … … 366 366 void WebPlaybackSessionManager::beginScrubbing(uint64_t contextId) 367 367 { 368 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);368 UserGestureIndicator indicator(ProcessingUserGesture); 369 369 ensureModel(contextId).beginScrubbing(); 370 370 } … … 372 372 void WebPlaybackSessionManager::endScrubbing(uint64_t contextId) 373 373 { 374 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);374 UserGestureIndicator indicator(ProcessingUserGesture); 375 375 ensureModel(contextId).endScrubbing(); 376 376 } … … 378 378 void WebPlaybackSessionManager::seekToTime(uint64_t contextId, double time) 379 379 { 380 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);380 UserGestureIndicator indicator(ProcessingUserGesture); 381 381 ensureModel(contextId).seekToTime(time); 382 382 } … … 384 384 void WebPlaybackSessionManager::fastSeek(uint64_t contextId, double time) 385 385 { 386 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);386 UserGestureIndicator indicator(ProcessingUserGesture); 387 387 ensureModel(contextId).fastSeek(time); 388 388 } … … 390 390 void WebPlaybackSessionManager::beginScanningForward(uint64_t contextId) 391 391 { 392 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);392 UserGestureIndicator indicator(ProcessingUserGesture); 393 393 ensureModel(contextId).beginScanningForward(); 394 394 } … … 396 396 void WebPlaybackSessionManager::beginScanningBackward(uint64_t contextId) 397 397 { 398 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);398 UserGestureIndicator indicator(ProcessingUserGesture); 399 399 ensureModel(contextId).beginScanningBackward(); 400 400 } … … 402 402 void WebPlaybackSessionManager::endScanning(uint64_t contextId) 403 403 { 404 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);404 UserGestureIndicator indicator(ProcessingUserGesture); 405 405 ensureModel(contextId).endScanning(); 406 406 } … … 408 408 void WebPlaybackSessionManager::selectAudioMediaOption(uint64_t contextId, uint64_t index) 409 409 { 410 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);410 UserGestureIndicator indicator(ProcessingUserGesture); 411 411 ensureModel(contextId).selectAudioMediaOption(index); 412 412 } … … 414 414 void WebPlaybackSessionManager::selectLegibleMediaOption(uint64_t contextId, uint64_t index) 415 415 { 416 UserGestureIndicator indicator( DefinitelyProcessingUserGesture);416 UserGestureIndicator indicator(ProcessingUserGesture); 417 417 ensureModel(contextId).selectLegibleMediaOption(index); 418 418 } -
trunk/Tools/ChangeLog
r203332 r203338 1 2016-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 1 22 2016-07-17 Yusuke Suzuki <utatane.tea@gmail.com> 2 23 -
trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
r202640 r203338 31 31 #import "SettingsController.h" 32 32 #import <WebKit/WKFrameInfo.h> 33 #import <WebKit/WKNavigationActionPrivate.h> 33 34 #import <WebKit/WKNavigationDelegate.h> 34 35 #import <WebKit/WKPreferencesPrivate.h> … … 38 39 #import <WebKit/WKWebsiteDataStorePrivate.h> 39 40 #import <WebKit/WebNSURLExtras.h> 41 #import <WebKit/_WKUserInitiatedAction.h> 40 42 41 43 static void* keyValueObservingContext = &keyValueObservingContext; … … 403 405 } 404 406 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 405 416 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler 406 417 { … … 536 547 #pragma mark WKNavigationDelegate 537 548 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 538 566 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler 539 567 { -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r203203 r203338 202 202 7CB184C61AA3F2100066EDFD /* ContentExtensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CB184C41AA3F2100066EDFD /* ContentExtensions.cpp */; }; 203 203 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 */; }; 204 206 7CCE7EA41A4119F300447C4C /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = C08587FF13FEC3A6001EF4E5 /* InstanceMethodSwizzler.mm */; }; 205 207 7CCE7EA51A411A0800447C4C /* JavaScriptTestMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C081224013FC172400DC39AE /* JavaScriptTestMac.mm */; }; … … 487 489 dstSubfolderSpec = 7; 488 490 files = ( 491 7CCB99231D3B4A46003922F6 /* open-multiple-external-url.html in Copy Resources */, 489 492 932AE53D1D371047005DFFAF /* focus-inputs.html in Copy Resources */, 490 493 46C519E61D3563FD00DAA51A /* LocalStorageNullEntries.html in Copy Resources */, … … 823 826 7CC3E1FA197E234100BE6252 /* UserContentController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserContentController.mm; sourceTree = "<group>"; }; 824 827 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>"; }; 825 830 7CCE7E8C1A41144E00447C4C /* libTestWebKitAPI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libTestWebKitAPI.a; sourceTree = BUILT_PRODUCTS_DIR; }; 826 831 7CCE7EA31A4115CB00447C4C /* TestWebKitAPILibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = TestWebKitAPILibrary.xcconfig; sourceTree = "<group>"; }; … … 1219 1224 7C882E041C80C624006BF731 /* UserContentWorldPlugIn.mm */, 1220 1225 7C882E051C80C624006BF731 /* UserContentWorldProtocol.h */, 1226 7CCB99201D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm */, 1221 1227 93E943F11CD3E87E00AC08C2 /* VideoControlsManager.mm */, 1222 1228 2D00065D1C1F58940088E6A7 /* WKPDFViewResizeCrash.mm */, … … 1299 1305 isa = PBXGroup; 1300 1306 children = ( 1301 93575C551D30366E000D604D /* focus-inputs.html */,1302 1307 93CFA8661CEB9DE1000565A8 /* autofocused-text-input.html */, 1303 9984FACD1CFFB038008D198C /* editable-body.html */,1304 CDE195B21CFE0ADE0053D256 /* FullscreenTopContentInset.html */,1305 1308 A16F66B91C40EA2000BD4D24 /* ContentFiltering.html */, 1306 1309 5714ECB81CA8B58800051AC8 /* DownloadRequestOriginalURL.html */, 1307 1310 5714ECBC1CA8C21800051AC8 /* DownloadRequestOriginalURL2.html */, 1308 1311 5714ECBA1CA8BFD100051AC8 /* DownloadRequestOriginalURLFrame.html */, 1309 51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */, 1312 9984FACD1CFFB038008D198C /* editable-body.html */, 1313 93575C551D30366E000D604D /* focus-inputs.html */, 1314 CDE195B21CFE0ADE0053D256 /* FullscreenTopContentInset.html */, 1310 1315 510477761D298E57009747EB /* IDBDeleteRecovery.html */, 1311 1316 5104776F1D298D85009747EB /* IDBDeleteRecovery.sqlite3 */, 1312 1317 510477701D298D85009747EB /* IDBDeleteRecovery.sqlite3-shm */, 1313 1318 510477711D298D85009747EB /* IDBDeleteRecovery.sqlite3-wal */, 1319 51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */, 1314 1320 51BCEE4C1C84F52C0042C82E /* IndexedDBMultiProcess-1.html */, 1315 1321 51BCEE4D1C84F52C0042C82E /* IndexedDBMultiProcess-2.html */, … … 1317 1323 51B1EE941C80FADD0064FB98 /* IndexedDBPersistence-1.html */, 1318 1324 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 */, 1319 1328 51E6A8951D2F1C7700C004B6 /* LocalStorageClear.html */, 1320 1329 46C519E21D35629600DAA51A /* LocalStorageNullEntries.html */, 1321 1330 46C519E31D35629600DAA51A /* LocalStorageNullEntries.localstorage */, 1322 1331 46C519E41D35629600DAA51A /* LocalStorageNullEntries.localstorage-shm */, 1332 7CCB99221D3B44E7003922F6 /* open-multiple-external-url.html */, 1323 1333 51714EB21CF8C761004723C4 /* WebProcessKillIDBCleanup-1.html */, 1324 1334 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 */,1328 1335 ); 1329 1336 name = Resources; … … 1972 1979 targets = ( 1973 1980 7C83E02B1D0A5E1000FEBCF3 /* All */, 1981 7CCE7E8B1A41144E00447C4C /* TestWebKitAPILibrary */, 1982 7C83DE951D0A590C00FEBCF3 /* TestWTFLibrary */, 1974 1983 8DD76F960486AA7600D96B5E /* TestWebKitAPI */, 1975 7CCE7E8B1A41144E00447C4C /* TestWebKitAPILibrary */,1976 1984 7C83DF951D0A5AE400FEBCF3 /* TestWTF */, 1977 7C83DE951D0A590C00FEBCF3 /* TestWTFLibrary */,1978 1985 BC57597F126E74AF006F0F12 /* InjectedBundleTestWebKitAPI */, 1979 1986 A13EBB481B87339E00097110 /* WebProcessPlugIn */, … … 2233 2240 7CCE7F171A411AE600447C4C /* UserMedia.cpp in Sources */, 2234 2241 7C83E0C41D0A654200FEBCF3 /* RequiresUserActionForPlayback.mm in Sources */, 2242 7CCB99211D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm in Sources */, 2235 2243 7CCE7F181A411AE600447C4C /* UserMessage.cpp in Sources */, 2236 2244 0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */,
Note:
See TracChangeset
for help on using the changeset viewer.