0

[WebView] Merge AwContentsClientBridgeBase into AwContentsClientBridge

AwContentsClientBridgeBase was a browser/ layer interface
for AwContentsClientBridge, since we can make jni calls from
browser/ already, we don't need this interface anymore.

This CL removes AwContentsClientBridgeBase, and put code into
AwContentsClientBridge.

BUG=716604

Review-Url: https://codereview.chromium.org/2888623004
Cr-Commit-Position: refs/heads/master@{#472307}
This commit is contained in:
ctzsm
2017-05-16 20:41:11 -07:00
committed by Commit bot
parent bc5732b541
commit 9ca8b8cd2b
10 changed files with 127 additions and 235 deletions

@ -446,8 +446,6 @@ source_set("common") {
"browser/aw_contents_background_thread_client.h",
"browser/aw_contents_client_bridge.cc",
"browser/aw_contents_client_bridge.h",
"browser/aw_contents_client_bridge_base.cc",
"browser/aw_contents_client_bridge_base.h",
"browser/aw_contents_io_thread_client.h",
"browser/aw_contents_io_thread_client_impl.cc",
"browser/aw_contents_io_thread_client_impl.h",

@ -8,7 +8,7 @@
#include "android_webview/browser/aw_browser_context.h"
#include "android_webview/browser/aw_browser_main_parts.h"
#include "android_webview/browser/aw_contents_client_bridge_base.h"
#include "android_webview/browser/aw_contents_client_bridge.h"
#include "android_webview/browser/aw_contents_io_thread_client.h"
#include "android_webview/browser/aw_cookie_access_policy.h"
#include "android_webview/browser/aw_devtools_manager_delegate.h"
@ -145,8 +145,8 @@ void AwContentsMessageFilter::OnShouldOverrideUrlLoading(
bool* ignore_navigation) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
*ignore_navigation = false;
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromID(process_id_, render_frame_id);
AwContentsClientBridge* client =
AwContentsClientBridge::FromID(process_id_, render_frame_id);
if (client) {
*ignore_navigation = client->ShouldOverrideUrlLoading(
url, has_user_gesture, is_redirect, is_main_frame);
@ -385,8 +385,8 @@ void AwContentBrowserClient::AllowCertificateError(
bool expired_previous_decision,
const base::Callback<void(content::CertificateRequestResultType)>&
callback) {
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromWebContents(web_contents);
AwContentsClientBridge* client =
AwContentsClientBridge::FromWebContents(web_contents);
bool cancel_request = true;
if (client)
client->AllowCertificateError(cert_error,
@ -403,8 +403,8 @@ void AwContentBrowserClient::SelectClientCertificate(
net::SSLCertRequestInfo* cert_request_info,
net::CertificateList client_certs,
std::unique_ptr<content::ClientCertificateDelegate> delegate) {
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromWebContents(web_contents);
AwContentsClientBridge* client =
AwContentsClientBridge::FromWebContents(web_contents);
if (client)
client->SelectClientCertificate(cert_request_info, std::move(delegate));
}

@ -261,8 +261,8 @@ void AwContents::SetJavaPeers(
contents_client_bridge_.reset(
new AwContentsClientBridge(env, contents_client_bridge));
AwContentsClientBridgeBase::Associate(web_contents_.get(),
contents_client_bridge_.get());
AwContentsClientBridge::Associate(web_contents_.get(),
contents_client_bridge_.get());
AwContentsIoThreadClientImpl::Associate(web_contents_.get(),
io_thread_client);

@ -20,6 +20,7 @@
#include "base/message_loop/message_loop.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/client_certificate_delegate.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
@ -43,6 +44,7 @@ using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
using base::android::ToJavaArrayOfStrings;
using content::BrowserThread;
using content::WebContents;
using std::vector;
namespace android_webview {
@ -58,8 +60,64 @@ void RecordClientCertificateKey(net::X509Certificate* client_cert,
client_cert, std::move(private_key));
}
const void* const kAwContentsClientBridge = &kAwContentsClientBridge;
// This class is invented so that the UserData registry that we inject the
// AwContentsClientBridge object does not own and destroy it.
class UserData : public base::SupportsUserData::Data {
public:
static AwContentsClientBridge* GetContents(
content::WebContents* web_contents) {
if (!web_contents)
return NULL;
UserData* data = static_cast<UserData*>(
web_contents->GetUserData(kAwContentsClientBridge));
return data ? data->contents_ : NULL;
}
explicit UserData(AwContentsClientBridge* ptr) : contents_(ptr) {}
private:
AwContentsClientBridge* contents_;
DISALLOW_COPY_AND_ASSIGN(UserData);
};
} // namespace
// static
void AwContentsClientBridge::Associate(WebContents* web_contents,
AwContentsClientBridge* handler) {
web_contents->SetUserData(kAwContentsClientBridge,
base::MakeUnique<UserData>(handler));
}
// static
AwContentsClientBridge* AwContentsClientBridge::FromWebContents(
WebContents* web_contents) {
return UserData::GetContents(web_contents);
}
// static
AwContentsClientBridge* AwContentsClientBridge::FromWebContentsGetter(
const content::ResourceRequestInfo::WebContentsGetter&
web_contents_getter) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebContents* web_contents = web_contents_getter.Run();
return UserData::GetContents(web_contents);
}
// static
AwContentsClientBridge* AwContentsClientBridge::FromID(int render_process_id,
int render_frame_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
content::RenderFrameHost* rfh =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(rfh);
return UserData::GetContents(web_contents);
}
AwContentsClientBridge::AwContentsClientBridge(JNIEnv* env,
const JavaRef<jobject>& obj)
: java_ref_(env, obj) {

@ -6,15 +6,28 @@
#define ANDROID_WEBVIEW_BROWSER_AW_CONTENTS_CLIENT_BRIDGE_H_
#include <jni.h>
#include <memory>
#include "android_webview/browser/aw_contents_client_bridge_base.h"
#include "android_webview/browser/net/aw_web_resource_request.h"
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/callback.h"
#include "base/id_map.h"
#include "base/supports_user_data.h"
#include "content/public/browser/certificate_request_result_type.h"
#include "content/public/browser/javascript_dialog_manager.h"
#include "content/public/browser/resource_request_info.h"
#include "net/http/http_response_headers.h"
class GURL;
namespace content {
class ClientCertificateDelegate;
class WebContents;
}
namespace net {
class SSLCertRequestInfo;
class X509Certificate;
}
@ -27,56 +40,67 @@ namespace android_webview {
// indirect refs from the Application (via callbacks) and so can outlive
// webview, this class notifies it before being destroyed and to nullify
// any references.
class AwContentsClientBridge : public AwContentsClientBridgeBase {
class AwContentsClientBridge {
public:
// Adds the handler to the UserData registry.
static void Associate(content::WebContents* web_contents,
AwContentsClientBridge* handler);
static AwContentsClientBridge* FromWebContents(
content::WebContents* web_contents);
static AwContentsClientBridge* FromWebContentsGetter(
const content::ResourceRequestInfo::WebContentsGetter&
web_contents_getter);
static AwContentsClientBridge* FromID(int render_process_id,
int render_frame_id);
AwContentsClientBridge(JNIEnv* env,
const base::android::JavaRef<jobject>& obj);
~AwContentsClientBridge() override;
~AwContentsClientBridge();
// AwContentsClientBridgeBase implementation
// AwContentsClientBridge implementation
void AllowCertificateError(
int cert_error,
net::X509Certificate* cert,
const GURL& request_url,
const base::Callback<void(content::CertificateRequestResultType)>&
callback,
bool* cancel_request) override;
bool* cancel_request);
void SelectClientCertificate(
net::SSLCertRequestInfo* cert_request_info,
std::unique_ptr<content::ClientCertificateDelegate> delegate) override;
std::unique_ptr<content::ClientCertificateDelegate> delegate);
void RunJavaScriptDialog(
content::JavaScriptDialogType dialog_type,
const GURL& origin_url,
const base::string16& message_text,
const base::string16& default_prompt_text,
const content::JavaScriptDialogManager::DialogClosedCallback& callback)
override;
const content::JavaScriptDialogManager::DialogClosedCallback& callback);
void RunBeforeUnloadDialog(
const GURL& origin_url,
const content::JavaScriptDialogManager::DialogClosedCallback& callback)
override;
const content::JavaScriptDialogManager::DialogClosedCallback& callback);
bool ShouldOverrideUrlLoading(const base::string16& url,
bool has_user_gesture,
bool is_redirect,
bool is_main_frame) override;
bool is_main_frame);
void NewDownload(const GURL& url,
const std::string& user_agent,
const std::string& content_disposition,
const std::string& mime_type,
int64_t content_length) override;
int64_t content_length);
// Called when a new login request is detected. See the documentation for
// WebViewClient.onReceivedLoginRequest for arguments. Note that |account|
// may be empty.
void NewLoginRequest(const std::string& realm,
const std::string& account,
const std::string& args) override;
const std::string& args);
void OnReceivedError(const AwWebResourceRequest& request,
int error_code) override;
// Called when a resource loading error has occured (e.g. an I/O error,
// host name lookup failure etc.)
void OnReceivedError(const AwWebResourceRequest& request, int error_code);
void OnReceivedHttpError(const AwWebResourceRequest& request,
const scoped_refptr<const net::HttpResponseHeaders>&
response_headers) override;
// Called when a response from the server is received with status code >= 400.
void OnReceivedHttpError(
const AwWebResourceRequest& request,
const scoped_refptr<const net::HttpResponseHeaders>& response_headers);
// Methods called from Java.
void ProceedSslError(JNIEnv* env,

@ -1,81 +0,0 @@
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/aw_contents_client_bridge_base.h"
#include "base/memory/ptr_util.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
using content::BrowserThread;
using content::WebContents;
namespace android_webview {
namespace {
const void* const kAwContentsClientBridgeBase = &kAwContentsClientBridgeBase;
// This class is invented so that the UserData registry that we inject the
// AwContentsClientBridgeBase object does not own and destroy it.
class UserData : public base::SupportsUserData::Data {
public:
static AwContentsClientBridgeBase* GetContents(
content::WebContents* web_contents) {
if (!web_contents)
return NULL;
UserData* data = static_cast<UserData*>(
web_contents->GetUserData(kAwContentsClientBridgeBase));
return data ? data->contents_ : NULL;
}
explicit UserData(AwContentsClientBridgeBase* ptr) : contents_(ptr) {}
private:
AwContentsClientBridgeBase* contents_;
DISALLOW_COPY_AND_ASSIGN(UserData);
};
} // namespace
// static
void AwContentsClientBridgeBase::Associate(
WebContents* web_contents,
AwContentsClientBridgeBase* handler) {
web_contents->SetUserData(kAwContentsClientBridgeBase,
base::MakeUnique<UserData>(handler));
}
// static
AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContents(
WebContents* web_contents) {
return UserData::GetContents(web_contents);
}
// static
AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromWebContentsGetter(
const content::ResourceRequestInfo::WebContentsGetter&
web_contents_getter) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
WebContents* web_contents = web_contents_getter.Run();
return UserData::GetContents(web_contents);
}
// static
AwContentsClientBridgeBase* AwContentsClientBridgeBase::FromID(
int render_process_id,
int render_frame_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
content::RenderFrameHost* rfh =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(rfh);
return UserData::GetContents(web_contents);
}
AwContentsClientBridgeBase::~AwContentsClientBridgeBase() {
}
} // namespace android_webview

@ -1,107 +0,0 @@
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ANDROID_WEBVIEW_BROWSER_AW_CONTENTS_CLIENT_BRIDGE_BASE_H_
#define ANDROID_WEBVIEW_BROWSER_AW_CONTENTS_CLIENT_BRIDGE_BASE_H_
#include <memory>
#include "android_webview/browser/net/aw_web_resource_request.h"
#include "base/supports_user_data.h"
#include "content/public/browser/certificate_request_result_type.h"
#include "content/public/browser/javascript_dialog_manager.h"
#include "content/public/browser/resource_request_info.h"
#include "net/http/http_response_headers.h"
class GURL;
namespace content {
class ClientCertificateDelegate;
class WebContents;
}
namespace net {
class SSLCertRequestInfo;
class X509Certificate;
}
namespace android_webview {
// browser/ layer interface for AwContensClientBridge, as DEPS prevents this
// layer from depending on native/ where the implementation lives. The
// implementor of the base class plumbs the request to the Java side and
// eventually to the webviewclient. This layering hides the details of
// native/ from browser/ layer.
class AwContentsClientBridgeBase {
public:
// Adds the handler to the UserData registry.
static void Associate(content::WebContents* web_contents,
AwContentsClientBridgeBase* handler);
static AwContentsClientBridgeBase* FromWebContents(
content::WebContents* web_contents);
static AwContentsClientBridgeBase* FromWebContentsGetter(
const content::ResourceRequestInfo::WebContentsGetter&
web_contents_getter);
static AwContentsClientBridgeBase* FromID(int render_process_id,
int render_frame_id);
virtual ~AwContentsClientBridgeBase();
virtual void AllowCertificateError(
int cert_error,
net::X509Certificate* cert,
const GURL& request_url,
const base::Callback<void(content::CertificateRequestResultType)>&
callback,
bool* cancel_request) = 0;
virtual void SelectClientCertificate(
net::SSLCertRequestInfo* cert_request_info,
std::unique_ptr<content::ClientCertificateDelegate> delegate) = 0;
virtual void RunJavaScriptDialog(
content::JavaScriptDialogType dialog_type,
const GURL& origin_url,
const base::string16& message_text,
const base::string16& default_prompt_text,
const content::JavaScriptDialogManager::DialogClosedCallback&
callback) = 0;
virtual void RunBeforeUnloadDialog(
const GURL& origin_url,
const content::JavaScriptDialogManager::DialogClosedCallback& callback)
= 0;
virtual bool ShouldOverrideUrlLoading(const base::string16& url,
bool has_user_gesture,
bool is_redirect,
bool is_main_frame) = 0;
virtual void NewDownload(const GURL& url,
const std::string& user_agent,
const std::string& content_disposition,
const std::string& mime_type,
int64_t content_length) = 0;
// Called when a new login request is detected. See the documentation for
// WebViewClient.onReceivedLoginRequest for arguments. Note that |account|
// may be empty.
virtual void NewLoginRequest(const std::string& realm,
const std::string& account,
const std::string& args) = 0;
// Called when a resource loading error has occured (e.g. an I/O error,
// host name lookup failure etc.)
virtual void OnReceivedError(const AwWebResourceRequest& request,
int error_code) = 0;
// Called when a response from the server is received with status code >= 400.
virtual void OnReceivedHttpError(
const AwWebResourceRequest& request,
const scoped_refptr<const net::HttpResponseHeaders>&
response_headers) = 0;
};
} // namespace android_webview
#endif // ANDROID_WEBVIEW_BROWSER_AW_CONTENTS_CLIENT_BRIDGE_BASE_H_

@ -4,7 +4,7 @@
#include "android_webview/browser/aw_javascript_dialog_manager.h"
#include "android_webview/browser/aw_contents_client_bridge_base.h"
#include "android_webview/browser/aw_contents_client_bridge.h"
#include "content/public/browser/javascript_dialog_manager.h"
#include "content/public/browser/web_contents.h"
@ -22,8 +22,8 @@ void AwJavaScriptDialogManager::RunJavaScriptDialog(
const base::string16& default_prompt_text,
const DialogClosedCallback& callback,
bool* did_suppress_message) {
AwContentsClientBridgeBase* bridge =
AwContentsClientBridgeBase::FromWebContents(web_contents);
AwContentsClientBridge* bridge =
AwContentsClientBridge::FromWebContents(web_contents);
if (!bridge) {
callback.Run(false, base::string16());
return;
@ -37,8 +37,8 @@ void AwJavaScriptDialogManager::RunBeforeUnloadDialog(
content::WebContents* web_contents,
bool is_reload,
const DialogClosedCallback& callback) {
AwContentsClientBridgeBase* bridge =
AwContentsClientBridgeBase::FromWebContents(web_contents);
AwContentsClientBridge* bridge =
AwContentsClientBridge::FromWebContents(web_contents);
if (!bridge) {
callback.Run(false, base::string16());
return;

@ -5,7 +5,7 @@
#include "android_webview/browser/net/aw_network_delegate.h"
#include "android_webview/browser/aw_browser_context.h"
#include "android_webview/browser/aw_contents_client_bridge_base.h"
#include "android_webview/browser/aw_contents_client_bridge.h"
#include "android_webview/browser/aw_contents_io_thread_client.h"
#include "android_webview/browser/aw_cookie_access_policy.h"
#include "android_webview/browser/net/aw_web_resource_request.h"
@ -30,8 +30,8 @@ void OnReceivedHttpErrorOnUiThread(
const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
const AwWebResourceRequest& request,
scoped_refptr<const net::HttpResponseHeaders> original_response_headers) {
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromWebContentsGetter(web_contents_getter);
AwContentsClientBridge* client =
AwContentsClientBridge::FromWebContentsGetter(web_contents_getter);
if (!client) {
DLOG(WARNING) << "client is null, onReceivedHttpError dropped for "
<< request.url;

@ -8,7 +8,7 @@
#include <string>
#include "android_webview/browser/aw_browser_context.h"
#include "android_webview/browser/aw_contents_client_bridge_base.h"
#include "android_webview/browser/aw_contents_client_bridge.h"
#include "android_webview/browser/aw_contents_io_thread_client.h"
#include "android_webview/browser/aw_login_delegate.h"
#include "android_webview/browser/aw_resource_context.h"
@ -34,7 +34,7 @@
#include "url/url_constants.h"
using android_webview::AwContentsIoThreadClient;
using android_webview::AwContentsClientBridgeBase;
using android_webview::AwContentsClientBridge;
using android_webview::AwWebResourceRequest;
using content::BrowserThread;
using content::ResourceType;
@ -69,8 +69,8 @@ void DownloadStartingOnUIThread(
const std::string& content_disposition,
const std::string& mime_type,
int64_t content_length) {
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromWebContentsGetter(web_contents_getter);
AwContentsClientBridge* client =
AwContentsClientBridge::FromWebContentsGetter(web_contents_getter);
if (!client)
return;
client->NewDownload(url, user_agent, content_disposition, mime_type,
@ -82,8 +82,8 @@ void NewLoginRequestOnUIThread(
const std::string& realm,
const std::string& account,
const std::string& args) {
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromWebContentsGetter(web_contents_getter);
AwContentsClientBridge* client =
AwContentsClientBridge::FromWebContentsGetter(web_contents_getter);
if (!client)
return;
client->NewLoginRequest(realm, account, args);
@ -93,8 +93,8 @@ void OnReceivedErrorOnUiThread(
const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
const AwWebResourceRequest& request,
int error_code) {
AwContentsClientBridgeBase* client =
AwContentsClientBridgeBase::FromWebContentsGetter(web_contents_getter);
AwContentsClientBridge* client =
AwContentsClientBridge::FromWebContentsGetter(web_contents_getter);
if (!client) {
DLOG(WARNING) << "client is null, onReceivedError dropped for "
<< request.url;