diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 534e5c4e4a8..5228c640f00 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -531,9 +531,10 @@ mate::Handle App::Create(v8::Isolate* isolate) { // static void App::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "App")); auto browser = base::Unretained(Browser::Get()); - mate::ObjectTemplateBuilder(isolate, prototype) + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("quit", base::Bind(&Browser::Quit, browser)) .SetMethod("exit", base::Bind(&Browser::Exit, browser)) .SetMethod("focus", base::Bind(&Browser::Focus, browser)) @@ -638,6 +639,7 @@ void Initialize(v8::Local exports, v8::Local unused, auto command_line = base::CommandLine::ForCurrentProcess(); mate::Dictionary dict(isolate, exports); + dict.Set("App", atom::api::App::GetConstructor(isolate)->GetFunction()); dict.Set("app", atom::api::App::Create(isolate)); dict.SetMethod("appendSwitch", &AppendSwitch); dict.SetMethod("appendArgument", diff --git a/atom/browser/api/atom_api_app.h b/atom/browser/api/atom_api_app.h index 13cedaa7d89..990199cd6fe 100644 --- a/atom/browser/api/atom_api_app.h +++ b/atom/browser/api/atom_api_app.h @@ -40,7 +40,7 @@ class App : public AtomBrowserClient::Delegate, static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); // Called when window with disposition needs to be created. void OnCreateWindow(const GURL& target_url, diff --git a/atom/browser/api/atom_api_auto_updater.cc b/atom/browser/api/atom_api_auto_updater.cc index f8d9a2f9ac9..83e5505a195 100644 --- a/atom/browser/api/atom_api_auto_updater.cc +++ b/atom/browser/api/atom_api_auto_updater.cc @@ -106,8 +106,9 @@ mate::Handle AutoUpdater::Create(v8::Isolate* isolate) { // static void AutoUpdater::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local 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) @@ -121,11 +122,14 @@ void AutoUpdater::BuildPrototype( namespace { +using atom::api::AutoUpdater; + void Initialize(v8::Local exports, v8::Local unused, v8::Local 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 diff --git a/atom/browser/api/atom_api_auto_updater.h b/atom/browser/api/atom_api_auto_updater.h index 4c73f7ce8e9..83a66146a3f 100644 --- a/atom/browser/api/atom_api_auto_updater.h +++ b/atom/browser/api/atom_api_auto_updater.h @@ -24,7 +24,7 @@ class AutoUpdater : public mate::EventEmitter, static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: explicit AutoUpdater(v8::Isolate* isolate); diff --git a/atom/browser/api/atom_api_cookies.cc b/atom/browser/api/atom_api_cookies.cc index 4ee2190219d..86cc59847b2 100644 --- a/atom/browser/api/atom_api_cookies.cc +++ b/atom/browser/api/atom_api_cookies.cc @@ -248,8 +248,9 @@ mate::Handle Cookies::Create( // static void Cookies::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Cookies")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("get", &Cookies::Get) .SetMethod("remove", &Cookies::Remove) .SetMethod("set", &Cookies::Set); diff --git a/atom/browser/api/atom_api_cookies.h b/atom/browser/api/atom_api_cookies.h index ce20c775975..5f60cb7ab49 100644 --- a/atom/browser/api/atom_api_cookies.h +++ b/atom/browser/api/atom_api_cookies.h @@ -41,7 +41,7 @@ class Cookies : public mate::TrackableObject { // mate::TrackableObject: static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: Cookies(v8::Isolate* isolate, AtomBrowserContext* browser_context); diff --git a/atom/browser/api/atom_api_debugger.cc b/atom/browser/api/atom_api_debugger.cc index 48b7a6f70c0..88d2a7adf4a 100644 --- a/atom/browser/api/atom_api_debugger.cc +++ b/atom/browser/api/atom_api_debugger.cc @@ -23,14 +23,6 @@ namespace atom { namespace api { -namespace { - -// The wrapDebugger funtion which is implemented in JavaScript. -using WrapDebuggerCallback = base::Callback)>; -WrapDebuggerCallback g_wrap_debugger; - -} // namespace - Debugger::Debugger(v8::Isolate* isolate, content::WebContents* web_contents) : web_contents_(web_contents), previous_request_id_(0) { @@ -151,37 +143,33 @@ void Debugger::SendCommand(mate::Arguments* args) { mate::Handle Debugger::Create( v8::Isolate* isolate, content::WebContents* web_contents) { - auto handle = mate::CreateHandle( - isolate, new Debugger(isolate, web_contents)); - g_wrap_debugger.Run(handle.ToV8()); - return handle; + return mate::CreateHandle(isolate, new Debugger(isolate, web_contents)); } // static void Debugger::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Debugger")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("attach", &Debugger::Attach) .SetMethod("isAttached", &Debugger::IsAttached) .SetMethod("detach", &Debugger::Detach) .SetMethod("sendCommand", &Debugger::SendCommand); } -void SetWrapDebugger(const WrapDebuggerCallback& callback) { - g_wrap_debugger = callback; -} - } // namespace api } // namespace atom namespace { +using atom::api::Debugger; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); - mate::Dictionary dict(isolate, exports); - dict.SetMethod("_setWrapDebugger", &atom::api::SetWrapDebugger); + mate::Dictionary(isolate, exports) + .Set("Debugger", Debugger::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/browser/api/atom_api_debugger.h b/atom/browser/api/atom_api_debugger.h index 1e97fa89abd..2f7106efd7e 100644 --- a/atom/browser/api/atom_api_debugger.h +++ b/atom/browser/api/atom_api_debugger.h @@ -39,7 +39,7 @@ class Debugger: public mate::TrackableObject, // mate::TrackableObject: static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: Debugger(v8::Isolate* isolate, content::WebContents* web_contents); diff --git a/atom/browser/api/atom_api_desktop_capturer.cc b/atom/browser/api/atom_api_desktop_capturer.cc index 3cb29a9124d..1ff5aadc0fa 100644 --- a/atom/browser/api/atom_api_desktop_capturer.cc +++ b/atom/browser/api/atom_api_desktop_capturer.cc @@ -99,8 +99,9 @@ mate::Handle DesktopCapturer::Create(v8::Isolate* isolate) { // static void DesktopCapturer::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "DesktopCapturer")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("startHandling", &DesktopCapturer::StartHandling); } diff --git a/atom/browser/api/atom_api_desktop_capturer.h b/atom/browser/api/atom_api_desktop_capturer.h index 4d1755e0682..571f08bcfc6 100644 --- a/atom/browser/api/atom_api_desktop_capturer.h +++ b/atom/browser/api/atom_api_desktop_capturer.h @@ -20,7 +20,7 @@ class DesktopCapturer: public mate::EventEmitter, static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); void StartHandling(bool capture_window, bool capture_screen, diff --git a/atom/browser/api/atom_api_download_item.cc b/atom/browser/api/atom_api_download_item.cc index 79ea3fa5fd5..05261a64f08 100644 --- a/atom/browser/api/atom_api_download_item.cc +++ b/atom/browser/api/atom_api_download_item.cc @@ -51,10 +51,6 @@ namespace api { namespace { -// The wrapDownloadItem funtion which is implemented in JavaScript -using WrapDownloadItemCallback = base::Callback)>; -WrapDownloadItemCallback g_wrap_download_item; - std::map> g_download_item_objects; } // namespace @@ -167,8 +163,9 @@ base::FilePath DownloadItem::GetSavePath() const { // static void DownloadItem::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "DownloadItem")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .MakeDestroyable() .SetMethod("pause", &DownloadItem::Pause) .SetMethod("isPaused", &DownloadItem::IsPaused) @@ -196,7 +193,6 @@ mate::Handle DownloadItem::Create( return mate::CreateHandle(isolate, static_cast(existing)); auto handle = mate::CreateHandle(isolate, new DownloadItem(isolate, item)); - g_wrap_download_item.Run(handle.ToV8()); // Reference this object in case it got garbage collected. g_download_item_objects[handle->weak_map_id()] = @@ -204,10 +200,6 @@ mate::Handle DownloadItem::Create( return handle; } -void SetWrapDownloadItem(const WrapDownloadItemCallback& callback) { - g_wrap_download_item = callback; -} - } // namespace api } // namespace atom @@ -217,8 +209,9 @@ namespace { void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); - mate::Dictionary dict(isolate, exports); - dict.SetMethod("_setWrapDownloadItem", &atom::api::SetWrapDownloadItem); + mate::Dictionary(isolate, exports) + .Set("DownloadItem", + atom::api::DownloadItem::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/browser/api/atom_api_download_item.h b/atom/browser/api/atom_api_download_item.h index fa330b90a0e..332c8cebb87 100644 --- a/atom/browser/api/atom_api_download_item.h +++ b/atom/browser/api/atom_api_download_item.h @@ -24,7 +24,7 @@ class DownloadItem : public mate::TrackableObject, content::DownloadItem* item); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); void Pause(); bool IsPaused() const; diff --git a/atom/browser/api/atom_api_global_shortcut.cc b/atom/browser/api/atom_api_global_shortcut.cc index 2b1e5d6591a..039d708a7c1 100644 --- a/atom/browser/api/atom_api_global_shortcut.cc +++ b/atom/browser/api/atom_api_global_shortcut.cc @@ -74,8 +74,9 @@ mate::Handle GlobalShortcut::Create(v8::Isolate* isolate) { // static void GlobalShortcut::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "GlobalShortcut")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("register", &GlobalShortcut::Register) .SetMethod("isRegistered", &GlobalShortcut::IsRegistered) .SetMethod("unregister", &GlobalShortcut::Unregister) diff --git a/atom/browser/api/atom_api_global_shortcut.h b/atom/browser/api/atom_api_global_shortcut.h index 41eb42f8556..b023aec4a84 100644 --- a/atom/browser/api/atom_api_global_shortcut.h +++ b/atom/browser/api/atom_api_global_shortcut.h @@ -24,7 +24,7 @@ class GlobalShortcut : public extensions::GlobalShortcutListener::Observer, static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: explicit GlobalShortcut(v8::Isolate* isolate); diff --git a/atom/browser/api/atom_api_menu.cc b/atom/browser/api/atom_api_menu.cc index 54a3d4e8132..627ce601f54 100644 --- a/atom/browser/api/atom_api_menu.cc +++ b/atom/browser/api/atom_api_menu.cc @@ -19,9 +19,10 @@ namespace atom { namespace api { -Menu::Menu(v8::Isolate* isolate) +Menu::Menu(v8::Isolate* isolate, v8::Local wrapper) : model_(new AtomMenuModel(this)), parent_(nullptr) { + InitWith(isolate, wrapper); } Menu::~Menu() { @@ -154,8 +155,9 @@ bool Menu::IsVisibleAt(int index) const { // static void Menu::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Menu")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .MakeDestroyable() .SetMethod("insertItem", &Menu::InsertItemAt) .SetMethod("insertCheckItem", &Menu::InsertCheckItemAt) @@ -184,14 +186,15 @@ void Menu::BuildPrototype(v8::Isolate* isolate, namespace { +using atom::api::Menu; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { - using atom::api::Menu; v8::Isolate* isolate = context->GetIsolate(); - v8::Local constructor = mate::CreateConstructor( - isolate, "Menu", base::Bind(&Menu::Create)); + Menu::SetConstructor(isolate, base::Bind(&Menu::New)); + mate::Dictionary dict(isolate, exports); - dict.Set("Menu", static_cast>(constructor)); + dict.Set("Menu", Menu::GetConstructor(isolate)->GetFunction()); #if defined(OS_MACOSX) dict.SetMethod("setApplicationMenu", &Menu::SetApplicationMenu); dict.SetMethod("sendActionToFirstResponder", diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index e04d189efc1..97b63600492 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -20,10 +20,10 @@ namespace api { class Menu : public mate::TrackableObject, public AtomMenuModel::Delegate { public: - static mate::WrappableBase* Create(v8::Isolate* isolate); + static mate::WrappableBase* New(mate::Arguments* args); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); #if defined(OS_MACOSX) // Set the global menubar. @@ -36,7 +36,7 @@ class Menu : public mate::TrackableObject, AtomMenuModel* model() const { return model_.get(); } protected: - explicit Menu(v8::Isolate* isolate); + Menu(v8::Isolate* isolate, v8::Local wrapper); ~Menu() override; // mate::Wrappable: diff --git a/atom/browser/api/atom_api_menu_mac.h b/atom/browser/api/atom_api_menu_mac.h index 062fd9be41b..d318b7bdc05 100644 --- a/atom/browser/api/atom_api_menu_mac.h +++ b/atom/browser/api/atom_api_menu_mac.h @@ -17,7 +17,7 @@ namespace api { class MenuMac : public Menu { protected: - explicit MenuMac(v8::Isolate* isolate); + MenuMac(v8::Isolate* isolate, v8::Local wrapper); void PopupAt(Window* window, int x, int y, int positioning_item) override; diff --git a/atom/browser/api/atom_api_menu_mac.mm b/atom/browser/api/atom_api_menu_mac.mm index 6a7d43b4da2..9e901d10980 100644 --- a/atom/browser/api/atom_api_menu_mac.mm +++ b/atom/browser/api/atom_api_menu_mac.mm @@ -18,7 +18,8 @@ namespace atom { namespace api { -MenuMac::MenuMac(v8::Isolate* isolate) : Menu(isolate) { +MenuMac::MenuMac(v8::Isolate* isolate, v8::Local wrapper) + : Menu(isolate, wrapper) { } void MenuMac::PopupAt(Window* window, int x, int y, int positioning_item) { @@ -94,8 +95,8 @@ void Menu::SendActionToFirstResponder(const std::string& action) { } // static -mate::WrappableBase* Menu::Create(v8::Isolate* isolate) { - return new MenuMac(isolate); +mate::WrappableBase* Menu::New(mate::Arguments* args) { + return new MenuMac(args->isolate(), args->GetThis()); } } // namespace api diff --git a/atom/browser/api/atom_api_menu_views.cc b/atom/browser/api/atom_api_menu_views.cc index a6fd8024ab2..8a72247c9d0 100644 --- a/atom/browser/api/atom_api_menu_views.cc +++ b/atom/browser/api/atom_api_menu_views.cc @@ -14,7 +14,8 @@ namespace atom { namespace api { -MenuViews::MenuViews(v8::Isolate* isolate) : Menu(isolate) { +MenuViews::MenuViews(v8::Isolate* isolate, v8::Local wrapper) + : Menu(isolate, wrapper) { } void MenuViews::PopupAt(Window* window, int x, int y, int positioning_item) { @@ -53,8 +54,8 @@ void MenuViews::PopupAt(Window* window, int x, int y, int positioning_item) { } // static -mate::WrappableBase* Menu::Create(v8::Isolate* isolate) { - return new MenuViews(isolate); +mate::WrappableBase* Menu::New(mate::Arguments* args) { + return new MenuViews(args->isolate(), args->GetThis()); } } // namespace api diff --git a/atom/browser/api/atom_api_menu_views.h b/atom/browser/api/atom_api_menu_views.h index 9b4ddf77f2a..1e7abd1372e 100644 --- a/atom/browser/api/atom_api_menu_views.h +++ b/atom/browser/api/atom_api_menu_views.h @@ -14,7 +14,7 @@ namespace api { class MenuViews : public Menu { public: - explicit MenuViews(v8::Isolate* isolate); + MenuViews(v8::Isolate* isolate, v8::Local wrapper); protected: void PopupAt(Window* window, int x, int y, int positioning_item) override; diff --git a/atom/browser/api/atom_api_power_monitor.cc b/atom/browser/api/atom_api_power_monitor.cc index 32c50c696c7..02b61e8f4bb 100644 --- a/atom/browser/api/atom_api_power_monitor.cc +++ b/atom/browser/api/atom_api_power_monitor.cc @@ -52,8 +52,8 @@ v8::Local PowerMonitor::Create(v8::Isolate* isolate) { // static void PowerMonitor::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype); + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "PowerMonitor")); } } // namespace api @@ -63,16 +63,19 @@ void PowerMonitor::BuildPrototype( namespace { +using atom::api::PowerMonitor; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { #if defined(OS_MACOSX) base::PowerMonitorDeviceSource::AllocateSystemIOPorts(); #endif - using atom::api::PowerMonitor; v8::Isolate* isolate = context->GetIsolate(); mate::Dictionary dict(isolate, exports); dict.Set("powerMonitor", PowerMonitor::Create(isolate)); + dict.Set("PowerMonitor", + PowerMonitor::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/browser/api/atom_api_power_monitor.h b/atom/browser/api/atom_api_power_monitor.h index 50d4bb466ca..94717e4c908 100644 --- a/atom/browser/api/atom_api_power_monitor.h +++ b/atom/browser/api/atom_api_power_monitor.h @@ -20,7 +20,7 @@ class PowerMonitor : public mate::TrackableObject, static v8::Local Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: explicit PowerMonitor(v8::Isolate* isolate); diff --git a/atom/browser/api/atom_api_power_save_blocker.cc b/atom/browser/api/atom_api_power_save_blocker.cc index 67c9b6dd83c..0f017be5fb1 100644 --- a/atom/browser/api/atom_api_power_save_blocker.cc +++ b/atom/browser/api/atom_api_power_save_blocker.cc @@ -105,8 +105,9 @@ mate::Handle PowerSaveBlocker::Create(v8::Isolate* isolate) { // static void PowerSaveBlocker::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "PowerSaveBlocker")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("start", &PowerSaveBlocker::Start) .SetMethod("stop", &PowerSaveBlocker::Stop) .SetMethod("isStarted", &PowerSaveBlocker::IsStarted); diff --git a/atom/browser/api/atom_api_power_save_blocker.h b/atom/browser/api/atom_api_power_save_blocker.h index ee1e0e3213a..0687106ab8b 100644 --- a/atom/browser/api/atom_api_power_save_blocker.h +++ b/atom/browser/api/atom_api_power_save_blocker.h @@ -25,7 +25,7 @@ class PowerSaveBlocker : public mate::TrackableObject { static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: explicit PowerSaveBlocker(v8::Isolate* isolate); diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc index 4019a96f2a6..eaed0c6dca3 100644 --- a/atom/browser/api/atom_api_protocol.cc +++ b/atom/browser/api/atom_api_protocol.cc @@ -160,8 +160,9 @@ mate::Handle Protocol::Create( // static void Protocol::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Protocol")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("registerServiceWorkerSchemes", &Protocol::RegisterServiceWorkerSchemes) .SetMethod("registerStringProtocol", diff --git a/atom/browser/api/atom_api_protocol.h b/atom/browser/api/atom_api_protocol.h index b5d47def68c..969fe7f6658 100644 --- a/atom/browser/api/atom_api_protocol.h +++ b/atom/browser/api/atom_api_protocol.h @@ -39,7 +39,7 @@ class Protocol : public mate::TrackableObject { v8::Isolate* isolate, AtomBrowserContext* browser_context); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: Protocol(v8::Isolate* isolate, AtomBrowserContext* browser_context); diff --git a/atom/browser/api/atom_api_render_process_preferences.cc b/atom/browser/api/atom_api_render_process_preferences.cc index 3d9495d932a..d5017122dd6 100644 --- a/atom/browser/api/atom_api_render_process_preferences.cc +++ b/atom/browser/api/atom_api_render_process_preferences.cc @@ -53,8 +53,10 @@ void RenderProcessPreferences::RemoveEntry(int id) { // static void RenderProcessPreferences::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName( + mate::StringToV8(isolate, "RenderProcessPreferences")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("addEntry", &RenderProcessPreferences::AddEntry) .SetMethod("removeEntry", &RenderProcessPreferences::RemoveEntry); } diff --git a/atom/browser/api/atom_api_render_process_preferences.h b/atom/browser/api/atom_api_render_process_preferences.h index 3fa197ed04c..19cc0d8821f 100644 --- a/atom/browser/api/atom_api_render_process_preferences.h +++ b/atom/browser/api/atom_api_render_process_preferences.h @@ -20,7 +20,7 @@ class RenderProcessPreferences ForAllWebContents(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); int AddEntry(const base::DictionaryValue& entry); void RemoveEntry(int id); diff --git a/atom/browser/api/atom_api_screen.cc b/atom/browser/api/atom_api_screen.cc index 68f4baeaf29..dfdd3450ebd 100644 --- a/atom/browser/api/atom_api_screen.cc +++ b/atom/browser/api/atom_api_screen.cc @@ -113,8 +113,9 @@ v8::Local Screen::Create(v8::Isolate* isolate) { // static void Screen::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Screen")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("getCursorScreenPoint", &Screen::GetCursorScreenPoint) .SetMethod("getPrimaryDisplay", &Screen::GetPrimaryDisplay) .SetMethod("getAllDisplays", &Screen::GetAllDisplays) @@ -128,10 +129,14 @@ void Screen::BuildPrototype( namespace { +using atom::api::Screen; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { - mate::Dictionary dict(context->GetIsolate(), exports); - dict.Set("screen", atom::api::Screen::Create(context->GetIsolate())); + v8::Isolate* isolate = context->GetIsolate(); + mate::Dictionary dict(isolate, exports); + dict.Set("screen", Screen::Create(isolate)); + dict.Set("Screen", Screen::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/browser/api/atom_api_screen.h b/atom/browser/api/atom_api_screen.h index feff6ddfffe..2bbaa13f6df 100644 --- a/atom/browser/api/atom_api_screen.h +++ b/atom/browser/api/atom_api_screen.h @@ -28,7 +28,7 @@ class Screen : public mate::EventEmitter, static v8::Local Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: Screen(v8::Isolate* isolate, display::Screen* screen); diff --git a/atom/browser/api/atom_api_session.cc b/atom/browser/api/atom_api_session.cc index 9117ff58a9f..58de02f2ff6 100644 --- a/atom/browser/api/atom_api_session.cc +++ b/atom/browser/api/atom_api_session.cc @@ -170,10 +170,6 @@ namespace { const char kPersistPrefix[] = "persist:"; -// The wrapSession funtion which is implemented in JavaScript -using WrapSessionCallback = base::Callback)>; -WrapSessionCallback g_wrap_session; - // Referenced session objects. std::map> g_sessions; @@ -541,7 +537,6 @@ mate::Handle Session::CreateFrom( auto handle = mate::CreateHandle( isolate, new Session(isolate, browser_context)); - g_wrap_session.Run(handle.ToV8()); // The Sessions should never be garbage collected, since the common pattern is // to use partition strings, instead of using the Session object directly. @@ -570,8 +565,9 @@ mate::Handle Session::FromPartition( // static void Session::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Session")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .MakeDestroyable() .SetMethod("resolveProxy", &Session::ResolveProxy) .SetMethod("getCacheSize", &Session::DoCacheAction) @@ -595,16 +591,14 @@ void Session::BuildPrototype(v8::Isolate* isolate, .SetProperty("webRequest", &Session::WebRequest); } -void SetWrapSession(const WrapSessionCallback& callback) { - g_wrap_session = callback; -} - } // namespace api } // namespace atom namespace { +using atom::api::Session; + v8::Local FromPartition( const std::string& partition, mate::Arguments* args) { if (!atom::Browser::Get()->is_ready()) { @@ -613,16 +607,15 @@ v8::Local FromPartition( } base::DictionaryValue options; args->GetNext(&options); - return atom::api::Session::FromPartition( - args->isolate(), partition, options).ToV8(); + return Session::FromPartition(args->isolate(), partition, options).ToV8(); } void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); mate::Dictionary dict(isolate, exports); + dict.Set("Session", Session::GetConstructor(isolate)->GetFunction()); dict.SetMethod("fromPartition", &FromPartition); - dict.SetMethod("_setWrapSession", &atom::api::SetWrapSession); } } // namespace diff --git a/atom/browser/api/atom_api_session.h b/atom/browser/api/atom_api_session.h index c3bb82eebaf..18189cf7e5c 100644 --- a/atom/browser/api/atom_api_session.h +++ b/atom/browser/api/atom_api_session.h @@ -57,7 +57,7 @@ class Session: public mate::TrackableObject, // mate::TrackableObject: static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); // Methods. void ResolveProxy(const GURL& url, ResolveProxyCallback callback); diff --git a/atom/browser/api/atom_api_system_preferences.cc b/atom/browser/api/atom_api_system_preferences.cc index c3421365f0c..618a9dff5b2 100644 --- a/atom/browser/api/atom_api_system_preferences.cc +++ b/atom/browser/api/atom_api_system_preferences.cc @@ -44,8 +44,9 @@ mate::Handle SystemPreferences::Create( // static void SystemPreferences::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "SystemPreferences")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) #if defined(OS_WIN) .SetMethod("isAeroGlassEnabled", &SystemPreferences::IsAeroGlassEnabled) #elif defined(OS_MACOSX) @@ -68,11 +69,15 @@ void SystemPreferences::BuildPrototype( namespace { +using atom::api::SystemPreferences; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); mate::Dictionary dict(isolate, exports); - dict.Set("systemPreferences", atom::api::SystemPreferences::Create(isolate)); + dict.Set("systemPreferences", SystemPreferences::Create(isolate)); + dict.Set("SystemPreferences", + SystemPreferences::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/browser/api/atom_api_system_preferences.h b/atom/browser/api/atom_api_system_preferences.h index 9a5cf990357..0d1f954b7a0 100644 --- a/atom/browser/api/atom_api_system_preferences.h +++ b/atom/browser/api/atom_api_system_preferences.h @@ -24,7 +24,7 @@ class SystemPreferences : public mate::EventEmitter { static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); #if defined(OS_WIN) bool IsAeroGlassEnabled(); diff --git a/atom/browser/api/atom_api_tray.cc b/atom/browser/api/atom_api_tray.cc index 213ddbfd89a..3f0386ab70a 100644 --- a/atom/browser/api/atom_api_tray.cc +++ b/atom/browser/api/atom_api_tray.cc @@ -60,10 +60,13 @@ namespace atom { namespace api { -Tray::Tray(v8::Isolate* isolate, mate::Handle image) +Tray::Tray(v8::Isolate* isolate, v8::Local wrapper, + mate::Handle image) : tray_icon_(TrayIcon::Create()) { SetImage(isolate, image); tray_icon_->AddObserver(this); + + InitWith(isolate, wrapper); } Tray::~Tray() { @@ -72,14 +75,13 @@ Tray::~Tray() { } // static -mate::WrappableBase* Tray::New(v8::Isolate* isolate, - mate::Handle image) { +mate::WrappableBase* Tray::New(mate::Handle image, + mate::Arguments* args) { if (!Browser::Get()->is_ready()) { - isolate->ThrowException(v8::Exception::Error(mate::StringToV8( - isolate, "Cannot create Tray before app is ready"))); + args->ThrowError("Cannot create Tray before app is ready"); return nullptr; } - return new Tray(isolate, image); + return new Tray(args->isolate(), args->GetThis(), image); } void Tray::OnClicked(const gfx::Rect& bounds, int modifiers) { @@ -199,8 +201,9 @@ gfx::Rect Tray::GetBounds() { // static void Tray::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Tray")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .MakeDestroyable() .SetMethod("setImage", &Tray::SetImage) .SetMethod("setPressedImage", &Tray::SetPressedImage) @@ -220,14 +223,15 @@ void Tray::BuildPrototype(v8::Isolate* isolate, namespace { +using atom::api::Tray; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { - using atom::api::Tray; v8::Isolate* isolate = context->GetIsolate(); - v8::Local constructor = mate::CreateConstructor( - isolate, "Tray", base::Bind(&Tray::New)); + Tray::SetConstructor(isolate, base::Bind(&Tray::New)); + mate::Dictionary dict(isolate, exports); - dict.Set("Tray", static_cast>(constructor)); + dict.Set("Tray", Tray::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/browser/api/atom_api_tray.h b/atom/browser/api/atom_api_tray.h index 1e1bc130754..61ee72bedf9 100644 --- a/atom/browser/api/atom_api_tray.h +++ b/atom/browser/api/atom_api_tray.h @@ -35,14 +35,15 @@ class NativeImage; class Tray : public mate::TrackableObject, public TrayIconObserver { public: - static mate::WrappableBase* New( - v8::Isolate* isolate, mate::Handle image); + static mate::WrappableBase* New(mate::Handle image, + mate::Arguments* args); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: - Tray(v8::Isolate* isolate, mate::Handle image); + Tray(v8::Isolate* isolate, v8::Local wrapper, + mate::Handle image); ~Tray() override; // TrayIconObserver: diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 967dc04a0b6..63638a27296 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -221,10 +221,6 @@ namespace api { namespace { -// The wrapWebContents function which is implemented in JavaScript -using WrapWebContentsCallback = base::Callback)>; -WrapWebContentsCallback g_wrap_web_contents; - content::ServiceWorkerContext* GetServiceWorkerContext( const content::WebContents* web_contents) { auto context = web_contents->GetBrowserContext(); @@ -1364,8 +1360,9 @@ v8::Local WebContents::Debugger(v8::Isolate* isolate) { // static void WebContents::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "WebContents")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .MakeDestroyable() .SetMethod("getId", &WebContents::GetID) .SetMethod("equal", &WebContents::Equal) @@ -1469,41 +1466,32 @@ mate::Handle WebContents::CreateFrom( return mate::CreateHandle(isolate, static_cast(existing)); // Otherwise create a new WebContents wrapper object. - auto handle = mate::CreateHandle( - isolate, new WebContents(isolate, web_contents)); - g_wrap_web_contents.Run(handle.ToV8()); - return handle; + return mate::CreateHandle(isolate, new WebContents(isolate, web_contents)); } // static mate::Handle WebContents::Create( v8::Isolate* isolate, const mate::Dictionary& options) { - auto handle = mate::CreateHandle(isolate, new WebContents(isolate, options)); - g_wrap_web_contents.Run(handle.ToV8()); - return handle; -} - -void SetWrapWebContents(const WrapWebContentsCallback& callback) { - g_wrap_web_contents = callback; + return mate::CreateHandle(isolate, new WebContents(isolate, options)); } } // namespace api } // namespace atom - namespace { +using atom::api::WebContents; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); mate::Dictionary dict(isolate, exports); - dict.SetMethod("create", &atom::api::WebContents::Create); - dict.SetMethod("_setWrapWebContents", &atom::api::SetWrapWebContents); - dict.SetMethod("fromId", - &mate::TrackableObject::FromWeakMapID); + dict.Set("WebContents", WebContents::GetConstructor(isolate)->GetFunction()); + dict.SetMethod("create", &WebContents::Create); + dict.SetMethod("fromId", &mate::TrackableObject::FromWeakMapID); dict.SetMethod("getAllWebContents", - &mate::TrackableObject::GetAll); + &mate::TrackableObject::GetAll); } } // namespace diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 381f3770d39..e3049f6832e 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -63,7 +63,7 @@ class WebContents : public mate::TrackableObject, v8::Isolate* isolate, const mate::Dictionary& options); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); int GetID() const; Type GetType() const; diff --git a/atom/browser/api/atom_api_web_request.cc b/atom/browser/api/atom_api_web_request.cc index 867901df065..2a39347d02a 100644 --- a/atom/browser/api/atom_api_web_request.cc +++ b/atom/browser/api/atom_api_web_request.cc @@ -88,8 +88,9 @@ mate::Handle WebRequest::Create( // static void WebRequest::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "WebRequest")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("onBeforeRequest", &WebRequest::SetResponseListener< AtomNetworkDelegate::kOnBeforeRequest>) diff --git a/atom/browser/api/atom_api_web_request.h b/atom/browser/api/atom_api_web_request.h index edcdcc5339e..b05a4e11b98 100644 --- a/atom/browser/api/atom_api_web_request.h +++ b/atom/browser/api/atom_api_web_request.h @@ -22,7 +22,7 @@ class WebRequest : public mate::TrackableObject { AtomBrowserContext* browser_context); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); protected: WebRequest(v8::Isolate* isolate, AtomBrowserContext* browser_context); diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 84829404542..bb78b376eaf 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -67,7 +67,8 @@ v8::Local ToBuffer(v8::Isolate* isolate, void* val, int size) { } // namespace -Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) { +Window::Window(v8::Isolate* isolate, v8::Local wrapper, + const mate::Dictionary& options) { // Use options.webPreferences to create WebContents. mate::Dictionary web_preferences = mate::Dictionary::CreateEmpty(isolate); options.Get(options::kWebPreferences, &web_preferences); @@ -107,7 +108,14 @@ Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) { window_->InitFromOptions(options); window_->AddObserver(this); + + InitWith(isolate, wrapper); AttachAsUserData(window_.get()); + + // We can only append this window to parent window's child windows after this + // window's JS wrapper gets initialized. + if (!parent.IsEmpty()) + parent->child_windows_.Set(isolate, ID(), wrapper); } Window::~Window() { @@ -119,17 +127,6 @@ Window::~Window() { base::MessageLoop::current()->DeleteSoon(FROM_HERE, window_.release()); } -void Window::AfterInit(v8::Isolate* isolate) { - mate::TrackableObject::AfterInit(isolate); - - // We can only append this window to parent window's child windows after this - // window's JS wrapper gets initialized. - mate::Handle parent; - if (!parent_window_.IsEmpty() && - mate::ConvertFromV8(isolate, GetParentWindow(), &parent)) - parent->child_windows_.Set(isolate, ID(), GetWrapper()); -} - void Window::WillCloseWindow(bool* prevent_default) { *prevent_default = Emit("close"); } @@ -262,10 +259,9 @@ void Window::OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) { #endif // static -mate::WrappableBase* Window::New(v8::Isolate* isolate, mate::Arguments* args) { +mate::WrappableBase* Window::New(mate::Arguments* args) { if (!Browser::Get()->is_ready()) { - isolate->ThrowException(v8::Exception::Error(mate::StringToV8( - isolate, "Cannot create BrowserWindow before app is ready"))); + args->ThrowError("Cannot create BrowserWindow before app is ready"); return nullptr; } @@ -276,10 +272,10 @@ mate::WrappableBase* Window::New(v8::Isolate* isolate, mate::Arguments* args) { mate::Dictionary options; if (!(args->Length() == 1 && args->GetNext(&options))) { - options = mate::Dictionary::CreateEmpty(isolate); + options = mate::Dictionary::CreateEmpty(args->isolate()); } - return new Window(isolate, options); + return new Window(args->isolate(), args->GetThis(), options); } void Window::Close() { @@ -750,8 +746,9 @@ void Window::RemoveFromParentChildWindows() { // static void Window::BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "BrowserWindow")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .MakeDestroyable() .SetMethod("close", &Window::Close) .SetMethod("focus", &Window::Focus) @@ -873,9 +870,10 @@ using atom::api::Window; void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); - v8::Local constructor = mate::CreateConstructor( - isolate, "BrowserWindow", base::Bind(&Window::New)); - mate::Dictionary browser_window(isolate, constructor); + Window::SetConstructor(isolate, base::Bind(&Window::New)); + + mate::Dictionary browser_window( + isolate, Window::GetConstructor(isolate)->GetFunction()); browser_window.SetMethod("fromId", &mate::TrackableObject::FromWeakMapID); browser_window.SetMethod("getAllWindows", diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 7736f835f74..5da7bd8d4bd 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -40,10 +40,10 @@ class WebContents; class Window : public mate::TrackableObject, public NativeWindowObserver { public: - static mate::WrappableBase* New(v8::Isolate* isolate, mate::Arguments* args); + static mate::WrappableBase* New(mate::Arguments* args); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); // Returns the BrowserWindow object from |native_window|. static v8::Local From(v8::Isolate* isolate, @@ -52,12 +52,10 @@ class Window : public mate::TrackableObject, NativeWindow* window() const { return window_.get(); } protected: - Window(v8::Isolate* isolate, const mate::Dictionary& options); + Window(v8::Isolate* isolate, v8::Local wrapper, + const mate::Dictionary& options); ~Window() override; - // TrackableObject: - void AfterInit(v8::Isolate* isolate) override; - // NativeWindowObserver: void WillCloseWindow(bool* prevent_default) override; void WillDestoryNativeObject() override; diff --git a/atom/browser/api/event.cc b/atom/browser/api/event.cc index 8c60eda2471..8810fed4b9a 100644 --- a/atom/browser/api/event.cc +++ b/atom/browser/api/event.cc @@ -58,8 +58,9 @@ Handle Event::Create(v8::Isolate* isolate) { // static void Event::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Event")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("preventDefault", &Event::PreventDefault) .SetMethod("sendReply", &Event::SendReply); } diff --git a/atom/browser/api/event.h b/atom/browser/api/event.h index 81db638a0dc..f08802b4ed1 100644 --- a/atom/browser/api/event.h +++ b/atom/browser/api/event.h @@ -21,7 +21,7 @@ class Event : public Wrappable, static Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); // Pass the sender and message to be replied. void SetSenderAndMessage(content::WebContents* sender, IPC::Message* message); diff --git a/atom/browser/api/event_emitter.cc b/atom/browser/api/event_emitter.cc index e98008b85d4..3dbcd0601ef 100644 --- a/atom/browser/api/event_emitter.cc +++ b/atom/browser/api/event_emitter.cc @@ -10,6 +10,8 @@ #include "native_mate/object_template_builder.h" #include "ui/events/event_constants.h" +#include "atom/common/node_includes.h" + namespace mate { namespace { diff --git a/atom/browser/api/trackable_object.cc b/atom/browser/api/trackable_object.cc index 5148df627c8..502757aa237 100644 --- a/atom/browser/api/trackable_object.cc +++ b/atom/browser/api/trackable_object.cc @@ -29,7 +29,7 @@ class IDUserData : public base::SupportsUserData::Data { } // namespace TrackableObjectBase::TrackableObjectBase() - : weak_map_id_(0), wrapped_(nullptr), weak_factory_(this) { + : weak_map_id_(0), weak_factory_(this) { cleanup_ = RegisterDestructionCallback(GetDestroyClosure()); } @@ -46,14 +46,7 @@ void TrackableObjectBase::Destroy() { } void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) { - if (weak_map_id_ != 0) { - wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_)); - wrapped_ = nullptr; - } else { - // If the TrackableObjectBase is not ready yet then delay SetUserData until - // AfterInit is called. - wrapped_ = wrapped; - } + wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_)); } // static diff --git a/atom/browser/api/trackable_object.h b/atom/browser/api/trackable_object.h index 2cb9428a004..3f04783bcd5 100644 --- a/atom/browser/api/trackable_object.h +++ b/atom/browser/api/trackable_object.h @@ -44,7 +44,6 @@ class TrackableObjectBase { static base::Closure RegisterDestructionCallback(const base::Closure& c); int32_t weak_map_id_; - base::SupportsUserData* wrapped_; private: void Destroy(); @@ -110,14 +109,13 @@ class TrackableObject : public TrackableObjectBase, RemoveFromWeakMap(); } - void AfterInit(v8::Isolate* isolate) override { + void InitWith(v8::Isolate* isolate, v8::Local wrapper) override { + WrappableBase::InitWith(isolate, wrapper); if (!weak_map_) { weak_map_ = new atom::KeyWeakMap; } weak_map_id_ = ++next_id_; - weak_map_->Set(isolate, weak_map_id_, Wrappable::GetWrapper()); - if (wrapped_) - AttachAsUserData(wrapped_); + weak_map_->Set(isolate, weak_map_id_, wrapper); } private: diff --git a/atom/common/api/atom_api_asar.cc b/atom/common/api/atom_api_asar.cc index 97c2e47fde0..012d8f3c167 100644 --- a/atom/common/api/atom_api_asar.cc +++ b/atom/common/api/atom_api_asar.cc @@ -29,8 +29,9 @@ class Archive : public mate::Wrappable { } static void BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "Archive")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetProperty("path", &Archive::GetPath) .SetMethod("getFileInfo", &Archive::GetFileInfo) .SetMethod("stat", &Archive::Stat) diff --git a/atom/common/api/atom_api_key_weak_map.h b/atom/common/api/atom_api_key_weak_map.h index b13338badd5..743b719e40e 100644 --- a/atom/common/api/atom_api_key_weak_map.h +++ b/atom/common/api/atom_api_key_weak_map.h @@ -8,6 +8,7 @@ #include "atom/common/key_weak_map.h" #include "native_mate/object_template_builder.h" #include "native_mate/handle.h" +#include "native_mate/wrappable.h" namespace atom { @@ -21,8 +22,9 @@ class KeyWeakMap : public mate::Wrappable> { } static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "KeyWeakMap")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("set", &KeyWeakMap::Set) .SetMethod("get", &KeyWeakMap::Get) .SetMethod("has", &KeyWeakMap::Has) diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 187ec7f48e0..bd97ea33850 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -355,8 +355,9 @@ mate::Handle NativeImage::CreateFromDataURL( // static void NativeImage::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "NativeImage")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("toPNG", &NativeImage::ToPNG) .SetMethod("toJPEG", &NativeImage::ToJPEG) .SetMethod("toBitmap", &NativeImage::ToBitmap) diff --git a/atom/common/api/atom_api_native_image.h b/atom/common/api/atom_api_native_image.h index 6702b33574f..d6fddd10763 100644 --- a/atom/common/api/atom_api_native_image.h +++ b/atom/common/api/atom_api_native_image.h @@ -52,7 +52,7 @@ class NativeImage : public mate::Wrappable { v8::Isolate* isolate, const GURL& url); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); #if defined(OS_WIN) HICON GetHICON(int size); diff --git a/atom/renderer/api/atom_api_web_frame.cc b/atom/renderer/api/atom_api_web_frame.cc index dce72b58095..9c83fc8e2f5 100644 --- a/atom/renderer/api/atom_api_web_frame.cc +++ b/atom/renderer/api/atom_api_web_frame.cc @@ -187,8 +187,9 @@ void WebFrame::ClearCache(v8::Isolate* isolate) { // static void WebFrame::BuildPrototype( - v8::Isolate* isolate, v8::Local prototype) { - mate::ObjectTemplateBuilder(isolate, prototype) + v8::Isolate* isolate, v8::Local prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "WebFrame")); + mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) .SetMethod("setName", &WebFrame::SetName) .SetMethod("setZoomLevel", &WebFrame::SetZoomLevel) .SetMethod("getZoomLevel", &WebFrame::GetZoomLevel) @@ -219,11 +220,14 @@ void WebFrame::BuildPrototype( namespace { +using atom::api::WebFrame; + void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); mate::Dictionary dict(isolate, exports); - dict.Set("webFrame", atom::api::WebFrame::Create(isolate)); + dict.Set("webFrame", WebFrame::Create(isolate)); + dict.Set("WebFrame", WebFrame::GetConstructor(isolate)->GetFunction()); } } // namespace diff --git a/atom/renderer/api/atom_api_web_frame.h b/atom/renderer/api/atom_api_web_frame.h index 852191fc766..7b2401dd407 100644 --- a/atom/renderer/api/atom_api_web_frame.h +++ b/atom/renderer/api/atom_api_web_frame.h @@ -32,7 +32,7 @@ class WebFrame : public mate::Wrappable { static mate::Handle Create(v8::Isolate* isolate); static void BuildPrototype(v8::Isolate* isolate, - v8::Local prototype); + v8::Local prototype); private: explicit WebFrame(v8::Isolate* isolate); diff --git a/lib/browser/api/app.js b/lib/browser/api/app.js index a63ef241bb6..c6ad57321ba 100644 --- a/lib/browser/api/app.js +++ b/lib/browser/api/app.js @@ -1,7 +1,7 @@ 'use strict' const bindings = process.atomBinding('app') -const {app} = bindings +const {app, App} = bindings // Only one app object permitted. module.exports = app @@ -10,7 +10,7 @@ const electron = require('electron') const {deprecate, Menu} = electron const {EventEmitter} = require('events') -Object.setPrototypeOf(app, EventEmitter.prototype) +Object.setPrototypeOf(App.prototype, EventEmitter.prototype) let appPath = null @@ -76,7 +76,5 @@ for (let name of events) { } // Wrappers for native classes. -process.atomBinding('download_item')._setWrapDownloadItem((downloadItem) => { - // downloadItem is an EventEmitter. - Object.setPrototypeOf(downloadItem, EventEmitter.prototype) -}) +const {DownloadItem} = process.atomBinding('download_item') +Object.setPrototypeOf(DownloadItem.prototype, EventEmitter.prototype) diff --git a/lib/browser/api/auto-updater/auto-updater-native.js b/lib/browser/api/auto-updater/auto-updater-native.js index 1fff05dbd65..80e2eb1b849 100644 --- a/lib/browser/api/auto-updater/auto-updater-native.js +++ b/lib/browser/api/auto-updater/auto-updater-native.js @@ -1,6 +1,6 @@ const EventEmitter = require('events').EventEmitter -const autoUpdater = process.atomBinding('auto_updater').autoUpdater +const {autoUpdater, AutoUpdater} = process.atomBinding('auto_updater') -Object.setPrototypeOf(autoUpdater, EventEmitter.prototype) +Object.setPrototypeOf(AutoUpdater.prototype, EventEmitter.prototype) module.exports = autoUpdater diff --git a/lib/browser/api/power-monitor.js b/lib/browser/api/power-monitor.js index 87c0069da3b..aee9b450c84 100644 --- a/lib/browser/api/power-monitor.js +++ b/lib/browser/api/power-monitor.js @@ -1,6 +1,6 @@ const {EventEmitter} = require('events') -const {powerMonitor} = process.atomBinding('power_monitor') +const {powerMonitor, PowerMonitor} = process.atomBinding('power_monitor') -Object.setPrototypeOf(powerMonitor, EventEmitter.prototype) +Object.setPrototypeOf(PowerMonitor.prototype, EventEmitter.prototype) module.exports = powerMonitor diff --git a/lib/browser/api/protocol.js b/lib/browser/api/protocol.js index 9d8394f7675..ab7f89bef55 100644 --- a/lib/browser/api/protocol.js +++ b/lib/browser/api/protocol.js @@ -9,7 +9,7 @@ Object.setPrototypeOf(module.exports, new Proxy({}, { if (!app.isReady()) return const protocol = session.defaultSession.protocol - if (!protocol.hasOwnProperty(property)) return + if (!Object.getPrototypeOf(protocol).hasOwnProperty(property)) return // Returning a native function directly would throw error. return (...args) => protocol[property](...args) @@ -18,7 +18,7 @@ Object.setPrototypeOf(module.exports, new Proxy({}, { ownKeys () { if (!app.isReady()) return [] - return Object.getOwnPropertyNames(session.defaultSession.protocol) + return Object.getOwnPropertyNames(Object.getPrototypeOf(session.defaultSession.protocol)) }, getOwnPropertyDescriptor (target) { diff --git a/lib/browser/api/screen.js b/lib/browser/api/screen.js index 25e3c37d3d5..83381ab5d79 100644 --- a/lib/browser/api/screen.js +++ b/lib/browser/api/screen.js @@ -1,6 +1,6 @@ const {EventEmitter} = require('events') -const {screen} = process.atomBinding('screen') +const {screen, Screen} = process.atomBinding('screen') -Object.setPrototypeOf(screen, EventEmitter.prototype) +Object.setPrototypeOf(Screen.prototype, EventEmitter.prototype) module.exports = screen diff --git a/lib/browser/api/session.js b/lib/browser/api/session.js index d82e6d01546..af553e442e1 100644 --- a/lib/browser/api/session.js +++ b/lib/browser/api/session.js @@ -1,6 +1,6 @@ const {EventEmitter} = require('events') const {app} = require('electron') -const {fromPartition, _setWrapSession} = process.atomBinding('session') +const {fromPartition, Session} = process.atomBinding('session') // Public API. Object.defineProperties(exports, { @@ -14,9 +14,8 @@ Object.defineProperties(exports, { } }) -// Wraps native Session class. -_setWrapSession(function (session) { - // Session is an EventEmitter. - Object.setPrototypeOf(session, EventEmitter.prototype) - app.emit('session-created', session) -}) +Object.setPrototypeOf(Session.prototype, EventEmitter.prototype) + +Session.prototype._init = function () { + app.emit('session-created', this) +} diff --git a/lib/browser/api/system-preferences.js b/lib/browser/api/system-preferences.js index 6ba1750507c..7d9d475bc24 100644 --- a/lib/browser/api/system-preferences.js +++ b/lib/browser/api/system-preferences.js @@ -1,6 +1,6 @@ const {EventEmitter} = require('events') -const {systemPreferences} = process.atomBinding('system_preferences') +const {systemPreferences, SystemPreferences} = process.atomBinding('system_preferences') -Object.setPrototypeOf(systemPreferences, EventEmitter.prototype) +Object.setPrototypeOf(SystemPreferences.prototype, EventEmitter.prototype) module.exports = systemPreferences diff --git a/lib/browser/api/web-contents.js b/lib/browser/api/web-contents.js index 04edb8d6c6b..eba951b6d7d 100644 --- a/lib/browser/api/web-contents.js +++ b/lib/browser/api/web-contents.js @@ -7,9 +7,6 @@ const {app, ipcMain, session, Menu, NavigationController} = require('electron') // before the webContents module. session -const binding = process.atomBinding('web_contents') -const debuggerBinding = process.atomBinding('debugger') - let nextId = 0 const getNextId = function () { return ++nextId @@ -81,6 +78,24 @@ const defaultPrintingSetting = { shouldPrintSelectionOnly: false } +// JavaScript implementations of WebContents. +const binding = process.atomBinding('web_contents') +const {WebContents} = binding + +Object.setPrototypeOf(NavigationController.prototype, EventEmitter.prototype) +Object.setPrototypeOf(WebContents.prototype, NavigationController.prototype) + +// WebContents::send(channel, args..) +// WebContents::sendToAll(channel, args..) +WebContents.prototype.send = function (channel, ...args) { + if (channel == null) throw new Error('Missing required channel argument') + return this._send(false, channel, args) +} +WebContents.prototype.sendToAll = function (channel, ...args) { + if (channel == null) throw new Error('Missing required channel argument') + return this._send(true, channel, args) +} + // Following methods are mapped to webFrame. const webFrameMethods = [ 'insertText', @@ -88,94 +103,112 @@ const webFrameMethods = [ 'setZoomLevel', 'setZoomLevelLimits' ] - const webFrameMethodsWithResult = [ 'getZoomFactor', 'getZoomLevel' ] +const asyncWebFrameMethods = function (requestId, method, callback, ...args) { + this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args) + ipcMain.once(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) { + if (callback) callback(result) + }) +} + +const syncWebFrameMethods = function (requestId, method, callback, ...args) { + this.send('ELECTRON_INTERNAL_RENDERER_SYNC_WEB_FRAME_METHOD', requestId, method, args) + ipcMain.once(`ELECTRON_INTERNAL_BROWSER_SYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) { + if (callback) callback(result) + }) +} + +for (const method of webFrameMethods) { + WebContents.prototype[method] = function (...args) { + this.send('ELECTRON_INTERNAL_RENDERER_WEB_FRAME_METHOD', method, args) + } +} + +for (const method of webFrameMethodsWithResult) { + WebContents.prototype[method] = function (...args) { + const callback = args[args.length - 1] + const actualArgs = args.slice(0, args.length - 2) + syncWebFrameMethods.call(this, getNextId(), method, callback, ...actualArgs) + } +} + +// Make sure WebContents::executeJavaScript would run the code only when the +// WebContents has been loaded. +WebContents.prototype.executeJavaScript = function (code, hasUserGesture, callback) { + const requestId = getNextId() + if (typeof hasUserGesture === 'function') { + callback = hasUserGesture + hasUserGesture = false + } + if (this.getURL() && !this.isLoadingMainFrame()) { + asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture) + } else { + this.once('did-finish-load', () => { + asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture) + }) + } +} + +// Translate the options of printToPDF. +WebContents.prototype.printToPDF = function (options, callback) { + const printingSetting = Object.assign({}, defaultPrintingSetting) + if (options.landscape) { + printingSetting.landscape = options.landscape + } + if (options.marginsType) { + printingSetting.marginsType = options.marginsType + } + if (options.printSelectionOnly) { + printingSetting.shouldPrintSelectionOnly = options.printSelectionOnly + } + if (options.printBackground) { + printingSetting.shouldPrintBackgrounds = options.printBackground + } + + if (options.pageSize) { + const pageSize = options.pageSize + if (typeof pageSize === 'object') { + if (!pageSize.height || !pageSize.width) { + return callback(new Error('Must define height and width for pageSize')) + } + // Dimensions in Microns + // 1 meter = 10^6 microns + printingSetting.mediaSize = { + name: 'CUSTOM', + custom_display_name: 'Custom', + height_microns: pageSize.height, + width_microns: pageSize.width + } + } else if (PDFPageSizes[pageSize]) { + printingSetting.mediaSize = PDFPageSizes[pageSize] + } else { + return callback(new Error(`Does not support pageSize with ${pageSize}`)) + } + } else { + printingSetting.mediaSize = PDFPageSizes['A4'] + } + + this._printToPDF(printingSetting, callback) +} + // Add JavaScript wrappers for WebContents class. -const wrapWebContents = function (webContents) { - // webContents is an EventEmitter. - Object.setPrototypeOf(webContents, EventEmitter.prototype) +WebContents.prototype._init = function () { + // The navigation controller. + NavigationController.call(this, this) // Every remote callback from renderer process would add a listenter to the // render-view-deleted event, so ignore the listenters warning. - webContents.setMaxListeners(0) - - // WebContents::send(channel, args..) - // WebContents::sendToAll(channel, args..) - const sendWrapper = (allFrames, channel, ...args) => { - if (channel == null) { - throw new Error('Missing required channel argument') - } - return webContents._send(allFrames, channel, args) - } - webContents.send = sendWrapper.bind(null, false) - webContents.sendToAll = sendWrapper.bind(null, true) - - // The navigation controller. - const controller = new NavigationController(webContents) - for (const name in NavigationController.prototype) { - const method = NavigationController.prototype[name] - if (method instanceof Function) { - webContents[name] = function () { - return method.apply(controller, arguments) - } - } - } - - const asyncWebFrameMethods = function (requestId, method, callback, ...args) { - this.send('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args) - ipcMain.once(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) { - if (callback) callback(result) - }) - } - - const syncWebFrameMethods = function (requestId, method, callback, ...args) { - this.send('ELECTRON_INTERNAL_RENDERER_SYNC_WEB_FRAME_METHOD', requestId, method, args) - ipcMain.once(`ELECTRON_INTERNAL_BROWSER_SYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, result) { - if (callback) callback(result) - }) - } - - // Mapping webFrame methods. - for (const method of webFrameMethods) { - webContents[method] = function (...args) { - this.send('ELECTRON_INTERNAL_RENDERER_WEB_FRAME_METHOD', method, args) - } - } - - for (const method of webFrameMethodsWithResult) { - webContents[method] = function (...args) { - const callback = args[args.length - 1] - const actualArgs = args.slice(0, args.length - 2) - syncWebFrameMethods.call(this, getNextId(), method, callback, ...actualArgs) - } - } - - // Make sure webContents.executeJavaScript would run the code only when the - // webContents has been loaded. - webContents.executeJavaScript = function (code, hasUserGesture, callback) { - const requestId = getNextId() - if (typeof hasUserGesture === 'function') { - callback = hasUserGesture - hasUserGesture = false - } - if (this.getURL() && !this.isLoadingMainFrame()) { - asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture) - } else { - this.once('did-finish-load', () => { - asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture) - }) - } - } + this.setMaxListeners(0) // Dispatch IPC messages to the ipc module. - webContents.on('ipc-message', function (event, [channel, ...args]) { + this.on('ipc-message', function (event, [channel, ...args]) { ipcMain.emit(channel, event, ...args) }) - webContents.on('ipc-message-sync', function (event, [channel, ...args]) { + this.on('ipc-message-sync', function (event, [channel, ...args]) { Object.defineProperty(event, 'returnValue', { set: function (value) { return event.sendReply(JSON.stringify(value)) @@ -186,77 +219,32 @@ const wrapWebContents = function (webContents) { }) // Handle context menu action request from pepper plugin. - webContents.on('pepper-context-menu', function (event, params) { + this.on('pepper-context-menu', function (event, params) { const menu = Menu.buildFromTemplate(params.menu) menu.popup(params.x, params.y) }) // The devtools requests the webContents to reload. - webContents.on('devtools-reload-page', function () { - webContents.reload() + this.on('devtools-reload-page', function () { + this.reload() }) // Delays the page-title-updated event to next tick. - webContents.on('-page-title-updated', function (...args) { + this.on('-page-title-updated', function (...args) { setImmediate(() => { this.emit.apply(this, ['page-title-updated'].concat(args)) }) }) - webContents.printToPDF = function (options, callback) { - const printingSetting = Object.assign({}, defaultPrintingSetting) - if (options.landscape) { - printingSetting.landscape = options.landscape - } - if (options.marginsType) { - printingSetting.marginsType = options.marginsType - } - if (options.printSelectionOnly) { - printingSetting.shouldPrintSelectionOnly = options.printSelectionOnly - } - if (options.printBackground) { - printingSetting.shouldPrintBackgrounds = options.printBackground - } - - if (options.pageSize) { - const pageSize = options.pageSize - if (typeof pageSize === 'object') { - if (!pageSize.height || !pageSize.width) { - return callback(new Error('Must define height and width for pageSize')) - } - // Dimensions in Microns - // 1 meter = 10^6 microns - printingSetting.mediaSize = { - name: 'CUSTOM', - custom_display_name: 'Custom', - height_microns: pageSize.height, - width_microns: pageSize.width - } - } else if (PDFPageSizes[pageSize]) { - printingSetting.mediaSize = PDFPageSizes[pageSize] - } else { - return callback(new Error(`Does not support pageSize with ${pageSize}`)) - } - } else { - printingSetting.mediaSize = PDFPageSizes['A4'] - } - - this._printToPDF(printingSetting, callback) - } - - app.emit('web-contents-created', {}, webContents) + app.emit('web-contents-created', {}, this) } -binding._setWrapWebContents(wrapWebContents) +// JavaScript wrapper of Debugger. +const {Debugger} = process.atomBinding('debugger') -// Add JavaScript wrappers for Debugger class. -const wrapDebugger = function (webContentsDebugger) { - // debugger is an EventEmitter. - Object.setPrototypeOf(webContentsDebugger, EventEmitter.prototype) -} - -debuggerBinding._setWrapDebugger(wrapDebugger) +Object.setPrototypeOf(Debugger.prototype, EventEmitter.prototype) +// Public APIs. module.exports = { create (options = {}) { return binding.create(options) diff --git a/lib/browser/init.js b/lib/browser/init.js index 88377a6978b..f7619fd17ba 100644 --- a/lib/browser/init.js +++ b/lib/browser/init.js @@ -65,7 +65,7 @@ process.on('uncaughtException', function (error) { }) // Emit 'exit' event on quit. -var app = require('electron').app +const {app} = require('electron') app.on('quit', function (event, exitCode) { process.emit('exit', exitCode) @@ -86,15 +86,12 @@ if (process.platform === 'win32') { // form `com.squirrel.PACKAGE-NAME.OUREXE`. We need to call // app.setAppUserModelId with a matching identifier so that renderer processes // will inherit this value. - var updateDotExe = path.join( - path.dirname(process.execPath), - '..', - 'update.exe') + const updateDotExe = path.join(path.dirname(process.execPath), '..', 'update.exe') - if (fs.statSyncNoException(updateDotExe)) { - var packageDir = path.dirname(path.resolve(updateDotExe)) - var packageName = path.basename(packageDir).replace(/\s/g, '') - var exeName = path.basename(process.execPath).replace(/\.exe$/i, '').replace(/\s/g, '') + if (fs.existsSync(updateDotExe)) { + const packageDir = path.dirname(path.resolve(updateDotExe)) + const packageName = path.basename(packageDir).replace(/\s/g, '') + const exeName = path.basename(process.execPath).replace(/\.exe$/i, '').replace(/\s/g, '') app.setAppUserModelId(`com.squirrel.${packageName}.${exeName}`) } @@ -108,15 +105,13 @@ require('./rpc-server') // Load the guest view manager. require('./guest-view-manager') - require('./guest-window-manager') // Now we try to load app's package.json. -var packageJson = null -var searchPaths = ['app', 'app.asar', 'default_app.asar'] -var i, len, packagePath -for (i = 0, len = searchPaths.length; i < len; i++) { - packagePath = searchPaths[i] +let packagePath = null +let packageJson = null +const searchPaths = ['app', 'app.asar', 'default_app.asar'] +for (packagePath of searchPaths) { try { packagePath = path.join(process.resourcesPath, packagePath) packageJson = require(path.join(packagePath, 'package.json')) @@ -157,14 +152,9 @@ if (packageJson.v8Flags != null) { v8.setFlagsFromString(packageJson.v8Flags) } -// Chrome 42 disables NPAPI plugins by default, reenable them here -app.commandLine.appendSwitch('enable-npapi') - // Set the user path according to application's name. app.setPath('userData', path.join(app.getPath('appData'), app.getName())) - app.setPath('userCache', path.join(app.getPath('cache'), app.getName())) - app.setAppPath(packagePath) // Load the chrome extension support. @@ -177,7 +167,7 @@ require('./desktop-capturer') require('./api/protocol') // Set main startup script of the app. -var mainStartupScript = packageJson.main || 'index.js' +const mainStartupScript = packageJson.main || 'index.js' // Finally load app's main.js and transfer control to C++. Module._load(path.join(packagePath, mainStartupScript), Module, true) diff --git a/lib/renderer/api/web-frame.js b/lib/renderer/api/web-frame.js index 81855c391f8..f9d2b3b1918 100644 --- a/lib/renderer/api/web-frame.js +++ b/lib/renderer/api/web-frame.js @@ -1,11 +1,10 @@ 'use strict' -const EventEmitter = require('events').EventEmitter +const {EventEmitter} = require('events') +const {webFrame, WebFrame} = process.atomBinding('web_frame') -const webFrame = process.atomBinding('web_frame').webFrame - -// webFrame is an EventEmitter. -Object.setPrototypeOf(webFrame, EventEmitter.prototype) +// WebFrame is an EventEmitter. +Object.setPrototypeOf(WebFrame.prototype, EventEmitter.prototype) // Lots of webview would subscribe to webFrame's events. webFrame.setMaxListeners(0) diff --git a/vendor/native_mate b/vendor/native_mate index d9bfe6a49d8..fa483e1fe01 160000 --- a/vendor/native_mate +++ b/vendor/native_mate @@ -1 +1 @@ -Subproject commit d9bfe6a49d8585916bd8dc77165154afeee4e5b6 +Subproject commit fa483e1fe012f873ad9812a67a66e2b7dbb570c6