Chromium Code Reviews| 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 "chrome/browser/guest_view/web_view/web_view_guest.h" | 5 #include "chrome/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 "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 printing::PrintViewManagerBasic::CreateForWebContents(contents); | 179 printing::PrintViewManagerBasic::CreateForWebContents(contents); |
| 180 #endif // defined(ENABLE_FULL_PRINTING) | 180 #endif // defined(ENABLE_FULL_PRINTING) |
| 181 #endif // defined(ENABLE_PRINTING) | 181 #endif // defined(ENABLE_PRINTING) |
| 182 } | 182 } |
| 183 | 183 |
| 184 } // namespace | 184 } // namespace |
| 185 | 185 |
| 186 WebViewGuest::WebViewGuest(int guest_instance_id, | 186 WebViewGuest::WebViewGuest(int guest_instance_id, |
| 187 WebContents* guest_web_contents, | 187 WebContents* guest_web_contents, |
| 188 const std::string& embedder_extension_id) | 188 const std::string& embedder_extension_id) |
| 189 : GuestView<WebViewGuest>(guest_instance_id, | 189 : GuestView<WebViewGuest>(guest_instance_id), |
| 190 guest_web_contents, | |
| 191 embedder_extension_id), | |
| 192 script_executor_(new extensions::ScriptExecutor(guest_web_contents, | 190 script_executor_(new extensions::ScriptExecutor(guest_web_contents, |
| 193 &script_observers_)), | 191 &script_observers_)), |
| 194 pending_context_menu_request_id_(0), | 192 pending_context_menu_request_id_(0), |
| 195 next_permission_request_id_(0), | 193 next_permission_request_id_(0), |
| 196 is_overriding_user_agent_(false), | 194 is_overriding_user_agent_(false), |
| 197 pending_reload_on_attachment_(false), | 195 pending_reload_on_attachment_(false), |
|
lazyboy
2014/06/13 17:40:01
Remove this flag then?
Fady Samuel
2014/06/16 14:35:41
Done.
| |
| 198 main_frame_id_(0), | 196 main_frame_id_(0), |
| 199 chromevox_injected_(false), | 197 chromevox_injected_(false), |
| 200 find_helper_(this), | 198 find_helper_(this), |
| 201 javascript_dialog_helper_(this) { | 199 javascript_dialog_helper_(this) { |
| 200 Init(guest_web_contents, embedder_extension_id); | |
| 202 notification_registrar_.Add( | 201 notification_registrar_.Add( |
| 203 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, | 202 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
| 204 content::Source<WebContents>(guest_web_contents)); | 203 content::Source<WebContents>(guest_web_contents)); |
| 205 | 204 |
| 206 notification_registrar_.Add( | 205 notification_registrar_.Add( |
| 207 this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, | 206 this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, |
| 208 content::Source<WebContents>(guest_web_contents)); | 207 content::Source<WebContents>(guest_web_contents)); |
| 209 | 208 |
| 210 #if defined(OS_CHROMEOS) | 209 #if defined(OS_CHROMEOS) |
| 211 chromeos::AccessibilityManager* accessibility_manager = | 210 chromeos::AccessibilityManager* accessibility_manager = |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 // TODO(lazyboy): We need to expose some kind of enum equivalent of | 376 // TODO(lazyboy): We need to expose some kind of enum equivalent of |
| 378 // |command_id| instead of plain integers. | 377 // |command_id| instead of plain integers. |
| 379 item_value->SetInteger(webview::kMenuItemCommandId, | 378 item_value->SetInteger(webview::kMenuItemCommandId, |
| 380 menu_model.GetCommandIdAt(i)); | 379 menu_model.GetCommandIdAt(i)); |
| 381 item_value->SetString(webview::kMenuItemLabel, menu_model.GetLabelAt(i)); | 380 item_value->SetString(webview::kMenuItemLabel, menu_model.GetLabelAt(i)); |
| 382 items->Append(item_value); | 381 items->Append(item_value); |
| 383 } | 382 } |
| 384 return items.Pass(); | 383 return items.Pass(); |
| 385 } | 384 } |
| 386 | 385 |
| 387 void WebViewGuest::Attach(WebContents* embedder_web_contents, | 386 void WebViewGuest::DidAttach() { |
| 388 const base::DictionaryValue& args) { | 387 AddWebViewToExtensionRendererState(); |
| 388 | |
| 389 std::string name; | 389 std::string name; |
| 390 args.GetString(webview::kName, &name); | 390 if (extra_params()->GetString(webview::kName, &name)) { |
| 391 // If the guest window's name is empty, then the WebView tag's name is | 391 // If the guest window's name is empty, then the WebView tag's name is |
| 392 // assigned. Otherwise, the guest window's name takes precedence over the | 392 // assigned. Otherwise, the guest window's name takes precedence over the |
| 393 // WebView tag's name. | 393 // WebView tag's name. |
| 394 if (name_.empty()) | 394 if (name_.empty()) |
| 395 name_ = name; | 395 name_ = name; |
| 396 } | |
| 396 ReportFrameNameChange(name_); | 397 ReportFrameNameChange(name_); |
| 397 | 398 |
| 398 std::string user_agent_override; | 399 std::string user_agent_override; |
| 399 if (args.GetString(webview::kParameterUserAgentOverride, | 400 if (extra_params()->GetString(webview::kParameterUserAgentOverride, |
| 400 &user_agent_override)) { | 401 &user_agent_override)) { |
| 401 SetUserAgentOverride(user_agent_override); | 402 SetUserAgentOverride(user_agent_override); |
| 402 } else { | 403 } else { |
| 403 SetUserAgentOverride(""); | 404 SetUserAgentOverride(""); |
| 404 } | 405 } |
| 405 | 406 |
| 406 GuestViewBase::Attach(embedder_web_contents, args); | 407 std::string src; |
| 408 if (extra_params()->GetString("src", &src) && !src.empty()) | |
| 409 NavigateGuest(src); | |
| 407 | 410 |
| 408 AddWebViewToExtensionRendererState(); | 411 if (GetOpener()) { |
| 412 // We need to do a navigation here if the target URL has changed between | |
| 413 // the time the WebContents was created and the time it was attached. | |
| 414 // We also need to do an initial navigation if a RenderView was never | |
| 415 // created for the new window in cases where there is no referrer. | |
| 416 PendingWindowMap::iterator it = | |
| 417 GetOpener()->pending_new_windows_.find(this); | |
| 418 if (it != GetOpener()->pending_new_windows_.end()) { | |
| 419 const NewWindowInfo& new_window_info = it->second; | |
| 420 NavigateGuest(new_window_info.url.spec()); | |
| 421 } else { | |
| 422 NOTREACHED(); | |
| 423 } | |
| 424 | |
| 425 // Once a new guest is attached to the DOM of the embedder page, then the | |
| 426 // lifetime of the new guest is no longer managed by the opener guest. | |
| 427 GetOpener()->pending_new_windows_.erase(this); | |
| 428 } | |
| 409 } | 429 } |
| 410 | 430 |
| 411 void WebViewGuest::DidStopLoading() { | 431 void WebViewGuest::DidStopLoading() { |
| 412 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 432 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| 413 DispatchEvent(new GuestViewBase::Event(webview::kEventLoadStop, args.Pass())); | 433 DispatchEvent(new GuestViewBase::Event(webview::kEventLoadStop, args.Pass())); |
| 414 } | 434 } |
| 415 | 435 |
| 416 void WebViewGuest::EmbedderDestroyed() { | 436 void WebViewGuest::EmbedderDestroyed() { |
| 417 // TODO(fsamuel): WebRequest event listeners for <webview> should survive | 437 // TODO(fsamuel): WebRequest event listeners for <webview> should survive |
| 418 // reparenting of a <webview> within a single embedder. Right now, we keep | 438 // reparenting of a <webview> within a single embedder. Right now, we keep |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 465 DispatchEvent( | 485 DispatchEvent( |
| 466 new GuestViewBase::Event(webview::kEventConsoleMessage, args.Pass())); | 486 new GuestViewBase::Event(webview::kEventConsoleMessage, args.Pass())); |
| 467 return true; | 487 return true; |
| 468 } | 488 } |
| 469 | 489 |
| 470 void WebViewGuest::CloseContents(WebContents* source) { | 490 void WebViewGuest::CloseContents(WebContents* source) { |
| 471 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 491 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| 472 DispatchEvent(new GuestViewBase::Event(webview::kEventClose, args.Pass())); | 492 DispatchEvent(new GuestViewBase::Event(webview::kEventClose, args.Pass())); |
| 473 } | 493 } |
| 474 | 494 |
| 475 void WebViewGuest::DidAttach(const base::DictionaryValue& extra_params) { | |
| 476 std::string src; | |
| 477 if (extra_params.GetString("src", &src) && !src.empty()) | |
| 478 NavigateGuest(src); | |
| 479 | |
| 480 if (GetOpener()) { | |
| 481 // We need to do a navigation here if the target URL has changed between | |
| 482 // the time the WebContents was created and the time it was attached. | |
| 483 // We also need to do an initial navigation if a RenderView was never | |
| 484 // created for the new window in cases where there is no referrer. | |
| 485 PendingWindowMap::iterator it = | |
| 486 GetOpener()->pending_new_windows_.find(this); | |
| 487 if (it != GetOpener()->pending_new_windows_.end()) { | |
| 488 const NewWindowInfo& new_window_info = it->second; | |
| 489 NavigateGuest(new_window_info.url.spec()); | |
| 490 } else { | |
| 491 NOTREACHED(); | |
| 492 } | |
| 493 | |
| 494 // Once a new guest is attached to the DOM of the embedder page, then the | |
| 495 // lifetime of the new guest is no longer managed by the opener guest. | |
| 496 GetOpener()->pending_new_windows_.erase(this); | |
| 497 } | |
| 498 | |
| 499 if (pending_reload_on_attachment_) { | |
| 500 pending_reload_on_attachment_ = false; | |
| 501 guest_web_contents()->GetController().Reload(false); | |
| 502 } | |
| 503 } | |
| 504 | |
| 505 void WebViewGuest::FindReply(WebContents* source, | 495 void WebViewGuest::FindReply(WebContents* source, |
| 506 int request_id, | 496 int request_id, |
| 507 int number_of_matches, | 497 int number_of_matches, |
| 508 const gfx::Rect& selection_rect, | 498 const gfx::Rect& selection_rect, |
| 509 int active_match_ordinal, | 499 int active_match_ordinal, |
| 510 bool final_update) { | 500 bool final_update) { |
| 511 find_helper_.FindReply(request_id, number_of_matches, selection_rect, | 501 find_helper_.FindReply(request_id, number_of_matches, selection_rect, |
| 512 active_match_ordinal, final_update); | 502 active_match_ordinal, final_update); |
| 513 } | 503 } |
| 514 | 504 |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 836 if (action != DEFAULT) | 826 if (action != DEFAULT) |
| 837 RecordUserInitiatedUMA(info, allow); | 827 RecordUserInitiatedUMA(info, allow); |
| 838 | 828 |
| 839 pending_permission_requests_.erase(request_itr); | 829 pending_permission_requests_.erase(request_itr); |
| 840 | 830 |
| 841 return allow ? SET_PERMISSION_ALLOWED : SET_PERMISSION_DENIED; | 831 return allow ? SET_PERMISSION_ALLOWED : SET_PERMISSION_DENIED; |
| 842 } | 832 } |
| 843 | 833 |
| 844 void WebViewGuest::SetUserAgentOverride( | 834 void WebViewGuest::SetUserAgentOverride( |
| 845 const std::string& user_agent_override) { | 835 const std::string& user_agent_override) { |
| 836 if (!attached()) | |
| 837 return; | |
| 846 is_overriding_user_agent_ = !user_agent_override.empty(); | 838 is_overriding_user_agent_ = !user_agent_override.empty(); |
| 847 if (is_overriding_user_agent_) { | 839 if (is_overriding_user_agent_) { |
| 848 content::RecordAction(UserMetricsAction("WebView.Guest.OverrideUA")); | 840 content::RecordAction(UserMetricsAction("WebView.Guest.OverrideUA")); |
| 849 } | 841 } |
| 850 guest_web_contents()->SetUserAgentOverride(user_agent_override); | 842 guest_web_contents()->SetUserAgentOverride(user_agent_override); |
| 851 } | 843 } |
| 852 | 844 |
| 853 void WebViewGuest::Stop() { | 845 void WebViewGuest::Stop() { |
| 854 guest_web_contents()->Stop(); | 846 guest_web_contents()->Stop(); |
| 855 } | 847 } |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1049 DispatchEvent(new GuestViewBase::Event(webview::kEventExit, args.Pass())); | 1041 DispatchEvent(new GuestViewBase::Event(webview::kEventExit, args.Pass())); |
| 1050 } | 1042 } |
| 1051 | 1043 |
| 1052 void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { | 1044 void WebViewGuest::UserAgentOverrideSet(const std::string& user_agent) { |
| 1053 content::NavigationController& controller = | 1045 content::NavigationController& controller = |
| 1054 guest_web_contents()->GetController(); | 1046 guest_web_contents()->GetController(); |
| 1055 content::NavigationEntry* entry = controller.GetVisibleEntry(); | 1047 content::NavigationEntry* entry = controller.GetVisibleEntry(); |
| 1056 if (!entry) | 1048 if (!entry) |
| 1057 return; | 1049 return; |
| 1058 entry->SetIsOverridingUserAgent(!user_agent.empty()); | 1050 entry->SetIsOverridingUserAgent(!user_agent.empty()); |
| 1059 if (!attached()) { | |
| 1060 // We cannot reload now because all resource loads are suspended until | |
| 1061 // attachment. | |
| 1062 pending_reload_on_attachment_ = true; | |
| 1063 return; | |
| 1064 } | |
| 1065 guest_web_contents()->GetController().Reload(false); | 1051 guest_web_contents()->GetController().Reload(false); |
| 1066 } | 1052 } |
| 1067 | 1053 |
| 1068 void WebViewGuest::RenderViewReady() { | 1054 void WebViewGuest::RenderViewReady() { |
| 1069 // The guest RenderView should always live in an isolated guest process. | 1055 // The guest RenderView should always live in an isolated guest process. |
| 1070 CHECK(guest_web_contents()->GetRenderProcessHost()->IsIsolatedGuest()); | 1056 CHECK(guest_web_contents()->GetRenderProcessHost()->IsIsolatedGuest()); |
| 1071 Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_)); | 1057 Send(new ChromeViewMsg_SetName(guest_web_contents()->GetRoutingID(), name_)); |
| 1072 } | 1058 } |
| 1073 | 1059 |
| 1074 void WebViewGuest::ReportFrameNameChange(const std::string& name) { | 1060 void WebViewGuest::ReportFrameNameChange(const std::string& name) { |
| (...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1589 bool allow, | 1575 bool allow, |
| 1590 const std::string& user_input) { | 1576 const std::string& user_input) { |
| 1591 WebViewGuest* guest = | 1577 WebViewGuest* guest = |
| 1592 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); | 1578 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); |
| 1593 if (!guest) | 1579 if (!guest) |
| 1594 return; | 1580 return; |
| 1595 | 1581 |
| 1596 if (!allow) | 1582 if (!allow) |
| 1597 guest->Destroy(); | 1583 guest->Destroy(); |
| 1598 } | 1584 } |
| OLD | NEW |