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;
}
}