diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 0975e9bdc9ee..5e12bea7e671 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -17,6 +17,7 @@ #include "atom/browser/atom_resource_dispatcher_host_delegate.h" #include "atom/browser/atom_speech_recognition_manager_delegate.h" #include "atom/browser/child_web_contents_tracker.h" +#include "atom/browser/login_handler.h" #include "atom/browser/native_window.h" #include "atom/browser/session_preferences.h" #include "atom/browser/web_contents_permission_helper.h" @@ -497,6 +498,19 @@ std::unique_ptr AtomBrowserClient::CreateClientCertStore( #endif } +content::ResourceDispatcherHostLoginDelegate* +AtomBrowserClient::CreateLoginDelegate( + net::AuthChallengeInfo* auth_info, + content::ResourceRequestInfo::WebContentsGetter web_contents_getter, + bool is_main_frame, + const GURL& url, + bool first_auth_attempt, + const base::Callback&)>& + auth_required_callback) { + return new LoginHandler(auth_info, web_contents_getter, url, + auth_required_callback); +} + brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts( const content::MainFunctionParams&) { v8::V8::Initialize(); // Init V8 before creating main parts. diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index a0284cf3f72e..51cd6ebc6f01 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -106,6 +106,14 @@ class AtomBrowserClient : public brightray::BrowserClient, void SiteInstanceDeleting(content::SiteInstance* site_instance) override; std::unique_ptr CreateClientCertStore( content::ResourceContext* resource_context) override; + content::ResourceDispatcherHostLoginDelegate* CreateLoginDelegate( + net::AuthChallengeInfo* auth_info, + content::ResourceRequestInfo::WebContentsGetter web_contents_getter, + bool is_main_frame, + const GURL& url, + bool first_auth_attempt, + const base::Callback&)>& + auth_required_callback) override; // brightray::BrowserClient: brightray::BrowserMainParts* OverrideCreateBrowserMainParts( diff --git a/atom/browser/atom_resource_dispatcher_host_delegate.cc b/atom/browser/atom_resource_dispatcher_host_delegate.cc index 0b425adbf09c..934b0ebaa49b 100644 --- a/atom/browser/atom_resource_dispatcher_host_delegate.cc +++ b/atom/browser/atom_resource_dispatcher_host_delegate.cc @@ -5,7 +5,6 @@ #include "atom/browser/atom_resource_dispatcher_host_delegate.h" #include "atom/browser/atom_browser_context.h" -#include "atom/browser/login_handler.h" #include "atom/browser/web_contents_permission_helper.h" #include "atom/browser/web_contents_preferences.h" #include "atom/common/platform_util.h" @@ -114,13 +113,6 @@ bool AtomResourceDispatcherHostDelegate::HandleExternalProtocol( return true; } -content::ResourceDispatcherHostLoginDelegate* -AtomResourceDispatcherHostDelegate::CreateLoginDelegate( - net::AuthChallengeInfo* auth_info, - net::URLRequest* request) { - return new LoginHandler(auth_info, request); -} - bool AtomResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream( net::URLRequest* request, const std::string& mime_type, diff --git a/atom/browser/atom_resource_dispatcher_host_delegate.h b/atom/browser/atom_resource_dispatcher_host_delegate.h index 58b7e5139827..eb91b27921e2 100644 --- a/atom/browser/atom_resource_dispatcher_host_delegate.h +++ b/atom/browser/atom_resource_dispatcher_host_delegate.h @@ -19,9 +19,6 @@ class AtomResourceDispatcherHostDelegate // content::ResourceDispatcherHostDelegate: bool HandleExternalProtocol(const GURL& url, content::ResourceRequestInfo* info) override; - content::ResourceDispatcherHostLoginDelegate* CreateLoginDelegate( - net::AuthChallengeInfo* auth_info, - net::URLRequest* request) override; bool ShouldInterceptResourceAsStream(net::URLRequest* request, const std::string& mime_type, GURL* origin, diff --git a/atom/browser/login_handler.cc b/atom/browser/login_handler.cc index d870c58b0921..8aa8e9d3c99e 100644 --- a/atom/browser/login_handler.cc +++ b/atom/browser/login_handler.cc @@ -5,41 +5,30 @@ #include "atom/browser/login_handler.h" #include "atom/browser/browser.h" -#include "atom/common/native_mate_converters/net_converter.h" #include "base/values.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/resource_dispatcher_host.h" -#include "content/public/browser/resource_request_info.h" #include "content/public/browser/web_contents.h" #include "net/base/auth.h" -#include "net/url_request/url_request.h" using content::BrowserThread; namespace atom { -namespace { - -// Helper to remove the ref from an net::URLRequest to the LoginHandler. -// Should only be called from the IO thread, since it accesses an -// net::URLRequest. -void ResetLoginHandlerForRequest(net::URLRequest* request) { - content::ResourceDispatcherHost::Get()->ClearLoginDelegateForRequest(request); -} - -} // namespace - -LoginHandler::LoginHandler(net::AuthChallengeInfo* auth_info, - net::URLRequest* request) - : auth_info_(auth_info), request_(request) { - content::ResourceRequestInfo::ForRequest(request_)->GetAssociatedRenderFrame( - &render_process_host_id_, &render_frame_id_); - +LoginHandler::LoginHandler( + net::AuthChallengeInfo* auth_info, + content::ResourceRequestInfo::WebContentsGetter web_contents_getter, + const GURL& url, + const base::Callback&)>& + auth_required_callback) + : auth_info_(auth_info), + web_contents_getter_(web_contents_getter), + auth_required_callback_(auth_required_callback) { // Fill request details on IO thread. + // TODO(deepak1556): Fill in method and referrer details to + // avoid breaking the app login event. std::unique_ptr request_details( new base::DictionaryValue); - FillRequestDetails(request_details.get(), request_); + request_details->SetKey("url", base::Value(url)); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -52,10 +41,7 @@ LoginHandler::~LoginHandler() {} content::WebContents* LoginHandler::GetWebContents() const { DCHECK_CURRENTLY_ON(BrowserThread::UI); - - content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( - render_process_host_id_, render_frame_id_); - return content::WebContents::FromRenderFrameHost(rfh); + return web_contents_getter_.Run(); } void LoginHandler::Login(const base::string16& username, @@ -78,7 +64,7 @@ void LoginHandler::CancelAuth() { void LoginHandler::OnRequestCancelled() { TestAndSetAuthHandled(); - request_ = nullptr; + auth_required_callback_.Reset(); } // Marks authentication as handled and returns the previous handled state. @@ -91,22 +77,16 @@ bool LoginHandler::TestAndSetAuthHandled() { void LoginHandler::DoCancelAuth() { DCHECK_CURRENTLY_ON(BrowserThread::IO); - - if (request_) { - request_->CancelAuth(); - // Verify that CancelAuth doesn't destroy the request via our delegate. - DCHECK(request_ != nullptr); - ResetLoginHandlerForRequest(request_); - } + if (!auth_required_callback_.is_null()) + std::move(auth_required_callback_).Run(base::nullopt); } void LoginHandler::DoLogin(const base::string16& username, const base::string16& password) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - - if (request_) { - request_->SetAuth(net::AuthCredentials(username, password)); - ResetLoginHandlerForRequest(request_); + if (!auth_required_callback_.is_null()) { + std::move(auth_required_callback_) + .Run(net::AuthCredentials(username, password)); } } diff --git a/atom/browser/login_handler.h b/atom/browser/login_handler.h index 16cded48625c..4178309c06cd 100644 --- a/atom/browser/login_handler.h +++ b/atom/browser/login_handler.h @@ -5,6 +5,8 @@ #ifndef ATOM_BROWSER_LOGIN_HANDLER_H_ #define ATOM_BROWSER_LOGIN_HANDLER_H_ +#include "base/callback.h" +#include "base/optional.h" #include "base/strings/string16.h" #include "base/synchronization/lock.h" #include "content/public/browser/resource_dispatcher_host_login_delegate.h" @@ -15,7 +17,7 @@ class WebContents; namespace net { class AuthChallengeInfo; -class URLRequest; +class AuthCredentials; } // namespace net namespace atom { @@ -23,7 +25,12 @@ namespace atom { // Handles the HTTP basic auth, must be created on IO thread. class LoginHandler : public content::ResourceDispatcherHostLoginDelegate { public: - LoginHandler(net::AuthChallengeInfo* auth_info, net::URLRequest* request); + LoginHandler( + net::AuthChallengeInfo* auth_info, + content::ResourceRequestInfo::WebContentsGetter web_contents_getter, + const GURL& url, + const base::Callback&)>& + auth_required_callback); // Returns the WebContents associated with the request, must be called on UI // thread. @@ -59,13 +66,11 @@ class LoginHandler : public content::ResourceDispatcherHostLoginDelegate { // Who/where/what asked for the authentication. scoped_refptr auth_info_; - // The request that wants login data. - // This should only be accessed on the IO loop. - net::URLRequest* request_ = nullptr; + // WebContents associated with the login request. + content::ResourceRequestInfo::WebContentsGetter web_contents_getter_; - // Cached from the net::URLRequest, in case it goes NULL on us. - int render_process_host_id_ = 0; - int render_frame_id_ = 0; + base::Callback&)> + auth_required_callback_; DISALLOW_COPY_AND_ASSIGN(LoginHandler); };