OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/debugger/debugger_node.h" | 5 #include "chrome/browser/debugger/debugger_node.h" |
6 | 6 |
7 #include "base/process_util.h" | 7 #include "base/process_util.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "chrome/browser/browser.h" | 9 #include "chrome/browser/browser.h" |
10 #include "chrome/browser/browser_list.h" | 10 #include "chrome/browser/browser_list.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 v8::Local<v8::External> node = v8::External::New(wrap); | 62 v8::Local<v8::External> node = v8::External::New(wrap); |
63 // TODO(erikkay): cache these templates? | 63 // TODO(erikkay): cache these templates? |
64 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 64 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); |
65 if (IsFunction()) { | 65 if (IsFunction()) { |
66 templ->SetCallHandler(&DebuggerNode::NodeFunc, node); | 66 templ->SetCallHandler(&DebuggerNode::NodeFunc, node); |
67 v8::Local<v8::Function> f = templ->GetFunction(); | 67 v8::Local<v8::Function> f = templ->GetFunction(); |
68 return f; | 68 return f; |
69 } | 69 } |
70 v8::Local<v8::ObjectTemplate> instance = templ->InstanceTemplate(); | 70 v8::Local<v8::ObjectTemplate> instance = templ->InstanceTemplate(); |
71 if (IsObject()) { | 71 if (IsObject()) { |
72 instance->SetNamedPropertyHandler(&DebuggerNode::NodeGetter, 0, 0, 0, 0, nod
e); | 72 instance->SetNamedPropertyHandler(&DebuggerNode::NodeGetter, 0, 0, 0, 0, |
| 73 node); |
73 // TODO(erikkay): verify that the interceptor does not have to be | 74 // TODO(erikkay): verify that the interceptor does not have to be |
74 // behind the object | 75 // behind the object |
75 } | 76 } |
76 if (IsCollection()) { | 77 if (IsCollection()) { |
77 instance->SetIndexedPropertyHandler(&DebuggerNode::NodeIndex, 0, 0, 0, 0, no
de); | 78 instance->SetIndexedPropertyHandler(&DebuggerNode::NodeIndex, 0, 0, 0, 0, |
| 79 node); |
78 } | 80 } |
79 v8::Local<v8::Object> ret = instance->NewInstance(); | 81 v8::Local<v8::Object> ret = instance->NewInstance(); |
80 v8::Persistent<v8::Object> p = v8::Persistent<v8::Object>::New(ret); | 82 v8::Persistent<v8::Object> p = v8::Persistent<v8::Object>::New(ret); |
81 p.MakeWeak(wrap, &DebuggerShell::HandleWeakReference); | 83 p.MakeWeak(wrap, &DebuggerShell::HandleWeakReference); |
82 return ret; | 84 return ret; |
83 } | 85 } |
84 | 86 |
85 v8::Handle<v8::Value> DebuggerNode::NodeGetter(v8::Local<v8::String> prop, | 87 v8::Handle<v8::Value> DebuggerNode::NodeGetter(v8::Local<v8::String> prop, |
86 const v8::AccessorInfo& info) { | 88 const v8::AccessorInfo& info) { |
87 DebuggerNodeWrapper* w = | 89 DebuggerNodeWrapper* w = static_cast<DebuggerNodeWrapper*>(v8::External::Cast( |
88 static_cast<DebuggerNodeWrapper*>(v8::External::Cast(*info.Data())->Value())
; | 90 *info.Data())->Value()); |
89 DebuggerNode* n = w->node(); | 91 DebuggerNode* n = w->node(); |
90 if (n->IsValid() && n->IsObject()) { | 92 if (n->IsValid() && n->IsObject()) { |
91 return n->PropGetter(prop, info); | 93 return n->PropGetter(prop, info); |
92 } else { | 94 } else { |
93 return v8::Undefined(); | 95 return v8::Undefined(); |
94 } | 96 } |
95 } | 97 } |
96 | 98 |
97 v8::Handle<v8::Value> DebuggerNode::NodeIndex(uint32_t index, | 99 v8::Handle<v8::Value> DebuggerNode::NodeIndex(uint32_t index, |
98 const v8::AccessorInfo& info) { | 100 const v8::AccessorInfo& info) { |
99 DebuggerNodeWrapper* w = | 101 DebuggerNodeWrapper* w = static_cast<DebuggerNodeWrapper*>(v8::External::Cast( |
100 static_cast<DebuggerNodeWrapper*>(v8::External::Cast(*info.Data())->Value())
; | 102 *info.Data())->Value()); |
101 DebuggerNode* n = w->node(); | 103 DebuggerNode* n = w->node(); |
102 if (n->IsValid() && n->IsCollection()) { | 104 if (n->IsValid() && n->IsCollection()) { |
103 return n->IndexGetter(index, info); | 105 return n->IndexGetter(index, info); |
104 } else { | 106 } else { |
105 return v8::Undefined(); | 107 return v8::Undefined(); |
106 } | 108 } |
107 } | 109 } |
108 | 110 |
109 v8::Handle<v8::Value> DebuggerNode::NodeFunc(const v8::Arguments& args) { | 111 v8::Handle<v8::Value> DebuggerNode::NodeFunc(const v8::Arguments& args) { |
110 DebuggerNodeWrapper* w = | 112 DebuggerNodeWrapper* w = static_cast<DebuggerNodeWrapper*>(v8::External::Cast( |
111 static_cast<DebuggerNodeWrapper*>(v8::External::Cast(*args.Data())->Value())
; | 113 *args.Data())->Value()); |
112 DebuggerNode* n = w->node(); | 114 DebuggerNode* n = w->node(); |
113 if (n->IsValid() && n->IsFunction()) { | 115 if (n->IsValid() && n->IsFunction()) { |
114 return n->Function(args); | 116 return n->Function(args); |
115 } else { | 117 } else { |
116 return v8::Undefined(); | 118 return v8::Undefined(); |
117 } | 119 } |
118 } | 120 } |
119 | 121 |
120 | 122 |
121 | 123 |
122 ///////////////////////////////////////////// | 124 ///////////////////////////////////////////// |
123 | 125 |
124 ChromeNode::ChromeNode(DebuggerShell* debugger) { | 126 ChromeNode::ChromeNode(DebuggerShell* debugger) { |
125 debugger_ = debugger; | 127 debugger_ = debugger; |
126 } | 128 } |
127 | 129 |
128 ChromeNode::~ChromeNode() { | 130 ChromeNode::~ChromeNode() { |
129 } | 131 } |
130 | 132 |
131 v8::Handle<v8::Value> ChromeNode::PropGetter(v8::Handle<v8::String> prop, | 133 v8::Handle<v8::Value> ChromeNode::PropGetter(v8::Handle<v8::String> prop, |
132 const v8::AccessorInfo& info) { | 134 const v8::AccessorInfo& info) { |
133 if (prop->Equals(v8::String::New("pid"))) { | 135 if (prop->Equals(v8::String::New("pid"))) { |
134 return v8::Number::New(base::GetCurrentProcId()); | 136 return v8::Number::New(base::GetCurrentProcId()); |
135 } else if (prop->Equals(v8::String::New("browser"))) { | 137 } else if (prop->Equals(v8::String::New("browser"))) { |
136 BrowserListNode *node = BrowserListNode::BrowserList(); | 138 BrowserListNode *node = BrowserListNode::BrowserList(); |
137 return node->NewInstance(); | 139 return node->NewInstance(); |
138 } else if (prop->Equals(v8::String::New("setDebuggerReady"))) { | 140 } else if (prop->Equals(v8::String::New("setDebuggerReady"))) { |
139 FunctionNode<DebuggerShell>* f = | 141 FunctionNode<DebuggerShell>* f = |
140 new FunctionNode<DebuggerShell>(DebuggerShell::SetDebuggerReady, debugger_
); | 142 new FunctionNode<DebuggerShell>(DebuggerShell::SetDebuggerReady, |
| 143 debugger_); |
141 return f->NewInstance(); | 144 return f->NewInstance(); |
142 } else if (prop->Equals(v8::String::New("setDebuggerBreak"))) { | 145 } else if (prop->Equals(v8::String::New("setDebuggerBreak"))) { |
143 FunctionNode<DebuggerShell>* f = | 146 FunctionNode<DebuggerShell>* f = |
144 new FunctionNode<DebuggerShell>(DebuggerShell::SetDebuggerBreak, debugger_
); | 147 new FunctionNode<DebuggerShell>(DebuggerShell::SetDebuggerBreak, |
| 148 debugger_); |
145 return f->NewInstance(); | 149 return f->NewInstance(); |
146 } else if (prop->Equals(v8::String::New("foo"))) { | 150 } else if (prop->Equals(v8::String::New("foo"))) { |
147 return v8::Undefined(); | 151 return v8::Undefined(); |
148 } else { | 152 } else { |
149 return prop; | 153 return prop; |
150 } | 154 } |
151 } | 155 } |
152 | 156 |
153 void ChromeNode::StopObserving(NotificationService *service) { | 157 void ChromeNode::StopObserving(NotificationService *service) { |
154 } | 158 } |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 } | 390 } |
387 | 391 |
388 | 392 |
389 ////////////////////////////////// | 393 ////////////////////////////////// |
390 | 394 |
391 template<class T> | 395 template<class T> |
392 v8::Handle<v8::Value> FunctionNode<T>::Function(const v8::Arguments &args) { | 396 v8::Handle<v8::Value> FunctionNode<T>::Function(const v8::Arguments &args) { |
393 return function_(args, data_); | 397 return function_(args, data_); |
394 } | 398 } |
395 | 399 |
OLD | NEW |