Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(519)

Side by Side Diff: content/browser/browser_plugin/browser_plugin_guest.cc

Issue 140073002: <webview>: navigating to WebStore should fire a loadabort instead of crashing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed test race Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/browser_plugin/browser_plugin_guest.h" 5 #include "content/browser/browser_plugin/browser_plugin_guest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 } 390 }
391 // All pending windows should be removed from the set after Destroy() is 391 // All pending windows should be removed from the set after Destroy() is
392 // called on all of them. 392 // called on all of them.
393 DCHECK(pending_new_windows_.empty()); 393 DCHECK(pending_new_windows_.empty());
394 } 394 }
395 395
396 void BrowserPluginGuest::LoadURLWithParams(const GURL& url, 396 void BrowserPluginGuest::LoadURLWithParams(const GURL& url,
397 const Referrer& referrer, 397 const Referrer& referrer,
398 PageTransition transition_type, 398 PageTransition transition_type,
399 WebContents* web_contents) { 399 WebContents* web_contents) {
400 NavigationController::LoadURLParams load_url_params(url); 400 // Do not allow navigating a guest to schemes other than known safe schemes.
401 // This will block the embedder trying to load unwanted schemes, e.g.
402 // chrome://settings.
403 bool scheme_is_blocked =
404 (!ChildProcessSecurityPolicyImpl::GetInstance()->IsWebSafeScheme(
405 url.scheme()) &&
406 !ChildProcessSecurityPolicyImpl::GetInstance()->IsPseudoScheme(
407 url.scheme())) ||
408 url.SchemeIs(kJavaScriptScheme);
409 bool can_commit =
410 GetContentClient()->browser()->CanCommitURL(
411 GetWebContents()->GetRenderProcessHost(), url);
412 if (scheme_is_blocked || !url.is_valid() || !can_commit) {
413 if (delegate_) {
414 // TODO(fsamuel): Need better error reporting here.
415 std::string error_type;
416 base::RemoveChars(net::ErrorToString(net::ERR_ABORTED), "net::",
417 &error_type);
418 delegate_->LoadAbort(true /* is_top_level */, url, error_type);
419 }
420 return;
421 }
422
423 GURL validated_url(url);
424 GetWebContents()->GetRenderProcessHost()->FilterURL(false, &validated_url);
425
426 NavigationController::LoadURLParams load_url_params(validated_url);
401 load_url_params.referrer = referrer; 427 load_url_params.referrer = referrer;
402 load_url_params.transition_type = transition_type; 428 load_url_params.transition_type = transition_type;
403 load_url_params.extra_headers = std::string(); 429 load_url_params.extra_headers = std::string();
404 if (delegate_ && delegate_->IsOverridingUserAgent()) { 430 if (delegate_ && delegate_->IsOverridingUserAgent()) {
405 load_url_params.override_user_agent = 431 load_url_params.override_user_agent =
406 NavigationController::UA_OVERRIDE_TRUE; 432 NavigationController::UA_OVERRIDE_TRUE;
407 } 433 }
408 web_contents->GetController().LoadURLWithParams(load_url_params); 434 web_contents->GetController().LoadURLWithParams(load_url_params);
409 } 435 }
410 436
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 // values for caret blinking interval, colors related to selection and 604 // values for caret blinking interval, colors related to selection and
579 // focus. 605 // focus.
580 *renderer_prefs = *embedder_web_contents_->GetMutableRendererPrefs(); 606 *renderer_prefs = *embedder_web_contents_->GetMutableRendererPrefs();
581 renderer_prefs->user_agent_override = guest_user_agent_override; 607 renderer_prefs->user_agent_override = guest_user_agent_override;
582 608
583 // We would like the guest to report changes to frame names so that we can 609 // We would like the guest to report changes to frame names so that we can
584 // update the BrowserPlugin's corresponding 'name' attribute. 610 // update the BrowserPlugin's corresponding 'name' attribute.
585 // TODO(fsamuel): Remove this once http://crbug.com/169110 is addressed. 611 // TODO(fsamuel): Remove this once http://crbug.com/169110 is addressed.
586 renderer_prefs->report_frame_name_changes = true; 612 renderer_prefs->report_frame_name_changes = true;
587 // Navigation is disabled in Chrome Apps. We want to make sure guest-initiated 613 // Navigation is disabled in Chrome Apps. We want to make sure guest-initiated
588 // navigations still continue to function inside the app. 614 // navigations still continue to function inside the app.
jam 2014/01/17 23:09:15 nit: does this need to be updated?
Fady Samuel 2014/01/18 22:45:58 Updated comment.
589 renderer_prefs->browser_handles_all_top_level_requests = false; 615 renderer_prefs->browser_handles_all_top_level_requests = true;
590 // Disable "client blocked" error page for browser plugin. 616 // Disable "client blocked" error page for browser plugin.
591 renderer_prefs->disable_client_blocked_error_page = true; 617 renderer_prefs->disable_client_blocked_error_page = true;
592 618
593 embedder_web_contents_observer_.reset(new EmbedderWebContentsObserver(this)); 619 embedder_web_contents_observer_.reset(new EmbedderWebContentsObserver(this));
594 620
595 OnSetSize(instance_id_, params.auto_size_params, params.resize_guest_params); 621 OnSetSize(instance_id_, params.auto_size_params, params.resize_guest_params);
596 622
597 // Create a swapped out RenderView for the guest in the embedder render 623 // Create a swapped out RenderView for the guest in the embedder render
598 // process, so that the embedder can access the guest's window object. 624 // process, so that the embedder can access the guest's window object.
599 int guest_routing_id = 625 int guest_routing_id =
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 const OpenURLParams& params) { 825 const OpenURLParams& params) {
800 // If the guest wishes to navigate away prior to attachment then we save the 826 // If the guest wishes to navigate away prior to attachment then we save the
801 // navigation to perform upon attachment. Navigation initializes a lot of 827 // navigation to perform upon attachment. Navigation initializes a lot of
802 // state that assumes an embedder exists, such as RenderWidgetHostViewGuest. 828 // state that assumes an embedder exists, such as RenderWidgetHostViewGuest.
803 // Navigation also resumes resource loading which we don't want to allow 829 // Navigation also resumes resource loading which we don't want to allow
804 // until attachment. 830 // until attachment.
805 if (!attached()) { 831 if (!attached()) {
806 PendingWindowMap::iterator it = opener()->pending_new_windows_.find(this); 832 PendingWindowMap::iterator it = opener()->pending_new_windows_.find(this);
807 if (it == opener()->pending_new_windows_.end()) 833 if (it == opener()->pending_new_windows_.end())
808 return NULL; 834 return NULL;
809 const NewWindowInfo& old_target_url = it->second; 835 const NewWindowInfo& old_info = it->second;
810 NewWindowInfo new_window_info(params.url, old_target_url.name); 836 it->second = NewWindowInfo(params.url, old_info.name);
811 new_window_info.changed = new_window_info.url != old_target_url.url;
812 it->second = new_window_info;
813 return NULL; 837 return NULL;
814 } 838 }
815 if (params.disposition == CURRENT_TAB) { 839 if (params.disposition == CURRENT_TAB) {
816 // This can happen for cross-site redirects. 840 // This can happen for cross-site redirects and top-level frame navigations.
817 LoadURLWithParams(params.url, params.referrer, params.transition, source); 841 LoadURLWithParams(params.url, params.referrer, params.transition, source);
818 return source; 842 return source;
819 } 843 }
820 844
821 return CreateNewGuestWindow(params)->GetWebContents(); 845 return CreateNewGuestWindow(params)->GetWebContents();
822 } 846 }
823 847
824 void BrowserPluginGuest::WebContentsCreated(WebContents* source_contents, 848 void BrowserPluginGuest::WebContentsCreated(WebContents* source_contents,
825 int64 source_frame_id, 849 int64 source_frame_id,
826 const base::string16& frame_name, 850 const base::string16& frame_name,
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 // to initialize the browser-side state now so that the RenderFrameHostManager 1245 // to initialize the browser-side state now so that the RenderFrameHostManager
1222 // does not create a new RenderView on navigation. 1246 // does not create a new RenderView on navigation.
1223 if (has_render_view_) { 1247 if (has_render_view_) {
1224 static_cast<RenderViewHostImpl*>( 1248 static_cast<RenderViewHostImpl*>(
1225 GetWebContents()->GetRenderViewHost())->Init(); 1249 GetWebContents()->GetRenderViewHost())->Init();
1226 WebContentsViewGuest* new_view = 1250 WebContentsViewGuest* new_view =
1227 static_cast<WebContentsViewGuest*>(GetWebContents()->GetView()); 1251 static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
1228 new_view->CreateViewForWidget(web_contents()->GetRenderViewHost()); 1252 new_view->CreateViewForWidget(web_contents()->GetRenderViewHost());
1229 } 1253 }
1230 1254
1231 // We need to do a navigation here if the target URL has changed between 1255 // Grab the URL for the initial navigation.
1232 // the time the WebContents was created and the time it was attached.
1233 // We also need to do an initial navigation if a RenderView was never
1234 // created for the new window in cases where there is no referrer.
1235 PendingWindowMap::iterator it = opener()->pending_new_windows_.find(this); 1256 PendingWindowMap::iterator it = opener()->pending_new_windows_.find(this);
1236 if (it != opener()->pending_new_windows_.end()) { 1257 if (it != opener()->pending_new_windows_.end()) {
1237 const NewWindowInfo& new_window_info = it->second; 1258 params.src = it->second.url.spec();
1238 if (new_window_info.changed || !has_render_view_)
1239 params.src = it->second.url.spec();
1240 } else { 1259 } else {
1241 NOTREACHED(); 1260 NOTREACHED();
1242 } 1261 }
1243 1262
1244 // Once a new guest is attached to the DOM of the embedder page, then the 1263 // Once a new guest is attached to the DOM of the embedder page, then the
1245 // lifetime of the new guest is no longer managed by the opener guest. 1264 // lifetime of the new guest is no longer managed by the opener guest.
1246 opener()->pending_new_windows_.erase(this); 1265 opener()->pending_new_windows_.erase(this);
1247 1266
1248 // The guest's frame name takes precedence over the BrowserPlugin's name. 1267 // The guest's frame name takes precedence over the BrowserPlugin's name.
1249 // The guest's frame name is assigned in 1268 // The guest's frame name is assigned in
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1424 pending_lock_request_ = false; 1443 pending_lock_request_ = false;
1425 if (succeeded) 1444 if (succeeded)
1426 mouse_locked_ = true; 1445 mouse_locked_ = true;
1427 } 1446 }
1428 1447
1429 void BrowserPluginGuest::OnNavigateGuest( 1448 void BrowserPluginGuest::OnNavigateGuest(
1430 int instance_id, 1449 int instance_id,
1431 const std::string& src) { 1450 const std::string& src) {
1432 GURL url = delegate_ ? delegate_->ResolveURL(src) : GURL(src); 1451 GURL url = delegate_ ? delegate_->ResolveURL(src) : GURL(src);
1433 1452
1434 // Do not allow navigating a guest to schemes other than known safe schemes.
1435 // This will block the embedder trying to load unwanted schemes, e.g.
1436 // chrome://settings.
1437 bool scheme_is_blocked =
1438 (!ChildProcessSecurityPolicyImpl::GetInstance()->IsWebSafeScheme(
1439 url.scheme()) &&
1440 !ChildProcessSecurityPolicyImpl::GetInstance()->IsPseudoScheme(
1441 url.scheme())) ||
1442 url.SchemeIs(kJavaScriptScheme);
1443 if (scheme_is_blocked || !url.is_valid()) {
1444 if (delegate_) {
1445 std::string error_type;
1446 base::RemoveChars(net::ErrorToString(net::ERR_ABORTED), "net::",
1447 &error_type);
1448 delegate_->LoadAbort(true /* is_top_level */, url, error_type);
1449 }
1450 return;
1451 }
1452
1453 GURL validated_url(url);
1454 GetWebContents()->GetRenderProcessHost()->FilterURL(false, &validated_url);
1455 // As guests do not swap processes on navigation, only navigations to 1453 // As guests do not swap processes on navigation, only navigations to
1456 // normal web URLs are supported. No protocol handlers are installed for 1454 // normal web URLs are supported. No protocol handlers are installed for
1457 // other schemes (e.g., WebUI or extensions), and no permissions or bindings 1455 // other schemes (e.g., WebUI or extensions), and no permissions or bindings
1458 // can be granted to the guest process. 1456 // can be granted to the guest process.
1459 LoadURLWithParams(validated_url, Referrer(), PAGE_TRANSITION_AUTO_TOPLEVEL, 1457 LoadURLWithParams(url, Referrer(), PAGE_TRANSITION_AUTO_TOPLEVEL,
1460 GetWebContents()); 1458 GetWebContents());
1461 } 1459 }
1462 1460
1463 void BrowserPluginGuest::OnPluginDestroyed(int instance_id) { 1461 void BrowserPluginGuest::OnPluginDestroyed(int instance_id) {
1464 Destroy(); 1462 Destroy();
1465 } 1463 }
1466 1464
1467 void BrowserPluginGuest::OnResizeGuest( 1465 void BrowserPluginGuest::OnResizeGuest(
1468 int instance_id, 1466 int instance_id,
1469 const BrowserPluginHostMsg_ResizeGuest_Params& params) { 1467 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1852 request_info.Set(browser_plugin::kRequestMethod, 1850 request_info.Set(browser_plugin::kRequestMethod,
1853 base::Value::CreateStringValue(request_method)); 1851 base::Value::CreateStringValue(request_method));
1854 request_info.Set(browser_plugin::kURL, base::Value::CreateStringValue(url)); 1852 request_info.Set(browser_plugin::kURL, base::Value::CreateStringValue(url));
1855 1853
1856 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_DOWNLOAD, 1854 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_DOWNLOAD,
1857 new DownloadRequest(callback), 1855 new DownloadRequest(callback),
1858 request_info); 1856 request_info);
1859 } 1857 }
1860 1858
1861 } // namespace content 1859 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/browser_plugin/browser_plugin_guest.h ('k') | content/browser/renderer_host/render_view_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698