Commit 2474e9c1 authored by John Abd-El-Malek's avatar John Abd-El-Malek Committed by Commit Bot

Move InputStream code from WebView to shared location so that WebLayer can reuse it

Bug: 1117626
Change-Id: I24af96b8149565d111950d82e4d3919470b5ff9a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2366559Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800245}
parent 6def1de7
...@@ -422,7 +422,6 @@ generate_jni("browser_jni_headers") { ...@@ -422,7 +422,6 @@ generate_jni("browser_jni_headers") {
"java/src/org/chromium/android_webview/AwWebContentsDelegate.java", "java/src/org/chromium/android_webview/AwWebContentsDelegate.java",
"java/src/org/chromium/android_webview/AwWebResourceInterceptResponse.java", "java/src/org/chromium/android_webview/AwWebResourceInterceptResponse.java",
"java/src/org/chromium/android_webview/AwWebResourceResponse.java", "java/src/org/chromium/android_webview/AwWebResourceResponse.java",
"java/src/org/chromium/android_webview/InputStreamUtil.java",
"java/src/org/chromium/android_webview/JsReplyProxy.java", "java/src/org/chromium/android_webview/JsReplyProxy.java",
"java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java", "java/src/org/chromium/android_webview/PopupTouchHandleDrawable.java",
"java/src/org/chromium/android_webview/VariationsSeedLoader.java", "java/src/org/chromium/android_webview/VariationsSeedLoader.java",
...@@ -503,7 +502,6 @@ android_library("browser_java") { ...@@ -503,7 +502,6 @@ android_library("browser_java") {
"java/src/org/chromium/android_webview/FindAddress.java", "java/src/org/chromium/android_webview/FindAddress.java",
"java/src/org/chromium/android_webview/FullScreenView.java", "java/src/org/chromium/android_webview/FullScreenView.java",
"java/src/org/chromium/android_webview/HttpAuthDatabase.java", "java/src/org/chromium/android_webview/HttpAuthDatabase.java",
"java/src/org/chromium/android_webview/InputStreamUtil.java",
"java/src/org/chromium/android_webview/JsPromptResultReceiver.java", "java/src/org/chromium/android_webview/JsPromptResultReceiver.java",
"java/src/org/chromium/android_webview/JsReplyProxy.java", "java/src/org/chromium/android_webview/JsReplyProxy.java",
"java/src/org/chromium/android_webview/JsResultHandler.java", "java/src/org/chromium/android_webview/JsResultHandler.java",
......
...@@ -106,14 +106,10 @@ source_set("browser") { ...@@ -106,14 +106,10 @@ source_set("browser") {
"find_helper.h", "find_helper.h",
"icon_helper.cc", "icon_helper.cc",
"icon_helper.h", "icon_helper.h",
"input_stream.cc",
"input_stream.h",
"js_java_interaction/aw_web_message_host_factory.cc", "js_java_interaction/aw_web_message_host_factory.cc",
"js_java_interaction/aw_web_message_host_factory.h", "js_java_interaction/aw_web_message_host_factory.h",
"js_java_interaction/js_reply_proxy.cc", "js_java_interaction/js_reply_proxy.cc",
"js_java_interaction/js_reply_proxy.h", "js_java_interaction/js_reply_proxy.h",
"network_service/android_stream_reader_url_loader.cc",
"network_service/android_stream_reader_url_loader.h",
"network_service/aw_network_change_notifier.cc", "network_service/aw_network_change_notifier.cc",
"network_service/aw_network_change_notifier.h", "network_service/aw_network_change_notifier.h",
"network_service/aw_network_change_notifier_factory.cc", "network_service/aw_network_change_notifier_factory.cc",
...@@ -132,8 +128,6 @@ source_set("browser") { ...@@ -132,8 +128,6 @@ source_set("browser") {
"network_service/aw_web_resource_request.h", "network_service/aw_web_resource_request.h",
"network_service/aw_web_resource_response.cc", "network_service/aw_web_resource_response.cc",
"network_service/aw_web_resource_response.h", "network_service/aw_web_resource_response.h",
"network_service/input_stream_reader.cc",
"network_service/input_stream_reader.h",
"network_service/net_helpers.cc", "network_service/net_helpers.cc",
"network_service/net_helpers.h", "network_service/net_helpers.h",
"page_load_metrics/aw_page_load_metrics_provider.cc", "page_load_metrics/aw_page_load_metrics_provider.cc",
...@@ -198,6 +192,7 @@ source_set("browser") { ...@@ -198,6 +192,7 @@ source_set("browser") {
"//components/cdm/browser", "//components/cdm/browser",
"//components/content_capture/android", "//components/content_capture/android",
"//components/content_capture/browser", "//components/content_capture/browser",
"//components/embedder_support/android:util",
"//components/favicon_base:favicon_base", "//components/favicon_base:favicon_base",
"//components/flags_ui", "//components/flags_ui",
......
...@@ -7,12 +7,12 @@ ...@@ -7,12 +7,12 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "android_webview/browser/input_stream.h"
#include "android_webview/browser_jni_headers/AndroidProtocolHandler_jni.h" #include "android_webview/browser_jni_headers/AndroidProtocolHandler_jni.h"
#include "android_webview/common/url_constants.h" #include "android_webview/common/url_constants.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "base/android/jni_weak_ref.h" #include "base/android/jni_weak_ref.h"
#include "components/embedder_support/android/util/input_stream.h"
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/base/mime_util.h" #include "net/base/mime_util.h"
...@@ -22,14 +22,13 @@ ...@@ -22,14 +22,13 @@
#include "url/gurl.h" #include "url/gurl.h"
#include "url/url_constants.h" #include "url/url_constants.h"
using android_webview::InputStream;
using android_webview::InputStream;
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ClearException; using base::android::ClearException;
using base::android::ConvertUTF8ToJavaString; using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef; using base::android::JavaParamRef;
using base::android::ScopedJavaGlobalRef; using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef; using base::android::ScopedJavaLocalRef;
using embedder_support::InputStream;
namespace android_webview { namespace android_webview {
...@@ -52,7 +51,7 @@ std::unique_ptr<InputStream> CreateInputStream(JNIEnv* env, const GURL& url) { ...@@ -52,7 +51,7 @@ std::unique_ptr<InputStream> CreateInputStream(JNIEnv* env, const GURL& url) {
bool GetInputStreamMimeType(JNIEnv* env, bool GetInputStreamMimeType(JNIEnv* env,
const GURL& url, const GURL& url,
InputStream* stream, embedder_support::InputStream* stream,
std::string* mime_type) { std::string* mime_type) {
// Query the mime type from the Java side. It is possible for the query to // Query the mime type from the Java side. It is possible for the query to
// fail, as the mime type cannot be determined for all supported schemes. // fail, as the mime type cannot be determined for all supported schemes.
......
...@@ -10,14 +10,19 @@ ...@@ -10,14 +10,19 @@
class GURL; class GURL;
namespace android_webview { namespace embedder_support {
class InputStream; class InputStream;
}
namespace android_webview {
std::unique_ptr<InputStream> CreateInputStream(JNIEnv* env, const GURL& url); std::unique_ptr<embedder_support::InputStream> CreateInputStream(
JNIEnv* env,
const GURL& url);
bool GetInputStreamMimeType(JNIEnv* env, bool GetInputStreamMimeType(JNIEnv* env,
const GURL& url, const GURL& url,
InputStream* stream, embedder_support::InputStream* stream,
std::string* mime_type); std::string* mime_type);
} // namespace android_webview } // namespace android_webview
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "android_webview/browser/input_stream.h"
#include "android_webview/browser/network_service/aw_web_resource_intercept_response.h" #include "android_webview/browser/network_service/aw_web_resource_intercept_response.h"
#include "android_webview/browser/network_service/aw_web_resource_request.h" #include "android_webview/browser/network_service/aw_web_resource_request.h"
#include "android_webview/browser/network_service/aw_web_resource_response.h" #include "android_webview/browser/network_service/aw_web_resource_response.h"
...@@ -25,6 +24,7 @@ ...@@ -25,6 +24,7 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "base/threading/scoped_blocking_call.h" #include "base/threading/scoped_blocking_call.h"
#include "components/embedder_support/android/util/input_stream.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
......
...@@ -13,18 +13,19 @@ ...@@ -13,18 +13,19 @@
#include "android_webview/browser/aw_contents_client_bridge.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_contents_io_thread_client.h"
#include "android_webview/browser/aw_cookie_access_policy.h" #include "android_webview/browser/aw_cookie_access_policy.h"
#include "android_webview/browser/input_stream.h"
#include "android_webview/browser/network_service/android_stream_reader_url_loader.h"
#include "android_webview/browser/network_service/aw_web_resource_intercept_response.h" #include "android_webview/browser/network_service/aw_web_resource_intercept_response.h"
#include "android_webview/browser/network_service/aw_web_resource_response.h" #include "android_webview/browser/network_service/aw_web_resource_response.h"
#include "android_webview/browser/network_service/net_helpers.h" #include "android_webview/browser/network_service/net_helpers.h"
#include "android_webview/browser/renderer_host/auto_login_parser.h" #include "android_webview/browser/renderer_host/auto_login_parser.h"
#include "android_webview/common/aw_features.h"
#include "android_webview/common/url_constants.h" #include "android_webview/common/url_constants.h"
#include "base/android/build_info.h" #include "base/android/build_info.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/feature_list.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "components/embedder_support/android/util/input_stream.h"
#include "components/safe_browsing/core/common/safebrowsing_constants.h" #include "components/safe_browsing/core/common/safebrowsing_constants.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -165,14 +166,14 @@ class InterceptedRequest : public network::mojom::URLLoader, ...@@ -165,14 +166,14 @@ class InterceptedRequest : public network::mojom::URLLoader,
// A ResponseDelegate for responses returned by shouldInterceptRequest. // A ResponseDelegate for responses returned by shouldInterceptRequest.
class InterceptResponseDelegate class InterceptResponseDelegate
: public AndroidStreamReaderURLLoader::ResponseDelegate { : public embedder_support::AndroidStreamReaderURLLoader::ResponseDelegate {
public: public:
explicit InterceptResponseDelegate( explicit InterceptResponseDelegate(
std::unique_ptr<AwWebResourceResponse> response, std::unique_ptr<AwWebResourceResponse> response,
base::WeakPtr<InterceptedRequest> request) base::WeakPtr<InterceptedRequest> request)
: response_(std::move(response)), request_(request) {} : response_(std::move(response)), request_(request) {}
std::unique_ptr<android_webview::InputStream> OpenInputStream( std::unique_ptr<embedder_support::InputStream> OpenInputStream(
JNIEnv* env) override { JNIEnv* env) override {
return response_->GetInputStream(env); return response_->GetInputStream(env);
} }
...@@ -186,14 +187,14 @@ class InterceptResponseDelegate ...@@ -186,14 +187,14 @@ class InterceptResponseDelegate
bool GetMimeType(JNIEnv* env, bool GetMimeType(JNIEnv* env,
const GURL& url, const GURL& url,
android_webview::InputStream* stream, embedder_support::InputStream* stream,
std::string* mime_type) override { std::string* mime_type) override {
return response_->GetMimeType(env, mime_type); return response_->GetMimeType(env, mime_type);
} }
bool GetCharset(JNIEnv* env, bool GetCharset(JNIEnv* env,
const GURL& url, const GURL& url,
android_webview::InputStream* stream, embedder_support::InputStream* stream,
std::string* charset) override { std::string* charset) override {
return response_->GetCharset(env, charset); return response_->GetCharset(env, charset);
} }
...@@ -221,13 +222,13 @@ class InterceptResponseDelegate ...@@ -221,13 +222,13 @@ class InterceptResponseDelegate
// protocols, such as content://, file:///android_asset, and file:///android_res // protocols, such as content://, file:///android_asset, and file:///android_res
// URLs. // URLs.
class ProtocolResponseDelegate class ProtocolResponseDelegate
: public AndroidStreamReaderURLLoader::ResponseDelegate { : public embedder_support::AndroidStreamReaderURLLoader::ResponseDelegate {
public: public:
ProtocolResponseDelegate(const GURL& url, ProtocolResponseDelegate(const GURL& url,
base::WeakPtr<InterceptedRequest> request) base::WeakPtr<InterceptedRequest> request)
: url_(url), request_(request) {} : url_(url), request_(request) {}
std::unique_ptr<android_webview::InputStream> OpenInputStream( std::unique_ptr<embedder_support::InputStream> OpenInputStream(
JNIEnv* env) override { JNIEnv* env) override {
return CreateInputStream(env, url_); return CreateInputStream(env, url_);
} }
...@@ -241,14 +242,14 @@ class ProtocolResponseDelegate ...@@ -241,14 +242,14 @@ class ProtocolResponseDelegate
bool GetMimeType(JNIEnv* env, bool GetMimeType(JNIEnv* env,
const GURL& url, const GURL& url,
android_webview::InputStream* stream, embedder_support::InputStream* stream,
std::string* mime_type) override { std::string* mime_type) override {
return GetInputStreamMimeType(env, url, stream, mime_type); return GetInputStreamMimeType(env, url, stream, mime_type);
} }
bool GetCharset(JNIEnv* env, bool GetCharset(JNIEnv* env,
const GURL& url, const GURL& url,
android_webview::InputStream* stream, embedder_support::InputStream* stream,
std::string* charset) override { std::string* charset) override {
// TODO: We should probably be getting this from the managed side. // TODO: We should probably be getting this from the managed side.
return false; return false;
...@@ -423,13 +424,15 @@ void InterceptedRequest::ContinueAfterIntercept() { ...@@ -423,13 +424,15 @@ void InterceptedRequest::ContinueAfterIntercept() {
if (!input_stream_previously_failed_ && if (!input_stream_previously_failed_ &&
(request_.url.SchemeIs(url::kContentScheme) || (request_.url.SchemeIs(url::kContentScheme) ||
android_webview::IsAndroidSpecialFileUrl(request_.url))) { android_webview::IsAndroidSpecialFileUrl(request_.url))) {
AndroidStreamReaderURLLoader* loader = new AndroidStreamReaderURLLoader( embedder_support::AndroidStreamReaderURLLoader* loader =
request_, proxied_client_receiver_.BindNewPipeAndPassRemote(), new embedder_support::AndroidStreamReaderURLLoader(
traffic_annotation_, request_, proxied_client_receiver_.BindNewPipeAndPassRemote(),
std::make_unique<ProtocolResponseDelegate>(request_.url, traffic_annotation_,
weak_factory_.GetWeakPtr()), std::make_unique<ProtocolResponseDelegate>(
security_options_); request_.url, weak_factory_.GetWeakPtr()),
loader->Start(); security_options_);
loader->Start(base::FeatureList::IsEnabled(
features::kWebViewOriginCheckForStreamReader));
return; return;
} }
...@@ -443,13 +446,15 @@ void InterceptedRequest::ContinueAfterIntercept() { ...@@ -443,13 +446,15 @@ void InterceptedRequest::ContinueAfterIntercept() {
void InterceptedRequest::ContinueAfterInterceptWithOverride( void InterceptedRequest::ContinueAfterInterceptWithOverride(
std::unique_ptr<AwWebResourceResponse> response) { std::unique_ptr<AwWebResourceResponse> response) {
AndroidStreamReaderURLLoader* loader = new AndroidStreamReaderURLLoader( embedder_support::AndroidStreamReaderURLLoader* loader =
request_, proxied_client_receiver_.BindNewPipeAndPassRemote(), new embedder_support::AndroidStreamReaderURLLoader(
traffic_annotation_, request_, proxied_client_receiver_.BindNewPipeAndPassRemote(),
std::make_unique<InterceptResponseDelegate>(std::move(response), traffic_annotation_,
weak_factory_.GetWeakPtr()), std::make_unique<InterceptResponseDelegate>(
base::nullopt); std::move(response), weak_factory_.GetWeakPtr()),
loader->Start(); base::nullopt);
loader->Start(base::FeatureList::IsEnabled(
features::kWebViewOriginCheckForStreamReader));
} }
namespace { namespace {
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
#ifndef ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_AW_PROXYING_URL_LOADER_FACTORY_H_ #ifndef ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_AW_PROXYING_URL_LOADER_FACTORY_H_
#define ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_AW_PROXYING_URL_LOADER_FACTORY_H_ #define ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_AW_PROXYING_URL_LOADER_FACTORY_H_
#include "android_webview/browser/network_service/android_stream_reader_url_loader.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/optional.h" #include "base/optional.h"
#include "components/embedder_support/android/util/android_stream_reader_url_loader.h"
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/receiver_set.h"
...@@ -55,7 +55,8 @@ namespace android_webview { ...@@ -55,7 +55,8 @@ namespace android_webview {
// //
class AwProxyingURLLoaderFactory : public network::mojom::URLLoaderFactory { class AwProxyingURLLoaderFactory : public network::mojom::URLLoaderFactory {
public: public:
using SecurityOptions = AndroidStreamReaderURLLoader::SecurityOptions; using SecurityOptions =
embedder_support::AndroidStreamReaderURLLoader::SecurityOptions;
// Create a factory that will create specialized URLLoaders for Android // Create a factory that will create specialized URLLoaders for Android
// WebView. If |intercept_only| parameter is true the loader created by // WebView. If |intercept_only| parameter is true the loader created by
......
...@@ -8,11 +8,11 @@ ...@@ -8,11 +8,11 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "android_webview/browser/input_stream.h"
#include "android_webview/browser_jni_headers/AwWebResourceResponse_jni.h" #include "android_webview/browser_jni_headers/AwWebResourceResponse_jni.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_array.h" #include "base/android/jni_array.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "components/embedder_support/android/util/input_stream.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
#include "net/url_request/url_request.h" #include "net/url_request/url_request.h"
#include "net/url_request/url_request_job.h" #include "net/url_request/url_request_job.h"
...@@ -34,8 +34,8 @@ bool AwWebResourceResponse::HasInputStream(JNIEnv* env) const { ...@@ -34,8 +34,8 @@ bool AwWebResourceResponse::HasInputStream(JNIEnv* env) const {
return !!jstream; return !!jstream;
} }
std::unique_ptr<InputStream> AwWebResourceResponse::GetInputStream( std::unique_ptr<embedder_support::InputStream>
JNIEnv* env) { AwWebResourceResponse::GetInputStream(JNIEnv* env) {
// Only allow to call GetInputStream once per object, because this method // Only allow to call GetInputStream once per object, because this method
// transfers ownership of the stream and once the unique_ptr<InputStream> // transfers ownership of the stream and once the unique_ptr<InputStream>
// is deleted it also closes the original java input stream. This // is deleted it also closes the original java input stream. This
...@@ -51,7 +51,7 @@ std::unique_ptr<InputStream> AwWebResourceResponse::GetInputStream( ...@@ -51,7 +51,7 @@ std::unique_ptr<InputStream> AwWebResourceResponse::GetInputStream(
Java_AwWebResourceResponse_getData(env, java_object_); Java_AwWebResourceResponse_getData(env, java_object_);
if (!jstream) if (!jstream)
return nullptr; return nullptr;
return std::make_unique<InputStream>(jstream); return std::make_unique<embedder_support::InputStream>(jstream);
} }
bool AwWebResourceResponse::GetMimeType(JNIEnv* env, bool AwWebResourceResponse::GetMimeType(JNIEnv* env,
......
...@@ -15,9 +15,11 @@ namespace net { ...@@ -15,9 +15,11 @@ namespace net {
class HttpResponseHeaders; class HttpResponseHeaders;
} }
namespace android_webview { namespace embedder_support {
class InputStream; class InputStream;
}
namespace android_webview {
// This class represents the Java-side data that is to be used to complete a // This class represents the Java-side data that is to be used to complete a
// particular URLRequest. // particular URLRequest.
...@@ -29,7 +31,7 @@ class AwWebResourceResponse { ...@@ -29,7 +31,7 @@ class AwWebResourceResponse {
~AwWebResourceResponse(); ~AwWebResourceResponse();
bool HasInputStream(JNIEnv* env) const; bool HasInputStream(JNIEnv* env) const;
std::unique_ptr<InputStream> GetInputStream(JNIEnv* env); std::unique_ptr<embedder_support::InputStream> GetInputStream(JNIEnv* env);
bool GetMimeType(JNIEnv* env, std::string* mime_type) const; bool GetMimeType(JNIEnv* env, std::string* mime_type) const;
bool GetCharset(JNIEnv* env, std::string* charset) const; bool GetCharset(JNIEnv* env, std::string* charset) const;
bool GetStatusInfo(JNIEnv* env, bool GetStatusInfo(JNIEnv* env,
......
...@@ -39,19 +39,6 @@ const base::Feature kWebViewExtraHeadersSameOriginOnly{ ...@@ -39,19 +39,6 @@ const base::Feature kWebViewExtraHeadersSameOriginOnly{
const base::Feature kWebViewOriginCheckForStreamReader{ const base::Feature kWebViewOriginCheckForStreamReader{
"WebViewOriginCheckForStreamReader", base::FEATURE_DISABLED_BY_DEFAULT}; "WebViewOriginCheckForStreamReader", base::FEATURE_DISABLED_BY_DEFAULT};
// Sniff the content stream to guess the MIME type when the application doesn't
// tell us the MIME type explicitly.
//
// This only applies:
// * when NetworkService is enabled (if disabled, the legacy net path sniffs
// content anyway, as an implementation detail).
// * to app-provided content (shouldInterceptRequest,
// file:///android_{asset,res} URLs, content:// URLs), rather than content
// from the net stack (we may sniff content from the net stack anyway,
// depending on headers, but that's a NetworkService implementation detail).
const base::Feature kWebViewSniffMimeType{"WebViewSniffMimeType",
base::FEATURE_ENABLED_BY_DEFAULT};
// A Feature used for WebView variations tests. Not used in production. // A Feature used for WebView variations tests. Not used in production.
const base::Feature kWebViewTestFeature{"WebViewTestFeature", const base::Feature kWebViewTestFeature{"WebViewTestFeature",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
......
...@@ -20,7 +20,6 @@ extern const base::Feature kWebViewDisplayCutout; ...@@ -20,7 +20,6 @@ extern const base::Feature kWebViewDisplayCutout;
extern const base::Feature kWebViewExtraHeadersSameDomainOnly; extern const base::Feature kWebViewExtraHeadersSameDomainOnly;
extern const base::Feature kWebViewExtraHeadersSameOriginOnly; extern const base::Feature kWebViewExtraHeadersSameOriginOnly;
extern const base::Feature kWebViewOriginCheckForStreamReader; extern const base::Feature kWebViewOriginCheckForStreamReader;
extern const base::Feature kWebViewSniffMimeType;
extern const base::Feature kWebViewTestFeature; extern const base::Feature kWebViewTestFeature;
extern const base::Feature kWebViewWideColorGamutSupport; extern const base::Feature kWebViewWideColorGamutSupport;
......
...@@ -426,6 +426,7 @@ test("android_webview_unittests") { ...@@ -426,6 +426,7 @@ test("android_webview_unittests") {
"//android_webview/common", "//android_webview/common",
"//base/test:test_support", "//base/test:test_support",
"//components/autofill/core/browser", "//components/autofill/core/browser",
"//components/embedder_support/android:util",
"//components/metrics", "//components/metrics",
"//components/prefs:prefs", "//components/prefs:prefs",
"//components/prefs:test_support", "//components/prefs:test_support",
...@@ -455,12 +456,9 @@ test("android_webview_unittests") { ...@@ -455,12 +456,9 @@ test("android_webview_unittests") {
"../browser/gfx/test/fake_window.h", "../browser/gfx/test/fake_window.h",
"../browser/gfx/test/rendering_test.cc", "../browser/gfx/test/rendering_test.cc",
"../browser/gfx/test/rendering_test.h", "../browser/gfx/test/rendering_test.h",
"../browser/input_stream_unittest.cc",
"../browser/lifecycle/aw_contents_lifecycle_notifier_unittest.cc", "../browser/lifecycle/aw_contents_lifecycle_notifier_unittest.cc",
"../browser/metrics/aw_stability_metrics_provider_unittest.cc", "../browser/metrics/aw_stability_metrics_provider_unittest.cc",
"../browser/metrics/visibility_metrics_logger_unittest.cc", "../browser/metrics/visibility_metrics_logger_unittest.cc",
"../browser/network_service/android_stream_reader_url_loader_unittest.cc",
"../browser/network_service/input_stream_reader_unittest.cc",
"../browser/permission/media_access_permission_request_unittest.cc", "../browser/permission/media_access_permission_request_unittest.cc",
"../browser/permission/permission_request_handler_unittest.cc", "../browser/permission/permission_request_handler_unittest.cc",
"../browser/renderer_host/auto_login_parser_unittest.cc", "../browser/renderer_host/auto_login_parser_unittest.cc",
...@@ -484,18 +482,12 @@ android_library("android_webview_unittests_java") { ...@@ -484,18 +482,12 @@ android_library("android_webview_unittests_java") {
"//base:base_java", "//base:base_java",
"//content/public/test/android:content_java_test_support", "//content/public/test/android:content_java_test_support",
] ]
sources = [ sources = [ "../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java" ]
"../unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java",
"../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java",
]
} }
generate_jni("android_webview_unittests_jni") { generate_jni("android_webview_unittests_jni") {
testonly = true testonly = true
sources = [ sources = [ "../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java" ]
"../unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java",
"../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java",
]
} }
# robolectric tests # robolectric tests
......
...@@ -20,11 +20,22 @@ source_set("unit_tests") { ...@@ -20,11 +20,22 @@ source_set("unit_tests") {
"//base/test:test_support", "//base/test:test_support",
"//components/embedder_support", "//components/embedder_support",
"//components/embedder_support/origin_trials", "//components/embedder_support/origin_trials",
"//mojo/core/embedder:embedder",
"//net:net",
"//net/traffic_annotation:test_support",
"//services/network:test_support",
"//testing/gtest", "//testing/gtest",
"//third_party/blink/public/mojom:mojom_platform_headers",
] ]
if (is_android) { if (is_android) {
sources += [ "android/util/url_utilities_unittest.cc" ] sources += [
"android/util/android_stream_reader_url_loader_unittest.cc",
"android/util/input_stream_reader_unittest.cc",
"android/util/input_stream_unittest.cc",
"android/util/url_utilities_unittest.cc",
]
deps += [ deps += [
"android:native_j_unittests_jni_headers", "android:native_j_unittests_jni_headers",
"android:native_java_unittests_java", "android:native_java_unittests_java",
......
...@@ -37,6 +37,7 @@ android_library("application_java") { ...@@ -37,6 +37,7 @@ android_library("application_java") {
android_library("util_java") { android_library("util_java") {
sources = [ sources = [
"java/src/org/chromium/components/embedder_support/util/InputStreamUtil.java",
"java/src/org/chromium/components/embedder_support/util/Origin.java", "java/src/org/chromium/components/embedder_support/util/Origin.java",
"java/src/org/chromium/components/embedder_support/util/UrlConstants.java", "java/src/org/chromium/components/embedder_support/util/UrlConstants.java",
"java/src/org/chromium/components/embedder_support/util/UrlUtilities.java", "java/src/org/chromium/components/embedder_support/util/UrlUtilities.java",
...@@ -52,19 +53,32 @@ android_library("util_java") { ...@@ -52,19 +53,32 @@ android_library("util_java") {
} }
static_library("util") { static_library("util") {
sources = [ "util/url_utilities.cc" ] sources = [
"util/android_stream_reader_url_loader.cc",
"util/android_stream_reader_url_loader.h",
"util/input_stream.cc",
"util/input_stream.h",
"util/input_stream_reader.cc",
"util/input_stream_reader.h",
"util/url_utilities.cc",
]
deps = [ deps = [
":util_jni_headers", ":util_jni_headers",
"//base", "//base",
"//components/google/core/common", "//components/google/core/common",
"//mojo/public/cpp/bindings:bindings",
"//mojo/public/cpp/system:system",
"//net", "//net",
"//services/network/public/cpp:cpp",
"//services/network/public/mojom:mojom",
"//url", "//url",
] ]
} }
generate_jni("util_jni_headers") { generate_jni("util_jni_headers") {
sources = [ sources = [
"java/src/org/chromium/components/embedder_support/util/InputStreamUtil.java",
"java/src/org/chromium/components/embedder_support/util/UrlUtilities.java", "java/src/org/chromium/components/embedder_support/util/UrlUtilities.java",
] ]
} }
...@@ -228,7 +242,10 @@ android_library("native_java_unittests_java") { ...@@ -228,7 +242,10 @@ android_library("native_java_unittests_java") {
"//base:base_java", "//base:base_java",
"//third_party/junit", "//third_party/junit",
] ]
sources = [ "native_java_unittests/src/org/chromium/components/embedder_support/util/UrlUtilitiesUnitTest.java" ] sources = [
"native_java_unittests/src/org/chromium/components/embedder_support/util/InputStreamUnittest.java",
"native_java_unittests/src/org/chromium/components/embedder_support/util/UrlUtilitiesUnitTest.java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
} }
...@@ -237,7 +254,10 @@ android_library("native_java_unittests_java") { ...@@ -237,7 +254,10 @@ android_library("native_java_unittests_java") {
# can't put 'java' in the name here. # can't put 'java' in the name here.
generate_jni("native_j_unittests_jni_headers") { generate_jni("native_j_unittests_jni_headers") {
testonly = true testonly = true
sources = [ "native_java_unittests/src/org/chromium/components/embedder_support/util/UrlUtilitiesUnitTest.java" ] sources = [
"native_java_unittests/src/org/chromium/components/embedder_support/util/InputStreamUnittest.java",
"native_java_unittests/src/org/chromium/components/embedder_support/util/UrlUtilitiesUnitTest.java",
]
} }
android_library("junit_test_support") { android_library("junit_test_support") {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.android_webview; package org.chromium.components.embedder_support.util;
import android.util.Log; import android.util.Log;
...@@ -15,7 +15,7 @@ import java.io.InputStream; ...@@ -15,7 +15,7 @@ import java.io.InputStream;
/** /**
* Utility methods for calling InputStream methods. These take care of exception handling. * Utility methods for calling InputStream methods. These take care of exception handling.
*/ */
@JNINamespace("android_webview") @JNINamespace("embedder_support")
class InputStreamUtil { class InputStreamUtil {
private static final String LOGTAG = "InputStreamUtil"; private static final String LOGTAG = "InputStreamUtil";
// The InputStream APIs return -1 in some cases. In order to convey the extra information that // The InputStream APIs return -1 in some cases. In order to convey the extra information that
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.android_webview.unittest; package org.chromium.components.embedder_support.util;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
...@@ -10,8 +10,7 @@ import java.io.IOException; ...@@ -10,8 +10,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
class InputStreamUnittest { class InputStreamUnittest {
private InputStreamUnittest() { private InputStreamUnittest() {}
}
@CalledByNative @CalledByNative
static InputStream getEmptyStream() { static InputStream getEmptyStream() {
......
include_rules = [ include_rules = [
"+components/google/core/common", "+components/google/core/common",
"+mojo/public/cpp/bindings",
"+mojo/public/cpp/system",
"+net", "+net",
"+services/network/public",
"+third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h",
] ]
specific_include_rules = {
".*_unittest\.cc": [
"+services/network/test",
"+mojo/core/embedder/embedder.h",
],
}
...@@ -2,26 +2,23 @@ ...@@ -2,26 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "android_webview/browser/network_service/android_stream_reader_url_loader.h" #include "components/embedder_support/android/util/android_stream_reader_url_loader.h"
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "android_webview/browser/input_stream.h"
#include "android_webview/browser/network_service/input_stream_reader.h"
#include "android_webview/common/aw_features.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/feature_list.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/task/thread_pool.h" #include "base/task/thread_pool.h"
#include "base/threading/thread.h" #include "base/threading/thread.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "content/public/browser/browser_thread.h" #include "components/embedder_support/android/util/input_stream.h"
#include "components/embedder_support/android/util/input_stream_reader.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/base/mime_sniffer.h" #include "net/base/mime_sniffer.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.h"
...@@ -29,7 +26,7 @@ ...@@ -29,7 +26,7 @@
#include "services/network/public/cpp/cors/cors.h" #include "services/network/public/cpp/cors/cors.h"
#include "services/network/public/cpp/url_loader_completion_status.h" #include "services/network/public/cpp/url_loader_completion_status.h"
namespace android_webview { namespace embedder_support {
namespace { namespace {
...@@ -52,8 +49,6 @@ void OpenInputStreamOnWorkerThread( ...@@ -52,8 +49,6 @@ void OpenInputStreamOnWorkerThread(
scoped_refptr<base::SingleThreadTaskRunner> job_thread_task_runner, scoped_refptr<base::SingleThreadTaskRunner> job_thread_task_runner,
std::unique_ptr<AndroidStreamReaderURLLoader::ResponseDelegate> delegate, std::unique_ptr<AndroidStreamReaderURLLoader::ResponseDelegate> delegate,
OnInputStreamOpenedCallback callback) { OnInputStreamOpenedCallback callback) {
DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
DCHECK(env); DCHECK(env);
...@@ -150,12 +145,10 @@ void AndroidStreamReaderURLLoader::SetPriority(net::RequestPriority priority, ...@@ -150,12 +145,10 @@ void AndroidStreamReaderURLLoader::SetPriority(net::RequestPriority priority,
void AndroidStreamReaderURLLoader::PauseReadingBodyFromNet() {} void AndroidStreamReaderURLLoader::PauseReadingBodyFromNet() {}
void AndroidStreamReaderURLLoader::ResumeReadingBodyFromNet() {} void AndroidStreamReaderURLLoader::ResumeReadingBodyFromNet() {}
void AndroidStreamReaderURLLoader::Start() { void AndroidStreamReaderURLLoader::Start(bool cors_check) {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
if (base::FeatureList::IsEnabled( if (cors_check && reject_cors_request_ &&
features::kWebViewOriginCheckForStreamReader) &&
reject_cors_request_ &&
response_head_->response_type == response_head_->response_type ==
network::mojom::FetchResponseType::kCors) { network::mojom::FetchResponseType::kCors) {
RequestCompleteWithStatus( RequestCompleteWithStatus(
...@@ -314,8 +307,7 @@ void AndroidStreamReaderURLLoader::SendBody() { ...@@ -314,8 +307,7 @@ void AndroidStreamReaderURLLoader::SendBody() {
// 2. Sending this now lets us unittest the net::ERR_ABORTED case. The case // 2. Sending this now lets us unittest the net::ERR_ABORTED case. The case
// needs the ability to break the stream after getting the headers but // needs the ability to break the stream after getting the headers but
// before finishing the read. // before finishing the read.
if (!base::FeatureList::IsEnabled(features::kWebViewSniffMimeType) || if (!response_head_->mime_type.empty()) {
!response_head_->mime_type.empty()) {
SendResponseToClient(); SendResponseToClient();
} }
ReadMore(); ReadMore();
...@@ -387,7 +379,6 @@ void AndroidStreamReaderURLLoader::DidRead(int result) { ...@@ -387,7 +379,6 @@ void AndroidStreamReaderURLLoader::DidRead(int result) {
if (consumer_handle_.is_valid()) { if (consumer_handle_.is_valid()) {
// We only hit this on for the first buffer read, which we expect to be // We only hit this on for the first buffer read, which we expect to be
// enough to determine the MIME type. // enough to determine the MIME type.
DCHECK(base::FeatureList::IsEnabled(features::kWebViewSniffMimeType));
if (response_head_->mime_type.empty()) { if (response_head_->mime_type.empty()) {
// Limit sniffing to the first net::kMaxBytesToSniff. // Limit sniffing to the first net::kMaxBytesToSniff.
size_t data_length = result; size_t data_length = result;
...@@ -478,4 +469,4 @@ bool AndroidStreamReaderURLLoader::ParseRange( ...@@ -478,4 +469,4 @@ bool AndroidStreamReaderURLLoader::ParseRange(
return true; return true;
} }
} // namespace android_webview } // namespace embedder_support
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_ANDROID_STREAM_READER_URL_LOADER_H_ #ifndef COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_ANDROID_STREAM_READER_URL_LOADER_H_
#define ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_ANDROID_STREAM_READER_URL_LOADER_H_ #define COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_ANDROID_STREAM_READER_URL_LOADER_H_
#include <memory> #include <memory>
#include <string> #include <string>
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
#include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_loader.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h" #include "services/network/public/mojom/url_response_head.mojom.h"
namespace android_webview { namespace embedder_support {
class InputStream; class InputStream;
class InputStreamReaderWrapper; class InputStreamReaderWrapper;
...@@ -41,7 +40,7 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader { ...@@ -41,7 +40,7 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader {
virtual ~ResponseDelegate() {} virtual ~ResponseDelegate() {}
// This method is called from a worker thread, not from the IO thread. // This method is called from a worker thread, not from the IO thread.
virtual std::unique_ptr<android_webview::InputStream> OpenInputStream( virtual std::unique_ptr<embedder_support::InputStream> OpenInputStream(
JNIEnv* env) = 0; JNIEnv* env) = 0;
// This method is called on the URLLoader thread (IO thread) if the // This method is called on the URLLoader thread (IO thread) if the
...@@ -52,12 +51,12 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader { ...@@ -52,12 +51,12 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader {
virtual bool GetMimeType(JNIEnv* env, virtual bool GetMimeType(JNIEnv* env,
const GURL& url, const GURL& url,
android_webview::InputStream* stream, embedder_support::InputStream* stream,
std::string* mime_type) = 0; std::string* mime_type) = 0;
virtual bool GetCharset(JNIEnv* env, virtual bool GetCharset(JNIEnv* env,
const GURL& url, const GURL& url,
android_webview::InputStream* stream, embedder_support::InputStream* stream,
std::string* charset) = 0; std::string* charset) = 0;
virtual void AppendResponseHeaders(JNIEnv* env, virtual void AppendResponseHeaders(JNIEnv* env,
...@@ -77,7 +76,9 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader { ...@@ -77,7 +76,9 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader {
base::Optional<SecurityOptions> security_options); base::Optional<SecurityOptions> security_options);
~AndroidStreamReaderURLLoader() override; ~AndroidStreamReaderURLLoader() override;
void Start(); // TODO: remove the boolean once https://crbug.com/1096677 reaches stable and
// there are no issues.
void Start(bool cors_check);
// network::mojom::URLLoader overrides: // network::mojom::URLLoader overrides:
void FollowRedirect( void FollowRedirect(
...@@ -95,7 +96,7 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader { ...@@ -95,7 +96,7 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader {
void OnInputStreamOpened( void OnInputStreamOpened(
std::unique_ptr<AndroidStreamReaderURLLoader::ResponseDelegate> std::unique_ptr<AndroidStreamReaderURLLoader::ResponseDelegate>
returned_delegate, returned_delegate,
std::unique_ptr<android_webview::InputStream> input_stream); std::unique_ptr<embedder_support::InputStream> input_stream);
void OnReaderSeekCompleted(int result); void OnReaderSeekCompleted(int result);
void HeadersComplete(int status_code, const std::string& status_text); void HeadersComplete(int status_code, const std::string& status_text);
void RequestCompleteWithStatus( void RequestCompleteWithStatus(
...@@ -141,6 +142,6 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader { ...@@ -141,6 +142,6 @@ class AndroidStreamReaderURLLoader : public network::mojom::URLLoader {
DISALLOW_COPY_AND_ASSIGN(AndroidStreamReaderURLLoader); DISALLOW_COPY_AND_ASSIGN(AndroidStreamReaderURLLoader);
}; };
} // namespace android_webview } // namespace embedder_support
#endif // ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_ANDROID_STREAM_READER_URL_LOADER_H_ #endif // COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_ANDROID_STREAM_READER_URL_LOADER_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "android_webview/browser/input_stream.h" #include "components/embedder_support/android/util/input_stream.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
// Disable "Warnings treated as errors" for input_stream_jni as it's a Java // Disable "Warnings treated as errors" for input_stream_jni as it's a Java
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
// even if they're unused. // even if they're unused.
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#include "android_webview/browser_jni_headers/InputStreamUtil_jni.h" #include "components/embedder_support/android/util_jni_headers/InputStreamUtil_jni.h"
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
...@@ -18,13 +18,13 @@ using base::android::AttachCurrentThread; ...@@ -18,13 +18,13 @@ using base::android::AttachCurrentThread;
using base::android::ClearException; using base::android::ClearException;
using base::android::JavaRef; using base::android::JavaRef;
namespace android_webview { namespace embedder_support {
namespace { namespace {
// This should be the same as InputStramUtil.EXCEPTION_THROWN_STATUS. // This should be the same as InputStramUtil.EXCEPTION_THROWN_STATUS.
const int kExceptionThrownStatusCode = -2; const int kExceptionThrownStatusCode = -2;
} } // namespace
// Maximum number of bytes to be read in a single read. // Maximum number of bytes to be read in a single read.
const int InputStream::kBufferSize = 4096; const int InputStream::kBufferSize = 4096;
...@@ -120,4 +120,4 @@ bool InputStream::Read(net::IOBuffer* dest, int length, int* bytes_read) { ...@@ -120,4 +120,4 @@ bool InputStream::Read(net::IOBuffer* dest, int length, int* bytes_read) {
return true; return true;
} }
} // namespace android_webview } // namespace embedder_support
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef ANDROID_WEBVIEW_BROWSER_INPUT_STREAM_H_ #ifndef COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_INPUT_STREAM_H_
#define ANDROID_WEBVIEW_BROWSER_INPUT_STREAM_H_ #define COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_INPUT_STREAM_H_
#include <stdint.h> #include <stdint.h>
...@@ -15,7 +15,7 @@ namespace net { ...@@ -15,7 +15,7 @@ namespace net {
class IOBuffer; class IOBuffer;
} }
namespace android_webview { namespace embedder_support {
// Abstract wrapper used to access the InputStream Java class. // Abstract wrapper used to access the InputStream Java class.
// This class is safe to pass around between threads (the destructor, // This class is safe to pass around between threads (the destructor,
...@@ -66,6 +66,6 @@ class InputStream { ...@@ -66,6 +66,6 @@ class InputStream {
DISALLOW_COPY_AND_ASSIGN(InputStream); DISALLOW_COPY_AND_ASSIGN(InputStream);
}; };
} // namespace android_webview } // namespace embedder_support
#endif // ANDROID_WEBVIEW_BROWSER_INPUT_STREAM_H_ #endif // COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_INPUT_STREAM_H_
...@@ -2,24 +2,19 @@ ...@@ -2,24 +2,19 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "android_webview/browser/network_service/input_stream_reader.h" #include "components/embedder_support/android/util/input_stream_reader.h"
#include "android_webview/browser/input_stream.h" #include "components/embedder_support/android/util/input_stream.h"
#include "content/public/browser/browser_thread.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/http/http_byte_range.h" #include "net/http/http_byte_range.h"
using content::BrowserThread; namespace embedder_support {
namespace android_webview { InputStreamReader::InputStreamReader(InputStream* stream) : stream_(stream) {
InputStreamReader::InputStreamReader(android_webview::InputStream* stream)
: stream_(stream) {
DCHECK(stream); DCHECK(stream);
} }
InputStreamReader::~InputStreamReader() { InputStreamReader::~InputStreamReader() {}
}
int InputStreamReader::Seek(const net::HttpByteRange& byte_range) { int InputStreamReader::Seek(const net::HttpByteRange& byte_range) {
int content_size = 0; int content_size = 0;
...@@ -64,8 +59,8 @@ int InputStreamReader::VerifyRequestedRange(net::HttpByteRange* byte_range, ...@@ -64,8 +59,8 @@ int InputStreamReader::VerifyRequestedRange(net::HttpByteRange* byte_range,
if (!byte_range->ComputeBounds(size)) if (!byte_range->ComputeBounds(size))
return net::ERR_REQUEST_RANGE_NOT_SATISFIABLE; return net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
size = byte_range->last_byte_position() - size =
byte_range->first_byte_position() + 1; byte_range->last_byte_position() - byte_range->first_byte_position() + 1;
DCHECK_GE(size, 0); DCHECK_GE(size, 0);
*content_size = size; *content_size = size;
...@@ -94,4 +89,4 @@ int InputStreamReader::SkipToRequestedRange( ...@@ -94,4 +89,4 @@ int InputStreamReader::SkipToRequestedRange(
return net::OK; return net::OK;
} }
} // namespace android_webview } // namespace embedder_support
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_INPUT_STREAM_READER_H_ #ifndef COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_INPUT_STREAM_READER_H_
#define ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_INPUT_STREAM_READER_H_ #define COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_INPUT_STREAM_READER_H_
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
...@@ -11,17 +11,16 @@ ...@@ -11,17 +11,16 @@
namespace net { namespace net {
class HttpByteRange; class HttpByteRange;
class IOBuffer; class IOBuffer;
} } // namespace net
namespace android_webview {
namespace embedder_support {
class InputStream; class InputStream;
// Class responsible for reading the InputStream. // Class responsible for reading the InputStream.
class InputStreamReader { class InputStreamReader {
public: public:
// The constructor is called on the IO thread, not on the worker thread. // The constructor is called on the IO thread, not on the worker thread.
explicit InputStreamReader(android_webview::InputStream* stream); explicit InputStreamReader(InputStream* stream);
virtual ~InputStreamReader(); virtual ~InputStreamReader();
// Perform a seek operation on the InputStream associated with this job. // Perform a seek operation on the InputStream associated with this job.
...@@ -45,18 +44,17 @@ class InputStreamReader { ...@@ -45,18 +44,17 @@ class InputStreamReader {
private: private:
// Verify the requested range against the stream size. // Verify the requested range against the stream size.
// net::OK is returned on success, the error code otherwise. // net::OK is returned on success, the error code otherwise.
int VerifyRequestedRange(net::HttpByteRange* byte_range, int VerifyRequestedRange(net::HttpByteRange* byte_range, int* content_size);
int* content_size);
// Skip to the first byte of the requested read range. // Skip to the first byte of the requested read range.
// net::OK is returned on success, the error code otherwise. // net::OK is returned on success, the error code otherwise.
int SkipToRequestedRange(const net::HttpByteRange& byte_range); int SkipToRequestedRange(const net::HttpByteRange& byte_range);
android_webview::InputStream* stream_; InputStream* stream_;
DISALLOW_COPY_AND_ASSIGN(InputStreamReader); DISALLOW_COPY_AND_ASSIGN(InputStreamReader);
}; };
} // namespace android_webview } // namespace embedder_support
#endif // ANDROID_WEBVIEW_BROWSER_NETWORK_SERVICE_INPUT_STREAM_READER_H_ #endif // COMPONENTS_EMBEDDER_SUPPORT_ANDROID_UTIL_INPUT_STREAM_READER_H_
...@@ -2,19 +2,20 @@ ...@@ -2,19 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "android_webview/browser/network_service/input_stream_reader.h" #include "components/embedder_support/android/util/input_stream_reader.h"
#include "android_webview/browser/input_stream.h"
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "components/embedder_support/android/util/input_stream.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/http/http_byte_range.h" #include "net/http/http_byte_range.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
using android_webview::InputStream; using embedder_support::InputStream;
using android_webview::InputStreamReader; using embedder_support::InputStreamReader;
using testing::_;
using testing::DoAll; using testing::DoAll;
using testing::Ge; using testing::Ge;
using testing::InSequence; using testing::InSequence;
...@@ -24,9 +25,8 @@ using testing::NotNull; ...@@ -24,9 +25,8 @@ using testing::NotNull;
using testing::Return; using testing::Return;
using testing::SetArgPointee; using testing::SetArgPointee;
using testing::Test; using testing::Test;
using testing::_;
class MockInputStream : public InputStream { class MockInputStream : public embedder_support::InputStream {
public: public:
MockInputStream() {} MockInputStream() {}
virtual ~MockInputStream() {} virtual ~MockInputStream() {}
...@@ -38,9 +38,8 @@ class MockInputStream : public InputStream { ...@@ -38,9 +38,8 @@ class MockInputStream : public InputStream {
class InputStreamReaderTest : public Test { class InputStreamReaderTest : public Test {
public: public:
InputStreamReaderTest() InputStreamReaderTest() : input_stream_reader_(&input_stream_) {}
: input_stream_reader_(&input_stream_) {
}
protected: protected:
int SeekRange(int first_byte, int last_byte) { int SeekRange(int first_byte, int last_byte) {
net::HttpByteRange byte_range; net::HttpByteRange byte_range;
...@@ -58,8 +57,7 @@ class InputStreamReaderTest : public Test { ...@@ -58,8 +57,7 @@ class InputStreamReaderTest : public Test {
}; };
TEST_F(InputStreamReaderTest, BytesAvailableFailurePropagationOnSeek) { TEST_F(InputStreamReaderTest, BytesAvailableFailurePropagationOnSeek) {
EXPECT_CALL(input_stream_, BytesAvailable(NotNull())) EXPECT_CALL(input_stream_, BytesAvailable(NotNull())).WillOnce(Return(false));
.WillOnce(Return(false));
ASSERT_GT(0, SeekRange(0, 0)); ASSERT_GT(0, SeekRange(0, 0));
} }
...@@ -69,8 +67,7 @@ TEST_F(InputStreamReaderTest, SkipFailurePropagationOnSeek) { ...@@ -69,8 +67,7 @@ TEST_F(InputStreamReaderTest, SkipFailurePropagationOnSeek) {
const int bytesToSkip = 5; const int bytesToSkip = 5;
EXPECT_CALL(input_stream_, BytesAvailable(NotNull())) EXPECT_CALL(input_stream_, BytesAvailable(NotNull()))
.WillOnce(DoAll(SetArgPointee<0>(streamSize), .WillOnce(DoAll(SetArgPointee<0>(streamSize), Return(true)));
Return(true)));
EXPECT_CALL(input_stream_, Skip(bytesToSkip, NotNull())) EXPECT_CALL(input_stream_, Skip(bytesToSkip, NotNull()))
.WillOnce(Return(false)); .WillOnce(Return(false));
...@@ -83,12 +80,10 @@ TEST_F(InputStreamReaderTest, SeekToMiddle) { ...@@ -83,12 +80,10 @@ TEST_F(InputStreamReaderTest, SeekToMiddle) {
const int bytesToSkip = 5; const int bytesToSkip = 5;
EXPECT_CALL(input_stream_, BytesAvailable(NotNull())) EXPECT_CALL(input_stream_, BytesAvailable(NotNull()))
.WillOnce(DoAll(SetArgPointee<0>(streamSize), .WillOnce(DoAll(SetArgPointee<0>(streamSize), Return(true)));
Return(true)));
EXPECT_CALL(input_stream_, Skip(bytesToSkip, NotNull())) EXPECT_CALL(input_stream_, Skip(bytesToSkip, NotNull()))
.WillOnce(DoAll(SetArgPointee<1>(bytesToSkip), .WillOnce(DoAll(SetArgPointee<1>(bytesToSkip), Return(true)));
Return(true)));
ASSERT_EQ(bytesToSkip, SeekRange(bytesToSkip, streamSize - 1)); ASSERT_EQ(bytesToSkip, SeekRange(bytesToSkip, streamSize - 1));
} }
...@@ -99,24 +94,19 @@ TEST_F(InputStreamReaderTest, SeekToMiddleInSteps) { ...@@ -99,24 +94,19 @@ TEST_F(InputStreamReaderTest, SeekToMiddleInSteps) {
EXPECT_CALL(input_stream_, BytesAvailable(NotNull())) EXPECT_CALL(input_stream_, BytesAvailable(NotNull()))
.Times(1) .Times(1)
.WillOnce(DoAll(SetArgPointee<0>(streamSize), .WillOnce(DoAll(SetArgPointee<0>(streamSize), Return(true)));
Return(true)));
EXPECT_CALL(input_stream_, Skip(_, _)) EXPECT_CALL(input_stream_, Skip(_, _)).Times(0);
.Times(0);
{ {
InSequence s; InSequence s;
EXPECT_CALL(input_stream_, Skip(bytesToSkip, NotNull())) EXPECT_CALL(input_stream_, Skip(bytesToSkip, NotNull()))
.WillOnce(DoAll(SetArgPointee<1>(bytesToSkip - 3), .WillOnce(DoAll(SetArgPointee<1>(bytesToSkip - 3), Return(true)))
Return(true)))
.RetiresOnSaturation(); .RetiresOnSaturation();
EXPECT_CALL(input_stream_, Skip(3, NotNull())) EXPECT_CALL(input_stream_, Skip(3, NotNull()))
.WillOnce(DoAll(SetArgPointee<1>(1), .WillOnce(DoAll(SetArgPointee<1>(1), Return(true)))
Return(true)))
.RetiresOnSaturation(); .RetiresOnSaturation();
EXPECT_CALL(input_stream_, Skip(2, NotNull())) EXPECT_CALL(input_stream_, Skip(2, NotNull()))
.WillOnce(DoAll(SetArgPointee<1>(2), .WillOnce(DoAll(SetArgPointee<1>(2), Return(true)))
Return(true)))
.RetiresOnSaturation(); .RetiresOnSaturation();
} }
...@@ -125,8 +115,7 @@ TEST_F(InputStreamReaderTest, SeekToMiddleInSteps) { ...@@ -125,8 +115,7 @@ TEST_F(InputStreamReaderTest, SeekToMiddleInSteps) {
TEST_F(InputStreamReaderTest, SeekEmpty) { TEST_F(InputStreamReaderTest, SeekEmpty) {
EXPECT_CALL(input_stream_, BytesAvailable(NotNull())) EXPECT_CALL(input_stream_, BytesAvailable(NotNull()))
.WillOnce(DoAll(SetArgPointee<0>(0), .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)));
Return(true)));
ASSERT_EQ(0, SeekRange(0, 0)); ASSERT_EQ(0, SeekRange(0, 0));
} }
...@@ -134,8 +123,7 @@ TEST_F(InputStreamReaderTest, SeekEmpty) { ...@@ -134,8 +123,7 @@ TEST_F(InputStreamReaderTest, SeekEmpty) {
TEST_F(InputStreamReaderTest, SeekMoreThanAvailable) { TEST_F(InputStreamReaderTest, SeekMoreThanAvailable) {
const int bytesAvailable = 256; const int bytesAvailable = 256;
EXPECT_CALL(input_stream_, BytesAvailable(NotNull())) EXPECT_CALL(input_stream_, BytesAvailable(NotNull()))
.WillOnce(DoAll(SetArgPointee<0>(bytesAvailable), .WillOnce(DoAll(SetArgPointee<0>(bytesAvailable), Return(true)));
Return(true)));
ASSERT_GT(0, SeekRange(bytesAvailable, 2 * bytesAvailable)); ASSERT_GT(0, SeekRange(bytesAvailable, 2 * bytesAvailable));
} }
...@@ -164,8 +152,7 @@ TEST_F(InputStreamReaderTest, ReadSuccess) { ...@@ -164,8 +152,7 @@ TEST_F(InputStreamReaderTest, ReadSuccess) {
auto buffer = base::MakeRefCounted<net::IOBuffer>(bytesToRead); auto buffer = base::MakeRefCounted<net::IOBuffer>(bytesToRead);
EXPECT_CALL(input_stream_, Read(buffer.get(), bytesToRead, NotNull())) EXPECT_CALL(input_stream_, Read(buffer.get(), bytesToRead, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(bytesToRead), .WillOnce(DoAll(SetArgPointee<2>(bytesToRead), Return(true)));
Return(true)));
ASSERT_EQ(bytesToRead, ReadRawData(buffer, bytesToRead)); ASSERT_EQ(bytesToRead, ReadRawData(buffer, bytesToRead));
} }
...@@ -4,20 +4,21 @@ ...@@ -4,20 +4,21 @@
#include <memory> #include <memory>
#include "android_webview/browser/input_stream.h"
#include "android_webview/test/android_webview_unittests_jni/InputStreamUnittest_jni.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "components/embedder_support/android/native_j_unittests_jni_headers/InputStreamUnittest_jni.h"
#include "components/embedder_support/android/util/input_stream.h"
#include "net/base/io_buffer.h" #include "net/base/io_buffer.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/http/http_byte_range.h" #include "net/http/http_byte_range.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
using android_webview::InputStream;
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef; using base::android::ScopedJavaLocalRef;
using embedder_support::InputStream;
using net::IOBuffer; using net::IOBuffer;
using testing::_;
using testing::DoAll; using testing::DoAll;
using testing::Ge; using testing::Ge;
using testing::InSequence; using testing::InSequence;
...@@ -27,7 +28,6 @@ using testing::NotNull; ...@@ -27,7 +28,6 @@ using testing::NotNull;
using testing::Return; using testing::Return;
using testing::SetArgPointee; using testing::SetArgPointee;
using testing::Test; using testing::Test;
using testing::_;
class InputStreamTest : public Test { class InputStreamTest : public Test {
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