diff --git a/atom.gyp b/atom.gyp index c9e7a50e97..d3d90dd9ca 100644 --- a/atom.gyp +++ b/atom.gyp @@ -11,6 +11,7 @@ 'coffee_sources': [ 'browser/api/lib/app.coffee', 'browser/api/lib/atom-delegate.coffee', + 'browser/api/lib/auto-updater.coffee', 'browser/api/lib/browser-window.coffee', 'browser/api/lib/crash-reporter.coffee', 'browser/api/lib/dialog.coffee', @@ -35,6 +36,8 @@ 'browser/accelerator_util_mac.mm', 'browser/api/atom_api_app.cc', 'browser/api/atom_api_app.h', + 'browser/api/atom_api_auto_updater.cc', + 'browser/api/atom_api_auto_updater.h', 'browser/api/atom_api_browser_ipc.cc', 'browser/api/atom_api_browser_ipc.h', 'browser/api/atom_api_crash_reporter.h', diff --git a/browser/api/atom_api_auto_updater.cc b/browser/api/atom_api_auto_updater.cc index 620a3ad638..c8ae2d62ec 100644 --- a/browser/api/atom_api_auto_updater.cc +++ b/browser/api/atom_api_auto_updater.cc @@ -4,6 +4,7 @@ #include "browser/api/atom_api_auto_updater.h" +#include "base/values.h" #include "browser/auto_updater.h" namespace atom { @@ -12,14 +13,104 @@ namespace api { AutoUpdater::AutoUpdater(v8::Handle wrapper) : EventEmitter(wrapper) { + auto_updater::AutoUpdater::SetDelegate(this); + auto_updater::AutoUpdater::Init(); } AutoUpdater::~AutoUpdater() { + auto_updater::AutoUpdater::SetDelegate(NULL); +} + +void AutoUpdater::WillInstallUpdate(const std::string& version, + const base::Closure& install) { + base::ListValue args; + args.AppendString(version); + bool prevent_default = Emit("will-install-update", &args); + + if (prevent_default) + continue_update_ = install; + else + install.Run(); +} + +// static +v8::Handle AutoUpdater::New(const v8::Arguments &args) { + v8::HandleScope scope; + + if (!args.IsConstructCall()) + return node::ThrowError("Require constructor call"); + + new AutoUpdater(args.This()); + + return args.This(); +} + +// static +v8::Handle AutoUpdater::SetFeedURL(const v8::Arguments &args) { + auto_updater::AutoUpdater::SetFeedURL(*v8::String::Utf8Value(args[0])); + return v8::Undefined(); +} + +// static +v8::Handle AutoUpdater::SetAutomaticallyChecksForUpdates( + const v8::Arguments &args) { + auto_updater::AutoUpdater::SetAutomaticallyChecksForUpdates( + args[0]->BooleanValue()); + return v8::Undefined(); +} + +// static +v8::Handle AutoUpdater::SetAutomaticallyDownloadsUpdates( + const v8::Arguments &args) { + auto_updater::AutoUpdater::SetAutomaticallyDownloadsUpdates( + args[0]->BooleanValue()); + return v8::Undefined(); +} + +// static +v8::Handle AutoUpdater::CheckForUpdates(const v8::Arguments &args) { + auto_updater::AutoUpdater::CheckForUpdates(); + return v8::Undefined(); +} + +// static +v8::Handle AutoUpdater::CheckForUpdatesInBackground( + const v8::Arguments &args) { + auto_updater::AutoUpdater::CheckForUpdatesInBackground(); + return v8::Undefined(); +} + +// static +v8::Handle AutoUpdater::ContinueUpdate(const v8::Arguments &args) { + AutoUpdater* self = AutoUpdater::Unwrap(args.This()); + self->continue_update_.Run(); + return v8::Undefined(); } // static void AutoUpdater::Initialize(v8::Handle target) { v8::HandleScope scope; + + v8::Local t( + v8::FunctionTemplate::New(AutoUpdater::New)); + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(v8::String::NewSymbol("AutoUpdater")); + + NODE_SET_PROTOTYPE_METHOD(t, "setFeedUrl", SetFeedURL); + NODE_SET_PROTOTYPE_METHOD(t, + "setAutomaticallyChecksForUpdates", + SetAutomaticallyChecksForUpdates); + NODE_SET_PROTOTYPE_METHOD(t, + "setAutomaticallyDownloadsUpdates", + SetAutomaticallyDownloadsUpdates); + NODE_SET_PROTOTYPE_METHOD(t, "checkForUpdates", CheckForUpdates); + NODE_SET_PROTOTYPE_METHOD(t, + "checkForUpdatesInBackground", + CheckForUpdatesInBackground); + + NODE_SET_PROTOTYPE_METHOD(t, "continueUpdate", ContinueUpdate); + + target->Set(v8::String::NewSymbol("AutoUpdater"), t->GetFunction()); } } // namespace api diff --git a/browser/api/atom_api_auto_updater.h b/browser/api/atom_api_auto_updater.h index f873583f34..7493112d53 100644 --- a/browser/api/atom_api_auto_updater.h +++ b/browser/api/atom_api_auto_updater.h @@ -5,6 +5,8 @@ #ifndef ATOM_BROWSER_API_ATOM_API_AUTO_UPDATER_H_ #define ATOM_BROWSER_API_ATOM_API_AUTO_UPDATER_H_ +#include "base/callback.h" +#include "base/memory/scoped_ptr.h" #include "browser/api/atom_api_event_emitter.h" #include "browser/auto_updater_delegate.h" @@ -22,9 +24,25 @@ class AutoUpdater : public EventEmitter, protected: explicit AutoUpdater(v8::Handle wrapper); + virtual void WillInstallUpdate(const std::string& version, + const base::Closure& install) OVERRIDE; + private: static v8::Handle New(const v8::Arguments &args); + static v8::Handle SetFeedURL(const v8::Arguments &args); + static v8::Handle SetAutomaticallyChecksForUpdates( + const v8::Arguments &args); + static v8::Handle SetAutomaticallyDownloadsUpdates( + const v8::Arguments &args); + static v8::Handle CheckForUpdates(const v8::Arguments &args); + static v8::Handle CheckForUpdatesInBackground( + const v8::Arguments &args); + + static v8::Handle ContinueUpdate(const v8::Arguments &args); + + base::Closure continue_update_; + DISALLOW_COPY_AND_ASSIGN(AutoUpdater); }; diff --git a/browser/api/lib/auto-updater.coffee b/browser/api/lib/auto-updater.coffee new file mode 100644 index 0000000000..67522969ae --- /dev/null +++ b/browser/api/lib/auto-updater.coffee @@ -0,0 +1,6 @@ +AutoUpdater = process.atomBinding('auto_updater').AutoUpdater +EventEmitter = require('events').EventEmitter + +AutoUpdater::__proto__ = EventEmitter.prototype + +module.exports = new AutoUpdater diff --git a/common/api/atom_extensions.h b/common/api/atom_extensions.h index 2b986d3d80..e575a37c7b 100644 --- a/common/api/atom_extensions.h +++ b/common/api/atom_extensions.h @@ -10,6 +10,7 @@ NODE_EXT_LIST_START // Module names start with `atom_browser_` can only be used by browser process. NODE_EXT_LIST_ITEM(atom_browser_app) +NODE_EXT_LIST_ITEM(atom_browser_auto_updater) NODE_EXT_LIST_ITEM(atom_browser_crash_reporter) NODE_EXT_LIST_ITEM(atom_browser_dialog) NODE_EXT_LIST_ITEM(atom_browser_ipc)