Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1238)

Unified Diff: third_party/WebKit/Source/web/WebLocalFrameImpl.cpp

Issue 1959183002: Multi-Process Find-in-Page. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments by nick@, and a bit of cleanup. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index 5d633b5ab2b9b3bdb66b7ed4b2e09d5a25a8d31c..47e46e8b0016ba5cf69745ca26a32a7016507e81 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -622,6 +622,11 @@ ScrollableArea* WebLocalFrameImpl::layoutViewportScrollableArea() const
return nullptr;
}
+bool WebLocalFrameImpl::isFocused() const
+{
+ return this == WebFrame::fromFrame(viewImpl()->page()->focusController().focusedFrame());
+}
+
WebSize WebLocalFrameImpl::scrollOffset() const
{
if (ScrollableArea* scrollableArea = layoutViewportScrollableArea())
@@ -1553,11 +1558,8 @@ LocalFrame* WebLocalFrameImpl::createChildFrame(const FrameLoadRequest& request,
void WebLocalFrameImpl::didChangeContentsSize(const IntSize& size)
{
- // This is only possible on the main frame.
- if (m_textFinder && m_textFinder->totalMatchCount() > 0) {
- DCHECK(!parent());
+ if (m_textFinder && m_textFinder->totalMatchCount() > 0)
m_textFinder->increaseMarkerVersion();
- }
}
void WebLocalFrameImpl::createFrameView()
@@ -1625,12 +1627,7 @@ WebDataSourceImpl* WebLocalFrameImpl::provisionalDataSourceImpl() const
void WebLocalFrameImpl::setFindEndstateFocusAndSelection()
{
- WebLocalFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
-
- // Main frame should already have a textFinder at this point of time.
- DCHECK(mainFrameImpl->textFinder());
-
- if (this != mainFrameImpl->textFinder()->activeMatchFrame())
+ if (!m_textFinder || !m_textFinder->activeMatchFrame())
return;
if (Range* activeMatch = m_textFinder->activeMatch()) {
@@ -1976,16 +1973,34 @@ void WebLocalFrameImpl::didCallIsSearchProviderInstalled()
bool WebLocalFrameImpl::find(int identifier, const WebString& searchText, const WebFindOptions& options, bool wrapWithinFrame, WebRect* selectionRect, bool* activeNow)
{
- return ensureTextFinder().find(identifier, searchText, options, wrapWithinFrame, selectionRect, activeNow);
+ // Search for an active match only if this frame is focused or if this is a
+ // find next request.
+ if (isFocused() || options.findNext)
+ return ensureTextFinder().find(identifier, searchText, options, wrapWithinFrame, selectionRect, activeNow);
+
+ return false;
}
-void WebLocalFrameImpl::stopFinding(bool clearSelection)
+void WebLocalFrameImpl::stopFinding(StopFindAction action)
{
+ bool clearSelection = action == StopFindActionClearSelection;
+ if (clearSelection)
+ executeCommand(WebString::fromUTF8("Unselect"));
dglazkov 2016/06/02 01:08:42 Curious -- why is this necessary now? Why wasn't i
paulmeyer 2016/06/02 17:36:37 I saw that you said I could disregard these commen
+
if (m_textFinder) {
if (!clearSelection)
setFindEndstateFocusAndSelection();
m_textFinder->stopFindingAndClearSelection();
}
+
+ if (action == StopFindActionActivateSelection && isFocused()) {
+ WebDocument doc = document();
+ if (!doc.isNull()) {
dglazkov 2016/06/02 01:08:42 It's not possible for a frame to be focused and no
paulmeyer 2016/06/02 17:36:36 I'm actually not sure. It was checked before, so I
+ WebElement element = doc.focusedElement();
+ if (!element.isNull())
+ element.simulateClick();
dglazkov 2016/06/02 01:08:42 Huh. This is also new code? Why do we need to do t
paulmeyer 2016/06/02 17:36:37 This is the functionality of the "activate" action
+ }
+ }
}
void WebLocalFrameImpl::scopeStringMatches(int identifier, const WebString& searchText, const WebFindOptions& options, bool reset)
@@ -2001,8 +2016,6 @@ void WebLocalFrameImpl::cancelPendingScopingEffort()
void WebLocalFrameImpl::increaseMatchCount(int count, int identifier)
{
- // This function should only be called on the mainframe.
- DCHECK(!parent());
ensureTextFinder().increaseMatchCount(identifier, count);
}
@@ -2019,8 +2032,6 @@ void WebLocalFrameImpl::dispatchMessageEventWithOriginCheck(const WebSecurityOri
int WebLocalFrameImpl::findMatchMarkersVersion() const
{
- DCHECK(!parent());
-
if (m_textFinder)
return m_textFinder->findMatchMarkersVersion();
return 0;
@@ -2028,14 +2039,18 @@ int WebLocalFrameImpl::findMatchMarkersVersion() const
int WebLocalFrameImpl::selectNearestFindMatch(const WebFloatPoint& point, WebRect* selectionRect)
{
- DCHECK(!parent());
return ensureTextFinder().selectNearestFindMatch(point, selectionRect);
}
-WebFloatRect WebLocalFrameImpl::activeFindMatchRect()
+float WebLocalFrameImpl::distanceToNearestFindMatch(const WebFloatPoint& point)
{
- DCHECK(!parent());
+ float nearestDistance;
+ ensureTextFinder().nearestFindMatch(point, &nearestDistance);
+ return nearestDistance;
+}
+WebFloatRect WebLocalFrameImpl::activeFindMatchRect()
+{
if (m_textFinder)
return m_textFinder->activeFindMatchRect();
return WebFloatRect();
@@ -2043,7 +2058,6 @@ WebFloatRect WebLocalFrameImpl::activeFindMatchRect()
void WebLocalFrameImpl::findMatchRects(WebVector<WebFloatRect>& outputRects)
{
- DCHECK(!parent());
ensureTextFinder().findMatchRects(outputRects);
}
@@ -2112,4 +2126,9 @@ void WebLocalFrameImpl::forceSandboxFlags(WebSandboxFlags flags)
frame()->loader().forceSandboxFlags(static_cast<SandboxFlags>(flags));
}
+void WebLocalFrameImpl::clearActiveFindMatch()
+{
+ ensureTextFinder().clearActiveFindMatch();
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698