Browse Source

NetworkService: Implement URLLoader::OnAuthRequired

https://chromium-review.googlesource.com/c/chromium/src/+/938960
deepak1556 7 years ago
parent
commit
0cbffb15cc

+ 14 - 0
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<net::ClientCertStore> 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<void(const base::Optional<net::AuthCredentials>&)>&
+        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.

+ 8 - 0
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<net::ClientCertStore> 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<void(const base::Optional<net::AuthCredentials>&)>&
+          auth_required_callback) override;
 
   // brightray::BrowserClient:
   brightray::BrowserMainParts* OverrideCreateBrowserMainParts(

+ 0 - 8
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,

+ 0 - 3
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,

+ 19 - 39
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<void(const base::Optional<net::AuthCredentials>&)>&
+        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<base::DictionaryValue> 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));
   }
 }
 

+ 13 - 8
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<void(const base::Optional<net::AuthCredentials>&)>&
+          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<net::AuthChallengeInfo> 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<void(const base::Optional<net::AuthCredentials>&)>
+      auth_required_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(LoginHandler);
 };