OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/html_viewer/html_frame.h" | 5 #include "components/html_viewer/html_frame.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
42 #include "mojo/common/common_type_converters.h" | 42 #include "mojo/common/common_type_converters.h" |
43 #include "mojo/converters/geometry/geometry_type_converters.h" | 43 #include "mojo/converters/geometry/geometry_type_converters.h" |
44 #include "skia/ext/refptr.h" | 44 #include "skia/ext/refptr.h" |
45 #include "third_party/WebKit/public/platform/Platform.h" | 45 #include "third_party/WebKit/public/platform/Platform.h" |
46 #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h" | 46 #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h" |
47 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 47 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
48 #include "third_party/WebKit/public/platform/WebSize.h" | 48 #include "third_party/WebKit/public/platform/WebSize.h" |
49 #include "third_party/WebKit/public/web/WebConsoleMessage.h" | 49 #include "third_party/WebKit/public/web/WebConsoleMessage.h" |
50 #include "third_party/WebKit/public/web/WebDocument.h" | 50 #include "third_party/WebKit/public/web/WebDocument.h" |
51 #include "third_party/WebKit/public/web/WebElement.h" | 51 #include "third_party/WebKit/public/web/WebElement.h" |
52 #include "third_party/WebKit/public/web/WebFindOptions.h" | |
52 #include "third_party/WebKit/public/web/WebInputEvent.h" | 53 #include "third_party/WebKit/public/web/WebInputEvent.h" |
53 #include "third_party/WebKit/public/web/WebKit.h" | 54 #include "third_party/WebKit/public/web/WebKit.h" |
54 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 55 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
55 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" | 56 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" |
56 #include "third_party/WebKit/public/web/WebRemoteFrame.h" | 57 #include "third_party/WebKit/public/web/WebRemoteFrame.h" |
57 #include "third_party/WebKit/public/web/WebRemoteFrameClient.h" | 58 #include "third_party/WebKit/public/web/WebRemoteFrameClient.h" |
58 #include "third_party/WebKit/public/web/WebScriptSource.h" | 59 #include "third_party/WebKit/public/web/WebScriptSource.h" |
59 #include "third_party/WebKit/public/web/WebView.h" | 60 #include "third_party/WebKit/public/web/WebView.h" |
60 #include "third_party/mojo/src/mojo/public/cpp/system/data_pipe.h" | 61 #include "third_party/mojo/src/mojo/public/cpp/system/data_pipe.h" |
61 #include "third_party/skia/include/core/SkCanvas.h" | 62 #include "third_party/skia/include/core/SkCanvas.h" |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
231 } | 232 } |
232 | 233 |
233 blink::WebView* HTMLFrame::web_view() { | 234 blink::WebView* HTMLFrame::web_view() { |
234 blink::WebWidget* web_widget = | 235 blink::WebWidget* web_widget = |
235 html_widget_ ? html_widget_->GetWidget() : nullptr; | 236 html_widget_ ? html_widget_->GetWidget() : nullptr; |
236 return web_widget && web_widget->isWebView() | 237 return web_widget && web_widget->isWebView() |
237 ? static_cast<blink::WebView*>(web_widget) | 238 ? static_cast<blink::WebView*>(web_widget) |
238 : nullptr; | 239 : nullptr; |
239 } | 240 } |
240 | 241 |
242 blink::WebView* HTMLFrame::web_view() const { | |
243 blink::WebWidget* web_widget = | |
244 html_widget_ ? html_widget_->GetWidget() : nullptr; | |
245 return web_widget && web_widget->isWebView() | |
246 ? static_cast<blink::WebView*>(web_widget) | |
247 : nullptr; | |
248 } | |
249 | |
241 blink::WebWidget* HTMLFrame::GetWebWidget() { | 250 blink::WebWidget* HTMLFrame::GetWebWidget() { |
242 return html_widget_ ? html_widget_->GetWidget() : nullptr; | 251 return html_widget_ ? html_widget_->GetWidget() : nullptr; |
243 } | 252 } |
244 | 253 |
245 bool HTMLFrame::IsLocal() const { | 254 bool HTMLFrame::IsLocal() const { |
246 return web_frame_->isWebLocalFrame(); | 255 return web_frame_->isWebLocalFrame(); |
247 } | 256 } |
248 | 257 |
249 bool HTMLFrame::HasLocalDescendant() const { | 258 bool HTMLFrame::HasLocalDescendant() const { |
250 if (IsLocal()) | 259 if (IsLocal()) |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
459 blink::WebTextDirection direction) { | 468 blink::WebTextDirection direction) { |
460 // TODO(beng): handle |direction|. | 469 // TODO(beng): handle |direction|. |
461 mojo::String formatted; | 470 mojo::String formatted; |
462 if (!title.isNull()) { | 471 if (!title.isNull()) { |
463 formatted = | 472 formatted = |
464 mojo::String::From(base::string16(title).substr(0, kMaxTitleChars)); | 473 mojo::String::From(base::string16(title).substr(0, kMaxTitleChars)); |
465 } | 474 } |
466 server_->TitleChanged(formatted); | 475 server_->TitleChanged(formatted); |
467 } | 476 } |
468 | 477 |
478 void HTMLFrame::reportFindInPageMatchCount(int identifier, | |
479 int count, | |
480 bool finalUpdate) { | |
481 server_->ReportFindInPageMatchCount(identifier, count, finalUpdate); | |
482 } | |
483 | |
484 void HTMLFrame::reportFindInPageSelection(int identifier, | |
485 int activeMatchOrdinal, | |
486 const blink::WebRect& selection) { | |
487 server_->ReportFindInPageSelection(identifier, activeMatchOrdinal); | |
488 } | |
489 | |
469 void HTMLFrame::Bind( | 490 void HTMLFrame::Bind( |
470 web_view::mojom::FramePtr frame, | 491 web_view::mojom::FramePtr frame, |
471 mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request) { | 492 mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request) { |
472 DCHECK(IsLocal()); | 493 DCHECK(IsLocal()); |
473 server_ = frame.Pass(); | 494 server_ = frame.Pass(); |
474 server_.set_connection_error_handler( | 495 server_.set_connection_error_handler( |
475 base::Bind(&HTMLFrame::Close, base::Unretained(this))); | 496 base::Bind(&HTMLFrame::Close, base::Unretained(this))); |
476 frame_client_binding_.reset(new mojo::Binding<web_view::mojom::FrameClient>( | 497 frame_client_binding_.reset(new mojo::Binding<web_view::mojom::FrameClient>( |
477 this, frame_client_request.Pass())); | 498 this, frame_client_request.Pass())); |
478 } | 499 } |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
610 web_layer_.reset(); | 631 web_layer_.reset(); |
611 } | 632 } |
612 | 633 |
613 void HTMLFrame::SwapDelegate(HTMLFrameDelegate* delegate) { | 634 void HTMLFrame::SwapDelegate(HTMLFrameDelegate* delegate) { |
614 DCHECK(IsLocal()); | 635 DCHECK(IsLocal()); |
615 HTMLFrameDelegate* old_delegate = delegate_; | 636 HTMLFrameDelegate* old_delegate = delegate_; |
616 delegate_ = delegate; | 637 delegate_ = delegate; |
617 delegate->OnSwap(this, old_delegate); | 638 delegate->OnSwap(this, old_delegate); |
618 } | 639 } |
619 | 640 |
641 blink::WebElement HTMLFrame::GetFocusedElement() const { | |
642 if (!web_view()) | |
643 return blink::WebElement(); | |
644 blink::WebFrame* focused_frame = web_view()->focusedFrame(); | |
645 if (focused_frame) { | |
646 blink::WebDocument doc = focused_frame->document(); | |
647 if (!doc.isNull()) | |
648 return doc.focusedElement(); | |
649 } | |
650 | |
651 return blink::WebElement(); | |
652 } | |
653 | |
620 HTMLFrame* HTMLFrame::FindFrameWithWebFrame(blink::WebFrame* web_frame) { | 654 HTMLFrame* HTMLFrame::FindFrameWithWebFrame(blink::WebFrame* web_frame) { |
621 if (web_frame_ == web_frame) | 655 if (web_frame_ == web_frame) |
622 return this; | 656 return this; |
623 for (HTMLFrame* child_frame : children_) { | 657 for (HTMLFrame* child_frame : children_) { |
624 HTMLFrame* result = child_frame->FindFrameWithWebFrame(web_frame); | 658 HTMLFrame* result = child_frame->FindFrameWithWebFrame(web_frame); |
625 if (result) | 659 if (result) |
626 return result; | 660 return result; |
627 } | 661 } |
628 return nullptr; | 662 return nullptr; |
629 } | 663 } |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
799 frame->web_frame_->toWebRemoteFrame()->didStopLoading(); | 833 frame->web_frame_->toWebRemoteFrame()->didStopLoading(); |
800 } | 834 } |
801 } | 835 } |
802 | 836 |
803 void HTMLFrame::OnDispatchFrameLoadEvent(uint32_t frame_id) { | 837 void HTMLFrame::OnDispatchFrameLoadEvent(uint32_t frame_id) { |
804 HTMLFrame* frame = frame_tree_manager_->root_->FindFrame(frame_id); | 838 HTMLFrame* frame = frame_tree_manager_->root_->FindFrame(frame_id); |
805 if (frame && !frame->IsLocal()) | 839 if (frame && !frame->IsLocal()) |
806 frame->web_frame_->toWebRemoteFrame()->DispatchLoadEventForFrameOwner(); | 840 frame->web_frame_->toWebRemoteFrame()->DispatchLoadEventForFrameOwner(); |
807 } | 841 } |
808 | 842 |
843 void HTMLFrame::OnFind(int32 request_id, const mojo::String& search_text) { | |
Elliot Glaysher
2015/09/28 21:22:57
This and GetFocusedElement() were copied almost ve
| |
844 blink::WebFrame* main_frame = web_view()->mainFrame(); | |
845 blink::WebFrame* frame_after_main = main_frame->traverseNext(true); | |
846 blink::WebFrame* focused_frame = web_view()->focusedFrame(); | |
847 blink::WebFrame* search_frame = | |
848 focused_frame; // start searching focused frame. | |
849 | |
850 bool multi_frame = (frame_after_main != main_frame); | |
851 | |
852 blink::WebFindOptions options; | |
853 | |
854 // If we have multiple frames, we don't want to wrap the search within the | |
855 // frame, so we check here if we only have main_frame in the chain. | |
856 bool wrap_within_frame = !multi_frame; | |
857 | |
858 blink::WebRect selection_rect; | |
859 bool result = false; | |
860 | |
861 // If something is selected when we start searching it means we cannot just | |
862 // increment the current match ordinal; we need to re-generate it. | |
863 blink::WebRange current_selection = focused_frame->selectionRange(); | |
864 | |
865 do { | |
866 result = search_frame->find(request_id, search_text.To<blink::WebString>(), | |
867 options, wrap_within_frame, &selection_rect); | |
868 | |
869 if (!result) { | |
870 // don't leave text selected as you move to the next frame. | |
871 search_frame->executeCommand(blink::WebString::fromUTF8("Unselect"), | |
872 GetFocusedElement()); | |
873 | |
874 // Find the next frame, but skip the invisible ones. | |
875 do { | |
876 // What is the next frame to search? (we might be going backwards). Note | |
877 // that we specify wrap=true so that search_frame never becomes NULL. | |
878 search_frame = options.forward ? search_frame->traverseNext(true) | |
879 : search_frame->traversePrevious(true); | |
880 } while (!search_frame->hasVisibleContent() && | |
881 search_frame != focused_frame); | |
882 | |
883 // Make sure selection doesn't affect the search operation in new frame. | |
884 search_frame->executeCommand(blink::WebString::fromUTF8("Unselect"), | |
885 GetFocusedElement()); | |
886 | |
887 // If we have multiple frames and we have wrapped back around to the | |
888 // focused frame, we need to search it once more allowing wrap within | |
889 // the frame, otherwise it will report 'no match' if the focused frame has | |
890 // reported matches, but no frames after the focused_frame contain a | |
891 // match for the search word(s). | |
892 if (multi_frame && search_frame == focused_frame) { | |
893 result = | |
894 search_frame->find(request_id, search_text.To<blink::WebString>(), | |
895 options, true, // Force wrapping. | |
896 &selection_rect); | |
897 } | |
898 } | |
899 | |
900 web_view()->setFocusedFrame(search_frame); | |
901 } while (!result && search_frame != focused_frame); | |
902 | |
903 if (options.findNext && current_selection.isNull()) { | |
904 // Force the main_frame to report the actual count. | |
905 main_frame->increaseMatchCount(0, request_id); | |
906 } else { | |
907 // If nothing is found, set result to "0 of 0", otherwise, set it to | |
908 // "-1 of 1" to indicate that we found at least one item, but we don't know | |
909 // yet what is active. | |
910 int ordinal = result ? -1 : 0; // -1 here means, we might know more later. | |
911 int match_count = result ? 1 : 0; // 1 here means possibly more coming. | |
912 | |
913 // If we find no matches then this will be our last status update. | |
914 // Otherwise the scoping effort will send more results. | |
915 bool final_status_update = !result; | |
916 | |
917 server_->ReportFindInPageSelection(request_id, ordinal); | |
918 server_->ReportFindInPageMatchCount(request_id, match_count, | |
919 final_status_update); | |
920 | |
921 // Scoping effort begins, starting with the mainframe. | |
922 search_frame = main_frame; | |
923 | |
924 main_frame->resetMatchCount(); | |
925 | |
926 do { | |
927 // Cancel all old scoping requests before starting a new one. | |
928 search_frame->cancelPendingScopingEffort(); | |
929 | |
930 // We don't start another scoping effort unless at least one match has | |
931 // been found. | |
932 if (result) { | |
933 // Start new scoping request. If the scoping function determines that it | |
934 // needs to scope, it will defer until later. | |
935 search_frame->scopeStringMatches( | |
936 request_id, search_text.To<blink::WebString>(), options, | |
937 true); // reset the tickmarks | |
938 } | |
939 | |
940 // Iterate to the next frame. The frame will not necessarily scope, for | |
941 // example if it is not visible. | |
942 search_frame = search_frame->traverseNext(true); | |
943 } while (search_frame != main_frame); | |
944 } | |
945 } | |
946 | |
947 void HTMLFrame::OnStopFinding() { | |
948 blink::WebView* view = web_view(); | |
949 if (!view) | |
950 return; | |
951 | |
952 // TODO(erg): content has a whole concept about different actions that can be | |
953 // done during a stop find. We aren't handling these at all. | |
954 bool clear_selection = true; | |
955 | |
956 view->focusedFrame()->executeCommand(blink::WebString::fromUTF8("Unselect"), | |
957 GetFocusedElement()); | |
958 | |
959 blink::WebFrame* frame = view->mainFrame(); | |
960 while (frame) { | |
961 frame->stopFinding(clear_selection); | |
962 frame = frame->traverseNext(false); | |
963 } | |
964 } | |
965 | |
809 void HTMLFrame::frameDetached(blink::WebRemoteFrameClient::DetachType type) { | 966 void HTMLFrame::frameDetached(blink::WebRemoteFrameClient::DetachType type) { |
810 if (type == blink::WebRemoteFrameClient::DetachType::Swap) { | 967 if (type == blink::WebRemoteFrameClient::DetachType::Swap) { |
811 web_frame_->close(); | 968 web_frame_->close(); |
812 return; | 969 return; |
813 } | 970 } |
814 | 971 |
815 DCHECK(type == blink::WebRemoteFrameClient::DetachType::Remove); | 972 DCHECK(type == blink::WebRemoteFrameClient::DetachType::Remove); |
816 FrameDetachedImpl(web_frame_); | 973 FrameDetachedImpl(web_frame_); |
817 } | 974 } |
818 | 975 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
862 | 1019 |
863 void HTMLFrame::reload(bool ignore_cache, bool is_client_redirect) { | 1020 void HTMLFrame::reload(bool ignore_cache, bool is_client_redirect) { |
864 NOTIMPLEMENTED(); | 1021 NOTIMPLEMENTED(); |
865 } | 1022 } |
866 | 1023 |
867 void HTMLFrame::forwardInputEvent(const blink::WebInputEvent* event) { | 1024 void HTMLFrame::forwardInputEvent(const blink::WebInputEvent* event) { |
868 NOTIMPLEMENTED(); | 1025 NOTIMPLEMENTED(); |
869 } | 1026 } |
870 | 1027 |
871 } // namespace mojo | 1028 } // namespace mojo |
OLD | NEW |