<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[177477] branches/safari-600.3-branch/Source</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/177477">177477</a></dd>
<dt>Author</dt> <dd>matthew_hanson@apple.com</dd>
<dt>Date</dt> <dd>2014-12-17 16:25:29 -0800 (Wed, 17 Dec 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/177427">r177427</a>. rdar://problem/19237945</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari6003branchSourceWebCoreChangeLog">branches/safari-600.3-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari6003branchSourceWebCoreWebCoreexpin">branches/safari-600.3-branch/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#branchessafari6003branchSourceWebCorepageTextIndicatorcpp">branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.cpp</a></li>
<li><a href="#branchessafari6003branchSourceWebCorepageTextIndicatorh">branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.h</a></li>
<li><a href="#branchessafari6003branchSourceWebCorepagemacTextIndicatorWindowh">branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.h</a></li>
<li><a href="#branchessafari6003branchSourceWebCorepagemacTextIndicatorWindowmm">branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebCoreplatformspimacNSImmediateActionGestureRecognizerSPIh">branches/safari-600.3-branch/Source/WebCore/platform/spi/mac/NSImmediateActionGestureRecognizerSPI.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacChangeLog">branches/safari-600.3-branch/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacWebViewWebActionMenuControllermm">branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebActionMenuController.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacWebViewWebHTMLViewmm">branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebHTMLView.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacWebViewWebImmediateActionControllermm">branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebImmediateActionController.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacWebViewWebViewmm">branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebView.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacWebViewWebViewDatah">branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewData.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKitmacWebViewWebViewInternalh">branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewInternal.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2ChangeLog">branches/safari-600.3-branch/Source/WebKit2/ChangeLog</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessAPImacWKViewmm">branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKView.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessAPImacWKViewInternalh">branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessPageClienth">branches/safari-600.3-branch/Source/WebKit2/UIProcess/PageClient.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessWebPageProxycpp">branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessWebPageProxyh">branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessmacPageClientImplh">branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessmacPageClientImplmm">branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessmacWKActionMenuControllermm">branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2UIProcessmacWKImmediateActionControllermm">branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKImmediateActionController.mm</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2WebProcessWebPageWebPageh">branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2WebProcessWebPageWebPagemessagesin">branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#branchessafari6003branchSourceWebKit2WebProcessWebPagemacWebPageMacmm">branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari6003branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/ChangeLog (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,5 +1,69 @@
</span><span class="cx"> 2014-12-17 Matthew Hanson <matthew_hanson@apple.com>
</span><span class="cx">
</span><ins>+ Merge r177427. rdar://problem/19237945
+
+ 2014-12-16 Timothy Horton <timothy_horton@apple.com>
+
+ 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 <matthew_hanson@apple.com>
+
</ins><span class="cx"> Merge r177409. rdar://problem/19271854
</span><span class="cx">
</span><span class="cx"> 2014-12-16 Beth Dakin <bdakin@apple.com>
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/WebCore.exp.in (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1810,6 +1810,7 @@
</span><span class="cx"> __ZNK7WebCore16IconDatabaseBase12databasePathEv
</span><span class="cx"> __ZNK7WebCore16ResourceResponse13nsURLResponseEv
</span><span class="cx"> __ZNK7WebCore16ResourceResponse16certificateChainEv
</span><ins>+__ZNK7WebCore16VisibleSelection10firstRangeEv
</ins><span class="cx"> __ZNK7WebCore16VisibleSelection17isContentEditableEv
</span><span class="cx"> __ZNK7WebCore16VisibleSelection17isInPasswordFieldEv
</span><span class="cx"> __ZNK7WebCore16VisibleSelection17toNormalizedRangeEv
</span><span class="lines">@@ -2298,7 +2299,8 @@
</span><span class="cx"> __ZN7WebCore17ScrollbarThemeMac24removeOverhangAreaShadowEP7CALayer
</span><span class="cx"> __ZN7WebCore17ScrollbarThemeMac27setUpOverhangAreaBackgroundEP7CALayerRKNS_5ColorE
</span><span class="cx"> __ZN7WebCore17ScrollbarThemeMac28removeOverhangAreaBackgroundEP7CALayer
</span><del>-__ZN7WebCore19TextIndicatorWindow16setTextIndicatorEN3WTF10PassRefPtrINS_13TextIndicatorEEE6CGRectbNSt3__18functionIFvvEEE
</del><ins>+__ZN7WebCore19TextIndicatorWindow16setTextIndicatorEN3WTF10PassRefPtrINS_13TextIndicatorEEE6CGRectb
+__ZN7WebCore19TextIndicatorWindow20setAnimationProgressEf
</ins><span class="cx"> __ZN7WebCore19TextIndicatorWindowC1EP6NSView
</span><span class="cx"> __ZN7WebCore19TextIndicatorWindowD1Ev
</span><span class="cx"> __ZN7WebCore19applicationIsSafariEv
</span><span class="lines">@@ -3416,7 +3418,6 @@
</span><span class="cx"> __ZN7WebCore8PositionC1EN3WTF10PassRefPtrINS_4NodeEEENS0_10AnchorTypeE
</span><span class="cx"> __ZNK7WebCore11ImageBuffer7contextEv
</span><span class="cx"> __ZNK7WebCore11ImageBuffer9copyImageENS_16BackingStoreCopyENS_13ScaleBehaviorE
</span><del>-__ZNK7WebCore16VisibleSelection10firstRangeEv
</del><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if ENABLE(SPEECH_SYNTHESIS)
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebCorepageTextIndicatorcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.cpp (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx">
</span><span class="cx"> RefPtr<Image> indicatorBitmapWithHighlight;
</span><del>- if (presentationTransition == TextIndicatorPresentationTransition::BounceAndCrossfade)
</del><ins>+ if (presentationTransition == TextIndicatorPresentationTransition::BounceAndCrossfade || presentationTransition == TextIndicatorPresentationTransition::Crossfade)
</ins><span class="cx"> indicatorBitmapWithHighlight = snapshotSelectionWithHighlight(frame);
</span><span class="cx">
</span><span class="cx"> // Store the selection rect in window coordinates, to be used subsequently
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebCorepageTextIndicatorh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/page/TextIndicator.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -47,7 +47,9 @@
</span><span class="cx"> enum class TextIndicatorPresentationTransition {
</span><span class="cx"> None,
</span><span class="cx"> Bounce,
</span><del>- BounceAndCrossfade
</del><ins>+ BounceAndCrossfade,
+ FadeIn,
+ Crossfade
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> struct TextIndicatorData {
</span><span class="lines">@@ -74,8 +76,8 @@
</span><span class="cx"> float contentImageScaleFactor() const { return m_data.contentImageScaleFactor; }
</span><span class="cx"> Image *contentImageWithHighlight() const { return m_data.contentImageWithHighlight.get(); }
</span><span class="cx"> Image *contentImage() const { return m_data.contentImage.get(); }
</span><ins>+
</ins><span class="cx"> TextIndicatorPresentationTransition presentationTransition() const { return m_data.presentationTransition; }
</span><del>-
</del><span class="cx"> void setPresentationTransition(TextIndicatorPresentationTransition transition) { m_data.presentationTransition = transition; }
</span><span class="cx">
</span><span class="cx"> TextIndicatorData data() const { return m_data; }
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebCorepagemacTextIndicatorWindowh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx">
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">
</span><del>-#import <functional>
</del><span class="cx"> #import <wtf/Noncopyable.h>
</span><span class="cx"> #import <wtf/RefPtr.h>
</span><span class="cx"> #import <wtf/RetainPtr.h>
</span><span class="lines">@@ -48,12 +47,14 @@
</span><span class="cx"> explicit TextIndicatorWindow(NSView *);
</span><span class="cx"> ~TextIndicatorWindow();
</span><span class="cx">
</span><del>- void setTextIndicator(PassRefPtr<TextIndicator>, CGRect contentRect, bool fadeOut, std::function<void ()> animationCompletionHandler);
</del><ins>+ void setTextIndicator(PassRefPtr<TextIndicator>, CGRect contentRect, bool fadeOut);
</ins><span class="cx">
</span><ins>+ void setAnimationProgress(float);
+
</ins><span class="cx"> private:
</span><span class="cx"> void closeWindow();
</span><span class="cx">
</span><del>- void startFadeOutTimerFired();
</del><ins>+ void startFadeOut();
</ins><span class="cx">
</span><span class="cx"> NSView *m_targetView;
</span><span class="cx"> RefPtr<TextIndicator> m_textIndicator;
</span><span class="lines">@@ -61,8 +62,6 @@
</span><span class="cx"> RetainPtr<WebTextIndicatorView> m_textIndicatorView;
</span><span class="cx">
</span><span class="cx"> RunLoop::Timer<TextIndicatorWindow> m_startFadeOutTimer;
</span><del>-
- std::function<void ()> m_bounceAnimationCompletionHandler;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebCorepagemacTextIndicatorWindowmm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/page/mac/TextIndicatorWindow.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx">
</span><span class="cx"> const CFTimeInterval bounceAnimationDuration = 0.12;
</span><span class="cx"> const CFTimeInterval bounceWithCrossfadeAnimationDuration = 0.3;
</span><ins>+const CFTimeInterval fadeInAnimationDuration = 0.15;
</ins><span class="cx"> const CFTimeInterval timeBeforeFadeStarts = bounceAnimationDuration + 0.2;
</span><span class="cx"> const CFTimeInterval fadeOutAnimationDuration = 0.3;
</span><span class="cx">
</span><span class="lines">@@ -69,13 +70,16 @@
</span><span class="cx"> RefPtr<TextIndicator> _textIndicator;
</span><span class="cx"> RetainPtr<NSArray> _bounceLayers;
</span><span class="cx"> NSSize _margin;
</span><ins>+ bool _hasCompletedAnimation;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (instancetype)initWithFrame:(NSRect)frame textIndicator:(PassRefPtr<TextIndicator>)textIndicator margin:(NSSize)margin;
</span><span class="cx">
</span><del>-- (void)presentWithCompletionHandler:(void(^)(void))completionHandler;
</del><ins>+- (void)present;
</ins><span class="cx"> - (void)hideWithCompletionHandler:(void(^)(void))completionHandler;
</span><span class="cx">
</span><ins>+- (void)setAnimationProgress:(float)progress;
+
</ins><span class="cx"> @end
</span><span class="cx">
</span><span class="cx"> @implementation WebTextIndicatorView
</span><span class="lines">@@ -91,7 +95,7 @@
</span><span class="cx"> self.wantsLayer = YES;
</span><span class="cx"> self.layer.anchorPoint = CGPointZero;
</span><span class="cx">
</span><del>- bool wantsCrossfade = _textIndicator->presentationTransition() == TextIndicatorPresentationTransition::BounceAndCrossfade;
</del><ins>+ bool wantsCrossfade = [self _textIndicatorWantsContentCrossfade];
</ins><span class="cx">
</span><span class="cx"> FloatSize contentsImageLogicalSize = _textIndicator->contentImage()->size();
</span><span class="cx"> contentsImageLogicalSize.scale(1 / _textIndicator->contentImageScaleFactor());
</span><span class="lines">@@ -187,41 +191,153 @@
</span><span class="cx"> return self;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-- (void)presentWithCompletionHandler:(void(^)(void))completionHandler
</del><ins>+static RetainPtr<CAKeyframeAnimation> createBounceAnimation(CFTimeInterval duration)
</ins><span class="cx"> {
</span><del>- bool wantsCrossfade = _textIndicator->presentationTransition() == TextIndicatorPresentationTransition::BounceAndCrossfade;
- double animationDuration = wantsCrossfade ? bounceWithCrossfadeAnimationDuration : bounceAnimationDuration;
</del><span class="cx"> RetainPtr<CAKeyframeAnimation> bounceAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
</span><span class="cx"> [bounceAnimation setValues:@[
</span><span class="cx"> [NSValue valueWithCATransform3D:CATransform3DIdentity],
</span><span class="cx"> [NSValue valueWithCATransform3D:CATransform3DMakeScale(midBounceScale, midBounceScale, 1)],
</span><span class="cx"> [NSValue valueWithCATransform3D:CATransform3DIdentity]
</span><span class="cx"> ]];
</span><del>- [bounceAnimation setDuration:animationDuration];
</del><ins>+ [bounceAnimation setDuration:duration];
</ins><span class="cx">
</span><ins>+ 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);
+
</ins><span class="cx"> RetainPtr<CABasicAnimation> crossfadeAnimation;
</span><span class="cx"> RetainPtr<CABasicAnimation> fadeShadowInAnimation;
</span><span class="cx"> if (wantsCrossfade) {
</span><del>- 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];
</del><ins>+ crossfadeAnimation = createContentCrossfadeAnimation(animationDuration, *_textIndicator);
+ fadeShadowInAnimation = createShadowFadeAnimation(animationDuration);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> [CATransaction begin];
</span><del>- [CATransaction setCompletionBlock:completionHandler];
- for (CALayer* bounceLayer in _bounceLayers.get()) {
- [bounceLayer setOpacity:1];
- [bounceLayer addAnimation:bounceAnimation.get() forKey:@"bounce"];
</del><ins>+ 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"];
+
</ins><span class="cx"> if (wantsCrossfade) {
</span><span class="cx"> [[bounceLayer valueForKey:textLayerKey] addAnimation:crossfadeAnimation.get() forKey:@"contentTransition"];
</span><span class="cx"> [[bounceLayer valueForKey:dropShadowLayerKey] addAnimation:fadeShadowInAnimation.get() forKey:@"fadeShadowIn"];
</span><span class="lines">@@ -246,6 +362,28 @@
</span><span class="cx"> [CATransaction commit];
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (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;
+ }
+}
+
</ins><span class="cx"> - (BOOL)isFlipped
</span><span class="cx"> {
</span><span class="cx"> return YES;
</span><span class="lines">@@ -257,17 +395,37 @@
</span><span class="cx">
</span><span class="cx"> TextIndicatorWindow::TextIndicatorWindow(NSView *targetView)
</span><span class="cx"> : m_targetView(targetView)
</span><del>- , m_startFadeOutTimer(RunLoop::main(), this, &TextIndicatorWindow::startFadeOutTimerFired)
</del><ins>+ , m_startFadeOutTimer(RunLoop::main(), this, &TextIndicatorWindow::startFadeOut)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> TextIndicatorWindow::~TextIndicatorWindow()
</span><span class="cx"> {
</span><ins>+ switch (m_textIndicator->presentationTransition()) {
+ case TextIndicatorPresentationTransition::Crossfade:
+ case TextIndicatorPresentationTransition::FadeIn:
+ startFadeOut();
+ return;
+
+ case TextIndicatorPresentationTransition::Bounce:
+ case TextIndicatorPresentationTransition::BounceAndCrossfade:
+ case TextIndicatorPresentationTransition::None:
+ break;
+ }
+
</ins><span class="cx"> closeWindow();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void TextIndicatorWindow::setTextIndicator(PassRefPtr<TextIndicator> textIndicator, CGRect contentRect, bool fadeOut, std::function<void ()> animationCompletionHandler)
</del><ins>+void TextIndicatorWindow::setAnimationProgress(float progress)
</ins><span class="cx"> {
</span><ins>+ if (!m_textIndicator)
+ return;
+
+ [m_textIndicatorView setAnimationProgress:progress];
+}
+
+void TextIndicatorWindow::setTextIndicator(PassRefPtr<TextIndicator> textIndicator, CGRect contentRect, bool fadeOut)
+{
</ins><span class="cx"> if (m_textIndicator == textIndicator)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -296,11 +454,8 @@
</span><span class="cx"> [[m_targetView window] addChildWindow:m_textIndicatorWindow.get() ordered:NSWindowAbove];
</span><span class="cx"> [m_textIndicatorWindow setReleasedWhenClosed:NO];
</span><span class="cx">
</span><del>- if (m_textIndicator->presentationTransition() != TextIndicatorPresentationTransition::None) {
- [m_textIndicatorView presentWithCompletionHandler:[animationCompletionHandler] {
- animationCompletionHandler();
- }];
- }
</del><ins>+ if (m_textIndicator->presentationTransition() != TextIndicatorPresentationTransition::None)
+ [m_textIndicatorView present];
</ins><span class="cx">
</span><span class="cx"> if (fadeOut)
</span><span class="cx"> m_startFadeOutTimer.startOneShot(timeBeforeFadeStarts);
</span><span class="lines">@@ -318,7 +473,7 @@
</span><span class="cx"> m_textIndicatorWindow = nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void TextIndicatorWindow::startFadeOutTimerFired()
</del><ins>+void TextIndicatorWindow::startFadeOut()
</ins><span class="cx"> {
</span><span class="cx"> RetainPtr<NSWindow> indicatorWindow = m_textIndicatorWindow;
</span><span class="cx"> [m_textIndicatorView hideWithCompletionHandler:[indicatorWindow] {
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebCoreplatformspimacNSImmediateActionGestureRecognizerSPIh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebCore/platform/spi/mac/NSImmediateActionGestureRecognizerSPI.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx"> @interface NSImmediateActionGestureRecognizer : NSGestureRecognizer
</span><span class="cx">
</span><span class="cx"> @property (strong) id<NSImmediateActionAnimationController> animationController;
</span><ins>+@property (readonly) CGFloat animationProgress;
</ins><span class="cx">
</span><span class="cx"> @end
</span><span class="cx">
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/ChangeLog (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,53 @@
</span><ins>+2014-12-17 Matthew Hanson <matthew_hanson@apple.com>
+
+ Merge r177427. rdar://problem/19237945
+
+ 2014-12-16 Timothy Horton <timothy_horton@apple.com>
+
+ 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:
+
</ins><span class="cx"> 2014-12-16 Matthew Hanson <matthew_hanson@apple.com>
</span><span class="cx">
</span><span class="cx"> Merge r177410. rdar://problem/19271707
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacWebViewWebActionMenuControllermm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebActionMenuController.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -810,7 +810,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> if (_type == WebActionMenuDataDetectedItem && _currentDetectedDataTextIndicator) {
</span><del>- [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO animationCompletionHandler:^ { }];
</del><ins>+ [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO];
</ins><span class="cx"> _isShowingTextIndicator = YES;
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacWebViewWebHTMLViewmm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebHTMLView.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -5699,7 +5699,7 @@
</span><span class="cx">
</span><span class="cx"> - (void)quickLookWithEvent:(NSEvent *)event
</span><span class="cx"> {
</span><del>- [[self _webView] _setTextIndicator:nullptr fadeOut:NO animationCompletionHandler:[] { }];
</del><ins>+ [[self _webView] _setTextIndicator:nullptr fadeOut:NO];
</ins><span class="cx"> [super quickLookWithEvent:event];
</span><span class="cx"> }
</span><span class="cx"> #endif // !PLATFORM(IOS)
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacWebViewWebImmediateActionControllermm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebImmediateActionController.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #import <WebCore/DataDetectorsSPI.h>
</span><span class="cx"> #import <WebCore/DictionaryLookup.h>
</span><span class="cx"> #import <WebCore/EventHandler.h>
</span><ins>+#import <WebCore/FocusController.h>
</ins><span class="cx"> #import <WebCore/Frame.h>
</span><span class="cx"> #import <WebCore/FrameView.h>
</span><span class="cx"> #import <WebCore/HTMLConverter.h>
</span><span class="lines">@@ -121,6 +122,8 @@
</span><span class="cx"> if (immediateActionRecognizer != _immediateActionRecognizer)
</span><span class="cx"> return;
</span><span class="cx">
</span><ins>+ [_webView _setMaintainsInactiveSelection:YES];
+
</ins><span class="cx"> WebHTMLView *documentView = [[[_webView _selectedOrMainFrame] frameView] documentView];
</span><span class="cx"> NSPoint locationInDocumentView = [immediateActionRecognizer locationInView:documentView];
</span><span class="cx"> [self performHitTestAtPoint:locationInDocumentView];
</span><span class="lines">@@ -146,12 +149,22 @@
</span><span class="cx"> // FIXME: Add support for the types of functionality provided in Action menu's menuNeedsUpdate.
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)immediateActionRecognizerDidUpdateAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
+{
+ if (immediateActionRecognizer != _immediateActionRecognizer)
+ return;
+
+ [_webView _setTextIndicatorAnimationProgress:[immediateActionRecognizer animationProgress]];
+}
+
</ins><span class="cx"> - (void)immediateActionRecognizerDidCancelAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
</span><span class="cx"> {
</span><span class="cx"> if (immediateActionRecognizer != _immediateActionRecognizer)
</span><span class="cx"> return;
</span><span class="cx">
</span><ins>+ [_webView _setTextIndicatorAnimationProgress:0];
</ins><span class="cx"> [self _clearImmediateActionState];
</span><ins>+ [_webView _setMaintainsInactiveSelection:NO];
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)immediateActionRecognizerDidCompleteAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
</span><span class="lines">@@ -159,7 +172,8 @@
</span><span class="cx"> if (immediateActionRecognizer != _immediateActionRecognizer)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- // FIXME: Add support for the types of functionality provided in Action menu's willOpenMenu.
</del><ins>+ [_webView _setTextIndicatorAnimationProgress:1];
+ [_webView _setMaintainsInactiveSelection:NO];
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #pragma mark Immediate actions
</span><span class="lines">@@ -268,7 +282,7 @@
</span><span class="cx"> return nil;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- _currentDetectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, TextIndicatorPresentationTransition::BounceAndCrossfade);
</del><ins>+ _currentDetectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, TextIndicatorPresentationTransition::FadeIn);
</ins><span class="cx">
</span><span class="cx"> _currentActionContext = [actionContext contextForView:_webView altMode:YES interactionStartedHandler:^() {
</span><span class="cx"> } interactionChangedHandler:^() {
</span><span class="lines">@@ -284,8 +298,6 @@
</span><span class="cx"> if (menuItems.count != 1)
</span><span class="cx"> return nil;
</span><span class="cx">
</span><del>- if (_currentDetectedDataTextIndicator)
- _currentDetectedDataTextIndicator->setPresentationTransition(TextIndicatorPresentationTransition::Bounce);
</del><span class="cx"> return menuItems.lastObject;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -349,7 +361,9 @@
</span><span class="cx"> if (!dictionaryRange)
</span><span class="cx"> return nil;
</span><span class="cx">
</span><del>- DictionaryPopupInfo dictionaryPopupInfo = dictionaryPopupInfoForRange(frame, *dictionaryRange, options, TextIndicatorPresentationTransition::Bounce);
</del><ins>+ 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);
</ins><span class="cx"> if (!dictionaryPopupInfo.attributedString)
</span><span class="cx"> return nil;
</span><span class="cx">
</span><span class="lines">@@ -364,7 +378,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> if (_type == WebImmediateActionDataDetectedItem && _currentDetectedDataTextIndicator) {
</span><del>- [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO animationCompletionHandler:^ { }];
</del><ins>+ [_webView _setTextIndicator:_currentDetectedDataTextIndicator.get() fadeOut:NO];
</ins><span class="cx"> _isShowingTextIndicator = YES;
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebView.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -7200,9 +7200,14 @@
</span><span class="cx"> return [[self _editingDelegateForwarder] webView:self shouldChangeSelectedDOMRange:currentRange toDOMRange:proposedRange affinity:selectionAffinity stillSelecting:flag];
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)_setMaintainsInactiveSelection:(BOOL)shouldMaintainInactiveSelection
+{
+ _private->shouldMaintainInactiveSelection = shouldMaintainInactiveSelection;
+}
+
</ins><span class="cx"> - (BOOL)maintainsInactiveSelection
</span><span class="cx"> {
</span><del>- return NO;
</del><ins>+ return _private->shouldMaintainInactiveSelection;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)selectionAffinity
</span><span class="lines">@@ -8629,6 +8634,7 @@
</span><span class="cx"> if (!mutableOptions)
</span><span class="cx"> mutableOptions = adoptNS([[NSMutableDictionary alloc] init]);
</span><span class="cx"> [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
</span><ins>+ [self _setTextIndicator:dictionaryPopupInfo.textIndicator.get() fadeOut:NO];
</ins><span class="cx"> return [getLULookupDefinitionModuleClass() lookupAnimationControllerForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -8636,7 +8642,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif // __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
</span><span class="cx">
</span><del>-- (void)_setTextIndicator:(TextIndicator *)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler
</del><ins>+- (void)_setTextIndicator:(TextIndicator *)textIndicator fadeOut:(BOOL)fadeOut
</ins><span class="cx"> {
</span><span class="cx"> if (!textIndicator) {
</span><span class="cx"> _private->textIndicatorWindow = nullptr;
</span><span class="lines">@@ -8647,14 +8653,20 @@
</span><span class="cx"> _private->textIndicatorWindow = std::make_unique<TextIndicatorWindow>(self);
</span><span class="cx">
</span><span class="cx"> NSRect contentRect = [self.window convertRectToScreen:textIndicator->textBoundingRectInWindowCoordinates()];
</span><del>- _private->textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut, WTF::move(completionHandler));
</del><ins>+ _private->textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)_clearTextIndicator
</span><span class="cx"> {
</span><del>- [self _setTextIndicator:nullptr fadeOut:NO animationCompletionHandler:^ { }];
</del><ins>+ [self _setTextIndicator:nullptr fadeOut:NO];
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)_setTextIndicatorAnimationProgress:(float)progress
+{
+ if (_private->textIndicatorWindow)
+ _private->textIndicatorWindow->setAnimationProgress(progress);
+}
+
</ins><span class="cx"> - (void)_showDictionaryLookupPopup:(const DictionaryPopupInfo&)dictionaryPopupInfo
</span><span class="cx"> {
</span><span class="cx"> if (!dictionaryPopupInfo.attributedString)
</span><span class="lines">@@ -8675,16 +8687,15 @@
</span><span class="cx"> if (!mutableOptions)
</span><span class="cx"> mutableOptions = adoptNS([[NSMutableDictionary alloc] init]);
</span><span class="cx"> [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
</span><del>- [self _setTextIndicator:dictionaryPopupInfo.textIndicator.get() fadeOut:NO animationCompletionHandler:[dictionaryPopupInfo, textBaselineOrigin, mutableOptions] {
- [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
- }];
</del><ins>+ [self _setTextIndicator:dictionaryPopupInfo.textIndicator.get() fadeOut:NO];
+ [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
</ins><span class="cx"> } else
</span><span class="cx"> [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.get() atLocation:textBaselineOrigin options:dictionaryPopupInfo.options.get()];
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)_dictionaryLookupPopoverWillClose:(NSNotification *)notification
</span><span class="cx"> {
</span><del>- [self _setTextIndicator:nullptr fadeOut:NO animationCompletionHandler:[] { }];
</del><ins>+ [self _setTextIndicator:nullptr fadeOut:NO];
</ins><span class="cx"> }
</span><span class="cx"> #endif // PLATFORM(MAC)
</span><span class="cx">
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacWebViewWebViewDatah"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewData.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -157,6 +157,8 @@
</span><span class="cx"> BOOL hasInitializedLookupObserver;
</span><span class="cx"> #endif // PLATFORM(MAC)
</span><span class="cx">
</span><ins>+ BOOL shouldMaintainInactiveSelection;
+
</ins><span class="cx"> BOOL allowsUndo;
</span><span class="cx">
</span><span class="cx"> float zoomMultiplier;
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKitmacWebViewWebViewInternalh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit/mac/WebView/WebViewInternal.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -257,9 +257,12 @@
</span><span class="cx"> - (NSPoint)_convertPointFromRootView:(NSPoint)point;
</span><span class="cx"> - (NSRect)_convertRectFromRootView:(NSRect)rect;
</span><span class="cx">
</span><ins>+- (void)_setMaintainsInactiveSelection:(BOOL)shouldMaintainInactiveSelection;
+
</ins><span class="cx"> #if PLATFORM(MAC) && defined(__cplusplus)
</span><del>-- (void)_setTextIndicator:(WebCore::TextIndicator*)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler;
</del><ins>+- (void)_setTextIndicator:(WebCore::TextIndicator*)textIndicator fadeOut:(BOOL)fadeOut;
</ins><span class="cx"> - (void)_clearTextIndicator;
</span><ins>+- (void)_setTextIndicatorAnimationProgress:(float)progress;
</ins><span class="cx"> - (void)_showDictionaryLookupPopup:(const DictionaryPopupInfo&)dictionaryPopupInfo;
</span><span class="cx"> #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
</span><span class="cx"> - (id)_animationControllerForDictionaryLookupPopupInfo:(const DictionaryPopupInfo&)dictionaryPopupInfo;
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/ChangeLog (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,5 +1,66 @@
</span><span class="cx"> 2014-12-17 Matthew Hanson <matthew_hanson@apple.com>
</span><span class="cx">
</span><ins>+ Merge r177427. rdar://problem/19237945
+
+ 2014-12-16 Timothy Horton <timothy_horton@apple.com>
+
+ 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 <matthew_hanson@apple.com>
+
</ins><span class="cx"> Merge r177411. rdar://problem/19271854
</span><span class="cx">
</span><span class="cx"> 2014-12-16 Beth Dakin <bdakin@apple.com>
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessAPImacWKViewmm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKView.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -3093,7 +3093,7 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-- (void)_setTextIndicator:(PassRefPtr<TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler
</del><ins>+- (void)_setTextIndicator:(PassRefPtr<TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut
</ins><span class="cx"> {
</span><span class="cx"> if (!textIndicator) {
</span><span class="cx"> _data->_textIndicatorWindow = nullptr;
</span><span class="lines">@@ -3104,12 +3104,13 @@
</span><span class="cx"> _data->_textIndicatorWindow = std::make_unique<TextIndicatorWindow>(self);
</span><span class="cx">
</span><span class="cx"> NSRect contentRect = [self.window convertRectToScreen:[self convertRect:textIndicator->textBoundingRectInWindowCoordinates() toView:nil]];
</span><del>- _data->_textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut, WTF::move(completionHandler));
</del><ins>+ _data->_textIndicatorWindow->setTextIndicator(textIndicator, NSRectToCGRect(contentRect), fadeOut);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-- (void)_setTextIndicator:(PassRefPtr<TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut
</del><ins>+- (void)_setTextIndicatorAnimationProgress:(float)progress
</ins><span class="cx"> {
</span><del>- [self _setTextIndicator:textIndicator fadeOut:fadeOut animationCompletionHandler:[] { }];
</del><ins>+ if (_data->_textIndicatorWindow)
+ _data->_textIndicatorWindow->setAnimationProgress(progress);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (CALayer *)_rootLayer
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessAPImacWKViewInternalh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx"> - (NSRect)_convertToDeviceSpace:(NSRect)rect;
</span><span class="cx"> - (NSRect)_convertToUserSpace:(NSRect)rect;
</span><span class="cx"> - (void)_setTextIndicator:(PassRefPtr<WebCore::TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut;
</span><del>-- (void)_setTextIndicator:(PassRefPtr<WebCore::TextIndicator>)textIndicator fadeOut:(BOOL)fadeOut animationCompletionHandler:(std::function<void ()>)completionHandler;
</del><ins>+- (void)_setTextIndicatorAnimationProgress:(float)progress;
</ins><span class="cx">
</span><span class="cx"> - (void)_setAcceleratedCompositingModeRootLayer:(CALayer *)rootLayer;
</span><span class="cx"> - (CALayer *)_acceleratedCompositingModeRootLayer;
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessPageClienth"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/PageClient.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -215,6 +215,7 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> virtual void setTextIndicator(PassRefPtr<WebCore::TextIndicator>, bool fadeOut) = 0;
</span><ins>+ virtual void setTextIndicatorAnimationProgress(float) = 0;
</ins><span class="cx">
</span><span class="cx"> virtual void enterAcceleratedCompositingMode(const LayerTreeContext&) = 0;
</span><span class="cx"> virtual void exitAcceleratedCompositingMode() = 0;
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -283,6 +283,7 @@
</span><span class="cx"> , m_viewState(ViewState::NoFlags)
</span><span class="cx"> , m_viewWasEverInWindow(false)
</span><span class="cx"> , m_backForwardList(WebBackForwardList::create(*this))
</span><ins>+ , m_maintainsInactiveSelection(false)
</ins><span class="cx"> , m_loadStateAtProcessExit(FrameLoadState::State::Finished)
</span><span class="cx"> #if PLATFORM(MAC) && !USE(ASYNC_NSTEXTINPUTCLIENT)
</span><span class="cx"> , m_temporarilyClosedComposition(false)
</span><span class="lines">@@ -3575,6 +3576,11 @@
</span><span class="cx"> m_pageClient.setTextIndicator(nullptr, false);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebPageProxy::setTextIndicatorAnimationProgress(float progress)
+{
+ m_pageClient.setTextIndicatorAnimationProgress(progress);
+}
+
</ins><span class="cx"> void WebPageProxy::didFindString(const String& string, uint32_t matchCount, int32_t matchIndex)
</span><span class="cx"> {
</span><span class="cx"> m_findClient->didFindString(this, string, matchCount, matchIndex);
</span><span class="lines">@@ -5215,9 +5221,9 @@
</span><span class="cx"> m_pageClient.removeNavigationGestureSnapshot();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPageProxy::performActionMenuHitTestAtLocation(FloatPoint point)
</del><ins>+void WebPageProxy::performActionMenuHitTestAtLocation(FloatPoint point, bool forImmediateAction)
</ins><span class="cx"> {
</span><del>- m_process->send(Messages::WebPage::PerformActionMenuHitTestAtLocation(point), m_pageID);
</del><ins>+ m_process->send(Messages::WebPage::PerformActionMenuHitTestAtLocation(point, forImmediateAction), m_pageID);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPageProxy::selectLastActionMenuRange()
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/WebPageProxy.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -659,6 +659,7 @@
</span><span class="cx"> void countStringMatches(const String&, FindOptions, unsigned maxMatchCount);
</span><span class="cx"> void didCountStringMatches(const String&, uint32_t matchCount);
</span><span class="cx"> void setTextIndicator(const WebCore::TextIndicatorData&, bool fadeOut);
</span><ins>+ void setTextIndicatorAnimationProgress(float);
</ins><span class="cx"> void clearTextIndicator();
</span><span class="cx"> void didFindString(const String&, uint32_t matchCount, int32_t matchIndex);
</span><span class="cx"> void didFailToFindString(const String&);
</span><span class="lines">@@ -918,7 +919,7 @@
</span><span class="cx">
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx"> WebHitTestResult* lastMouseMoveHitTestResult() const { return m_lastMouseMoveHitTestResult.get(); }
</span><del>- void performActionMenuHitTestAtLocation(WebCore::FloatPoint);
</del><ins>+ void performActionMenuHitTestAtLocation(WebCore::FloatPoint, bool forImmediateAction);
</ins><span class="cx"> void selectLastActionMenuRange();
</span><span class="cx"> void focusAndSelectLastActionMenuHitTestResult();
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessmacPageClientImplh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -119,7 +119,8 @@
</span><span class="cx"> virtual PassRefPtr<WebColorPicker> createColorPicker(WebPageProxy*, const WebCore::Color& initialColor, const WebCore::IntRect&);
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- void setTextIndicator(PassRefPtr<WebCore::TextIndicator>, bool fadeOut);
</del><ins>+ virtual void setTextIndicator(PassRefPtr<WebCore::TextIndicator>, bool fadeOut) override;
+ virtual void setTextIndicatorAnimationProgress(float) override;
</ins><span class="cx">
</span><span class="cx"> virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
</span><span class="cx"> virtual void exitAcceleratedCompositingMode();
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessmacPageClientImplmm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/PageClientImpl.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -486,6 +486,11 @@
</span><span class="cx"> [m_wkView _setTextIndicator:textIndicator fadeOut:fadeOut];
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void PageClientImpl::setTextIndicatorAnimationProgress(float progress)
+{
+ [m_wkView _setTextIndicatorAnimationProgress:progress];
+}
+
</ins><span class="cx"> void PageClientImpl::accessibilityWebProcessTokenReceived(const IPC::DataReference& data)
</span><span class="cx"> {
</span><span class="cx"> NSData* remoteToken = [NSData dataWithBytes:data.data() length:data.size()];
</span><span class="lines">@@ -560,10 +565,9 @@
</span><span class="cx"> // Run the animations serially because attaching another subwindow breaks the bounce animation.
</span><span class="cx"> // We could consider making the bounce NSAnimationNonblockingThreaded instead, which seems
</span><span class="cx"> // to work, but need to consider all of the implications.
</span><del>- [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()];
- }];
</del><ins>+ [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()];
</ins><span class="cx"> } else
</span><span class="cx"> [getLULookupDefinitionModuleClass() showDefinitionForTerm:dictionaryPopupInfo.attributedString.string.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessmacWKActionMenuControllermm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx">
</span><span class="cx"> [_wkView _dismissContentRelativeChildWindows];
</span><span class="cx">
</span><del>- _page->performActionMenuHitTestAtLocation([_wkView convertPoint:event.locationInWindow fromView:nil]);
</del><ins>+ _page->performActionMenuHitTestAtLocation([_wkView convertPoint:event.locationInWindow fromView:nil], false);
</ins><span class="cx">
</span><span class="cx"> _state = ActionMenuState::Pending;
</span><span class="cx"> [self _updateActionMenuItems];
</span><span class="lines">@@ -399,8 +399,6 @@
</span><span class="cx"> [_currentActionContext setHighlightFrame:[_wkView.window convertRectToScreen:[_wkView convertRect:_hitTestResult.detectedDataBoundingBox toView:nil]]];
</span><span class="cx">
</span><span class="cx"> NSArray *menuItems = [[getDDActionsManagerClass() sharedManager] menuItemsForResult:[_currentActionContext mainResult] actionContext:_currentActionContext.get()];
</span><del>- if (menuItems.count == 1 && _hitTestResult.detectedDataTextIndicator)
- _hitTestResult.detectedDataTextIndicator->setPresentationTransition(TextIndicatorPresentationTransition::Bounce);
</del><span class="cx"> return menuItems;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2UIProcessmacWKImmediateActionControllermm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/UIProcess/mac/WKImmediateActionController.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -101,6 +101,12 @@
</span><span class="cx">
</span><span class="cx"> - (void)_clearImmediateActionState
</span><span class="cx"> {
</span><ins>+#if WK_API_ENABLED
+ [self hidePreview];
+#endif
+
+ _page->clearTextIndicator();
+
</ins><span class="cx"> if (_currentActionContext && _hasActivatedActionContext) {
</span><span class="cx"> [getDDActionsManagerClass() didUseActions];
</span><span class="cx"> _hasActivatedActionContext = NO;
</span><span class="lines">@@ -130,10 +136,12 @@
</span><span class="cx"> if (immediateActionRecognizer != _immediateActionRecognizer)
</span><span class="cx"> return;
</span><span class="cx">
</span><ins>+ _page->setMaintainsInactiveSelection(true);
+
</ins><span class="cx"> [_wkView _dismissContentRelativeChildWindows];
</span><span class="cx">
</span><span class="cx"> _eventLocationInView = [immediateActionRecognizer locationInView:immediateActionRecognizer.view];
</span><del>- _page->performActionMenuHitTestAtLocation(_eventLocationInView);
</del><ins>+ _page->performActionMenuHitTestAtLocation(_eventLocationInView, true);
</ins><span class="cx">
</span><span class="cx"> _state = ImmediateActionState::Pending;
</span><span class="cx"> [self _updateImmediateActionItem];
</span><span class="lines">@@ -172,12 +180,22 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (void)immediateActionRecognizerDidUpdateAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
+{
+ if (immediateActionRecognizer != _immediateActionRecognizer)
+ return;
+
+ _page->setTextIndicatorAnimationProgress([immediateActionRecognizer animationProgress]);
+}
+
</ins><span class="cx"> - (void)immediateActionRecognizerDidCancelAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
</span><span class="cx"> {
</span><span class="cx"> if (immediateActionRecognizer != _immediateActionRecognizer)
</span><span class="cx"> return;
</span><span class="cx">
</span><ins>+ _page->setTextIndicatorAnimationProgress(0);
</ins><span class="cx"> [self _clearImmediateActionState];
</span><ins>+ _page->setMaintainsInactiveSelection(false);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)immediateActionRecognizerDidCompleteAnimation:(NSImmediateActionGestureRecognizer *)immediateActionRecognizer
</span><span class="lines">@@ -185,7 +203,8 @@
</span><span class="cx"> if (immediateActionRecognizer != _immediateActionRecognizer)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- // FIXME: Add support for the types of functionality provided in Action menu's willOpenMenu.
</del><ins>+ _page->setTextIndicatorAnimationProgress(1);
+ _page->setMaintainsInactiveSelection(false);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (PassRefPtr<WebHitTestResult>)_webHitTestResult
</span><span class="lines">@@ -507,8 +526,6 @@
</span><span class="cx"> if (menuItems.count != 1)
</span><span class="cx"> return nil;
</span><span class="cx">
</span><del>- if (_hitTestResult.detectedDataTextIndicator)
- _hitTestResult.detectedDataTextIndicator->setPresentationTransition(TextIndicatorPresentationTransition::Bounce);
</del><span class="cx"> return menuItems.lastObject;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -533,6 +550,7 @@
</span><span class="cx">
</span><span class="cx"> RetainPtr<NSMutableDictionary> mutableOptions = adoptNS([(NSDictionary *)dictionaryPopupInfo.options.get() mutableCopy]);
</span><span class="cx"> if (canLoadLUTermOptionDisableSearchTermIndicator() && dictionaryPopupInfo.textIndicator.contentImage) {
</span><ins>+ [_wkView _setTextIndicator:TextIndicator::create(dictionaryPopupInfo.textIndicator) fadeOut:NO];
</ins><span class="cx"> [mutableOptions setObject:@YES forKey:getLUTermOptionDisableSearchTermIndicator()];
</span><span class="cx"> return [getLULookupDefinitionModuleClass() lookupAnimationControllerForTerm:dictionaryPopupInfo.attributedString.string.get() atLocation:textBaselineOrigin options:mutableOptions.get()];
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.h (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1045,7 +1045,7 @@
</span><span class="cx"> void reportUsedFeatures();
</span><span class="cx">
</span><span class="cx"> #if PLATFORM(MAC)
</span><del>- void performActionMenuHitTestAtLocation(WebCore::FloatPoint);
</del><ins>+ void performActionMenuHitTestAtLocation(WebCore::FloatPoint, bool forImmediateAction);
</ins><span class="cx"> PassRefPtr<WebCore::Range> lookupTextAtLocation(WebCore::FloatPoint, NSDictionary **options);
</span><span class="cx"> void selectLastActionMenuRange();
</span><span class="cx"> void focusAndSelectLastActionMenuHitTestResult();
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -388,7 +388,7 @@
</span><span class="cx"> TakeSnapshot(WebCore::IntRect snapshotRect, WebCore::IntSize bitmapSize, uint32_t options, uint64_t callbackID)
</span><span class="cx">
</span><span class="cx"> #if PLATFORM(MAC)
</span><del>- PerformActionMenuHitTestAtLocation(WebCore::FloatPoint location)
</del><ins>+ PerformActionMenuHitTestAtLocation(WebCore::FloatPoint location, bool forImmediateAction)
</ins><span class="cx"> SelectLastActionMenuRange()
</span><span class="cx"> FocusAndSelectLastActionMenuHitTestResult()
</span><span class="cx"> DataDetectorsDidPresentUI(WebCore::PageOverlay::PageOverlayID pageOverlay)
</span></span></pre></div>
<a id="branchessafari6003branchSourceWebKit2WebProcessWebPagemacWebPageMacmm"></a>
<div class="modfile"><h4>Modified: branches/safari-600.3-branch/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (177476 => 177477)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -973,8 +973,15 @@
</span><span class="cx"> return String();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPage::performActionMenuHitTestAtLocation(WebCore::FloatPoint locationInViewCooordinates)
</del><ins>+static TextIndicatorPresentationTransition textIndicatorTransitionForActionMenu(Range* selectionRange, Range& indicatorRange, bool forImmediateAction, bool forDataDetectors)
</ins><span class="cx"> {
</span><ins>+ 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)
+{
</ins><span class="cx"> layoutIfNeeded();
</span><span class="cx">
</span><span class="cx"> MainFrame& mainFrame = corePage()->mainFrame();
</span><span class="lines">@@ -990,26 +997,31 @@
</span><span class="cx"> actionMenuResult.hitTestLocationInViewCooordinates = locationInViewCooordinates;
</span><span class="cx"> actionMenuResult.hitTestResult = WebHitTestResult::Data(hitTestResult);
</span><span class="cx">
</span><ins>+ RefPtr<Range> selectionRange = corePage()->focusController().focusedOrMainFrame().selection().selection().firstRange();
+
</ins><span class="cx"> NSDictionary *options = nil;
</span><del>- RefPtr<WebCore::Range> lookupRange = lookupTextAtLocation(locationInViewCooordinates, &options);
</del><ins>+ RefPtr<Range> lookupRange = lookupTextAtLocation(locationInViewCooordinates, &options);
</ins><span class="cx"> actionMenuResult.lookupText = lookupRange ? lookupRange->text() : String();
</span><ins>+
</ins><span class="cx"> if (lookupRange) {
</span><span class="cx"> if (Node* node = hitTestResult.innerNode()) {
</span><span class="cx"> if (Frame* hitTestResultFrame = node->document().frame())
</span><del>- actionMenuResult.dictionaryPopupInfo = dictionaryPopupInfoForRange(hitTestResultFrame, *lookupRange.get(), &options, TextIndicatorPresentationTransition::Bounce);
</del><ins>+ actionMenuResult.dictionaryPopupInfo = dictionaryPopupInfoForRange(hitTestResultFrame, *lookupRange.get(), &options, textIndicatorTransitionForActionMenu(selectionRange.get(), *lookupRange, forImmediateAction, false));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> m_lastActionMenuRangeForSelection = lookupRange;
</span><span class="cx"> m_lastActionMenuHitTestResult = hitTestResult;
</span><span class="cx">
</span><del>- 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;
</del><ins>+ 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;
+ }
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1035,7 +1047,7 @@
</span><span class="cx"> detectedDataBoundingBox.unite(frameView->contentsToWindow(quad.enclosingBoundingBox()));
</span><span class="cx">
</span><span class="cx"> actionMenuResult.detectedDataBoundingBox = detectedDataBoundingBox;
</span><del>- actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*mainResultRange, TextIndicatorPresentationTransition::BounceAndCrossfade);
</del><ins>+ actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*mainResultRange, textIndicatorTransitionForActionMenu(selectionRange.get(), *mainResultRange, forImmediateAction, true));
</ins><span class="cx"> actionMenuResult.detectedDataOriginatingPageOverlay = overlay->pageOverlayID();
</span><span class="cx"> m_lastActionMenuRangeForSelection = mainResultRange;
</span><span class="cx">
</span><span class="lines">@@ -1049,7 +1061,7 @@
</span><span class="cx"> actionMenuResult.actionContext = DataDetection::detectItemAroundHitTestResult(hitTestResult, detectedDataBoundingBox, detectedDataRange);
</span><span class="cx"> if (actionMenuResult.actionContext && detectedDataRange) {
</span><span class="cx"> actionMenuResult.detectedDataBoundingBox = detectedDataBoundingBox;
</span><del>- actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, TextIndicatorPresentationTransition::BounceAndCrossfade);
</del><ins>+ actionMenuResult.detectedDataTextIndicator = TextIndicator::createWithRange(*detectedDataRange, textIndicatorTransitionForActionMenu(selectionRange.get(), *detectedDataRange, forImmediateAction, true));
</ins><span class="cx"> m_lastActionMenuRangeForSelection = detectedDataRange;
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
</body>
</html>