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

Unified Diff: components/html_viewer/html_frame.cc

Issue 1371773003: mandoline: Add find in page. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Further patch cleanup; use a WeakPtrFactory in FindController. Created 5 years, 2 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: components/html_viewer/html_frame.cc
diff --git a/components/html_viewer/html_frame.cc b/components/html_viewer/html_frame.cc
index 19be8ee782549531875b450ed3897fb9ef242c04..4aa588937231dc7f1550c155be484f18fbf23f4d 100644
--- a/components/html_viewer/html_frame.cc
+++ b/components/html_viewer/html_frame.cc
@@ -50,6 +50,7 @@
#include "third_party/WebKit/public/web/WebConsoleMessage.h"
#include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebElement.h"
+#include "third_party/WebKit/public/web/WebFindOptions.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
#include "third_party/WebKit/public/web/WebKit.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
@@ -503,6 +504,18 @@ void HTMLFrame::didReceiveTitle(blink::WebLocalFrame* frame,
server_->TitleChanged(formatted);
}
+void HTMLFrame::reportFindInFrameMatchCount(int identifier,
+ int count,
+ bool finalUpdate) {
+ server_->OnReportFindInFrameMatchCount(identifier, count, finalUpdate);
+}
+
+void HTMLFrame::reportFindInPageSelection(int identifier,
+ int activeMatchOrdinal,
+ const blink::WebRect& selection) {
+ server_->OnReportFindInPageSelection(identifier, activeMatchOrdinal);
+}
+
void HTMLFrame::Bind(
web_view::mojom::FramePtr frame,
mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request) {
@@ -662,6 +675,26 @@ void HTMLFrame::SwapDelegate(HTMLFrameDelegate* delegate) {
delegate->OnSwap(this, old_delegate);
}
+blink::WebElement HTMLFrame::GetFocusedElement() {
+ if (!web_view())
+ return blink::WebElement();
+
+ HTMLFrame* frame = this;
+ while (frame) {
+ if (frame->web_view()) {
+ if (frame->web_view()->focusedFrame() == web_frame_) {
+ blink::WebDocument doc = web_frame_->document();
+ if (!doc.isNull())
+ return doc.focusedElement();
+ }
+ return blink::WebElement();
+ }
+ frame = frame->parent();
+ }
+
+ return blink::WebElement();
+}
+
HTMLFrame* HTMLFrame::FindFrameWithWebFrame(blink::WebFrame* web_frame) {
if (web_frame_ == web_frame)
return this;
@@ -857,6 +890,50 @@ void HTMLFrame::OnDispatchFrameLoadEvent(uint32_t frame_id) {
frame->web_frame_->toWebRemoteFrame()->DispatchLoadEventForFrameOwner();
}
+void HTMLFrame::Find(int32 request_id,
+ const mojo::String& search_text,
sky 2015/10/05 15:55:08 What should happen if search_text is empty? Either
Elliot Glaysher 2015/10/05 20:43:50 When search text is empty (this happens all the ti
+ const FindCallback& callback) {
+ // TODO(erg): We need to synchronize whether we're a singleton frame here
+ // with the parent; we can't trust our state.
+ bool wrap_within_frame = false;
+
+ blink::WebFindOptions options;
+ blink::WebRect selection_rect;
+ bool result = web_frame_->find(request_id, search_text.To<blink::WebString>(),
+ options, wrap_within_frame, &selection_rect);
+ if (!result) {
+ // don't leave text selected as you move to the next frame.
+ web_frame_->executeCommand(blink::WebString::fromUTF8("Unselect"),
+ GetFocusedElement());
+ }
+
+ callback.Run(result);
+}
+
+void HTMLFrame::StopFinding(bool clear_selection) {
+ // TODO(erg): |clear_selection| isn't correct; this should be a state enum
+ // that lets us STOP_FIND_ACTION_ACTIVATE_SELECTION, too.
+ if (clear_selection) {
+ web_frame_->executeCommand(blink::WebString::fromUTF8("Unselect"),
sky 2015/10/05 15:55:08 What happens if Find() was invoked, something was
Elliot Glaysher 2015/10/05 20:43:50 Added check to ensure focused element is part of w
+ GetFocusedElement());
+ }
+
+ web_frame_->stopFinding(clear_selection);
+}
+
+void HTMLFrame::ScopeStringMatches(int32_t request_id,
+ const mojo::String& search_text,
+ bool reset) {
+ blink::WebFindOptions options;
+ web_frame_->scopeStringMatches(request_id, search_text.To<blink::WebString>(),
+ options, reset);
+}
+
+void HTMLFrame::CancelPendingScopingEffort() {
+ web_frame_->resetMatchCount();
+ web_frame_->cancelPendingScopingEffort();
+}
+
void HTMLFrame::frameDetached(blink::WebRemoteFrameClient::DetachType type) {
if (type == blink::WebRemoteFrameClient::DetachType::Swap) {
web_frame_->close();

Powered by Google App Engine
This is Rietveld 408576698