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

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: Added test 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 std::string error_type;
415 base::RemoveChars(net::ErrorToString(net::ERR_ABORTED), "net::",
416 &error_type);
417 delegate_->LoadAbort(true /* is_top_level */, url, error_type);
418 }
419 return;
420 }
421
422 GURL validated_url(url);
423 GetWebContents()->GetRenderProcessHost()->FilterURL(false, &validated_url);
424
425 NavigationController::LoadURLParams load_url_params(validated_url);
401 load_url_params.referrer = referrer; 426 load_url_params.referrer = referrer;
402 load_url_params.transition_type = transition_type; 427 load_url_params.transition_type = transition_type;
403 load_url_params.extra_headers = std::string(); 428 load_url_params.extra_headers = std::string();
404 if (delegate_ && delegate_->IsOverridingUserAgent()) { 429 if (delegate_ && delegate_->IsOverridingUserAgent()) {
405 load_url_params.override_user_agent = 430 load_url_params.override_user_agent =
406 NavigationController::UA_OVERRIDE_TRUE; 431 NavigationController::UA_OVERRIDE_TRUE;
407 } 432 }
408 web_contents->GetController().LoadURLWithParams(load_url_params); 433 web_contents->GetController().LoadURLWithParams(load_url_params);
409 } 434 }
410 435
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 // focus. 604 // focus.
580 *renderer_prefs = *embedder_web_contents_->GetMutableRendererPrefs(); 605 *renderer_prefs = *embedder_web_contents_->GetMutableRendererPrefs();
581 renderer_prefs->user_agent_override = guest_user_agent_override; 606 renderer_prefs->user_agent_override = guest_user_agent_override;
582 607
583 // We would like the guest to report changes to frame names so that we can 608 // We would like the guest to report changes to frame names so that we can
584 // update the BrowserPlugin's corresponding 'name' attribute. 609 // update the BrowserPlugin's corresponding 'name' attribute.
585 // TODO(fsamuel): Remove this once http://crbug.com/169110 is addressed. 610 // TODO(fsamuel): Remove this once http://crbug.com/169110 is addressed.
586 renderer_prefs->report_frame_name_changes = true; 611 renderer_prefs->report_frame_name_changes = true;
587 // Navigation is disabled in Chrome Apps. We want to make sure guest-initiated 612 // Navigation is disabled in Chrome Apps. We want to make sure guest-initiated
588 // navigations still continue to function inside the app. 613 // navigations still continue to function inside the app.
589 renderer_prefs->browser_handles_all_top_level_requests = false; 614 renderer_prefs->browser_handles_all_top_level_requests = true;
lazyboy 2014/01/16 22:31:24 I remember creis@ raising concerns doing this befo
Fady Samuel 2014/01/16 23:40:27 Nasko? Thoughts? Charlie is on paternity leave.
590 // Disable "client blocked" error page for browser plugin. 615 // Disable "client blocked" error page for browser plugin.
591 renderer_prefs->disable_client_blocked_error_page = true; 616 renderer_prefs->disable_client_blocked_error_page = true;
592 617
593 embedder_web_contents_observer_.reset(new EmbedderWebContentsObserver(this)); 618 embedder_web_contents_observer_.reset(new EmbedderWebContentsObserver(this));
594 619
595 OnSetSize(instance_id_, params.auto_size_params, params.resize_guest_params); 620 OnSetSize(instance_id_, params.auto_size_params, params.resize_guest_params);
596 621
597 // Create a swapped out RenderView for the guest in the embedder render 622 // 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. 623 // process, so that the embedder can access the guest's window object.
599 int guest_routing_id = 624 int guest_routing_id =
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 PendingWindowMap::iterator it = opener()->pending_new_windows_.find(this); 831 PendingWindowMap::iterator it = opener()->pending_new_windows_.find(this);
807 if (it == opener()->pending_new_windows_.end()) 832 if (it == opener()->pending_new_windows_.end())
808 return NULL; 833 return NULL;
809 const NewWindowInfo& old_target_url = it->second; 834 const NewWindowInfo& old_target_url = it->second;
810 NewWindowInfo new_window_info(params.url, old_target_url.name); 835 NewWindowInfo new_window_info(params.url, old_target_url.name);
811 new_window_info.changed = new_window_info.url != old_target_url.url; 836 new_window_info.changed = new_window_info.url != old_target_url.url;
812 it->second = new_window_info; 837 it->second = new_window_info;
813 return NULL; 838 return NULL;
814 } 839 }
815 if (params.disposition == CURRENT_TAB) { 840 if (params.disposition == CURRENT_TAB) {
816 // This can happen for cross-site redirects. 841 // This can happen for cross-site redirects and top-level frame navigations.
817 LoadURLWithParams(params.url, params.referrer, params.transition, source); 842 LoadURLWithParams(params.url, params.referrer, params.transition, source);
818 return source; 843 return source;
819 } 844 }
820 845
821 return CreateNewGuestWindow(params)->GetWebContents(); 846 return CreateNewGuestWindow(params)->GetWebContents();
822 } 847 }
823 848
824 void BrowserPluginGuest::WebContentsCreated(WebContents* source_contents, 849 void BrowserPluginGuest::WebContentsCreated(WebContents* source_contents,
825 int64 source_frame_id, 850 int64 source_frame_id,
826 const base::string16& frame_name, 851 const base::string16& frame_name,
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
1424 pending_lock_request_ = false; 1449 pending_lock_request_ = false;
1425 if (succeeded) 1450 if (succeeded)
1426 mouse_locked_ = true; 1451 mouse_locked_ = true;
1427 } 1452 }
1428 1453
1429 void BrowserPluginGuest::OnNavigateGuest( 1454 void BrowserPluginGuest::OnNavigateGuest(
1430 int instance_id, 1455 int instance_id,
1431 const std::string& src) { 1456 const std::string& src) {
1432 GURL url = delegate_ ? delegate_->ResolveURL(src) : GURL(src); 1457 GURL url = delegate_ ? delegate_->ResolveURL(src) : GURL(src);
1433 1458
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 1459 // As guests do not swap processes on navigation, only navigations to
1456 // normal web URLs are supported. No protocol handlers are installed for 1460 // normal web URLs are supported. No protocol handlers are installed for
1457 // other schemes (e.g., WebUI or extensions), and no permissions or bindings 1461 // other schemes (e.g., WebUI or extensions), and no permissions or bindings
1458 // can be granted to the guest process. 1462 // can be granted to the guest process.
1459 LoadURLWithParams(validated_url, Referrer(), PAGE_TRANSITION_AUTO_TOPLEVEL, 1463 LoadURLWithParams(url, Referrer(), PAGE_TRANSITION_AUTO_TOPLEVEL,
1460 GetWebContents()); 1464 GetWebContents());
1461 } 1465 }
1462 1466
1463 void BrowserPluginGuest::OnPluginDestroyed(int instance_id) { 1467 void BrowserPluginGuest::OnPluginDestroyed(int instance_id) {
1464 Destroy(); 1468 Destroy();
1465 } 1469 }
1466 1470
1467 void BrowserPluginGuest::OnResizeGuest( 1471 void BrowserPluginGuest::OnResizeGuest(
1468 int instance_id, 1472 int instance_id,
1469 const BrowserPluginHostMsg_ResizeGuest_Params& params) { 1473 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1852 request_info.Set(browser_plugin::kRequestMethod, 1856 request_info.Set(browser_plugin::kRequestMethod,
1853 base::Value::CreateStringValue(request_method)); 1857 base::Value::CreateStringValue(request_method));
1854 request_info.Set(browser_plugin::kURL, base::Value::CreateStringValue(url)); 1858 request_info.Set(browser_plugin::kURL, base::Value::CreateStringValue(url));
1855 1859
1856 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_DOWNLOAD, 1860 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_DOWNLOAD,
1857 new DownloadRequest(callback), 1861 new DownloadRequest(callback),
1858 request_info); 1862 request_info);
1859 } 1863 }
1860 1864
1861 } // namespace content 1865 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698