Browse Source

Merge pull request #11925 from electron/squirrel-mac-cdn

Update to use Squirrel.Mac that supports CDN releases
Cheng Zhao 7 years ago
parent
commit
67fa13d7cf

+ 2 - 4
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() {

+ 1 - 1
atom/browser/api/atom_api_auto_updater.h

@@ -47,7 +47,7 @@ class AutoUpdater : public mate::EventEmitter<AutoUpdater>,
 
  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);

+ 1 - 2
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() {

+ 2 - 2
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();
 

+ 34 - 3
atom/browser/auto_updater_mac.mm

@@ -9,9 +9,13 @@
 #import <ReactiveCocoa/NSObject+RACPropertySubscribing.h>
 #import <Squirrel/Squirrel.h>
 
+#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 @@ std::string AutoUpdater::GetFeedURL() {
 }
 
 // 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 @@ void AutoUpdater::SetFeedURL(const std::string& feed,
 
   // 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;

+ 6 - 3
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.
 

+ 13 - 1
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
   }
 

+ 1 - 1
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",

+ 1 - 1
script/update-external-binaries.py

@@ -8,7 +8,7 @@ from lib.config import get_target_arch
 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

+ 75 - 16
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
+        )
+      })
     })
   })