Title: [177477] branches/safari-600.3-branch/Source
Revision
177477
Author
[email protected]
Date
2014-12-17 16:25:29 -0800 (Wed, 17 Dec 2014)

Log Message

Merge r177427. rdar://problem/19237945

Modified Paths

Diff

Modified: branches/safari-600.3-branch/Source/WebCore/ChangeLog (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/ChangeLog	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/ChangeLog	2014-12-18 00:25:29 UTC (rev 177477)
@@ -1,5 +1,69 @@
 2014-12-17  Matthew Hanson  <[email protected]>
 
+        Merge r177427. rdar://problem/19237945
+
+    2014-12-16  Timothy Horton  <[email protected]>
+
+            Implement and adopt two new TextIndicator presentation animations
+            https://bugs.webkit.org/show_bug.cgi?id=139715
+            <rdar://problem/19237945>
+
+            Reviewed by Anders Carlsson.
+
+            * WebCore.exp.in:
+            Adjust one symbol and export another.
+
+            * page/TextIndicator.cpp:
+            (WebCore::TextIndicator::createWithSelectionInFrame):
+            Take a blue-highlight snapshot if we're doing a crossfade without a bounce.
+
+            * page/TextIndicator.h:
+            (WebCore::TextIndicator::presentationTransition):
+            Add FadeIn and Crossfade transition types.
+
+            * page/mac/TextIndicatorWindow.h:
+            * page/mac/TextIndicatorWindow.mm:
+            (-[WebTextIndicatorView initWithFrame:textIndicator:margin:]):
+            (createBounceAnimation):
+            (createContentCrossfadeAnimation):
+            (createShadowFadeAnimation):
+            (createFadeInAnimation):
+            (-[WebTextIndicatorView _textIndicatorWantsBounce]):
+            (-[WebTextIndicatorView _textIndicatorWantsContentCrossfade]):
+            (-[WebTextIndicatorView _textIndicatorWantsFadeIn]):
+            Factor out the animation construction.
+
+            (-[WebTextIndicatorView _animationDuration]):
+            Factor out the duration computation.
+
+            (-[WebTextIndicatorView present]):
+            (-[WebTextIndicatorView setAnimationProgress:]):
+            Implement FadeIn and Crossfade transitions.
+            They can be driven externally and then continue from where they
+            left off when the progress reaches 100%.
+            FadeIn changes the opacity of the whole bubble, Crossfade
+            crossfades the content (from blue to yellow).
+
+            (WebCore::TextIndicatorWindow::TextIndicatorWindow):
+            (WebCore::TextIndicatorWindow::~TextIndicatorWindow):
+            Don't immediately destroy the window if it is crossfades or fades in.
+            Fade it out, instead.
+
+            (WebCore::TextIndicatorWindow::setAnimationProgress):
+            Drive the paused animation manually. If progress hits 100%,
+            start running it automatically from where it last left off.
+
+            (WebCore::TextIndicatorWindow::setTextIndicator):
+            (WebCore::TextIndicatorWindow::startFadeOut):
+            (-[WebTextIndicatorView presentWithCompletionHandler:]): Deleted.
+            (WebCore::TextIndicatorWindow::startFadeOutTimerFired): Deleted.
+            Remove the completion block from -present.
+
+            * platform/spi/mac/NSImmediateActionGestureRecognizerSPI.h:
+            Add some SPI.
+
+2014-12-17  Matthew Hanson  <[email protected]>
+
         Merge r177409. rdar://problem/19271854
 
     2014-12-16  Beth Dakin  <[email protected]>

Modified: branches/safari-600.3-branch/Source/WebCore/WebCore.exp.in (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/WebCore.exp.in	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/WebCore.exp.in	2014-12-18 00:25:29 UTC (rev 177477)
@@ -1810,6 +1810,7 @@
 __ZNK7WebCore16IconDatabaseBase12databasePathEv
 __ZNK7WebCore16ResourceResponse13nsURLResponseEv
 __ZNK7WebCore16ResourceResponse16certificateChainEv
+__ZNK7WebCore16VisibleSelection10firstRangeEv
 __ZNK7WebCore16VisibleSelection17isContentEditableEv
 __ZNK7WebCore16VisibleSelection17isInPasswordFieldEv
 __ZNK7WebCore16VisibleSelection17toNormalizedRangeEv
@@ -2298,7 +2299,8 @@
 __ZN7WebCore17ScrollbarThemeMac24removeOverhangAreaShadowEP7CALayer
 __ZN7WebCore17ScrollbarThemeMac27setUpOverhangAreaBackgroundEP7CALayerRKNS_5ColorE
 __ZN7WebCore17ScrollbarThemeMac28removeOverhangAreaBackgroundEP7CALayer
-__ZN7WebCore19TextIndicatorWindow16setTextIndicatorEN3WTF10PassRefPtrINS_13TextIndicatorEEE6CGRectbNSt3__18functionIFvvEEE
+__ZN7WebCore19TextIndicatorWindow16setTextIndicatorEN3WTF10PassRefPtrINS_13TextIndicatorEEE6CGRectb
+__ZN7WebCore19TextIndicatorWindow20setAnimationProgressEf
 __ZN7WebCore19TextIndicatorWindowC1EP6NSView
 __ZN7WebCore19TextIndicatorWindowD1Ev
 __ZN7WebCore19applicationIsSafariEv
@@ -3416,7 +3418,6 @@
 __ZN7WebCore8PositionC1EN3WTF10PassRefPtrINS_4NodeEEENS0_10AnchorTypeE
 __ZNK7WebCore11ImageBuffer7contextEv
 __ZNK7WebCore11ImageBuffer9copyImageENS_16BackingStoreCopyENS_13ScaleBehaviorE
-__ZNK7WebCore16VisibleSelection10firstRangeEv
 #endif
 
 #if ENABLE(SPEECH_SYNTHESIS)

Modified: branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.cpp (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.cpp	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.cpp	2014-12-18 00:25:29 UTC (rev 177477)
@@ -141,7 +141,7 @@
         return nullptr;
 
     RefPtr<Image> indicatorBitmapWithHighlight;
-    if (presentationTransition == TextIndicatorPresentationTransition::BounceAndCrossfade)
+    if (presentationTransition == TextIndicatorPresentationTransition::BounceAndCrossfade || presentationTransition == TextIndicatorPresentationTransition::Crossfade)
         indicatorBitmapWithHighlight = snapshotSelectionWithHighlight(frame);
 
     // Store the selection rect in window coordinates, to be used subsequently

Modified: branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -47,7 +47,9 @@
 enum class TextIndicatorPresentationTransition {
     None,
     Bounce,
-    BounceAndCrossfade
+    BounceAndCrossfade,
+    FadeIn,
+    Crossfade
 };
 
 struct TextIndicatorData {
@@ -74,8 +76,8 @@
     float contentImageScaleFactor() const { return m_data.contentImageScaleFactor; }
     Image *contentImageWithHighlight() const { return m_data.contentImageWithHighlight.get(); }
     Image *contentImage() const { return m_data.contentImage.get(); }
+
     TextIndicatorPresentationTransition presentationTransition() const { return m_data.presentationTransition; }
-
     void setPresentationTransition(TextIndicatorPresentationTransition transition) { m_data.presentationTransition = transition; }
 
     TextIndicatorData data() const { return m_data; }

Modified: branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -28,7 +28,6 @@
 
 #if PLATFORM(MAC)
 
-#import <functional>
 #import <wtf/Noncopyable.h>
 #import <wtf/RefPtr.h>
 #import <wtf/RetainPtr.h>
@@ -48,12 +47,14 @@
     explicit TextIndicatorWindow(NSView *);
     ~TextIndicatorWindow();
 
-    void setTextIndicator(PassRefPtr<TextIndicator>, CGRect contentRect, bool fadeOut, std::function<void ()> animationCompletionHandler);
+    void setTextIndicator(PassRefPtr<TextIndicator>, CGRect contentRect, bool fadeOut);
 
+    void setAnimationProgress(float);
+
 private:
     void closeWindow();
 
-    void startFadeOutTimerFired();
+    void startFadeOut();
 
     NSView *m_targetView;
     RefPtr<TextIndicator> m_textIndicator;
@@ -61,8 +62,6 @@
     RetainPtr<WebTextIndicatorView> m_textIndicatorView;
 
     RunLoop::Timer<TextIndicatorWindow> m_startFadeOutTimer;
-
-    std::function<void ()> m_bounceAnimationCompletionHandler;
 };
 
 } // namespace WebKit

Modified: branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -35,6 +35,7 @@
 
 const CFTimeInterval bounceAnimationDuration = 0.12;
 const CFTimeInterval bounceWithCrossfadeAnimationDuration = 0.3;
+const CFTimeInterval fadeInAnimationDuration = 0.15;
 const CFTimeInterval timeBeforeFadeStarts = bounceAnimationDuration + 0.2;
 const CFTimeInterval fadeOutAnimationDuration = 0.3;
 
@@ -69,13 +70,16 @@
     RefPtr<TextIndicator> _textIndicator;
     RetainPtr<NSArray> _bounceLayers;
     NSSize _margin;
+    bool _hasCompletedAnimation;
 }
 
 - (instancetype)initWithFrame:(NSRect)frame textIndicator:(PassRefPtr<TextIndicator>)textIndicator margin:(NSSize)margin;
 
-- (void)presentWithCompletionHandler:(void(^)(void))completionHandler;
+- (void)present;
 - (void)hideWithCompletionHandler:(void(^)(void))completionHandler;
 
+- (void)setAnimationProgress:(float)progress;
+
 @end
 
 @implementation WebTextIndicatorView
@@ -91,7 +95,7 @@
     self.wantsLayer = YES;
     self.layer.anchorPoint = CGPointZero;
 
-    bool wantsCrossfade = _textIndicator->presentationTransition() == TextIndicatorPresentationTransition::BounceAndCrossfade;
+    bool wantsCrossfade = [self _textIndicatorWantsContentCrossfade];
 
     FloatSize contentsImageLogicalSize = _textIndicator->contentImage()->size();
     contentsImageLogicalSize.scale(1 / _textIndicator->contentImageScaleFactor());
@@ -187,41 +191,153 @@
     return self;
 }
 
-- (void)presentWithCompletionHandler:(void(^)(void))completionHandler
+static RetainPtr<CAKeyframeAnimation> createBounceAnimation(CFTimeInterval duration)
 {
-    bool wantsCrossfade = _textIndicator->presentationTransition() == TextIndicatorPresentationTransition::BounceAndCrossfade;
-    double animationDuration = wantsCrossfade ? bounceWithCrossfadeAnimationDuration : bounceAnimationDuration;
     RetainPtr<CAKeyframeAnimation> bounceAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
     [bounceAnimation setValues:@[
         [NSValue valueWithCATransform3D:CATransform3DIdentity],
         [NSValue valueWithCATransform3D:CATransform3DMakeScale(midBounceScale, midBounceScale, 1)],
         [NSValue valueWithCATransform3D:CATransform3DIdentity]
         ]];
-    [bounceAnimation setDuration:animationDuration];
+    [bounceAnimation setDuration:duration];
 
+    return bounceAnimation;
+}
+
+static RetainPtr<CABasicAnimation> createContentCrossfadeAnimation(CFTimeInterval duration, TextIndicator& textIndicator)
+{
+    RetainPtr<CABasicAnimation> crossfadeAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];
+    RetainPtr<CGImageRef> contentsImage = textIndicator.contentImage()->getCGImageRef();
+    [crossfadeAnimation setToValue:(id)contentsImage.get()];
+    [crossfadeAnimation setFillMode:kCAFillModeForwards];
+    [crossfadeAnimation setRemovedOnCompletion:NO];
+    [crossfadeAnimation setDuration:duration];
+
+    return crossfadeAnimation;
+}
+
+static RetainPtr<CABasicAnimation> createShadowFadeAnimation(CFTimeInterval duration)
+{
+    RetainPtr<CABasicAnimation> fadeShadowInAnimation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
+    [fadeShadowInAnimation setFromValue:@0];
+    [fadeShadowInAnimation setToValue:@1];
+    [fadeShadowInAnimation setFillMode:kCAFillModeForwards];
+    [fadeShadowInAnimation setRemovedOnCompletion:NO];
+    [fadeShadowInAnimation setDuration:duration];
+
+    return fadeShadowInAnimation;
+}
+
+static RetainPtr<CABasicAnimation> createFadeInAnimation(CFTimeInterval duration)
+{
+    RetainPtr<CABasicAnimation> fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
+    [fadeInAnimation setFromValue:@0];
+    [fadeInAnimation setToValue:@1];
+    [fadeInAnimation setFillMode:kCAFillModeForwards];
+    [fadeInAnimation setRemovedOnCompletion:NO];
+    [fadeInAnimation setDuration:duration];
+
+    return fadeInAnimation;
+}
+
+- (bool)_textIndicatorWantsBounce
+{
+    switch (_textIndicator->presentationTransition()) {
+    case TextIndicatorPresentationTransition::BounceAndCrossfade:
+    case TextIndicatorPresentationTransition::Bounce:
+        return true;
+
+    case TextIndicatorPresentationTransition::FadeIn:
+    case TextIndicatorPresentationTransition::Crossfade:
+    case TextIndicatorPresentationTransition::None:
+        return false;
+    }
+
+    return false;
+}
+
+- (bool)_textIndicatorWantsContentCrossfade
+{
+    if (!_textIndicator->contentImageWithHighlight())
+        return false;
+
+    switch (_textIndicator->presentationTransition()) {
+    case TextIndicatorPresentationTransition::BounceAndCrossfade:
+    case TextIndicatorPresentationTransition::Crossfade:
+        return true;
+
+    case TextIndicatorPresentationTransition::Bounce:
+    case TextIndicatorPresentationTransition::FadeIn:
+    case TextIndicatorPresentationTransition::None:
+        return false;
+    }
+
+    return false;
+}
+
+- (bool)_textIndicatorWantsFadeIn
+{
+    switch (_textIndicator->presentationTransition()) {
+    case TextIndicatorPresentationTransition::FadeIn:
+        return true;
+
+    case TextIndicatorPresentationTransition::Bounce:
+    case TextIndicatorPresentationTransition::BounceAndCrossfade:
+    case TextIndicatorPresentationTransition::Crossfade:
+    case TextIndicatorPresentationTransition::None:
+        return false;
+    }
+
+    return false;
+}
+
+- (CFTimeInterval)_animationDuration
+{
+    bool wantsBounce = [self _textIndicatorWantsBounce];
+    bool wantsCrossfade = [self _textIndicatorWantsContentCrossfade];
+
+    if (wantsBounce) {
+        if (wantsCrossfade)
+            return bounceWithCrossfadeAnimationDuration;
+        return bounceAnimationDuration;
+    }
+
+    return fadeInAnimationDuration;
+}
+
+- (void)present
+{
+    bool wantsBounce = [self _textIndicatorWantsBounce];
+    bool wantsCrossfade = [self _textIndicatorWantsContentCrossfade];
+    bool wantsFadeIn = [self _textIndicatorWantsFadeIn];
+    CFTimeInterval animationDuration = [self _animationDuration];
+
+    _hasCompletedAnimation = false;
+
+    RetainPtr<CAAnimation> presentationAnimation;
+    if (wantsBounce)
+        presentationAnimation = createBounceAnimation(animationDuration);
+    else if (wantsFadeIn)
+        presentationAnimation = createFadeInAnimation(animationDuration);
+
     RetainPtr<CABasicAnimation> crossfadeAnimation;
     RetainPtr<CABasicAnimation> fadeShadowInAnimation;
     if (wantsCrossfade) {
-        crossfadeAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];
-        RetainPtr<CGImageRef> contentsImage = _textIndicator->contentImage()->getCGImageRef();
-        [crossfadeAnimation setToValue:(id)contentsImage.get()];
-        [crossfadeAnimation setFillMode:kCAFillModeForwards];
-        [crossfadeAnimation setRemovedOnCompletion:NO];
-        [crossfadeAnimation setDuration:animationDuration];
-
-        fadeShadowInAnimation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
-        [fadeShadowInAnimation setFromValue:@0];
-        [fadeShadowInAnimation setToValue:@1];
-        [fadeShadowInAnimation setFillMode:kCAFillModeForwards];
-        [fadeShadowInAnimation setRemovedOnCompletion:NO];
-        [fadeShadowInAnimation setDuration:animationDuration];
+        crossfadeAnimation = createContentCrossfadeAnimation(animationDuration, *_textIndicator);
+        fadeShadowInAnimation = createShadowFadeAnimation(animationDuration);
     }
 
     [CATransaction begin];
-    [CATransaction setCompletionBlock:completionHandler];
-    for (CALayer* bounceLayer in _bounceLayers.get()) {
-        [bounceLayer setOpacity:1];
-        [bounceLayer addAnimation:bounceAnimation.get() forKey:@"bounce"];
+    for (CALayer *bounceLayer in _bounceLayers.get()) {
+        if (wantsFadeIn || wantsCrossfade)
+            bounceLayer.speed = 0;
+
+        if (!wantsFadeIn)
+            bounceLayer.opacity = 1;
+
+        if (presentationAnimation)
+            [bounceLayer addAnimation:presentationAnimation.get() forKey:@"presentation"];
+
         if (wantsCrossfade) {
             [[bounceLayer valueForKey:textLayerKey] addAnimation:crossfadeAnimation.get() forKey:@"contentTransition"];
             [[bounceLayer valueForKey:dropShadowLayerKey] addAnimation:fadeShadowInAnimation.get() forKey:@"fadeShadowIn"];
@@ -246,6 +362,28 @@
     [CATransaction commit];
 }
 
+- (void)setAnimationProgress:(float)progress
+{
+    if (_hasCompletedAnimation)
+        return;
+
+    if (progress == 1) {
+        _hasCompletedAnimation = true;
+
+        for (CALayer *bounceLayer in _bounceLayers.get()) {
+            // Continue the animation from wherever it had manually progressed to.
+            CFTimeInterval beginTime = bounceLayer.timeOffset;
+            bounceLayer.speed = 1;
+            beginTime = [bounceLayer convertTime:CACurrentMediaTime() fromLayer:nil] - beginTime;
+            bounceLayer.beginTime = beginTime;
+        }
+    } else {
+        CFTimeInterval animationDuration = [self _animationDuration];
+        for (CALayer *bounceLayer in _bounceLayers.get())
+            bounceLayer.timeOffset = progress * animationDuration;
+    }
+}
+
 - (BOOL)isFlipped
 {
     return YES;
@@ -257,17 +395,37 @@
 
 TextIndicatorWindow::TextIndicatorWindow(NSView *targetView)
     : m_targetView(targetView)
-    , m_startFadeOutTimer(RunLoop::main(), this, &TextIndicatorWindow::startFadeOutTimerFired)
+    , m_startFadeOutTimer(RunLoop::main(), this, &TextIndicatorWindow::startFadeOut)
 {
 }
 
 TextIndicatorWindow::~TextIndicatorWindow()
 {
+    switch (m_textIndicator->presentationTransition()) {
+    case TextIndicatorPresentationTransition::Crossfade:
+    case TextIndicatorPresentationTransition::FadeIn:
+        startFadeOut();
+        return;
+
+    case TextIndicatorPresentationTransition::Bounce:
+    case TextIndicatorPresentationTransition::BounceAndCrossfade:
+    case TextIndicatorPresentationTransition::None:
+        break;
+    }
+
     closeWindow();
 }
 
-void TextIndicatorWindow::setTextIndicator(PassRefPtr<TextIndicator> textIndicator, CGRect contentRect, bool fadeOut, std::function<void ()> animationCompletionHandler)
+void TextIndicatorWindow::setAnimationProgress(float progress)
 {
+    if (!m_textIndicator)
+        return;
+
+    [m_textIndicatorView setAnimationProgress:progress];
+}
+
+void TextIndicatorWindow::setTextIndicator(PassRefPtr<TextIndicator> textIndicator, CGRect contentRect, bool fadeOut)
+{
     if (m_textIndicator == textIndicator)
         return;
 
@@ -296,11 +454,8 @@
     [[m_targetView window] addChildWindow:m_textIndicatorWindow.get() ordered:NSWindowAbove];
     [m_textIndicatorWindow setReleasedWhenClosed:NO];
 
-    if (m_textIndicator->presentationTransition() != TextIndicatorPresentationTransition::None) {
-        [m_textIndicatorView presentWithCompletionHandler:[animationCompletionHandler] {
-            animationCompletionHandler();
-        }];
-    }
+    if (m_textIndicator->presentationTransition() != TextIndicatorPresentationTransition::None)
+        [m_textIndicatorView present];
 
     if (fadeOut)
         m_startFadeOutTimer.startOneShot(timeBeforeFadeStarts);
@@ -318,7 +473,7 @@
     m_textIndicatorWindow = nullptr;
 }
 
-void TextIndicatorWindow::startFadeOutTimerFired()
+void TextIndicatorWindow::startFadeOut()
 {
     RetainPtr<NSWindow> indicatorWindow = m_textIndicatorWindow;
     [m_textIndicatorView hideWithCompletionHandler:[indicatorWindow] {

Modified: branches/safari-600.3-branch/Source/WebCore/platform/spi/mac/NSImmediateActionGestureRecognizerSPI.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebCore/platform/spi/mac/NSImmediateActionGestureRecognizerSPI.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebCore/platform/spi/mac/NSImmediateActionGestureRecognizerSPI.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -55,6 +55,7 @@
 @interface NSImmediateActionGestureRecognizer : NSGestureRecognizer
 
 @property (strong) id<NSImmediateActionAnimationController> animationController;
+@property (readonly) CGFloat animationProgress;
 
 @end
 

Modified: branches/safari-600.3-branch/Source/WebKit/mac/ChangeLog (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/ChangeLog	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/ChangeLog	2014-12-18 00:25:29 UTC (rev 177477)
@@ -1,3 +1,53 @@
+2014-12-17  Matthew Hanson  <[email protected]>
+
+        Merge r177427. rdar://problem/19237945
+
+    2014-12-16  Timothy Horton  <[email protected]>
+
+            Implement and adopt two new TextIndicator presentation animations
+            https://bugs.webkit.org/show_bug.cgi?id=139715
+            <rdar://problem/19237945>
+
+            Reviewed by Anders Carlsson.
+
+            * WebView/WebActionMenuController.mm:
+            (-[WebActionMenuController _showTextIndicator]):
+            * WebView/WebHTMLView.mm:
+            (-[WebHTMLView quickLookWithEvent:]):
+            Remove the completionHandler from text indicator presentation.
+
+            * WebView/WebImmediateActionController.mm:
+            (-[WebImmediateActionController immediateActionRecognizerWillPrepare:]):
+            (-[WebImmediateActionController immediateActionRecognizerDidUpdateAnimation:]):
+            (-[WebImmediateActionController immediateActionRecognizerDidCancelAnimation:]):
+            (-[WebImmediateActionController immediateActionRecognizerDidCompleteAnimation:]):
+            (-[WebImmediateActionController _menuItemForDataDetectedText]):
+            (-[WebImmediateActionController _animationControllerForText]):
+            (-[WebImmediateActionController _showTextIndicator]):
+            Forward immediate action gesture recognizer animation progress
+            to TextIndicator. Force us to keep the selection when immediate
+            action popovers steal first responder status from the WebView.
+            If the Lookup range is equal to the selection range, use a Crossfade
+            animation; otherwise, use a FadeIn animation.
+
+            * WebView/WebView.mm:
+            (-[WebView _setMaintainsInactiveSelection:]):
+            (-[WebView maintainsInactiveSelection]):
+            (-[WebView _animationControllerForDictionaryLookupPopupInfo:]):
+            (-[WebView _setTextIndicator:fadeOut:]):
+            (-[WebView _clearTextIndicator]):
+            (-[WebView _setTextIndicatorAnimationProgress:]):
+            (-[WebView _showDictionaryLookupPopup:]):
+            (-[WebView _dictionaryLookupPopoverWillClose:]):
+            (-[WebView _setTextIndicator:fadeOut:animationCompletionHandler:]):
+            Remove the completionHandler from text indicator presentation.
+            Add a _setMaintainsInactiveSelection, which allows WebKit internals
+            to change the return value of -maintainsInactiveSelection, allowing
+            us to keep the selection alive when the WebView loses first responder status.
+
+            * WebView/WebViewData.h:
+            * WebView/WebViewInternal.h:
+
 2014-12-16  Matthew Hanson  <[email protected]>
 
         Merge r177410. rdar://problem/19271707

Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebActionMenuController.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebActionMenuController.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebActionMenuController.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -810,7 +810,7 @@
         return;
 
     if (_type == WebActionMenuDataDetectedItem && _currentDetectedDataTextIndicator) {
-        [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO animationCompletionHandler:^ { }];
+        [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO];
         _isShowingTextIndicator = YES;
     }
 }

Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebHTMLView.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebHTMLView.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebHTMLView.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -5699,7 +5699,7 @@
 
 - (void)quickLookWithEvent:(NSEvent *)event
 {
-    [[self _webView] _setTextIndicator:nullptr fadeOut:NO animationCompletionHandler:[] { }];
+    [[self _webView] _setTextIndicator:nullptr fadeOut:NO];
     [super quickLookWithEvent:event];
 }
 #endif // !PLATFORM(IOS)

Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebImmediateActionController.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebImmediateActionController.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebImmediateActionController.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -41,6 +41,7 @@
 #import <WebCore/DataDetectorsSPI.h>
 #import <WebCore/DictionaryLookup.h>
 #import <WebCore/EventHandler.h>
+#import <WebCore/FocusController.h>
 #import <WebCore/Frame.h>
 #import <WebCore/FrameView.h>
 #import <WebCore/HTMLConverter.h>
@@ -121,6 +122,8 @@
     if (immediateActionRecognizer != _immediateActionRecognizer)
         return;
 
+    [_webView _setMaintainsInactiveSelection:YES];
+
     WebHTMLView *documentView = [[[_webView _selectedOrMainFrame] frameView] documentView];
     NSPoint locationInDocumentView = [immediateActionRecognizer locationInView:documentView];
     [self performHitTestAtPoint:locationInDocumentView];
@@ -146,12 +149,22 @@
     // FIXME: Add support for the types of functionality provided in Action menu's menuNeedsUpdate.
 }
 
+- (void)immediateActionRecognizerDidUpdateAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
+{
+    if (immediateActionRecognizer != _immediateActionRecognizer)
+        return;
+
+    [_webView _setTextIndicatorAnimationProgress:[immediateActionRecognizer animationProgress]];
+}
+
 - (void)immediateActionRecognizerDidCancelAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
 {
     if (immediateActionRecognizer != _immediateActionRecognizer)
         return;
 
+    [_webView _setTextIndicatorAnimationProgress:0];
     [self _clearImmediateActionState];
+    [_webView _setMaintainsInactiveSelection:NO];
 }
 
 - (void)immediateActionRecognizerDidCompleteAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
@@ -159,7 +172,8 @@
     if (immediateActionRecognizer != _immediateActionRecognizer)
         return;
 
-    // FIXME: Add support for the types of functionality provided in Action menu's willOpenMenu.
+    [_webView _setTextIndicatorAnimationProgress:1];
+    [_webView _setMaintainsInactiveSelection:NO];
 }
 
 #pragma mark Immediate actions
@@ -268,7 +282,7 @@
             return nil;
     }
 
-    _currentDetectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, TextIndicatorPresentationTransition::BounceAndCrossfade);
+    _currentDetectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, TextIndicatorPresentationTransition::FadeIn);
 
     _currentActionContext = [actionContext contextForView:_webView altMode:YES interactionStartedHandler:^() {
     } interactionChangedHandler:^() {
@@ -284,8 +298,6 @@
     if (menuItems.count != 1)
         return nil;
 
-    if (_currentDetectedDataTextIndicator)
-        _currentDetectedDataTextIndicator->setPresentationTransition(TextIndicatorPresentationTransition::Bounce);
     return menuItems.lastObject;
 }
 
@@ -349,7 +361,9 @@
     if (!dictionaryRange)
         return nil;
 
-    DictionaryPopupInfo dictionaryPopupInfo = dictionaryPopupInfoForRange(frame, *dictionaryRange, options, TextIndicatorPresentationTransition::Bounce);
+    RefPtr<Range> selectionRange = frame->page()->focusController().focusedOrMainFrame().selection().selection().firstRange();
+    bool rangeMatchesSelection = areRangesEqual(dictionaryRange.get(), selectionRange.get());
+    DictionaryPopupInfo dictionaryPopupInfo = dictionaryPopupInfoForRange(frame, *dictionaryRange, options, rangeMatchesSelection ? TextIndicatorPresentationTransition::Crossfade : TextIndicatorPresentationTransition::FadeIn);
     if (!dictionaryPopupInfo.attributedString)
         return nil;
 
@@ -364,7 +378,7 @@
         return;
 
     if (_type == WebImmediateActionDataDetectedItem && _currentDetectedDataTextIndicator) {
-        [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO animationCompletionHandler:^ { }];
+        [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO];
         _isShowingTextIndicator = YES;
     }
 }

Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebView.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebView.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebView.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -7200,9 +7200,14 @@
     return [[self _editingDelegateForwarder] webView:self shouldChangeSelectedDOMRange:currentRange toDOMRange:proposedRange affinity:selectionAffinity stillSelecting:flag];
 }
 
+- (void)_setMaintainsInactiveSelection:(BOOL)shouldMaintainInactiveSelection
+{
+    _private->shouldMaintainInactiveSelection = shouldMaintainInactiveSelection;
+}
+
 - (BOOL)maintainsInactiveSelection
 {
-    return NO;
+    return _private->shouldMaintainInactiveSelection;
 }
 
 - (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)selectionAffinity
@@ -8629,6 +8634,7 @@
         if (!mutableOptions)
             mutableOptions = adoptNS([[NSMutableDictionary alloc] init]);
         [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
+        [self _setTextIndicator:dictionaryPopupInfo.textIndicator.get() fadeOut:NO];
         return [getLULookupDefinitionModuleClass() lookupAnimationControllerForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
     }
 
@@ -8636,7 +8642,7 @@
 }
 #endif // __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
 
-- (void)_setTextIndicator:(TextIndicator *)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler
+- (void)_setTextIndicator:(TextIndicator *)textIndicator fadeOut:(BOOL)fadeOut
 {
     if (!textIndicator) {
         _private->textIndicatorWindow = nullptr;
@@ -8647,14 +8653,20 @@
         _private->textIndicatorWindow = std::make_unique<TextIndicatorWindow>(self);
 
     NSRect contentRect = [self.window convertRectToScreen:textIndicator->textBoundingRectInWindowCoordinates()];
-    _private->textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut, WTF::move(completionHandler));
+    _private->textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut);
 }
 
 - (void)_clearTextIndicator
 {
-    [self _setTextIndicator:nullptr fadeOut:NO animationCompletionHandler:^ { }];
+    [self _setTextIndicator:nullptr fadeOut:NO];
 }
 
+- (void)_setTextIndicatorAnimationProgress:(float)progress
+{
+    if (_private->textIndicatorWindow)
+        _private->textIndicatorWindow->setAnimationProgress(progress);
+}
+
 - (void)_showDictionaryLookupPopup:(const DictionaryPopupInfo&)dictionaryPopupInfo
 {
     if (!dictionaryPopupInfo.attributedString)
@@ -8675,16 +8687,15 @@
         if (!mutableOptions)
             mutableOptions = adoptNS([[NSMutableDictionary alloc] init]);
         [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
-        [self _setTextIndicator:dictionaryPopupInfo.textIndicator.get() fadeOut:NO animationCompletionHandler:[dictionaryPopupInfo, textBaselineOrigin, mutableOptions] {
-            [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
-        }];
+        [self _setTextIndicator:dictionaryPopupInfo.textIndicator.get() fadeOut:NO];
+        [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
     } else
         [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:dictionaryPopupInfo.options.get()];
 }
 
 - (void)_dictionaryLookupPopoverWillClose:(NSNotification *)notification
 {
-    [self _setTextIndicator:nullptr fadeOut:NO animationCompletionHandler:[] { }];
+    [self _setTextIndicator:nullptr fadeOut:NO];
 }
 #endif // PLATFORM(MAC)
 

Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewData.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewData.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewData.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -157,6 +157,8 @@
     BOOL hasInitializedLookupObserver;
 #endif // PLATFORM(MAC)
 
+    BOOL shouldMaintainInactiveSelection;
+
     BOOL allowsUndo;
         
     float zoomMultiplier;

Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewInternal.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewInternal.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewInternal.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -257,9 +257,12 @@
 - (NSPoint)_convertPointFromRootView:(NSPoint)point;
 - (NSRect)_convertRectFromRootView:(NSRect)rect;
 
+- (void)_setMaintainsInactiveSelection:(BOOL)shouldMaintainInactiveSelection;
+
 #if PLATFORM(MAC) && defined(__cplusplus)
-- (void)_setTextIndicator:(WebCore::TextIndicator*)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler;
+- (void)_setTextIndicator:(WebCore::TextIndicator*)textIndicator fadeOut:(BOOL)fadeOut;
 - (void)_clearTextIndicator;
+- (void)_setTextIndicatorAnimationProgress:(float)progress;
 - (void)_showDictionaryLookupPopup:(const DictionaryPopupInfo&)dictionaryPopupInfo;
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
 - (id)_animationControllerForDictionaryLookupPopupInfo:(const DictionaryPopupInfo&)dictionaryPopupInfo;

Modified: branches/safari-600.3-branch/Source/WebKit2/ChangeLog (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/ChangeLog	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/ChangeLog	2014-12-18 00:25:29 UTC (rev 177477)
@@ -1,5 +1,66 @@
 2014-12-17  Matthew Hanson  <[email protected]>
 
+        Merge r177427. rdar://problem/19237945
+
+    2014-12-16  Timothy Horton  <[email protected]>
+
+            Implement and adopt two new TextIndicator presentation animations
+            https://bugs.webkit.org/show_bug.cgi?id=139715
+            <rdar://problem/19237945>
+
+            Reviewed by Anders Carlsson.
+
+            * UIProcess/API/mac/WKView.mm:
+            (-[WKView _setTextIndicator:fadeOut:]):
+            (-[WKView _setTextIndicatorAnimationProgress:]):
+            (-[WKView _setTextIndicator:fadeOut:animationCompletionHandler:]): Deleted.
+            * UIProcess/API/mac/WKViewInternal.h:
+            * UIProcess/PageClient.h:
+            * UIProcess/WebPageProxy.cpp:
+            (WebKit::WebPageProxy::WebPageProxy):
+            (WebKit::WebPageProxy::setTextIndicatorAnimationProgress):
+            (WebKit::WebPageProxy::performActionMenuHitTestAtLocation):
+            * UIProcess/WebPageProxy.h:
+            * UIProcess/mac/PageClientImpl.h:
+            * UIProcess/mac/PageClientImpl.mm:
+            (WebKit::PageClientImpl::setTextIndicatorAnimationProgress):
+            (WebKit::PageClientImpl::didPerformDictionaryLookup):
+            Remove the completion handler block argument from TextIndicator
+            installation.
+            Plumb animation progress through PageClient to TextIndicatorWindow.
+
+            * UIProcess/mac/WKActionMenuController.mm:
+            (-[WKActionMenuController prepareForMenu:withEvent:]):
+            (-[WKActionMenuController _defaultMenuItemsForDataDetectedText]):
+            * UIProcess/mac/WKImmediateActionController.mm:
+            (-[WKImmediateActionController _clearImmediateActionState]):
+            (-[WKImmediateActionController immediateActionRecognizerWillPrepare:]):
+            (-[WKImmediateActionController immediateActionRecognizerDidUpdateAnimation:]):
+            (-[WKImmediateActionController immediateActionRecognizerDidCancelAnimation:]):
+            (-[WKImmediateActionController immediateActionRecognizerDidCompleteAnimation:]):
+            (-[WKImmediateActionController _menuItemForDataDetectedText]):
+            (-[WKImmediateActionController _animationControllerForText]):
+            Forward immediate action gesture recognizer animation progress
+            to TextIndicator. Force us to keep the selection when immediate
+            action popovers steal first responder status from the WebView.
+
+            * WebProcess/WebPage/WebPage.h:
+            * WebProcess/WebPage/WebPage.messages.in:
+            * WebProcess/WebPage/mac/WebPageMac.mm:
+            (WebKit::textIndicatorTransitionForActionMenu):
+            (WebKit::WebPage::performActionMenuHitTestAtLocation):
+            Factor out the presentation animation decision code.
+            For immediate actions, of the Lookup range is equal to the
+            selection range, use a Crossfade animation; otherwise, use a FadeIn
+            animation.
+            Push whether the actionMenuHitTest is for an immediate action
+            or a menu to the Web process, to make the presentation animation
+            decision code live entirely in the Web process.
+            Avoid extracting encoded image data if we know we're doing
+            an immediate action and will never need it.
+
+2014-12-17  Matthew Hanson  <[email protected]>
+
         Merge r177411. rdar://problem/19271854
 
     2014-12-16  Beth Dakin  <[email protected]>

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKView.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKView.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKView.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -3093,7 +3093,7 @@
     }
 }
 
-- (void)_setTextIndicator:(PassRefPtr<TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler
+- (void)_setTextIndicator:(PassRefPtr<TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut
 {
     if (!textIndicator) {
         _data->_textIndicatorWindow = nullptr;
@@ -3104,12 +3104,13 @@
         _data->_textIndicatorWindow = std::make_unique<TextIndicatorWindow>(self);
 
     NSRect contentRect = [self.window convertRectToScreen:[self convertRect:textIndicator->textBoundingRectInWindowCoordinates() toView:nil]];
-    _data->_textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut, WTF::move(completionHandler));
+    _data->_textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut);
 }
 
-- (void)_setTextIndicator:(PassRefPtr<TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut
+- (void)_setTextIndicatorAnimationProgress:(float)progress
 {
-    [self _setTextIndicator:textIndicator fadeOut:fadeOut animationCompletionHandler:[] { }];
+    if (_data->_textIndicatorWindow)
+        _data->_textIndicatorWindow->setAnimationProgress(progress);
 }
 
 - (CALayer *)_rootLayer

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -81,7 +81,7 @@
 - (NSRect)_convertToDeviceSpace:(NSRect)rect;
 - (NSRect)_convertToUserSpace:(NSRect)rect;
 - (void)_setTextIndicator:(PassRefPtr<WebCore::TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut;
-- (void)_setTextIndicator:(PassRefPtr<WebCore::TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler;
+- (void)_setTextIndicatorAnimationProgress:(float)progress;
 
 - (void)_setAcceleratedCompositingModeRootLayer:(CALayer *)rootLayer;
 - (CALayer *)_acceleratedCompositingModeRootLayer;

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/PageClient.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/PageClient.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/PageClient.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -215,6 +215,7 @@
 #endif
 
     virtual void setTextIndicator(PassRefPtr<WebCore::TextIndicator>, bool fadeOut) = 0;
+    virtual void setTextIndicatorAnimationProgress(float) = 0;
 
     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&) = 0;
     virtual void exitAcceleratedCompositingMode() = 0;

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp	2014-12-18 00:25:29 UTC (rev 177477)
@@ -283,6 +283,7 @@
     , m_viewState(ViewState::NoFlags)
     , m_viewWasEverInWindow(false)
     , m_backForwardList(WebBackForwardList::create(*this))
+    , m_maintainsInactiveSelection(false)
     , m_loadStateAtProcessExit(FrameLoadState::State::Finished)
 #if PLATFORM(MAC) && !USE(ASYNC_NSTEXTINPUTCLIENT)
     , m_temporarilyClosedComposition(false)
@@ -3575,6 +3576,11 @@
     m_pageClient.setTextIndicator(nullptr, false);
 }
 
+void WebPageProxy::setTextIndicatorAnimationProgress(float progress)
+{
+    m_pageClient.setTextIndicatorAnimationProgress(progress);
+}
+
 void WebPageProxy::didFindString(const String& string, uint32_t matchCount, int32_t matchIndex)
 {
     m_findClient->didFindString(this, string, matchCount, matchIndex);
@@ -5215,9 +5221,9 @@
     m_pageClient.removeNavigationGestureSnapshot();
 }
 
-void WebPageProxy::performActionMenuHitTestAtLocation(FloatPoint point)
+void WebPageProxy::performActionMenuHitTestAtLocation(FloatPoint point, bool forImmediateAction)
 {
-    m_process->send(Messages::WebPage::PerformActionMenuHitTestAtLocation(point), m_pageID);
+    m_process->send(Messages::WebPage::PerformActionMenuHitTestAtLocation(point, forImmediateAction), m_pageID);
 }
 
 void WebPageProxy::selectLastActionMenuRange()

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -659,6 +659,7 @@
     void countStringMatches(const String&, FindOptions, unsigned maxMatchCount);
     void didCountStringMatches(const String&, uint32_t matchCount);
     void setTextIndicator(const WebCore::TextIndicatorData&, bool fadeOut);
+    void setTextIndicatorAnimationProgress(float);
     void clearTextIndicator();
     void didFindString(const String&, uint32_t matchCount, int32_t matchIndex);
     void didFailToFindString(const String&);
@@ -918,7 +919,7 @@
 
 #if PLATFORM(MAC)
     WebHitTestResult* lastMouseMoveHitTestResult() const { return m_lastMouseMoveHitTestResult.get(); }
-    void performActionMenuHitTestAtLocation(WebCore::FloatPoint);
+    void performActionMenuHitTestAtLocation(WebCore::FloatPoint, bool forImmediateAction);
     void selectLastActionMenuRange();
     void focusAndSelectLastActionMenuHitTestResult();
 #endif

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -119,7 +119,8 @@
     virtual PassRefPtr<WebColorPicker> createColorPicker(WebPageProxy*, const WebCore::Color& initialColor, const WebCore::IntRect&);
 #endif
 
-    void setTextIndicator(PassRefPtr<WebCore::TextIndicator>, bool fadeOut);
+    virtual void setTextIndicator(PassRefPtr<WebCore::TextIndicator>, bool fadeOut) override;
+    virtual void setTextIndicatorAnimationProgress(float) override;
 
     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
     virtual void exitAcceleratedCompositingMode();

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -486,6 +486,11 @@
     [m_wkView _setTextIndicator:textIndicator fadeOut:fadeOut];
 }
 
+void PageClientImpl::setTextIndicatorAnimationProgress(float progress)
+{
+    [m_wkView _setTextIndicatorAnimationProgress:progress];
+}
+
 void PageClientImpl::accessibilityWebProcessTokenReceived(const IPC::DataReference& data)
 {
     NSData* remoteToken = [NSData dataWithBytes:data.data() length:data.size()];
@@ -560,10 +565,9 @@
         // Run the animations serially because attaching another subwindow breaks the bounce animation.
         // We could consider making the bounce NSAnimationNonblockingThreaded instead, which seems
         // to work, but need to consider all of the implications.
-        [m_wkView _setTextIndicator:TextIndicator::create(dictionaryPopupInfo.textIndicator) fadeOut:NO animationCompletionHandler:[dictionaryPopupInfo, textBaselineOrigin, mutableOptions] {
-            [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
-            [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.string.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
-        }];
+        [m_wkView _setTextIndicator:TextIndicator::create(dictionaryPopupInfo.textIndicator) fadeOut:NO];
+        [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
+        [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.string.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
     } else
         [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.string.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
 }

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -101,7 +101,7 @@
 
     [_wkView _dismissContentRelativeChildWindows];
 
-    _page->performActionMenuHitTestAtLocation([_wkView convertPoint:event.locationInWindow fromView:nil]);
+    _page->performActionMenuHitTestAtLocation([_wkView convertPoint:event.locationInWindow fromView:nil], false);
 
     _state = ActionMenuState::Pending;
     [self _updateActionMenuItems];
@@ -399,8 +399,6 @@
     [_currentActionContext setHighlightFrame:[_wkView.window convertRectToScreen:[_wkView convertRect:_hitTestResult.detectedDataBoundingBox toView:nil]]];
 
     NSArray *menuItems = [[getDDActionsManagerClass() sharedManager] menuItemsForResult:[_currentActionContext mainResult] actionContext:_currentActionContext.get()];
-    if (menuItems.count == 1 && _hitTestResult.detectedDataTextIndicator)
-        _hitTestResult.detectedDataTextIndicator->setPresentationTransition(TextIndicatorPresentationTransition::Bounce);
     return menuItems;
 }
 

Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKImmediateActionController.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKImmediateActionController.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKImmediateActionController.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -101,6 +101,12 @@
 
 - (void)_clearImmediateActionState
 {
+#if WK_API_ENABLED
+    [self hidePreview];
+#endif
+
+    _page->clearTextIndicator();
+
     if (_currentActionContext && _hasActivatedActionContext) {
         [getDDActionsManagerClass() didUseActions];
         _hasActivatedActionContext = NO;
@@ -130,10 +136,12 @@
     if (immediateActionRecognizer != _immediateActionRecognizer)
         return;
 
+    _page->setMaintainsInactiveSelection(true);
+
     [_wkView _dismissContentRelativeChildWindows];
 
     _eventLocationInView = [immediateActionRecognizer locationInView:immediateActionRecognizer.view];
-    _page->performActionMenuHitTestAtLocation(_eventLocationInView);
+    _page->performActionMenuHitTestAtLocation(_eventLocationInView, true);
 
     _state = ImmediateActionState::Pending;
     [self _updateImmediateActionItem];
@@ -172,12 +180,22 @@
     }
 }
 
+- (void)immediateActionRecognizerDidUpdateAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
+{
+    if (immediateActionRecognizer != _immediateActionRecognizer)
+        return;
+
+    _page->setTextIndicatorAnimationProgress([immediateActionRecognizer animationProgress]);
+}
+
 - (void)immediateActionRecognizerDidCancelAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
 {
     if (immediateActionRecognizer != _immediateActionRecognizer)
         return;
 
+    _page->setTextIndicatorAnimationProgress(0);
     [self _clearImmediateActionState];
+    _page->setMaintainsInactiveSelection(false);
 }
 
 - (void)immediateActionRecognizerDidCompleteAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
@@ -185,7 +203,8 @@
     if (immediateActionRecognizer != _immediateActionRecognizer)
         return;
 
-    // FIXME: Add support for the types of functionality provided in Action menu's willOpenMenu.
+    _page->setTextIndicatorAnimationProgress(1);
+    _page->setMaintainsInactiveSelection(false);
 }
 
 - (PassRefPtr<WebHitTestResult>)_webHitTestResult
@@ -507,8 +526,6 @@
     if (menuItems.count != 1)
         return nil;
 
-    if (_hitTestResult.detectedDataTextIndicator)
-        _hitTestResult.detectedDataTextIndicator->setPresentationTransition(TextIndicatorPresentationTransition::Bounce);
     return menuItems.lastObject;
 }
 
@@ -533,6 +550,7 @@
 
     RetainPtr<NSMutableDictionary> mutableOptions = adoptNS([(NSDictionary *)dictionaryPopupInfo.options.get() mutableCopy]);
     if (canLoadLUTermOptionDisableSearchTermIndicator() && dictionaryPopupInfo.textIndicator.contentImage) {
+        [_wkView _setTextIndicator:TextIndicator::create(dictionaryPopupInfo.textIndicator) fadeOut:NO];
         [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
         return [getLULookupDefinitionModuleClass() lookupAnimationControllerForTerm:dictionaryPopupInfo.attributedString.string.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
     }

Modified: branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.h (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.h	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.h	2014-12-18 00:25:29 UTC (rev 177477)
@@ -1045,7 +1045,7 @@
     void reportUsedFeatures();
 
 #if PLATFORM(MAC)
-    void performActionMenuHitTestAtLocation(WebCore::FloatPoint);
+    void performActionMenuHitTestAtLocation(WebCore::FloatPoint, bool forImmediateAction);
     PassRefPtr<WebCore::Range> lookupTextAtLocation(WebCore::FloatPoint, NSDictionary **options);
     void selectLastActionMenuRange();
     void focusAndSelectLastActionMenuHitTestResult();

Modified: branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in	2014-12-18 00:25:29 UTC (rev 177477)
@@ -388,7 +388,7 @@
     TakeSnapshot(WebCore::IntRect snapshotRect, WebCore::IntSize bitmapSize, uint32_t options, uint64_t callbackID)
 
 #if PLATFORM(MAC)
-    PerformActionMenuHitTestAtLocation(WebCore::FloatPoint location)
+    PerformActionMenuHitTestAtLocation(WebCore::FloatPoint location, bool forImmediateAction)
     SelectLastActionMenuRange()
     FocusAndSelectLastActionMenuHitTestResult()
     DataDetectorsDidPresentUI(WebCore::PageOverlay::PageOverlayID pageOverlay)

Modified: branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (177476 => 177477)


--- branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm	2014-12-18 00:25:22 UTC (rev 177476)
+++ branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm	2014-12-18 00:25:29 UTC (rev 177477)
@@ -973,8 +973,15 @@
     return String();
 }
 
-void WebPage::performActionMenuHitTestAtLocation(WebCore::FloatPoint locationInViewCooordinates)
+static TextIndicatorPresentationTransition textIndicatorTransitionForActionMenu(Range* selectionRange, Range& indicatorRange, bool forImmediateAction, bool forDataDetectors)
 {
+    if (areRangesEqual(&indicatorRange, selectionRange) || (forDataDetectors && !forImmediateAction))
+        return forImmediateAction ? TextIndicatorPresentationTransition::Crossfade : TextIndicatorPresentationTransition::BounceAndCrossfade;
+    return forImmediateAction ? TextIndicatorPresentationTransition::FadeIn : TextIndicatorPresentationTransition::Bounce;
+}
+
+void WebPage::performActionMenuHitTestAtLocation(WebCore::FloatPoint locationInViewCooordinates, bool forImmediateAction)
+{
     layoutIfNeeded();
 
     MainFrame& mainFrame = corePage()->mainFrame();
@@ -990,26 +997,31 @@
     actionMenuResult.hitTestLocationInViewCooordinates = locationInViewCooordinates;
     actionMenuResult.hitTestResult = WebHitTestResult::Data(hitTestResult);
 
+    RefPtr<Range> selectionRange = corePage()->focusController().focusedOrMainFrame().selection().selection().firstRange();
+
     NSDictionary *options = nil;
-    RefPtr<WebCore::Range> lookupRange = lookupTextAtLocation(locationInViewCooordinates, &options);
+    RefPtr<Range> lookupRange = lookupTextAtLocation(locationInViewCooordinates, &options);
     actionMenuResult.lookupText = lookupRange ? lookupRange->text() : String();
+
     if (lookupRange) {
         if (Node* node = hitTestResult.innerNode()) {
             if (Frame* hitTestResultFrame = node->document().frame())
-                actionMenuResult.dictionaryPopupInfo = dictionaryPopupInfoForRange(hitTestResultFrame, *lookupRange.get(), &options, TextIndicatorPresentationTransition::Bounce);
+                actionMenuResult.dictionaryPopupInfo = dictionaryPopupInfoForRange(hitTestResultFrame, *lookupRange.get(), &options, textIndicatorTransitionForActionMenu(selectionRange.get(), *lookupRange, forImmediateAction, false));
         }
     }
 
     m_lastActionMenuRangeForSelection = lookupRange;
     m_lastActionMenuHitTestResult = hitTestResult;
 
-    if (Image* image = hitTestResult.image()) {
-        RefPtr<SharedBuffer> buffer = image->data();
-        String imageExtension = image->filenameExtension();
-        if (!imageExtension.isEmpty() && buffer) {
-            actionMenuResult.imageSharedMemory = SharedMemory::create(buffer->size());
-            memcpy(actionMenuResult.imageSharedMemory->data(), buffer->data(), buffer->size());
-            actionMenuResult.imageExtension = imageExtension;
+    if (!forImmediateAction) {
+        if (Image* image = hitTestResult.image()) {
+            RefPtr<SharedBuffer> buffer = image->data();
+            String imageExtension = image->filenameExtension();
+            if (!imageExtension.isEmpty() && buffer) {
+                actionMenuResult.imageSharedMemory = SharedMemory::create(buffer->size());
+                memcpy(actionMenuResult.imageSharedMemory->data(), buffer->data(), buffer->size());
+                actionMenuResult.imageExtension = imageExtension;
+            }
         }
     }
 
@@ -1035,7 +1047,7 @@
             detectedDataBoundingBox.unite(frameView->contentsToWindow(quad.enclosingBoundingBox()));
 
         actionMenuResult.detectedDataBoundingBox = detectedDataBoundingBox;
-        actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*mainResultRange, TextIndicatorPresentationTransition::BounceAndCrossfade);
+        actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*mainResultRange, textIndicatorTransitionForActionMenu(selectionRange.get(), *mainResultRange, forImmediateAction, true));
         actionMenuResult.detectedDataOriginatingPageOverlay = overlay->pageOverlayID();
         m_lastActionMenuRangeForSelection = mainResultRange;
 
@@ -1049,7 +1061,7 @@
         actionMenuResult.actionContext = DataDetection::detectItemAroundHitTestResult(hitTestResult, detectedDataBoundingBox, detectedDataRange);
         if (actionMenuResult.actionContext && detectedDataRange) {
             actionMenuResult.detectedDataBoundingBox = detectedDataBoundingBox;
-            actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, TextIndicatorPresentationTransition::BounceAndCrossfade);
+            actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, textIndicatorTransitionForActionMenu(selectionRange.get(), *detectedDataRange, forImmediateAction, true));
             m_lastActionMenuRangeForSelection = detectedDataRange;
         }
     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to