aw_http_auth_handler.cc 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/aw_http_auth_handler.h"
  5. #include <utility>
  6. #include "android_webview/browser/aw_contents.h"
  7. #include "android_webview/browser_jni_headers/AwHttpAuthHandler_jni.h"
  8. #include "base/android/jni_android.h"
  9. #include "base/android/jni_string.h"
  10. #include "base/bind.h"
  11. #include "content/public/browser/browser_task_traits.h"
  12. #include "content/public/browser/browser_thread.h"
  13. #include "content/public/browser/web_contents.h"
  14. #include "net/base/auth.h"
  15. #include "third_party/abseil-cpp/absl/types/optional.h"
  16. using base::android::ConvertJavaStringToUTF16;
  17. using base::android::JavaParamRef;
  18. using content::BrowserThread;
  19. namespace android_webview {
  20. AwHttpAuthHandler::AwHttpAuthHandler(const net::AuthChallengeInfo& auth_info,
  21. content::WebContents* web_contents,
  22. bool first_auth_attempt,
  23. LoginAuthRequiredCallback callback)
  24. : web_contents_(web_contents->GetWeakPtr()),
  25. host_(auth_info.challenger.host()),
  26. realm_(auth_info.realm),
  27. callback_(std::move(callback)) {
  28. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  29. JNIEnv* env = base::android::AttachCurrentThread();
  30. http_auth_handler_.Reset(Java_AwHttpAuthHandler_create(
  31. env, reinterpret_cast<intptr_t>(this), first_auth_attempt));
  32. content::GetUIThreadTaskRunner({})->PostTask(
  33. FROM_HERE,
  34. base::BindOnce(&AwHttpAuthHandler::Start, weak_factory_.GetWeakPtr()));
  35. }
  36. AwHttpAuthHandler::~AwHttpAuthHandler() {
  37. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  38. Java_AwHttpAuthHandler_handlerDestroyed(base::android::AttachCurrentThread(),
  39. http_auth_handler_);
  40. }
  41. void AwHttpAuthHandler::Proceed(JNIEnv* env,
  42. const JavaParamRef<jobject>& obj,
  43. const JavaParamRef<jstring>& user,
  44. const JavaParamRef<jstring>& password) {
  45. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  46. if (callback_) {
  47. std::move(callback_).Run(
  48. net::AuthCredentials(ConvertJavaStringToUTF16(env, user),
  49. ConvertJavaStringToUTF16(env, password)));
  50. }
  51. }
  52. void AwHttpAuthHandler::Cancel(JNIEnv* env, const JavaParamRef<jobject>& obj) {
  53. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  54. if (callback_) {
  55. std::move(callback_).Run(absl::nullopt);
  56. }
  57. }
  58. void AwHttpAuthHandler::Start() {
  59. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  60. // The WebContents may have been destroyed during the PostTask.
  61. if (!web_contents_) {
  62. std::move(callback_).Run(absl::nullopt);
  63. return;
  64. }
  65. AwContents* aw_contents = AwContents::FromWebContents(web_contents_.get());
  66. if (!aw_contents->OnReceivedHttpAuthRequest(http_auth_handler_, host_,
  67. realm_)) {
  68. std::move(callback_).Run(absl::nullopt);
  69. }
  70. }
  71. } // namespace android_webview