Commit 4105618e authored by Ayu Ishii's avatar Ayu Ishii Committed by Commit Bot

WebOTP: Use WeakPtr to hold onto RenderFrameHost

Change-Id: Id9ab078652ae626170b51fb5e6697808de67f34a
Bug: 1068395
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2141114Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Commit-Queue: Ayu Ishii <ayui@chromium.org>
Cr-Commit-Position: refs/heads/master@{#757875}
parent 5a40a115
...@@ -6966,7 +6966,8 @@ void RenderFrameHostImpl::BindSmsReceiverReceiver( ...@@ -6966,7 +6966,8 @@ void RenderFrameHostImpl::BindSmsReceiverReceiver(
mojo::ReportBadMessage("Must have the same origin as the top-level frame."); mojo::ReportBadMessage("Must have the same origin as the top-level frame.");
return; return;
} }
auto* fetcher = SmsFetcher::Get(GetProcess()->GetBrowserContext(), this); auto* fetcher = SmsFetcher::Get(GetProcess()->GetBrowserContext(),
weak_ptr_factory_.GetWeakPtr());
SmsService::Create(fetcher, this, std::move(receiver)); SmsService::Create(fetcher, this, std::move(receiver));
} }
......
...@@ -38,12 +38,13 @@ SmsFetcher* SmsFetcher::Get(BrowserContext* context) { ...@@ -38,12 +38,13 @@ SmsFetcher* SmsFetcher::Get(BrowserContext* context) {
context->GetUserData(kSmsFetcherImplKeyName)); context->GetUserData(kSmsFetcherImplKeyName));
} }
SmsFetcher* SmsFetcher::Get(BrowserContext* context, RenderFrameHost* rfh) { SmsFetcher* SmsFetcher::Get(BrowserContext* context,
base::WeakPtr<RenderFrameHost> rfh) {
auto* stored_fetcher = static_cast<SmsFetcherImpl*>( auto* stored_fetcher = static_cast<SmsFetcherImpl*>(
context->GetUserData(kSmsFetcherImplKeyName)); context->GetUserData(kSmsFetcherImplKeyName));
if (!stored_fetcher || !stored_fetcher->CanReceiveSms()) { if (!stored_fetcher || !stored_fetcher->CanReceiveSms()) {
auto fetcher = auto fetcher = std::make_unique<SmsFetcherImpl>(
std::make_unique<SmsFetcherImpl>(context, SmsProvider::Create(rfh)); context, SmsProvider::Create(std::move(rfh)));
context->SetUserData(kSmsFetcherImplKeyName, std::move(fetcher)); context->SetUserData(kSmsFetcherImplKeyName, std::move(fetcher));
} }
return static_cast<SmsFetcherImpl*>( return static_cast<SmsFetcherImpl*>(
......
...@@ -24,14 +24,15 @@ SmsProvider::SmsProvider() = default; ...@@ -24,14 +24,15 @@ SmsProvider::SmsProvider() = default;
SmsProvider::~SmsProvider() = default; SmsProvider::~SmsProvider() = default;
// static // static
std::unique_ptr<SmsProvider> SmsProvider::Create(RenderFrameHost* rfh) { std::unique_ptr<SmsProvider> SmsProvider::Create(
base::WeakPtr<RenderFrameHost> rfh) {
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kWebOtpBackend) == switches::kWebOtpBackend) ==
switches::kWebOtpBackendSmsVerification) { switches::kWebOtpBackendSmsVerification) {
return std::make_unique<SmsProviderGmsVerification>(); return std::make_unique<SmsProviderGmsVerification>();
} }
return std::make_unique<SmsProviderGmsUserConsent>(rfh); return std::make_unique<SmsProviderGmsUserConsent>(std::move(rfh));
#else #else
return nullptr; return nullptr;
#endif #endif
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/observer_list_types.h" #include "base/observer_list_types.h"
#include "content/browser/sms/sms_parser.h" #include "content/browser/sms/sms_parser.h"
...@@ -40,7 +41,8 @@ class CONTENT_EXPORT SmsProvider { ...@@ -40,7 +41,8 @@ class CONTENT_EXPORT SmsProvider {
// it is received or (exclusively) when it timeouts. // it is received or (exclusively) when it timeouts.
virtual void Retrieve() = 0; virtual void Retrieve() = 0;
static std::unique_ptr<SmsProvider> Create(RenderFrameHost* rfh); static std::unique_ptr<SmsProvider> Create(
base::WeakPtr<RenderFrameHost> rfh);
void AddObserver(Observer*); void AddObserver(Observer*);
void RemoveObserver(const Observer*); void RemoveObserver(const Observer*);
......
...@@ -19,8 +19,9 @@ using base::android::ConvertJavaStringToUTF8; ...@@ -19,8 +19,9 @@ using base::android::ConvertJavaStringToUTF8;
namespace content { namespace content {
SmsProviderGmsUserConsent::SmsProviderGmsUserConsent(RenderFrameHost* rfh) SmsProviderGmsUserConsent::SmsProviderGmsUserConsent(
: SmsProvider(), render_frame_host_(rfh) { base::WeakPtr<RenderFrameHost> rfh)
: SmsProvider(), render_frame_host_(std::move(rfh)) {
// This class is constructed a single time whenever the // This class is constructed a single time whenever the
// first web page uses the SMS Retriever API to wait for // first web page uses the SMS Retriever API to wait for
// SMSes. // SMSes.
...@@ -35,13 +36,15 @@ SmsProviderGmsUserConsent::~SmsProviderGmsUserConsent() { ...@@ -35,13 +36,15 @@ SmsProviderGmsUserConsent::~SmsProviderGmsUserConsent() {
} }
void SmsProviderGmsUserConsent::Retrieve() { void SmsProviderGmsUserConsent::Retrieve() {
JNIEnv* env = AttachCurrentThread(); if (!render_frame_host_)
return;
WebContents* web_contents = WebContents* web_contents =
WebContents::FromRenderFrameHost(render_frame_host_); WebContents::FromRenderFrameHost(render_frame_host_.get());
if (!web_contents || !web_contents->GetTopLevelNativeWindow()) if (!web_contents || !web_contents->GetTopLevelNativeWindow())
return; return;
JNIEnv* env = AttachCurrentThread();
Java_SmsUserConsentReceiver_listen( Java_SmsUserConsentReceiver_listen(
env, j_sms_receiver_, env, j_sms_receiver_,
web_contents->GetTopLevelNativeWindow()->GetJavaObject()); web_contents->GetTopLevelNativeWindow()->GetJavaObject());
......
...@@ -17,7 +17,7 @@ namespace content { ...@@ -17,7 +17,7 @@ namespace content {
class CONTENT_EXPORT SmsProviderGmsUserConsent : public SmsProvider { class CONTENT_EXPORT SmsProviderGmsUserConsent : public SmsProvider {
public: public:
SmsProviderGmsUserConsent(RenderFrameHost* rfh); SmsProviderGmsUserConsent(base::WeakPtr<RenderFrameHost> rfh);
~SmsProviderGmsUserConsent() override; ~SmsProviderGmsUserConsent() override;
void Retrieve() override; void Retrieve() override;
...@@ -30,7 +30,7 @@ class CONTENT_EXPORT SmsProviderGmsUserConsent : public SmsProvider { ...@@ -30,7 +30,7 @@ class CONTENT_EXPORT SmsProviderGmsUserConsent : public SmsProvider {
private: private:
base::android::ScopedJavaGlobalRef<jobject> j_sms_receiver_; base::android::ScopedJavaGlobalRef<jobject> j_sms_receiver_;
RenderFrameHost* const render_frame_host_; const base::WeakPtr<RenderFrameHost> render_frame_host_;
DISALLOW_COPY_AND_ASSIGN(SmsProviderGmsUserConsent); DISALLOW_COPY_AND_ASSIGN(SmsProviderGmsUserConsent);
}; };
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/sms/sms_provider.h" #include "content/browser/sms/sms_provider.h"
#include "content/browser/sms/sms_provider_gms_user_consent.h" #include "content/browser/sms/sms_provider_gms_user_consent.h"
#include "content/public/common/content_features.h" #include "content/public/common/content_features.h"
...@@ -49,7 +50,7 @@ class SmsProviderGmsUserConsentTest : public RenderViewHostTestHarness { ...@@ -49,7 +50,7 @@ class SmsProviderGmsUserConsentTest : public RenderViewHostTestHarness {
void SetUp() { void SetUp() {
RenderViewHostTestHarness::SetUp(); RenderViewHostTestHarness::SetUp();
provider_ = std::make_unique<SmsProviderGmsUserConsent>( provider_ = std::make_unique<SmsProviderGmsUserConsent>(
web_contents()->GetMainFrame()); static_cast<RenderFrameHostImpl*>(main_rfh())->GetWeakPtr());
j_fake_sms_retriever_client_.Reset( j_fake_sms_retriever_client_.Reset(
Java_FakeSmsUserConsentRetrieverClient_create(AttachCurrentThread())); Java_FakeSmsUserConsentRetrieverClient_create(AttachCurrentThread()));
Java_SmsUserConsentFakes_setUserConsentClientForTesting( Java_SmsUserConsentFakes_setUserConsentClientForTesting(
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <string> #include <string>
#include "base/memory/weak_ptr.h"
#include "base/observer_list_types.h" #include "base/observer_list_types.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
...@@ -30,7 +31,7 @@ class SmsFetcher { ...@@ -30,7 +31,7 @@ class SmsFetcher {
// Retrieval for devices that have telephony capabilities and can receive // Retrieval for devices that have telephony capabilities and can receive
// SMSes coming from the installed device locally. (eg. Android phones) // SMSes coming from the installed device locally. (eg. Android phones)
CONTENT_EXPORT static SmsFetcher* Get(BrowserContext* context, CONTENT_EXPORT static SmsFetcher* Get(BrowserContext* context,
RenderFrameHost* rfh); base::WeakPtr<RenderFrameHost> rfh);
class Subscriber : public base::CheckedObserver { class Subscriber : public base::CheckedObserver {
public: public:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment