OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/browser/render_view_host.h" | 5 #include "chrome/browser/render_view_host.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/waitable_event.h" |
11 #include "chrome/app/result_codes.h" | 12 #include "chrome/app/result_codes.h" |
12 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
13 #include "chrome/browser/cross_site_request_manager.h" | 14 #include "chrome/browser/cross_site_request_manager.h" |
14 #include "chrome/browser/navigation_entry.h" | 15 #include "chrome/browser/navigation_entry.h" |
15 #include "chrome/browser/profile.h" | 16 #include "chrome/browser/profile.h" |
16 #include "chrome/browser/render_process_host.h" | 17 #include "chrome/browser/render_process_host.h" |
17 #include "chrome/browser/render_widget_host.h" | 18 #include "chrome/browser/render_widget_host.h" |
18 #include "chrome/browser/render_widget_host_view.h" | 19 #include "chrome/browser/render_widget_host_view.h" |
19 #include "chrome/browser/render_view_host_delegate.h" | 20 #include "chrome/browser/render_view_host_delegate.h" |
20 #include "chrome/browser/renderer_security_policy.h" | 21 #include "chrome/browser/renderer_security_policy.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 RenderWidgetHost* widget = static_cast<RenderWidgetHost*>( | 68 RenderWidgetHost* widget = static_cast<RenderWidgetHost*>( |
68 process->GetListenerByID(render_view_id)); | 69 process->GetListenerByID(render_view_id)); |
69 if (!widget || !widget->IsRenderView()) | 70 if (!widget || !widget->IsRenderView()) |
70 return NULL; | 71 return NULL; |
71 return static_cast<RenderViewHost*>(widget); | 72 return static_cast<RenderViewHost*>(widget); |
72 } | 73 } |
73 | 74 |
74 RenderViewHost::RenderViewHost(SiteInstance* instance, | 75 RenderViewHost::RenderViewHost(SiteInstance* instance, |
75 RenderViewHostDelegate* delegate, | 76 RenderViewHostDelegate* delegate, |
76 int routing_id, | 77 int routing_id, |
77 HANDLE modal_dialog_event) | 78 base::WaitableEvent* modal_dialog_event) |
78 : RenderWidgetHost(instance->GetProcess(), routing_id), | 79 : RenderWidgetHost(instance->GetProcess(), routing_id), |
79 instance_(instance), | 80 instance_(instance), |
80 enable_dom_ui_bindings_(false), | 81 enable_dom_ui_bindings_(false), |
81 enable_external_host_bindings_(false), | 82 enable_external_host_bindings_(false), |
82 delegate_(delegate), | 83 delegate_(delegate), |
83 renderer_initialized_(false), | 84 renderer_initialized_(false), |
84 waiting_for_drag_context_response_(false), | 85 waiting_for_drag_context_response_(false), |
85 debugger_attached_(false), | 86 debugger_attached_(false), |
86 modal_dialog_count_(0), | 87 modal_dialog_count_(0), |
87 navigations_suspended_(false), | 88 navigations_suspended_(false), |
88 suspended_nav_message_(NULL), | 89 suspended_nav_message_(NULL), |
89 run_modal_reply_msg_(NULL), | 90 run_modal_reply_msg_(NULL), |
90 has_unload_listener_(false), | 91 has_unload_listener_(false), |
91 is_waiting_for_unload_ack_(false), | 92 is_waiting_for_unload_ack_(false), |
92 are_javascript_messages_suppressed_(false) { | 93 are_javascript_messages_suppressed_(false) { |
93 DCHECK(instance_); | 94 DCHECK(instance_); |
94 DCHECK(delegate_); | 95 DCHECK(delegate_); |
95 if (modal_dialog_event == NULL) | 96 if (modal_dialog_event == NULL) |
96 modal_dialog_event = CreateEvent(NULL, TRUE, FALSE, NULL); | 97 modal_dialog_event = new base::WaitableEvent(true, false); |
97 | 98 |
98 modal_dialog_event_.Set(modal_dialog_event); | 99 modal_dialog_event_.reset(modal_dialog_event); |
99 #ifdef CHROME_PERSONALIZATION | 100 #ifdef CHROME_PERSONALIZATION |
100 personalization_ = Personalization::CreateHostPersonalization(this); | 101 personalization_ = Personalization::CreateHostPersonalization(this); |
101 #endif | 102 #endif |
102 } | 103 } |
103 | 104 |
104 RenderViewHost::~RenderViewHost() { | 105 RenderViewHost::~RenderViewHost() { |
105 OnDebugDisconnect(); | 106 OnDebugDisconnect(); |
106 | 107 |
107 #ifdef CHROME_PERSONALIZATION | 108 #ifdef CHROME_PERSONALIZATION |
108 Personalization::CleanupHostPersonalization(personalization_); | 109 Personalization::CleanupHostPersonalization(personalization_); |
(...skipping 18 matching lines...) Expand all Loading... |
127 DCHECK(process_->profile()); | 128 DCHECK(process_->profile()); |
128 | 129 |
129 renderer_initialized_ = true; | 130 renderer_initialized_ = true; |
130 | 131 |
131 HANDLE modal_dialog_event; | 132 HANDLE modal_dialog_event; |
132 HANDLE renderer_process_handle = process()->process().handle(); | 133 HANDLE renderer_process_handle = process()->process().handle(); |
133 if (renderer_process_handle == NULL) | 134 if (renderer_process_handle == NULL) |
134 renderer_process_handle = GetCurrentProcess(); | 135 renderer_process_handle = GetCurrentProcess(); |
135 | 136 |
136 BOOL result = DuplicateHandle(GetCurrentProcess(), | 137 BOOL result = DuplicateHandle(GetCurrentProcess(), |
137 modal_dialog_event_.Get(), | 138 modal_dialog_event_->handle(), |
138 renderer_process_handle, | 139 renderer_process_handle, |
139 &modal_dialog_event, | 140 &modal_dialog_event, |
140 SYNCHRONIZE, | 141 SYNCHRONIZE, |
141 FALSE, | 142 FALSE, |
142 0); | 143 0); |
143 DCHECK(result) << "Couldn't duplicate the modal dialog handle for the renderer
."; | 144 DCHECK(result) << "Couldn't duplicate the modal dialog handle for the renderer
."; |
144 | 145 |
145 DCHECK(view_); | 146 DCHECK(view_); |
146 Send(new ViewMsg_New(view_->GetPluginHWND(), | 147 Send(new ViewMsg_New(view_->GetPluginHWND(), |
147 modal_dialog_event, | 148 modal_dialog_event, |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 if (is_waiting_for_unload_ack_) { | 492 if (is_waiting_for_unload_ack_) { |
492 if (are_javascript_messages_suppressed_) { | 493 if (are_javascript_messages_suppressed_) { |
493 delegate_->RendererUnresponsive(this, is_waiting_for_unload_ack_); | 494 delegate_->RendererUnresponsive(this, is_waiting_for_unload_ack_); |
494 return; | 495 return; |
495 } | 496 } |
496 | 497 |
497 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 498 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
498 } | 499 } |
499 | 500 |
500 if (--modal_dialog_count_ == 0) | 501 if (--modal_dialog_count_ == 0) |
501 ResetEvent(modal_dialog_event_.Get()); | 502 modal_dialog_event_->Reset(); |
502 ViewHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, success, prompt)
; | 503 ViewHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, success, prompt)
; |
503 Send(reply_msg); | 504 Send(reply_msg); |
504 } | 505 } |
505 | 506 |
506 void RenderViewHost::ModalHTMLDialogClosed(IPC::Message* reply_msg, | 507 void RenderViewHost::ModalHTMLDialogClosed(IPC::Message* reply_msg, |
507 const std::string& json_retval) { | 508 const std::string& json_retval) { |
508 if (is_waiting_for_unload_ack_) | 509 if (is_waiting_for_unload_ack_) |
509 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 510 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
510 | 511 |
511 if (--modal_dialog_count_ == 0) | 512 if (--modal_dialog_count_ == 0) |
512 ResetEvent(modal_dialog_event_.Get()); | 513 modal_dialog_event_->Reset(); |
513 | 514 |
514 ViewHostMsg_ShowModalHTMLDialog::WriteReplyParams(reply_msg, json_retval); | 515 ViewHostMsg_ShowModalHTMLDialog::WriteReplyParams(reply_msg, json_retval); |
515 Send(reply_msg); | 516 Send(reply_msg); |
516 } | 517 } |
517 | 518 |
518 void RenderViewHost::CopyImageAt(int x, int y) { | 519 void RenderViewHost::CopyImageAt(int x, int y) { |
519 Send(new ViewMsg_CopyImageAt(routing_id_, x, y)); | 520 Send(new ViewMsg_CopyImageAt(routing_id_, x, y)); |
520 } | 521 } |
521 | 522 |
522 void RenderViewHost::InspectElementAt(int x, int y) { | 523 void RenderViewHost::InspectElementAt(int x, int y) { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 // The message had a handler, but its de-serialization failed. | 736 // The message had a handler, but its de-serialization failed. |
736 // Kill the renderer. | 737 // Kill the renderer. |
737 process()->ReceivedBadMessage(msg.type()); | 738 process()->ReceivedBadMessage(msg.type()); |
738 } | 739 } |
739 } | 740 } |
740 | 741 |
741 void RenderViewHost::Shutdown() { | 742 void RenderViewHost::Shutdown() { |
742 // If we are being run modally (see RunModal), then we need to cleanup. | 743 // If we are being run modally (see RunModal), then we need to cleanup. |
743 if (run_modal_reply_msg_) { | 744 if (run_modal_reply_msg_) { |
744 if (--modal_dialog_count_ == 0) | 745 if (--modal_dialog_count_ == 0) |
745 ResetEvent(modal_dialog_event_.Get()); | 746 modal_dialog_event_->Reset(); |
746 Send(run_modal_reply_msg_); | 747 Send(run_modal_reply_msg_); |
747 run_modal_reply_msg_ = NULL; | 748 run_modal_reply_msg_ = NULL; |
748 } | 749 } |
749 RenderWidgetHost::Shutdown(); | 750 RenderWidgetHost::Shutdown(); |
750 } | 751 } |
751 | 752 |
752 void RenderViewHost::OnMsgCreateWindow(int route_id, | 753 void RenderViewHost::OnMsgCreateWindow(int route_id, |
753 HANDLE modal_dialog_event) { | 754 HANDLE modal_dialog_event) { |
754 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 755 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
755 if (view) | 756 if (view) |
756 view->CreateNewWindow(route_id, modal_dialog_event); | 757 view->CreateNewWindow(route_id, |
| 758 new base::WaitableEvent(modal_dialog_event)); |
757 } | 759 } |
758 | 760 |
759 void RenderViewHost::OnMsgCreateWidget(int route_id, bool activatable) { | 761 void RenderViewHost::OnMsgCreateWidget(int route_id, bool activatable) { |
760 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 762 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
761 if (view) | 763 if (view) |
762 view->CreateNewWidget(route_id, activatable); | 764 view->CreateNewWidget(route_id, activatable); |
763 } | 765 } |
764 | 766 |
765 void RenderViewHost::OnMsgShowView(int route_id, | 767 void RenderViewHost::OnMsgShowView(int route_id, |
766 WindowOpenDisposition disposition, | 768 WindowOpenDisposition disposition, |
767 const gfx::Rect& initial_pos, | 769 const gfx::Rect& initial_pos, |
768 bool user_gesture) { | 770 bool user_gesture) { |
769 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 771 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
770 if (view) | 772 if (view) |
771 view->ShowCreatedWindow(route_id, disposition, initial_pos, user_gesture); | 773 view->ShowCreatedWindow(route_id, disposition, initial_pos, user_gesture); |
772 } | 774 } |
773 | 775 |
774 void RenderViewHost::OnMsgShowWidget(int route_id, | 776 void RenderViewHost::OnMsgShowWidget(int route_id, |
775 const gfx::Rect& initial_pos) { | 777 const gfx::Rect& initial_pos) { |
776 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); | 778 RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); |
777 if (view) | 779 if (view) |
778 view->ShowCreatedWidget(route_id, initial_pos); | 780 view->ShowCreatedWidget(route_id, initial_pos); |
779 } | 781 } |
780 | 782 |
781 void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) { | 783 void RenderViewHost::OnMsgRunModal(IPC::Message* reply_msg) { |
782 DCHECK(!run_modal_reply_msg_); | 784 DCHECK(!run_modal_reply_msg_); |
783 if (modal_dialog_count_++ == 0) | 785 if (modal_dialog_count_++ == 0) |
784 SetEvent(modal_dialog_event_.Get()); | 786 modal_dialog_event_->Reset(); |
785 run_modal_reply_msg_ = reply_msg; | 787 run_modal_reply_msg_ = reply_msg; |
786 | 788 |
787 // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in | 789 // TODO(darin): Bug 1107929: Need to inform our delegate to show this view in |
788 // an app-modal fashion. | 790 // an app-modal fashion. |
789 } | 791 } |
790 | 792 |
791 void RenderViewHost::OnMsgRendererReady() { | 793 void RenderViewHost::OnMsgRendererReady() { |
792 WasResized(); | 794 WasResized(); |
793 delegate_->RendererReady(this); | 795 delegate_->RendererReady(this); |
794 } | 796 } |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 delegate_->RunFileChooser(multiple_files, title, default_file, real_filter); | 1080 delegate_->RunFileChooser(multiple_files, title, default_file, real_filter); |
1079 } | 1081 } |
1080 | 1082 |
1081 void RenderViewHost::OnMsgRunJavaScriptMessage( | 1083 void RenderViewHost::OnMsgRunJavaScriptMessage( |
1082 const std::wstring& message, | 1084 const std::wstring& message, |
1083 const std::wstring& default_prompt, | 1085 const std::wstring& default_prompt, |
1084 const int flags, | 1086 const int flags, |
1085 IPC::Message* reply_msg) { | 1087 IPC::Message* reply_msg) { |
1086 StopHangMonitorTimeout(); | 1088 StopHangMonitorTimeout(); |
1087 if (modal_dialog_count_++ == 0) | 1089 if (modal_dialog_count_++ == 0) |
1088 SetEvent(modal_dialog_event_.Get()); | 1090 modal_dialog_event_->Signal(); |
1089 bool did_suppress_message = false; | 1091 bool did_suppress_message = false; |
1090 delegate_->RunJavaScriptMessage(message, default_prompt, flags, reply_msg, | 1092 delegate_->RunJavaScriptMessage(message, default_prompt, flags, reply_msg, |
1091 &are_javascript_messages_suppressed_); | 1093 &are_javascript_messages_suppressed_); |
1092 } | 1094 } |
1093 | 1095 |
1094 void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const std::wstring& message, | 1096 void RenderViewHost::OnMsgRunBeforeUnloadConfirm(const std::wstring& message, |
1095 IPC::Message* reply_msg) { | 1097 IPC::Message* reply_msg) { |
1096 StopHangMonitorTimeout(); | 1098 StopHangMonitorTimeout(); |
1097 if (modal_dialog_count_++ == 0) | 1099 if (modal_dialog_count_++ == 0) |
1098 SetEvent(modal_dialog_event_.Get()); | 1100 modal_dialog_event_->Signal(); |
1099 delegate_->RunBeforeUnloadConfirm(message, reply_msg); | 1101 delegate_->RunBeforeUnloadConfirm(message, reply_msg); |
1100 } | 1102 } |
1101 | 1103 |
1102 void RenderViewHost::OnMsgShowModalHTMLDialog( | 1104 void RenderViewHost::OnMsgShowModalHTMLDialog( |
1103 const GURL& url, int width, int height, const std::string& json_arguments, | 1105 const GURL& url, int width, int height, const std::string& json_arguments, |
1104 IPC::Message* reply_msg) { | 1106 IPC::Message* reply_msg) { |
1105 StopHangMonitorTimeout(); | 1107 StopHangMonitorTimeout(); |
1106 if (modal_dialog_count_++ == 0) | 1108 if (modal_dialog_count_++ == 0) |
1107 SetEvent(modal_dialog_event_.Get()); | 1109 modal_dialog_event_->Signal(); |
1108 delegate_->ShowModalHTMLDialog(url, width, height, json_arguments, reply_msg); | 1110 delegate_->ShowModalHTMLDialog(url, width, height, json_arguments, reply_msg); |
1109 } | 1111 } |
1110 | 1112 |
1111 void RenderViewHost::OnMsgPasswordFormsSeen( | 1113 void RenderViewHost::OnMsgPasswordFormsSeen( |
1112 const std::vector<PasswordForm>& forms) { | 1114 const std::vector<PasswordForm>& forms) { |
1113 delegate_->PasswordFormsSeen(forms); | 1115 delegate_->PasswordFormsSeen(forms); |
1114 } | 1116 } |
1115 | 1117 |
1116 void RenderViewHost::OnMsgAutofillFormSubmitted( | 1118 void RenderViewHost::OnMsgAutofillFormSubmitted( |
1117 const AutofillForm& form) { | 1119 const AutofillForm& form) { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1300 Send(new ViewMsg_PersonalizationEvent(routing_id_, | 1302 Send(new ViewMsg_PersonalizationEvent(routing_id_, |
1301 event_name, | 1303 event_name, |
1302 event_arg)); | 1304 event_arg)); |
1303 } | 1305 } |
1304 #endif | 1306 #endif |
1305 | 1307 |
1306 void RenderViewHost::ForwardMessageFromExternalHost( | 1308 void RenderViewHost::ForwardMessageFromExternalHost( |
1307 const std::string& target, const std::string& message) { | 1309 const std::string& target, const std::string& message) { |
1308 Send(new ViewMsg_HandleMessageFromExternalHost(routing_id_, target, message)); | 1310 Send(new ViewMsg_HandleMessageFromExternalHost(routing_id_, target, message)); |
1309 } | 1311 } |
OLD | NEW |