diff --git a/atom/browser/api/atom_api_auto_updater.cc b/atom/browser/api/atom_api_auto_updater.cc index bc708b128f735..706931fe61eb4 100644 --- a/atom/browser/api/atom_api_auto_updater.cc +++ b/atom/browser/api/atom_api_auto_updater.cc @@ -99,10 +99,8 @@ void AutoUpdater::OnWindowAllClosed() { QuitAndInstall(); } -void AutoUpdater::SetFeedURL(const std::string& url, mate::Arguments* args) { - auto_updater::AutoUpdater::HeaderMap headers; - args->GetNext(&headers); - auto_updater::AutoUpdater::SetFeedURL(url, headers); +void AutoUpdater::SetFeedURL(mate::Arguments* args) { + auto_updater::AutoUpdater::SetFeedURL(args); } void AutoUpdater::QuitAndInstall() { diff --git a/atom/browser/api/atom_api_auto_updater.h b/atom/browser/api/atom_api_auto_updater.h index e9e5c53ade0a9..305313df52e5e 100644 --- a/atom/browser/api/atom_api_auto_updater.h +++ b/atom/browser/api/atom_api_auto_updater.h @@ -47,7 +47,7 @@ class AutoUpdater : public mate::EventEmitter, private: std::string GetFeedURL(); - void SetFeedURL(const std::string& url, mate::Arguments* args); + void SetFeedURL(mate::Arguments* args); void QuitAndInstall(); DISALLOW_COPY_AND_ASSIGN(AutoUpdater); diff --git a/atom/browser/auto_updater.cc b/atom/browser/auto_updater.cc index 8ada3ff6ab3dc..4dc1818cfb83a 100644 --- a/atom/browser/auto_updater.cc +++ b/atom/browser/auto_updater.cc @@ -21,8 +21,7 @@ std::string AutoUpdater::GetFeedURL() { return ""; } -void AutoUpdater::SetFeedURL(const std::string& url, - const HeaderMap& requestHeaders) { +void AutoUpdater::SetFeedURL(mate::Arguments* args) { } void AutoUpdater::CheckForUpdates() { diff --git a/atom/browser/auto_updater.h b/atom/browser/auto_updater.h index 389e39d31eb02..ae9178585a7ec 100644 --- a/atom/browser/auto_updater.h +++ b/atom/browser/auto_updater.h @@ -10,6 +10,7 @@ #include "base/macros.h" #include "build/build_config.h" +#include "native_mate/arguments.h" namespace base { class Time; @@ -53,8 +54,7 @@ class AutoUpdater { static void SetDelegate(Delegate* delegate); static std::string GetFeedURL(); - static void SetFeedURL(const std::string& url, - const HeaderMap& requestHeaders); + static void SetFeedURL(mate::Arguments* args); static void CheckForUpdates(); static void QuitAndInstall(); diff --git a/atom/browser/auto_updater_mac.mm b/atom/browser/auto_updater_mac.mm index e0317f42b03d7..8f1a6e43bcd2d 100644 --- a/atom/browser/auto_updater_mac.mm +++ b/atom/browser/auto_updater_mac.mm @@ -9,9 +9,13 @@ #import #import +#include "atom/browser/browser.h" +#include "atom/common/native_mate_converters/value_converter.h" #include "base/bind.h" #include "base/time/time.h" #include "base/strings/sys_string_conversions.h" +#include "native_mate/converter.h" +#include "native_mate/dictionary.h" namespace auto_updater { @@ -34,8 +38,29 @@ } // static -void AutoUpdater::SetFeedURL(const std::string& feed, - const HeaderMap& requestHeaders) { +void AutoUpdater::SetFeedURL(mate::Arguments* args) { + mate::Dictionary opts; + std::string feed; + HeaderMap requestHeaders; + std::string serverType = "default"; + if (args->GetNext(&opts)) { + if (!opts.Get("url", &feed)) { + args->ThrowError("Expected options object to contain a 'url' string property in setFeedUrl call"); + return; + } + opts.Get("headers", &requestHeaders); + opts.Get("serverType", &serverType); + if (serverType != "default" && serverType != "json") { + args->ThrowError("Expected serverType to be 'default' or 'json'"); + return; + } + } else if (args->GetNext(&feed)) { + args->GetNext(&requestHeaders); + } else { + args->ThrowError("Expected an options object with a 'url' property to be provided"); + return; + } + Delegate* delegate = GetDelegate(); if (!delegate) return; @@ -55,7 +80,13 @@ // Initialize the SQRLUpdater. @try { - g_updater = [[SQRLUpdater alloc] initWithUpdateRequest:urlRequest]; + if (serverType == "json") { + NSString* nsAppVersion = base::SysUTF8ToNSString(atom::Browser::Get()->GetVersion()); + g_updater = [[SQRLUpdater alloc] initWithUpdateRequest:urlRequest forVersion:nsAppVersion]; + } else { + // default + g_updater = [[SQRLUpdater alloc] initWithUpdateRequest:urlRequest]; + } } @catch (NSException* error) { delegate->OnError(base::SysNSStringToUTF8(error.reason)); return; diff --git a/docs/api/auto-updater.md b/docs/api/auto-updater.md index 8f4a4128b4258..66bcf19dbe0b2 100644 --- a/docs/api/auto-updater.md +++ b/docs/api/auto-updater.md @@ -88,10 +88,13 @@ On Windows only `releaseName` is available. The `autoUpdater` object has the following methods: -### `autoUpdater.setFeedURL(url[, requestHeaders])` +### `autoUpdater.setFeedURL(options)` -* `url` String -* `requestHeaders` Object (optional) _macOS_ - HTTP request headers. +* `options` Object + * `url` String + * `headers` Object (optional) _macOS_ - HTTP request headers. + * `serverType` String (optional) _macOS_ - Either `json` or `default`, see the [Squirrel.Mac][squirrel-mac] + README for more information. Sets the `url` and initialize the auto updater. diff --git a/lib/browser/api/auto-updater/auto-updater-win.js b/lib/browser/api/auto-updater/auto-updater-win.js index fced125879775..7fead4aabb4a8 100644 --- a/lib/browser/api/auto-updater/auto-updater-win.js +++ b/lib/browser/api/auto-updater/auto-updater-win.js @@ -17,7 +17,19 @@ class AutoUpdater extends EventEmitter { return this.updateURL } - setFeedURL (updateURL, headers) { + setFeedURL (options) { + let updateURL + if (typeof options === 'object') { + if (typeof options.url === 'string') { + updateURL = options.url + } else { + throw new Error('Expected options object to contain a \'url\' string property in setFeedUrl call') + } + } else if (typeof options === 'string') { + updateURL = options + } else { + throw new Error('Expected an options object with a \'url\' property to be provided') + } this.updateURL = updateURL } diff --git a/package.json b/package.json index 01726d60fdfe5..8c508271da798 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "dugite": "^1.45.0", "electabul": "~0.0.4", "electron-docs-linter": "^2.3.4", - "electron-typescript-definitions": "^1.3.0", + "electron-typescript-definitions": "1.3.1", "github": "^9.2.0", "husky": "^0.14.3", "minimist": "^1.2.0", diff --git a/script/update-external-binaries.py b/script/update-external-binaries.py index a207ad3a1a15e..e67ac996e2605 100755 --- a/script/update-external-binaries.py +++ b/script/update-external-binaries.py @@ -8,7 +8,7 @@ from lib.util import safe_mkdir, rm_rf, extract_zip, tempdir, download -VERSION = 'v1.2.2' +VERSION = 'v1.3.0' SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) FRAMEWORKS_URL = 'http://github.com/electron/electron-frameworks/releases' \ '/download/' + VERSION diff --git a/spec/api-auto-updater-spec.js b/spec/api-auto-updater-spec.js index a9324c1705bde..c2a26326135ea 100644 --- a/spec/api-auto-updater-spec.js +++ b/spec/api-auto-updater-spec.js @@ -29,8 +29,65 @@ describe('autoUpdater module', function () { }) }) + describe('getFeedURL', function () { + it('returns a falsey value by default', function () { + assert.ok(!autoUpdater.getFeedURL()) + }) + + it('correctly fetches the previously set FeedURL', function (done) { + if (process.platform !== 'win32') { + // FIXME(alexeykuzmin): Skip the test. + // this.skip() + return done() + } + + const updateURL = 'https://fake-update.electron.io' + autoUpdater.setFeedURL(updateURL) + assert.equal(autoUpdater.getFeedURL(), updateURL) + done() + }) + }) + describe('setFeedURL', function () { + describe('on Mac or Windows', () => { + const noThrow = (fn) => { + try { fn() } catch (err) {} + } + + before(function () { + if (process.platform !== 'win32' && process.platform !== 'darwin') { + this.skip() + } + }) + + it('sets url successfully using old (url, headers) syntax', () => { + noThrow(() => autoUpdater.setFeedURL('http://electronjs.org', { header: 'val' })) + assert.equal(autoUpdater.getFeedURL(), 'http://electronjs.org') + }) + + it('throws if no url is provided when using the old style', () => { + assert.throws( + () => autoUpdater.setFeedURL(), + err => err.message.includes('Expected an options object with a \'url\' property to be provided') // eslint-disable-line + ) + }) + + it('sets url successfully using new ({ url }) syntax', () => { + noThrow(() => autoUpdater.setFeedURL({ url: 'http://mymagicurl.local' })) + assert.equal(autoUpdater.getFeedURL(), 'http://mymagicurl.local') + }) + + it('throws if no url is provided when using the new style', () => { + assert.throws( + () => autoUpdater.setFeedURL({ noUrl: 'lol' }), + err => err.message.includes('Expected options object to contain a \'url\' string property in setFeedUrl call') // eslint-disable-line + ) + }) + }) + describe('on Mac', function () { + const isServerTypeError = (err) => err.message.includes('Expected serverType to be \'default\' or \'json\'') + before(function () { if (process.platform !== 'darwin') { this.skip() @@ -44,25 +101,27 @@ describe('autoUpdater module', function () { }) autoUpdater.setFeedURL('') }) - }) - }) - describe('getFeedURL', function () { - it('returns a falsey value by default', function () { - assert.ok(!autoUpdater.getFeedURL()) - }) + it('does not throw if default is the serverType', () => { + assert.doesNotThrow( + () => autoUpdater.setFeedURL({ url: '', serverType: 'default' }), + isServerTypeError + ) + }) - it('correctly fetches the previously set FeedURL', function (done) { - if (process.platform !== 'win32') { - // FIXME(alexeykuzmin): Skip the test. - // this.skip() - return done() - } + it('does not throw if json is the serverType', () => { + assert.doesNotThrow( + () => autoUpdater.setFeedURL({ url: '', serverType: 'default' }), + isServerTypeError + ) + }) - const updateURL = 'https://fake-update.electron.io' - autoUpdater.setFeedURL(updateURL) - assert.equal(autoUpdater.getFeedURL(), updateURL) - done() + it('does throw if an unknown string is the serverType', () => { + assert.throws( + () => autoUpdater.setFeedURL({ url: '', serverType: 'weow' }), + isServerTypeError + ) + }) }) })