| Index: content/browser/browser_plugin/browser_plugin_guest.cc
|
| diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
|
| index 2e79b6335e3c8815151c1264fd21b4362542eb13..fd42b01344a7d0935bf777790307a91048ff1041 100644
|
| --- a/content/browser/browser_plugin/browser_plugin_guest.cc
|
| +++ b/content/browser/browser_plugin/browser_plugin_guest.cc
|
| @@ -311,6 +311,21 @@ static std::string RetrieveDownloadURLFromRequestId(
|
| return "";
|
| }
|
|
|
| +bool SupportsScheme(const GURL& url) {
|
| + // javascript: URLs are not supported.
|
| + if (url.SchemeIs(kJavaScriptScheme))
|
| + return false;
|
| +
|
| + ChildProcessSecurityPolicyImpl* policy =
|
| + ChildProcessSecurityPolicyImpl::GetInstance();
|
| + if (policy->IsWebSafeScheme(url.scheme()) ||
|
| + policy->IsPseudoScheme(url.scheme())) {
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| } // namespace
|
|
|
| class BrowserPluginGuest::EmbedderWebContentsObserver
|
| @@ -402,30 +417,40 @@ void BrowserPluginGuest::DestroyUnattachedWindows() {
|
| DCHECK(pending_new_windows_.empty());
|
| }
|
|
|
| +void BrowserPluginGuest::ReportLoadAbort(const GURL& url,
|
| + bool is_top_level,
|
| + int reason) {
|
| + if (!delegate_)
|
| + return;
|
| +
|
| + std::string error_type;
|
| + base::RemoveChars(net::ErrorToString(reason), "net::",
|
| + &error_type);
|
| + delegate_->LoadAbort(is_top_level, url, error_type);
|
| +}
|
| +
|
| void BrowserPluginGuest::LoadURLWithParams(const GURL& url,
|
| const Referrer& referrer,
|
| PageTransition transition_type,
|
| WebContents* web_contents) {
|
| + // If the URL is invalid, then there's nothing to do here except abort.
|
| + if (!url.is_valid()) {
|
| + ReportLoadAbort(url, true /* is_top_level */, net::ERR_INVALID_URL);
|
| + return;
|
| + }
|
| +
|
| // Do not allow navigating a guest to schemes other than known safe schemes.
|
| // This will block the embedder trying to load unwanted schemes, e.g.
|
| // chrome://settings.
|
| - bool scheme_is_blocked =
|
| - (!ChildProcessSecurityPolicyImpl::GetInstance()->IsWebSafeScheme(
|
| - url.scheme()) &&
|
| - !ChildProcessSecurityPolicyImpl::GetInstance()->IsPseudoScheme(
|
| - url.scheme())) ||
|
| - url.SchemeIs(kJavaScriptScheme);
|
| - bool can_commit =
|
| - GetContentClient()->browser()->CanCommitURL(
|
| - GetWebContents()->GetRenderProcessHost(), url);
|
| - if (scheme_is_blocked || !url.is_valid() || !can_commit) {
|
| - if (delegate_) {
|
| - // TODO(fsamuel): Need better error reporting here.
|
| - std::string error_type;
|
| - base::RemoveChars(net::ErrorToString(net::ERR_ABORTED), "net::",
|
| - &error_type);
|
| - delegate_->LoadAbort(true /* is_top_level */, url, error_type);
|
| - }
|
| + if (!SupportsScheme(url)) {
|
| + ReportLoadAbort(url, true /* is_top_level */,
|
| + net::ERR_DISALLOWED_URL_SCHEME);
|
| + return;
|
| + }
|
| +
|
| + if (!GetContentClient()->browser()->CanCommitURL(
|
| + GetWebContents()->GetRenderProcessHost(), url)) {
|
| + ReportLoadAbort(url, true /* is_top_level */, net::ERR_ACCESS_DENIED);
|
| return;
|
| }
|
|
|
|
|