diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc index 1e6e9806466d..dd7c8d9cbb34 100644 --- a/atom/browser/api/atom_api_protocol.cc +++ b/atom/browser/api/atom_api_protocol.cc @@ -103,22 +103,29 @@ Protocol::ProtocolError Protocol::UnregisterProtocolInIO( return PROTOCOL_OK; } -void Protocol::IsProtocolHandled(const std::string& scheme, - const BooleanCallback& callback) { - auto* getter = static_cast( - browser_context_->GetRequestContext()); - base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, {content::BrowserThread::IO}, - base::Bind(&Protocol::IsProtocolHandledInIO, base::RetainedRef(getter), - scheme), - callback); -} - -// static -bool Protocol::IsProtocolHandledInIO( +bool IsProtocolHandledInIO( scoped_refptr request_context_getter, const std::string& scheme) { - return request_context_getter->job_factory()->IsHandledProtocol(scheme); + bool is_handled = + request_context_getter->job_factory()->IsHandledProtocol(scheme); + return is_handled; +} + +void PromiseCallback(scoped_refptr promise, bool handled) { + promise->Resolve(handled); +} + +v8::Local Protocol::IsProtocolHandled(const std::string& scheme) { + scoped_refptr promise = new util::Promise(isolate()); + auto* getter = static_cast( + browser_context_->GetRequestContext()); + + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, {content::BrowserThread::IO}, + base::Bind(&IsProtocolHandledInIO, base::RetainedRef(getter), scheme), + base::Bind(&PromiseCallback, promise)); + + return promise->GetHandle(); } void Protocol::UninterceptProtocol(const std::string& scheme, diff --git a/atom/browser/api/atom_api_protocol.h b/atom/browser/api/atom_api_protocol.h index ae029bbf4dbd..59945ac26263 100644 --- a/atom/browser/api/atom_api_protocol.h +++ b/atom/browser/api/atom_api_protocol.h @@ -14,6 +14,7 @@ #include "atom/browser/api/trackable_object.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/net/atom_url_request_job_factory.h" +#include "atom/common/promise_util.h" #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "base/task/post_task.h" @@ -41,7 +42,6 @@ class Protocol : public mate::TrackableObject { using Handler = base::Callback)>; using CompletionCallback = base::Callback)>; - using BooleanCallback = base::Callback; static mate::Handle Create(v8::Isolate* isolate, AtomBrowserContext* browser_context); @@ -136,11 +136,7 @@ class Protocol : public mate::TrackableObject { const std::string& scheme); // Whether the protocol has handler registered. - void IsProtocolHandled(const std::string& scheme, - const BooleanCallback& callback); - static bool IsProtocolHandledInIO( - scoped_refptr request_context_getter, - const std::string& scheme); + v8::Local IsProtocolHandled(const std::string& scheme); // Replace the protocol handler with a new one. template diff --git a/docs/api/promisification.md b/docs/api/promisification.md index c1794a7e5445..aa627180d6f2 100644 --- a/docs/api/promisification.md +++ b/docs/api/promisification.md @@ -31,7 +31,6 @@ When a majority of affected functions are migrated, this flag will be enabled by - [ ] [inAppPurchase.purchaseProduct(productID, quantity, callback)](https://github.com/electron/electron/blob/master/docs/api/in-app-purchase.md#purchaseProduct) - [ ] [inAppPurchase.getProducts(productIDs, callback)](https://github.com/electron/electron/blob/master/docs/api/in-app-purchase.md#getProducts) - [ ] [netLog.stopLogging([callback])](https://github.com/electron/electron/blob/master/docs/api/net-log.md#stopLogging) -- [ ] [protocol.isProtocolHandled(scheme, callback)](https://github.com/electron/electron/blob/master/docs/api/protocol.md#isProtocolHandled) - [ ] [ses.getCacheSize(callback)](https://github.com/electron/electron/blob/master/docs/api/session.md#getCacheSize) - [ ] [ses.clearCache(callback)](https://github.com/electron/electron/blob/master/docs/api/session.md#clearCache) - [ ] [ses.clearStorageData([options, callback])](https://github.com/electron/electron/blob/master/docs/api/session.md#clearStorageData) @@ -61,4 +60,5 @@ When a majority of affected functions are migrated, this flag will be enabled by - [ ] [webviewTag.capturePage([rect, ]callback)](https://github.com/electron/electron/blob/master/docs/api/webview-tag.md#capturePage) - [ ] [contents.capturePage([rect, ]callback)](https://github.com/electron/electron/blob/master/docs/api/web-contents.md#capturePage) - [ ] [app.getFileIcon(path[, options], callback)](https://github.com/electron/electron/blob/master/docs/api/app.md#getFileIcon) -- [ ] [shell.openExternal(url[, options, callback])](https://github.com/electron/electron/blob/master/docs/api/shell.md#openExternal) \ No newline at end of file +- [ ] [shell.openExternal(url[, options, callback])](https://github.com/electron/electron/blob/master/docs/api/shell.md#openExternal) +- [ ] [protocol.isProtocolHandled(scheme, callback)](https://github.com/electron/electron/blob/master/docs/api/protocol.md#isProtocolHandled) \ No newline at end of file diff --git a/docs/api/protocol.md b/docs/api/protocol.md index 5829f3d12ce3..b5837e68d643 100644 --- a/docs/api/protocol.md +++ b/docs/api/protocol.md @@ -275,6 +275,15 @@ Unregisters the custom protocol of `scheme`. The `callback` will be called with a boolean that indicates whether there is already a handler for `scheme`. +**[Deprecated Soon](promisification.md)** + +### `protocol.isProtocolHandled(scheme)` + +* `scheme` String + +Returns `Promise` - fulfilled with a boolean that indicates whether there is +already a handler for `scheme`. + ### `protocol.interceptFileProtocol(scheme, handler[, completion])` * `scheme` String diff --git a/lib/browser/api/session.js b/lib/browser/api/session.js index 08c10eeff935..89d380209882 100644 --- a/lib/browser/api/session.js +++ b/lib/browser/api/session.js @@ -1,7 +1,7 @@ 'use strict' const { EventEmitter } = require('events') -const { app } = require('electron') +const { app, deprecate } = require('electron') const { fromPartition, Session, Cookies } = process.atomBinding('session') // Public API. @@ -20,5 +20,6 @@ Object.setPrototypeOf(Session.prototype, EventEmitter.prototype) Object.setPrototypeOf(Cookies.prototype, EventEmitter.prototype) Session.prototype._init = function () { + this.protocol.isProtocolHandled = deprecate.promisify(this.protocol.isProtocolHandled, 1) app.emit('session-created', this) } diff --git a/spec/api-protocol-spec.js b/spec/api-protocol-spec.js index afc7f277c5d3..1fe687bc5f1a 100644 --- a/spec/api-protocol-spec.js +++ b/spec/api-protocol-spec.js @@ -657,60 +657,48 @@ describe('protocol module', () => { }) describe('protocol.isProtocolHandled', () => { - it('returns true for about:', (done) => { - protocol.isProtocolHandled('about', (result) => { - assert.strictEqual(result, true) - done() - }) + it('returns true for about:', async () => { + const result = await protocol.isProtocolHandled('about') + assert.strictEqual(result, true) }) - it('returns true for file:', (done) => { - protocol.isProtocolHandled('file', (result) => { - assert.strictEqual(result, true) - done() - }) + it('returns true for file:', async () => { + const result = await protocol.isProtocolHandled('file') + assert.strictEqual(result, true) }) - it('returns true for http:', (done) => { - protocol.isProtocolHandled('http', (result) => { - assert.strictEqual(result, true) - done() - }) + it('returns true for http:', async () => { + const result = await protocol.isProtocolHandled('http') + assert.strictEqual(result, true) }) - it('returns true for https:', (done) => { - protocol.isProtocolHandled('https', (result) => { - assert.strictEqual(result, true) - done() - }) + it('returns true for https:', async () => { + const result = await protocol.isProtocolHandled('https') + assert.strictEqual(result, true) }) - it('returns false when scheme is not registered', (done) => { - protocol.isProtocolHandled('no-exist', (result) => { - assert.strictEqual(result, false) - done() - }) + it('returns false when scheme is not registered', async () => { + const result = await protocol.isProtocolHandled('no-exist') + assert.strictEqual(result, false) }) it('returns true for custom protocol', (done) => { const emptyHandler = (request, callback) => callback() - protocol.registerStringProtocol(protocolName, emptyHandler, (error) => { + protocol.registerStringProtocol(protocolName, emptyHandler, async (error) => { assert.strictEqual(error, null) - protocol.isProtocolHandled(protocolName, (result) => { - assert.strictEqual(result, true) - done() - }) + const result = await protocol.isProtocolHandled(protocolName) + assert.strictEqual(result, true) + done() }) }) it('returns true for intercepted protocol', (done) => { const emptyHandler = (request, callback) => callback() - protocol.interceptStringProtocol('http', emptyHandler, (error) => { + protocol.interceptStringProtocol('http', emptyHandler, async (error) => { assert.strictEqual(error, null) - protocol.isProtocolHandled('http', (result) => { - assert.strictEqual(result, true) - done() - }) + const result = await protocol.isProtocolHandled('http') + assert.strictEqual(result, true) + done() }) }) }) diff --git a/spec/api-session-spec.js b/spec/api-session-spec.js index 69d57bde58df..a578f0dc4eb8 100644 --- a/spec/api-session-spec.js +++ b/spec/api-session-spec.js @@ -524,14 +524,12 @@ describe('session module', () => { partitionProtocol.unregisterProtocol(protocolName, () => done()) }) - it('does not affect defaultSession', (done) => { - protocol.isProtocolHandled(protocolName, (result) => { - assert.strictEqual(result, false) - partitionProtocol.isProtocolHandled(protocolName, (result) => { - assert.strictEqual(result, true) - done() - }) - }) + it('does not affect defaultSession', async () => { + const result1 = await protocol.isProtocolHandled(protocolName) + assert.strictEqual(result1, false) + + const result2 = await partitionProtocol.isProtocolHandled(protocolName) + assert.strictEqual(result2, true) }) it('handles requests from partition', (done) => {