#include "atom/browser/api/atom_api_auto_updater.h"
-#include "base/time/time.h"
-#include "atom/browser/auto_updater.h"
#include "atom/browser/browser.h"
+#include "atom/browser/native_window.h"
+#include "atom/browser/window_list.h"
+#include "atom/common/api/event_emitter_caller.h"
+#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/node_includes.h"
+#include "base/time/time.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
+#include "tizen/common/env_variables.h"
+
+namespace mate {
+
+template<>
+struct Converter<base::Time> {
+ static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
+ const base::Time& val) {
+ v8::MaybeLocal<v8::Value> date = v8::Date::New(
+ isolate->GetCurrentContext(), val.ToJsTime());
+ if (date.IsEmpty())
+ return v8::Null(isolate);
+ else
+ return date.ToLocalChecked();
+ }
+};
+
+} // namespace mate
namespace atom {
namespace api {
-AutoUpdater::AutoUpdater() {
+AutoUpdater::AutoUpdater(v8::Isolate* isolate) {
auto_updater::AutoUpdater::SetDelegate(this);
+ Init(isolate);
}
AutoUpdater::~AutoUpdater() {
- auto_updater::AutoUpdater::SetDelegate(NULL);
+ auto_updater::AutoUpdater::SetDelegate(nullptr);
}
-void AutoUpdater::OnError(const std::string& error) {
- Emit("error", error);
+void AutoUpdater::OnError(const std::string& message) {
+ if (!::tizen::is_single_process)
+ v8::Locker locker(isolate());
+ v8::HandleScope handle_scope(isolate());
+ auto error = v8::Exception::Error(mate::StringToV8(isolate(), message));
+ mate::EmitEvent(
+ isolate(),
+ GetWrapper(),
+ "error",
+ error->ToObject(isolate()->GetCurrentContext()).ToLocalChecked(),
+ // Message is also emitted to keep compatibility with old code.
+ message);
}
void AutoUpdater::OnCheckingForUpdate() {
void AutoUpdater::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) {
- quit_and_install_ = quit_and_install;
- Emit("update-downloaded-raw", release_notes, release_name,
- release_date.ToJsTime(), update_url);
+ const std::string& url) {
+ Emit("update-downloaded", release_notes, release_name, release_date, url,
+ // Keep compatibility with old APIs.
+ base::Bind(&AutoUpdater::QuitAndInstall, base::Unretained(this)));
}
-mate::ObjectTemplateBuilder AutoUpdater::GetObjectTemplateBuilder(
- v8::Isolate* isolate) {
- return mate::ObjectTemplateBuilder(isolate)
- .SetMethod("setFeedUrl", &auto_updater::AutoUpdater::SetFeedURL)
- .SetMethod("checkForUpdates", &auto_updater::AutoUpdater::CheckForUpdates)
- .SetMethod("_quitAndInstall", &AutoUpdater::QuitAndInstall);
+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::QuitAndInstall() {
- if (quit_and_install_.is_null())
- Browser::Get()->Shutdown();
- else
- quit_and_install_.Run();
+ // If we don't have any window then quitAndInstall immediately.
+ if (WindowList::IsEmpty()) {
+ auto_updater::AutoUpdater::QuitAndInstall();
+ return;
+ }
+
+ // Otherwise do the restart after all windows have been closed.
+ WindowList::AddObserver(this);
+ WindowList::CloseAllWindows();
}
// static
mate::Handle<AutoUpdater> AutoUpdater::Create(v8::Isolate* isolate) {
- return CreateHandle(isolate, new AutoUpdater);
+ return mate::CreateHandle(isolate, new AutoUpdater(isolate));
+}
+
+// static
+void AutoUpdater::BuildPrototype(
+ v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> prototype) {
+ prototype->SetClassName(mate::StringToV8(isolate, "AutoUpdater"));
+ mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
+ .SetMethod("checkForUpdates", &auto_updater::AutoUpdater::CheckForUpdates)
+ .SetMethod("getFeedURL", &auto_updater::AutoUpdater::GetFeedURL)
+ .SetMethod("setFeedURL", &AutoUpdater::SetFeedURL)
+ .SetMethod("quitAndInstall", &AutoUpdater::QuitAndInstall);
}
} // namespace api
namespace {
+using atom::api::AutoUpdater;
+
void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
v8::Local<v8::Context> context, void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
- dict.Set("autoUpdater", atom::api::AutoUpdater::Create(isolate));
+ dict.Set("autoUpdater", AutoUpdater::Create(isolate));
+ dict.Set("AutoUpdater", AutoUpdater::GetConstructor(isolate)->GetFunction());
}
} // namespace