feat: implement net module with NetworkService (#19094)

* Stub class for NetworkService-based URLRequest

* Create SimpleURLLoader

* Implement downloading

* Implement response event

* Only write data afte previous one finished

* Use DataPipeGetter for uploading data

* Support chunked upload data

* Call size callback at last

* Simplify UploadDataPipeGetter

* Implement cancelling and closing

* Handle redirection

* Fix uploading large data

* Emit error when request fails

* Emit error for redirection error

* Simplify emitting error

* "follow" should also emit "redirect" event

* SetLoadFlags is not really used

* Implement GetUploadProgress

* Implement FollowRedirect

* Fix exception with multiple redirections

* Reduce number of EmitEvent methods

* Emit response errors

* FetchRedirectMode => RedirectMode
This commit is contained in:
Cheng Zhao 2019-07-04 10:56:19 +09:00 committed by GitHub
parent 4b674c1daf
commit 2a3793485f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 708 additions and 5 deletions

View file

@ -3,8 +3,12 @@
// found in the LICENSE file.
#include "shell/browser/api/atom_api_net.h"
#include "native_mate/dictionary.h"
#include "services/network/public/cpp/features.h"
#include "shell/browser/api/atom_api_url_request.h"
#include "shell/browser/api/atom_api_url_request_ns.h"
#include "shell/common/node_includes.h"
namespace electron {
@ -31,8 +35,12 @@ void Net::BuildPrototype(v8::Isolate* isolate,
}
v8::Local<v8::Value> Net::URLRequest(v8::Isolate* isolate) {
return URLRequest::GetConstructor(isolate)
->GetFunction(isolate->GetCurrentContext())
v8::Local<v8::FunctionTemplate> constructor;
if (base::FeatureList::IsEnabled(network::features::kNetworkService))
constructor = URLRequestNS::GetConstructor(isolate);
else
constructor = URLRequest::GetConstructor(isolate);
return constructor->GetFunction(isolate->GetCurrentContext())
.ToLocalChecked();
}
@ -44,6 +52,7 @@ namespace {
using electron::api::Net;
using electron::api::URLRequest;
using electron::api::URLRequestNS;
void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Value> unused,
@ -51,12 +60,18 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
URLRequest::SetConstructor(isolate, base::BindRepeating(URLRequest::New));
if (base::FeatureList::IsEnabled(network::features::kNetworkService))
URLRequestNS::SetConstructor(isolate,
base::BindRepeating(URLRequestNS::New));
else
URLRequest::SetConstructor(isolate, base::BindRepeating(URLRequest::New));
mate::Dictionary dict(isolate, exports);
dict.Set("net", Net::Create(isolate));
dict.Set("Net",
Net::GetConstructor(isolate)->GetFunction(context).ToLocalChecked());
dict.Set("isNetworkServiceEnabled",
base::FeatureList::IsEnabled(network::features::kNetworkService));
}
} // namespace