From d8a6c68bf951052ddd52d9285b74bb79323ab96a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 14 May 2013 19:26:16 +0800 Subject: [PATCH] Expose Menu's delegate methods in javascript. --- browser/api/atom_api_event_emitter.h | 2 +- browser/api/atom_api_menu.cc | 62 ++++++++++++++++++++++------ browser/api/atom_api_menu.h | 2 +- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/browser/api/atom_api_event_emitter.h b/browser/api/atom_api_event_emitter.h index cc48f5c24d6..af514503dca 100644 --- a/browser/api/atom_api_event_emitter.h +++ b/browser/api/atom_api_event_emitter.h @@ -30,7 +30,7 @@ class EventEmitter : public node::ObjectWrap { bool Emit(const std::string& name, base::ListValue* args); // Small accessor to return handle_, this follows Google C++ Style. - v8::Persistent& handle() { return handle_; } + v8::Persistent handle() const { return handle_; } protected: explicit EventEmitter(v8::Handle wrapper); diff --git a/browser/api/atom_api_menu.cc b/browser/api/atom_api_menu.cc index 3699acc0a56..2aea34d5c20 100644 --- a/browser/api/atom_api_menu.cc +++ b/browser/api/atom_api_menu.cc @@ -4,6 +4,8 @@ #include "browser/api/atom_api_menu.h" +#include "browser/api/atom_api_window.h" + #define UNWRAP_MEMNU_AND_CHECK \ Menu* self = ObjectWrap::Unwrap(args.This()); \ if (self == NULL) \ @@ -26,6 +28,26 @@ v8::Handle UTF16ToV8Value(const string16& s) { return v8::String::New(reinterpret_cast(s.data()), s.size()); } +// Call method of delegate object. +v8::Handle CallDelegate(v8::Handle default_value, + v8::Handle menu, + const char* method, + int command_id) { + v8::HandleScope scope; + + v8::Handle delegate = menu->Get(v8::String::New("delegate")); + if (!delegate->IsObject()) + return default_value; + + v8::Handle function = v8::Handle::Cast( + delegate->ToObject()->Get(v8::String::New(method))); + if (!function->IsFunction()) + return default_value; + + return scope.Close( + function->Call(v8::Context::GetCurrent()->Global(), 0, NULL)); +} + } // namespace Menu::Menu(v8::Handle wrapper) @@ -37,32 +59,50 @@ Menu::~Menu() { } bool Menu::IsCommandIdChecked(int command_id) const { - return false; + return CallDelegate(v8::False(), + handle(), + "isCommandIdChecked", + command_id)->BooleanValue(); } bool Menu::IsCommandIdEnabled(int command_id) const { - return true; + return CallDelegate(v8::True(), + handle(), + "isCommandIdEnabled", + command_id)->BooleanValue(); } bool Menu::IsCommandIdVisible(int command_id) const { - return true; + return CallDelegate(v8::True(), + handle(), + "isCommandIdVisible", + command_id)->BooleanValue(); } bool Menu::GetAcceleratorForCommandId(int command_id, - ui::Accelerator* accelerator) { + ui::Accelerator* accelerator) { return false; } bool Menu::IsItemForCommandIdDynamic(int command_id) const { - return false; + return CallDelegate(v8::False(), + handle(), + "isItemForCommandIdDynamic", + command_id)->BooleanValue(); } string16 Menu::GetLabelForCommandId(int command_id) const { - return string16(); + return V8ValueToUTF16(CallDelegate(v8::False(), + handle(), + "getLabelForCommandId", + command_id)); } string16 Menu::GetSublabelForCommandId(int command_id) const { - return string16(); + return V8ValueToUTF16(CallDelegate(v8::False(), + handle(), + "getSubLabelForCommandId", + command_id)); } void Menu::ExecuteCommand(int command_id, int event_flags) { @@ -276,15 +316,11 @@ v8::Handle Menu::IsVisibleAt(const v8::Arguments &args) { v8::Handle Menu::Popup(const v8::Arguments &args) { UNWRAP_MEMNU_AND_CHECK; - if (!args[0]->IsObject() || !args[1]->IsNumber() || !args[2]->IsNumber()) - return node::ThrowTypeError("Bad argument"); - - NativeWindow* window = Unwrap(args[0]->ToObject()); + Window* window = Window::Unwrap(args[0]->ToObject()); if (!window) return node::ThrowTypeError("Invalid window"); - self->Popup(window, args[1]->IntegerValue(), args[2]->IntegerValue()); - + self->Popup(window->window()); return v8::Undefined(); } diff --git a/browser/api/atom_api_menu.h b/browser/api/atom_api_menu.h index 26ac768741f..1967f4f78a6 100644 --- a/browser/api/atom_api_menu.h +++ b/browser/api/atom_api_menu.h @@ -39,7 +39,7 @@ class Menu : public EventEmitter, virtual string16 GetSublabelForCommandId(int command_id) const OVERRIDE; virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; - virtual void Popup(NativeWindow* window, int x, int y) = 0; + virtual void Popup(NativeWindow* window) = 0; scoped_ptr model_;