Simplify the auto-updater implementations

We used to use Sparkle on OS X, and the design was reserved to be
extended to all platforms, which are all wrong now.
This commit is contained in:
Cheng Zhao 2015-10-23 15:40:56 +08:00
parent d74ef5c078
commit f89d28a63e
10 changed files with 81 additions and 141 deletions

View file

@ -5,8 +5,9 @@
#include "atom/browser/api/atom_api_auto_updater.h" #include "atom/browser/api/atom_api_auto_updater.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "atom/browser/auto_updater.h"
#include "atom/browser/browser.h" #include "atom/browser/browser.h"
#include "atom/browser/native_window.h"
#include "atom/browser/window_list.h"
#include "atom/common/node_includes.h" #include "atom/common/node_includes.h"
#include "native_mate/dictionary.h" #include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h" #include "native_mate/object_template_builder.h"
@ -37,7 +38,7 @@ AutoUpdater::AutoUpdater() {
} }
AutoUpdater::~AutoUpdater() { AutoUpdater::~AutoUpdater() {
auto_updater::AutoUpdater::SetDelegate(NULL); auto_updater::AutoUpdater::SetDelegate(nullptr);
} }
void AutoUpdater::OnError(const std::string& message) { void AutoUpdater::OnError(const std::string& message) {
@ -66,25 +67,34 @@ void AutoUpdater::OnUpdateNotAvailable() {
void AutoUpdater::OnUpdateDownloaded(const std::string& release_notes, void AutoUpdater::OnUpdateDownloaded(const std::string& release_notes,
const std::string& release_name, const std::string& release_name,
const base::Time& release_date, const base::Time& release_date,
const std::string& url, const std::string& url) {
const base::Closure& quit_and_install) {
quit_and_install_ = quit_and_install;
Emit("update-downloaded", release_notes, release_name, release_date, url); Emit("update-downloaded", release_notes, release_name, release_date, url);
} }
void AutoUpdater::OnWindowAllClosed() {
QuitAndInstall();
}
mate::ObjectTemplateBuilder AutoUpdater::GetObjectTemplateBuilder( mate::ObjectTemplateBuilder AutoUpdater::GetObjectTemplateBuilder(
v8::Isolate* isolate) { v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate) return mate::ObjectTemplateBuilder(isolate)
.SetMethod("setFeedUrl", &auto_updater::AutoUpdater::SetFeedURL) .SetMethod("setFeedUrl", &auto_updater::AutoUpdater::SetFeedURL)
.SetMethod("checkForUpdates", &auto_updater::AutoUpdater::CheckForUpdates) .SetMethod("checkForUpdates", &auto_updater::AutoUpdater::CheckForUpdates)
.SetMethod("_quitAndInstall", &AutoUpdater::QuitAndInstall); .SetMethod("quitAndInstall", &AutoUpdater::QuitAndInstall);
} }
void AutoUpdater::QuitAndInstall() { void AutoUpdater::QuitAndInstall() {
if (quit_and_install_.is_null()) // If we don't have any window then quitAndInstall immediately.
Browser::Get()->Shutdown(); WindowList* window_list = WindowList::GetInstance();
else if (window_list->size() == 0) {
quit_and_install_.Run(); auto_updater::AutoUpdater::QuitAndInstall();
return;
}
// Otherwise do the restart after all windows have been closed.
window_list->AddObserver(this);
for (NativeWindow* window : *window_list)
window->Close();
} }
// static // static

View file

@ -7,9 +7,9 @@
#include <string> #include <string>
#include "base/callback.h"
#include "atom/browser/api/event_emitter.h" #include "atom/browser/api/event_emitter.h"
#include "atom/browser/auto_updater_delegate.h" #include "atom/browser/auto_updater.h"
#include "atom/browser/window_list_observer.h"
#include "native_mate/handle.h" #include "native_mate/handle.h"
namespace atom { namespace atom {
@ -17,7 +17,8 @@ namespace atom {
namespace api { namespace api {
class AutoUpdater : public mate::EventEmitter, class AutoUpdater : public mate::EventEmitter,
public auto_updater::AutoUpdaterDelegate { public auto_updater::Delegate,
public WindowListObserver {
public: public:
static mate::Handle<AutoUpdater> Create(v8::Isolate* isolate); static mate::Handle<AutoUpdater> Create(v8::Isolate* isolate);
@ -25,17 +26,18 @@ class AutoUpdater : public mate::EventEmitter,
AutoUpdater(); AutoUpdater();
virtual ~AutoUpdater(); virtual ~AutoUpdater();
// AutoUpdaterDelegate implementations. // Delegate implementations.
void OnError(const std::string& error) override; void OnError(const std::string& error) override;
void OnCheckingForUpdate() override; void OnCheckingForUpdate() override;
void OnUpdateAvailable() override; void OnUpdateAvailable() override;
void OnUpdateNotAvailable() override; void OnUpdateNotAvailable() override;
void OnUpdateDownloaded( void OnUpdateDownloaded(const std::string& release_notes,
const std::string& release_notes, const std::string& release_name,
const std::string& release_name, const base::Time& release_date,
const base::Time& release_date, const std::string& update_url) override;
const std::string& update_url,
const base::Closure& quit_and_install) override; // WindowListObserver:
void OnWindowAllClosed() override;
// mate::Wrappable implementations: // mate::Wrappable implementations:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder( mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
@ -44,8 +46,6 @@ class AutoUpdater : public mate::EventEmitter,
private: private:
void QuitAndInstall(); void QuitAndInstall();
base::Closure quit_and_install_;
DISALLOW_COPY_AND_ASSIGN(AutoUpdater); DISALLOW_COPY_AND_ASSIGN(AutoUpdater);
}; };

View file

@ -3,18 +3,4 @@
autoUpdater.__proto__ = EventEmitter.prototype autoUpdater.__proto__ = EventEmitter.prototype
autoUpdater.quitAndInstall = ->
# If we don't have any window then quitAndInstall immediately.
BrowserWindow = require 'browser-window'
windows = BrowserWindow.getAllWindows()
if windows.length is 0
@_quitAndInstall()
return
# Do the restart after all windows have been closed.
app = require 'app'
app.removeAllListeners 'window-all-closed'
app.once 'window-all-closed', @_quitAndInstall.bind(this)
win.close() for win in windows
module.exports = autoUpdater module.exports = autoUpdater

View file

@ -6,22 +6,25 @@
namespace auto_updater { namespace auto_updater {
AutoUpdaterDelegate* AutoUpdater::delegate_ = NULL; Delegate* AutoUpdater::delegate_ = nullptr;
AutoUpdaterDelegate* AutoUpdater::GetDelegate() { Delegate* AutoUpdater::GetDelegate() {
return delegate_; return delegate_;
} }
void AutoUpdater::SetDelegate(AutoUpdaterDelegate* delegate) { void AutoUpdater::SetDelegate(Delegate* delegate) {
delegate_ = delegate; delegate_ = delegate;
} }
#if defined(OS_MACOSX) && defined(MAS_BUILD) #if !defined(OS_MACOSX) || defined(MAS_BUILD)
void AutoUpdater::SetFeedURL(const std::string& url) { void AutoUpdater::SetFeedURL(const std::string& url) {
} }
void AutoUpdater::CheckForUpdates() { void AutoUpdater::CheckForUpdates() {
} }
void AutoUpdater::QuitAndInstall() {
}
#endif #endif
} // namespace auto_updater } // namespace auto_updater

View file

@ -9,21 +9,48 @@
#include "base/basictypes.h" #include "base/basictypes.h"
namespace base {
class Time;
}
namespace auto_updater { namespace auto_updater {
class AutoUpdaterDelegate; class Delegate {
public:
// An error happened.
virtual void OnError(const std::string& error) {}
// Checking to see if there is an update
virtual void OnCheckingForUpdate() {}
// There is an update available and it is being downloaded
virtual void OnUpdateAvailable() {}
// There is no available update.
virtual void OnUpdateNotAvailable() {}
// There is a new update which has been downloaded.
virtual void OnUpdateDownloaded(const std::string& release_notes,
const std::string& release_name,
const base::Time& release_date,
const std::string& update_url) {}
protected:
virtual ~Delegate() {}
};
class AutoUpdater { class AutoUpdater {
public: public:
// Gets/Sets the delegate. // Gets/Sets the delegate.
static AutoUpdaterDelegate* GetDelegate(); static Delegate* GetDelegate();
static void SetDelegate(AutoUpdaterDelegate* delegate); static void SetDelegate(Delegate* delegate);
static void SetFeedURL(const std::string& url); static void SetFeedURL(const std::string& url);
static void CheckForUpdates(); static void CheckForUpdates();
static void QuitAndInstall();
private: private:
static AutoUpdaterDelegate* delegate_; static Delegate* delegate_;
DISALLOW_IMPLICIT_CONSTRUCTORS(AutoUpdater); DISALLOW_IMPLICIT_CONSTRUCTORS(AutoUpdater);
}; };

View file

@ -1,45 +0,0 @@
// Copyright (c) 2013 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef ATOM_BROWSER_AUTO_UPDATER_DELEGATE_H_
#define ATOM_BROWSER_AUTO_UPDATER_DELEGATE_H_
#include <string>
#include "base/callback_forward.h"
namespace base {
class Time;
}
namespace auto_updater {
class AutoUpdaterDelegate {
public:
// An error happened.
virtual void OnError(const std::string& error) {}
// Checking to see if there is an update
virtual void OnCheckingForUpdate() {}
// There is an update available and it is being downloaded
virtual void OnUpdateAvailable() {}
// There is no available update.
virtual void OnUpdateNotAvailable() {}
// There is a new update which has been downloaded.
virtual void OnUpdateDownloaded(const std::string& release_notes,
const std::string& release_name,
const base::Time& release_date,
const std::string& update_url,
const base::Closure& quit_and_install) {}
protected:
virtual ~AutoUpdaterDelegate() {}
};
} // namespace auto_updater
#endif // ATOM_BROWSER_AUTO_UPDATER_DELEGATE_H_

View file

@ -1,17 +0,0 @@
// Copyright (c) 2013 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "atom/browser/auto_updater.h"
namespace auto_updater {
// static
void AutoUpdater::SetFeedURL(const std::string& url) {
}
// static
void AutoUpdater::CheckForUpdates() {
}
} // namespace auto_updater

View file

@ -12,9 +12,6 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "atom/browser/auto_updater_delegate.h"
#include <iostream>
namespace auto_updater { namespace auto_updater {
@ -23,20 +20,12 @@ namespace {
// The gloal SQRLUpdater object. // The gloal SQRLUpdater object.
SQRLUpdater* g_updater = nil; SQRLUpdater* g_updater = nil;
void RelaunchToInstallUpdate() {
[[g_updater relaunchToInstallUpdate] subscribeError:^(NSError* error) {
AutoUpdaterDelegate* delegate = AutoUpdater::GetDelegate();
if (delegate)
delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription));
}];
}
} // namespace } // namespace
// static // static
void AutoUpdater::SetFeedURL(const std::string& feed) { void AutoUpdater::SetFeedURL(const std::string& feed) {
if (g_updater == nil) { if (g_updater == nil) {
AutoUpdaterDelegate* delegate = GetDelegate(); Delegate* delegate = GetDelegate();
if (!delegate) if (!delegate)
return; return;
@ -67,7 +56,7 @@ void AutoUpdater::SetFeedURL(const std::string& feed) {
// static // static
void AutoUpdater::CheckForUpdates() { void AutoUpdater::CheckForUpdates() {
AutoUpdaterDelegate* delegate = GetDelegate(); Delegate* delegate = GetDelegate();
if (!delegate) if (!delegate)
return; return;
@ -86,8 +75,7 @@ void AutoUpdater::CheckForUpdates() {
base::SysNSStringToUTF8(update.releaseNotes), base::SysNSStringToUTF8(update.releaseNotes),
base::SysNSStringToUTF8(update.releaseName), base::SysNSStringToUTF8(update.releaseName),
base::Time::FromDoubleT(update.releaseDate.timeIntervalSince1970), base::Time::FromDoubleT(update.releaseDate.timeIntervalSince1970),
base::SysNSStringToUTF8(update.updateURL.absoluteString), base::SysNSStringToUTF8(update.updateURL.absoluteString));
base::Bind(RelaunchToInstallUpdate));
} else { } else {
// When the completed event is sent with no update, then we know there // When the completed event is sent with no update, then we know there
// is no update available. // is no update available.
@ -100,4 +88,12 @@ void AutoUpdater::CheckForUpdates() {
}]; }];
} }
void AutoUpdater::QuitAndInstall() {
[[g_updater relaunchToInstallUpdate] subscribeError:^(NSError* error) {
Delegate* delegate = AutoUpdater::GetDelegate();
if (delegate)
delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription));
}];
}
} // namespace auto_updater } // namespace auto_updater

View file

@ -1,17 +0,0 @@
// Copyright (c) 2013 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "atom/browser/auto_updater.h"
namespace auto_updater {
// static
void AutoUpdater::SetFeedURL(const std::string& url) {
}
// static
void AutoUpdater::CheckForUpdates() {
}
} // namespace auto_updater

View file

@ -115,10 +115,7 @@
'atom/browser/api/save_page_handler.h', 'atom/browser/api/save_page_handler.h',
'atom/browser/auto_updater.cc', 'atom/browser/auto_updater.cc',
'atom/browser/auto_updater.h', 'atom/browser/auto_updater.h',
'atom/browser/auto_updater_delegate.h',
'atom/browser/auto_updater_linux.cc',
'atom/browser/auto_updater_mac.mm', 'atom/browser/auto_updater_mac.mm',
'atom/browser/auto_updater_win.cc',
'atom/browser/atom_access_token_store.cc', 'atom/browser/atom_access_token_store.cc',
'atom/browser/atom_access_token_store.h', 'atom/browser/atom_access_token_store.h',
'atom/browser/atom_browser_client.cc', 'atom/browser/atom_browser_client.cc',