diff --git a/atom/browser/net/js_asker.cc b/atom/browser/net/js_asker.cc index 96c6736150e5..b53799b06fdd 100644 --- a/atom/browser/net/js_asker.cc +++ b/atom/browser/net/js_asker.cc @@ -110,6 +110,18 @@ void AskForOptions(v8::Isolate* isolate, handler.Run(request, wrapped_callback.ToLocalChecked()); } +bool IsErrorOptions(base::Value* value, int* error) { + if (value->IsType(base::Value::TYPE_DICTIONARY)) { + base::DictionaryValue* dict = static_cast(value); + if (dict->GetInteger("error", error)) + return true; + } else if (value->IsType(base::Value::TYPE_INTEGER)) { + if (value->GetAsInteger(error)) + return true; + } + return false; +} + } // namespace internal } // namespace atom diff --git a/atom/browser/net/js_asker.h b/atom/browser/net/js_asker.h index 97b384e213f7..0f5f05856cd3 100644 --- a/atom/browser/net/js_asker.h +++ b/atom/browser/net/js_asker.h @@ -29,6 +29,9 @@ void AskForOptions(v8::Isolate* isolate, net::URLRequest* request, const ResponseCallback& callback); +// Test whether the |options| means an error. +bool IsErrorOptions(base::Value* value, int* error); + } // namespace internal template @@ -63,13 +66,13 @@ class JsAsker : public RequestJob { // Called when the JS handler has sent the response, we need to decide whether // to start, or fail the job. - void OnResponse(bool success, scoped_ptr options) { - if (success && options) { - StartAsync(options.Pass()); + void OnResponse(bool success, scoped_ptr value) { + int error = net::ERR_NOT_IMPLEMENTED; + if (success && value && !internal::IsErrorOptions(value.get(), &error)) { + StartAsync(value.Pass()); } else { RequestJob::NotifyStartError( - net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_NOT_IMPLEMENTED)); + net::URLRequestStatus(net::URLRequestStatus::FAILED, error)); } }