diff --git a/atom/browser/api/atom_api_menu.cc b/atom/browser/api/atom_api_menu.cc index 54a3d4e81326..b7fc230651c6 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() { @@ -189,7 +190,7 @@ void Initialize(v8::Local exports, v8::Local unused, using atom::api::Menu; v8::Isolate* isolate = context->GetIsolate(); v8::Local constructor = mate::CreateConstructor( - isolate, "Menu", base::Bind(&Menu::Create)); + isolate, "Menu", base::Bind(&Menu::New)); mate::Dictionary dict(isolate, exports); dict.Set("Menu", static_cast>(constructor)); #if defined(OS_MACOSX) diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index e04d189efc1c..24164e5e71aa 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -20,7 +20,7 @@ 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); @@ -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 062fd9be41b6..d318b7bdc055 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 6a7d43b4da27..9e901d10980a 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 a6fd8024ab2a..8a72247c9d0b 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 9b4ddf77f2a2..1e7abd1372e2 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_tray.cc b/atom/browser/api/atom_api_tray.cc index 213ddbfd89a0..de11f7874861 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) { diff --git a/atom/browser/api/atom_api_tray.h b/atom/browser/api/atom_api_tray.h index 1e1bc1307543..038c4414e977 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); 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_window.cc b/atom/browser/api/atom_api_window.cc index 848294045428..19d88ec33118 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() { diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 7736f835f745..c585af15e7c4 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -40,7 +40,7 @@ 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); @@ -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/vendor/native_mate b/vendor/native_mate index d9bfe6a49d85..bd20bde1a257 160000 --- a/vendor/native_mate +++ b/vendor/native_mate @@ -1 +1 @@ -Subproject commit d9bfe6a49d8585916bd8dc77165154afeee4e5b6 +Subproject commit bd20bde1a257b1b740dfeafc220c331ead3b66ab