OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/guest_view/web_view/web_view_guest.h" | 5 #include "extensions/browser/guest_view/web_view/web_view_guest.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "content/public/browser/browser_context.h" | 10 #include "content/public/browser/browser_context.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "content/public/browser/storage_partition.h" | 23 #include "content/public/browser/storage_partition.h" |
24 #include "content/public/browser/user_metrics.h" | 24 #include "content/public/browser/user_metrics.h" |
25 #include "content/public/browser/web_contents.h" | 25 #include "content/public/browser/web_contents.h" |
26 #include "content/public/browser/web_contents_delegate.h" | 26 #include "content/public/browser/web_contents_delegate.h" |
27 #include "content/public/common/media_stream_request.h" | 27 #include "content/public/common/media_stream_request.h" |
28 #include "content/public/common/page_zoom.h" | 28 #include "content/public/common/page_zoom.h" |
29 #include "content/public/common/result_codes.h" | 29 #include "content/public/common/result_codes.h" |
30 #include "content/public/common/stop_find_action.h" | 30 #include "content/public/common/stop_find_action.h" |
31 #include "content/public/common/url_constants.h" | 31 #include "content/public/common/url_constants.h" |
32 #include "extensions/browser/api/extensions_api_client.h" | 32 #include "extensions/browser/api/extensions_api_client.h" |
| 33 #include "extensions/browser/api/web_view/web_view_internal_api.h" |
33 #include "extensions/browser/extension_system.h" | 34 #include "extensions/browser/extension_system.h" |
34 #include "extensions/browser/guest_view/guest_view_manager.h" | 35 #include "extensions/browser/guest_view/guest_view_manager.h" |
35 #include "extensions/browser/guest_view/web_view/web_view_constants.h" | 36 #include "extensions/browser/guest_view/web_view/web_view_constants.h" |
36 #include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" | 37 #include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" |
37 #include "extensions/browser/guest_view/web_view/web_view_permission_types.h" | 38 #include "extensions/browser/guest_view/web_view/web_view_permission_types.h" |
38 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" | 39 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
39 #include "extensions/common/constants.h" | 40 #include "extensions/common/constants.h" |
40 #include "extensions/common/extension_messages.h" | 41 #include "extensions/common/extension_messages.h" |
41 #include "extensions/common/guest_view/guest_view_constants.h" | 42 #include "extensions/common/guest_view/guest_view_constants.h" |
42 #include "extensions/strings/grit/extensions_strings.h" | 43 #include "extensions/strings/grit/extensions_strings.h" |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 DispatchEventToEmbedder( | 383 DispatchEventToEmbedder( |
383 new GuestViewBase::Event(webview::kEventClose, args.Pass())); | 384 new GuestViewBase::Event(webview::kEventClose, args.Pass())); |
384 } | 385 } |
385 | 386 |
386 void WebViewGuest::FindReply(WebContents* source, | 387 void WebViewGuest::FindReply(WebContents* source, |
387 int request_id, | 388 int request_id, |
388 int number_of_matches, | 389 int number_of_matches, |
389 const gfx::Rect& selection_rect, | 390 const gfx::Rect& selection_rect, |
390 int active_match_ordinal, | 391 int active_match_ordinal, |
391 bool final_update) { | 392 bool final_update) { |
392 if (web_view_guest_delegate_) { | 393 find_helper_.FindReply(request_id, |
393 web_view_guest_delegate_->FindReply( | 394 number_of_matches, |
394 source, request_id, number_of_matches, | 395 selection_rect, |
395 selection_rect, active_match_ordinal, final_update); | 396 active_match_ordinal, |
396 } | 397 final_update); |
397 } | 398 } |
398 | 399 |
399 bool WebViewGuest::HandleContextMenu( | 400 bool WebViewGuest::HandleContextMenu( |
400 const content::ContextMenuParams& params) { | 401 const content::ContextMenuParams& params) { |
401 if (!web_view_guest_delegate_) | 402 if (!web_view_guest_delegate_) |
402 return false; | 403 return false; |
403 return web_view_guest_delegate_->HandleContextMenu(params); | 404 return web_view_guest_delegate_->HandleContextMenu(params); |
404 } | 405 } |
405 | 406 |
406 void WebViewGuest::HandleKeyboardEvent( | 407 void WebViewGuest::HandleKeyboardEvent( |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 | 540 |
540 double WebViewGuest::GetZoom() { | 541 double WebViewGuest::GetZoom() { |
541 if (!web_view_guest_delegate_) | 542 if (!web_view_guest_delegate_) |
542 return 1.0; | 543 return 1.0; |
543 return web_view_guest_delegate_->GetZoom(); | 544 return web_view_guest_delegate_->GetZoom(); |
544 } | 545 } |
545 | 546 |
546 void WebViewGuest::Find( | 547 void WebViewGuest::Find( |
547 const base::string16& search_text, | 548 const base::string16& search_text, |
548 const blink::WebFindOptions& options, | 549 const blink::WebFindOptions& options, |
549 WebViewInternalFindFunction* find_function) { | 550 scoped_refptr<WebViewInternalFindFunction> find_function) { |
550 if (web_view_guest_delegate_) | 551 find_helper_.Find(web_contents(), search_text, options, find_function); |
551 web_view_guest_delegate_->Find(search_text, options, find_function); | |
552 } | 552 } |
553 | 553 |
554 void WebViewGuest::StopFinding(content::StopFindAction action) { | 554 void WebViewGuest::StopFinding(content::StopFindAction action) { |
555 if (web_view_guest_delegate_) | 555 find_helper_.CancelAllFindSessions(); |
556 web_view_guest_delegate_->StopFinding(action); | 556 web_contents()->StopFinding(action); |
557 } | 557 } |
558 | 558 |
559 void WebViewGuest::Go(int relative_index) { | 559 void WebViewGuest::Go(int relative_index) { |
560 web_contents()->GetController().GoToOffset(relative_index); | 560 web_contents()->GetController().GoToOffset(relative_index); |
561 } | 561 } |
562 | 562 |
563 void WebViewGuest::Reload() { | 563 void WebViewGuest::Reload() { |
564 // TODO(fsamuel): Don't check for repost because we don't want to show | 564 // TODO(fsamuel): Don't check for repost because we don't want to show |
565 // Chromium's repost warning. We might want to implement a separate API | 565 // Chromium's repost warning. We might want to implement a separate API |
566 // for registering a callback if a repost is about to happen. | 566 // for registering a callback if a repost is about to happen. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 content::StoragePartition::OriginMatcherFunction(), | 609 content::StoragePartition::OriginMatcherFunction(), |
610 remove_since, | 610 remove_since, |
611 base::Time::Now(), | 611 base::Time::Now(), |
612 callback); | 612 callback); |
613 return true; | 613 return true; |
614 } | 614 } |
615 | 615 |
616 WebViewGuest::WebViewGuest(content::BrowserContext* browser_context, | 616 WebViewGuest::WebViewGuest(content::BrowserContext* browser_context, |
617 int guest_instance_id) | 617 int guest_instance_id) |
618 : GuestView<WebViewGuest>(browser_context, guest_instance_id), | 618 : GuestView<WebViewGuest>(browser_context, guest_instance_id), |
| 619 find_helper_(this), |
619 is_overriding_user_agent_(false), | 620 is_overriding_user_agent_(false), |
620 javascript_dialog_helper_(this) { | 621 javascript_dialog_helper_(this) { |
621 web_view_guest_delegate_.reset( | 622 web_view_guest_delegate_.reset( |
622 ExtensionsAPIClient::Get()->CreateWebViewGuestDelegate(this)); | 623 ExtensionsAPIClient::Get()->CreateWebViewGuestDelegate(this)); |
623 } | 624 } |
624 | 625 |
625 WebViewGuest::~WebViewGuest() { | 626 WebViewGuest::~WebViewGuest() { |
626 } | 627 } |
627 | 628 |
628 void WebViewGuest::DidCommitProvisionalLoadForFrame( | 629 void WebViewGuest::DidCommitProvisionalLoadForFrame( |
629 content::RenderFrameHost* render_frame_host, | 630 content::RenderFrameHost* render_frame_host, |
630 const GURL& url, | 631 const GURL& url, |
631 content::PageTransition transition_type) { | 632 content::PageTransition transition_type) { |
632 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 633 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
633 args->SetString(guestview::kUrl, url.spec()); | 634 args->SetString(guestview::kUrl, url.spec()); |
634 args->SetBoolean(guestview::kIsTopLevel, !render_frame_host->GetParent()); | 635 args->SetBoolean(guestview::kIsTopLevel, !render_frame_host->GetParent()); |
635 args->SetInteger(webview::kInternalCurrentEntryIndex, | 636 args->SetInteger(webview::kInternalCurrentEntryIndex, |
636 web_contents()->GetController().GetCurrentEntryIndex()); | 637 web_contents()->GetController().GetCurrentEntryIndex()); |
637 args->SetInteger(webview::kInternalEntryCount, | 638 args->SetInteger(webview::kInternalEntryCount, |
638 web_contents()->GetController().GetEntryCount()); | 639 web_contents()->GetController().GetEntryCount()); |
639 args->SetInteger(webview::kInternalProcessId, | 640 args->SetInteger(webview::kInternalProcessId, |
640 web_contents()->GetRenderProcessHost()->GetID()); | 641 web_contents()->GetRenderProcessHost()->GetID()); |
641 DispatchEventToEmbedder( | 642 DispatchEventToEmbedder( |
642 new GuestViewBase::Event(webview::kEventLoadCommit, args.Pass())); | 643 new GuestViewBase::Event(webview::kEventLoadCommit, args.Pass())); |
| 644 |
| 645 find_helper_.CancelAllFindSessions(); |
643 if (web_view_guest_delegate_) { | 646 if (web_view_guest_delegate_) { |
644 web_view_guest_delegate_->OnDidCommitProvisionalLoadForFrame( | 647 web_view_guest_delegate_->OnDidCommitProvisionalLoadForFrame( |
645 !render_frame_host->GetParent()); | 648 !render_frame_host->GetParent()); |
646 } | 649 } |
647 } | 650 } |
648 | 651 |
649 void WebViewGuest::DidFailProvisionalLoad( | 652 void WebViewGuest::DidFailProvisionalLoad( |
650 content::RenderFrameHost* render_frame_host, | 653 content::RenderFrameHost* render_frame_host, |
651 const GURL& validated_url, | 654 const GURL& validated_url, |
652 int error_code, | 655 int error_code, |
(...skipping 24 matching lines...) Expand all Loading... |
677 RenderFrameHost* render_frame_host) { | 680 RenderFrameHost* render_frame_host) { |
678 bool handled = true; | 681 bool handled = true; |
679 IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message) | 682 IPC_BEGIN_MESSAGE_MAP(WebViewGuest, message) |
680 IPC_MESSAGE_HANDLER(ExtensionHostMsg_FrameNameChanged, OnFrameNameChanged) | 683 IPC_MESSAGE_HANDLER(ExtensionHostMsg_FrameNameChanged, OnFrameNameChanged) |
681 IPC_MESSAGE_UNHANDLED(handled = false) | 684 IPC_MESSAGE_UNHANDLED(handled = false) |
682 IPC_END_MESSAGE_MAP() | 685 IPC_END_MESSAGE_MAP() |
683 return handled; | 686 return handled; |
684 } | 687 } |
685 | 688 |
686 void WebViewGuest::RenderProcessGone(base::TerminationStatus status) { | 689 void WebViewGuest::RenderProcessGone(base::TerminationStatus status) { |
687 if (web_view_guest_delegate_) | 690 // Cancel all find sessions in progress. |
688 web_view_guest_delegate_->OnRenderProcessGone(); | 691 find_helper_.CancelAllFindSessions(); |
689 | 692 |
690 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 693 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
691 args->SetInteger(webview::kProcessId, | 694 args->SetInteger(webview::kProcessId, |
692 web_contents()->GetRenderProcessHost()->GetID()); | 695 web_contents()->GetRenderProcessHost()->GetID()); |
693 args->SetString(webview::kReason, TerminationStatusToString(status)); | 696 args->SetString(webview::kReason, TerminationStatusToString(status)); |
694 DispatchEventToEmbedder( | 697 DispatchEventToEmbedder( |
695 new GuestViewBase::Event(webview::kEventExit, args.Pass())); | 698 new GuestViewBase::Event(webview::kEventExit, args.Pass())); |
696 } | 699 } |
697 | 700 |
698 void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { | 701 void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1093 WebViewGuest* guest = | 1096 WebViewGuest* guest = |
1094 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); | 1097 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); |
1095 if (!guest) | 1098 if (!guest) |
1096 return; | 1099 return; |
1097 | 1100 |
1098 if (!allow) | 1101 if (!allow) |
1099 guest->Destroy(); | 1102 guest->Destroy(); |
1100 } | 1103 } |
1101 | 1104 |
1102 } // namespace extensions | 1105 } // namespace extensions |
OLD | NEW |