Chromium Code Reviews| Index: extensions/browser/guest_view/web_view/web_view_guest.cc |
| diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc |
| index 692e490b24e85894f9fd9ce0c30f49204b5521e6..a520ce9fa9182c6f3fd76fb2a0d1a0c2deccab8f 100644 |
| --- a/extensions/browser/guest_view/web_view/web_view_guest.cc |
| +++ b/extensions/browser/guest_view/web_view/web_view_guest.cc |
| @@ -23,6 +23,7 @@ |
| #include "content/public/browser/child_process_security_policy.h" |
| #include "content/public/browser/native_web_keyboard_event.h" |
| #include "content/public/browser/navigation_entry.h" |
| +#include "content/public/browser/navigation_handle.h" |
| #include "content/public/browser/notification_details.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_source.h" |
| @@ -600,13 +601,12 @@ void WebViewGuest::LoadProgressChanged(WebContents* source, double progress) { |
| void WebViewGuest::LoadAbort(bool is_top_level, |
| const GURL& url, |
| - int error_code, |
| - const std::string& error_type) { |
| + int error_code) { |
| std::unique_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| args->SetBoolean(guest_view::kIsTopLevel, is_top_level); |
| args->SetString(guest_view::kUrl, url.possibly_invalid_spec()); |
| args->SetInteger(guest_view::kCode, error_code); |
| - args->SetString(guest_view::kReason, error_type); |
| + args->SetString(guest_view::kReason, net::ErrorToShortString(error_code)); |
| DispatchEventToView(base::MakeUnique<GuestViewEvent>(webview::kEventLoadAbort, |
| std::move(args))); |
| } |
| @@ -806,11 +806,24 @@ WebViewGuest::WebViewGuest(WebContents* owner_web_contents) |
| WebViewGuest::~WebViewGuest() { |
| } |
| -void WebViewGuest::DidCommitProvisionalLoadForFrame( |
| - content::RenderFrameHost* render_frame_host, |
| - const GURL& url, |
| - ui::PageTransition transition_type) { |
| - if (!render_frame_host->GetParent()) { |
| +void WebViewGuest::DidFinishNavigation( |
| + content::NavigationHandle* navigation_handle) { |
| + if (navigation_handle->IsErrorPage() || !navigation_handle->HasCommitted()) { |
| + // Suppress loadabort for "mailto" URLs. |
| + // Also during destruction, owner_web_contents() is null so there's no point |
| + // trying to send the event. |
| + if (!navigation_handle->GetURL().SchemeIs(url::kMailToScheme) && |
| + owner_web_contents()) { |
| + int error_code = navigation_handle->IsErrorPage() |
| + ? navigation_handle->GetNetErrorCode() |
| + : net::ERR_BLOCKED_BY_CLIENT; |
|
Fady Samuel
2016/10/13 15:33:01
This would happen if the load is blocked by the we
jam
2016/10/13 16:30:06
Right. the error code ERR_BLOCKED_BY_CLIENT keeps
|
| + LoadAbort(navigation_handle->IsInMainFrame(), navigation_handle->GetURL(), |
| + error_code); |
| + } |
| + return; |
| + } |
| + |
| + if (navigation_handle->IsInMainFrame()) { |
| // For LoadDataWithBaseURL loads, |url| contains the data URL, but the |
| // virtual URL is needed in that case. So use WebContents::GetURL instead. |
| src_ = web_contents()->GetURL(); |
| @@ -822,7 +835,7 @@ void WebViewGuest::DidCommitProvisionalLoadForFrame( |
| } |
| std::unique_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| args->SetString(guest_view::kUrl, src_.spec()); |
| - args->SetBoolean(guest_view::kIsTopLevel, !render_frame_host->GetParent()); |
| + args->SetBoolean(guest_view::kIsTopLevel, navigation_handle->IsInMainFrame()); |
| args->SetString(webview::kInternalBaseURLForDataURL, |
| web_contents() |
| ->GetController() |
| @@ -841,28 +854,11 @@ void WebViewGuest::DidCommitProvisionalLoadForFrame( |
| find_helper_.CancelAllFindSessions(); |
| } |
| -void WebViewGuest::DidFailProvisionalLoad( |
| - content::RenderFrameHost* render_frame_host, |
| - const GURL& validated_url, |
| - int error_code, |
| - const base::string16& error_description, |
| - bool was_ignored_by_handler) { |
| - // Suppress loadabort for "mailto" URLs. |
| - if (validated_url.SchemeIs(url::kMailToScheme)) |
| - return; |
| - |
| - LoadAbort(!render_frame_host->GetParent(), validated_url, error_code, |
| - net::ErrorToShortString(error_code)); |
| -} |
| - |
| -void WebViewGuest::DidStartProvisionalLoadForFrame( |
| - content::RenderFrameHost* render_frame_host, |
| - const GURL& validated_url, |
| - bool is_error_page, |
| - bool is_iframe_srcdoc) { |
| +void WebViewGuest::DidStartNavigation( |
| + content::NavigationHandle* navigation_handle) { |
| std::unique_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| - args->SetString(guest_view::kUrl, validated_url.spec()); |
| - args->SetBoolean(guest_view::kIsTopLevel, !render_frame_host->GetParent()); |
| + args->SetString(guest_view::kUrl, navigation_handle->GetURL().spec()); |
| + args->SetBoolean(guest_view::kIsTopLevel, navigation_handle->IsInMainFrame()); |
| DispatchEventToView(base::MakeUnique<GuestViewEvent>(webview::kEventLoadStart, |
| std::move(args))); |
| } |
| @@ -1381,8 +1377,7 @@ void WebViewGuest::LoadURLWithParams( |
| ui::PageTransition transition_type, |
| bool force_navigation) { |
| if (!url.is_valid()) { |
| - LoadAbort(true /* is_top_level */, url, net::ERR_INVALID_URL, |
| - net::ErrorToShortString(net::ERR_INVALID_URL)); |
| + LoadAbort(true /* is_top_level */, url, net::ERR_INVALID_URL); |
| NavigateGuest(url::kAboutBlankURL, false /* force_navigation */); |
| return; |
| } |
| @@ -1397,8 +1392,7 @@ void WebViewGuest::LoadURLWithParams( |
| // This will block the embedder trying to load unwanted schemes, e.g. |
| // chrome://. |
| if (scheme_is_blocked) { |
| - LoadAbort(true /* is_top_level */, url, net::ERR_DISALLOWED_URL_SCHEME, |
| - net::ErrorToShortString(net::ERR_DISALLOWED_URL_SCHEME)); |
| + LoadAbort(true /* is_top_level */, url, net::ERR_DISALLOWED_URL_SCHEME); |
| NavigateGuest(url::kAboutBlankURL, false /* force_navigation */); |
| return; |
| } |