Chromium Code Reviews| 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..236ac0b667d0148d86157ef392f4a82f830f3a47 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" |
| @@ -251,6 +252,14 @@ blink::WebView* HTMLFrame::web_view() { |
| : nullptr; |
| } |
| +blink::WebView* HTMLFrame::web_view() const { |
| + blink::WebWidget* web_widget = |
| + html_widget_ ? html_widget_->GetWidget() : nullptr; |
| + return web_widget && web_widget->isWebView() |
| + ? static_cast<blink::WebView*>(web_widget) |
| + : nullptr; |
| +} |
| + |
| blink::WebWidget* HTMLFrame::GetWebWidget() { |
| return html_widget_ ? html_widget_->GetWidget() : nullptr; |
| } |
| @@ -503,6 +512,17 @@ 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 +682,19 @@ void HTMLFrame::SwapDelegate(HTMLFrameDelegate* delegate) { |
| delegate->OnSwap(this, old_delegate); |
| } |
| +blink::WebElement HTMLFrame::GetFocusedElement() const { |
| + if (!web_view()) |
| + return blink::WebElement(); |
| + blink::WebFrame* focused_frame = web_view()->focusedFrame(); |
| + if (focused_frame) { |
|
sky
2015/10/02 16:03:40
Should you only look at focused_frame if it's the
|
| + blink::WebDocument doc = focused_frame->document(); |
| + if (!doc.isNull()) |
| + return doc.focusedElement(); |
| + } |
| + |
| + return blink::WebElement(); |
| +} |
| + |
| HTMLFrame* HTMLFrame::FindFrameWithWebFrame(blink::WebFrame* web_frame) { |
| if (web_frame_ == web_frame) |
| return this; |
| @@ -857,6 +890,54 @@ void HTMLFrame::OnDispatchFrameLoadEvent(uint32_t frame_id) { |
| frame->web_frame_->toWebRemoteFrame()->DispatchLoadEventForFrameOwner(); |
| } |
| +void HTMLFrame::Find(int32 request_id, const mojo::String& search_text, |
| + 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(request_id, search_text, 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"), |
| + 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(); |