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