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_shell.h" | 5 #include "chrome/browser/debugger/debugger_shell.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 ChromeNode* chrome = new ChromeNode(this); | 78 ChromeNode* chrome = new ChromeNode(this); |
79 v8_context_->Global()->Set(v8::String::New("chrome"), | 79 v8_context_->Global()->Set(v8::String::New("chrome"), |
80 chrome->NewInstance()); | 80 chrome->NewInstance()); |
81 | 81 |
82 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 82 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
83 const std::string& debugger_shell_js = | 83 const std::string& debugger_shell_js = |
84 rb.GetDataResource(IDR_DEBUGGER_SHELL_JS); | 84 rb.GetDataResource(IDR_DEBUGGER_SHELL_JS); |
85 CompileAndRun(debugger_shell_js, "chrome.dll/debugger_shell.js"); | 85 CompileAndRun(debugger_shell_js, "chrome.dll/debugger_shell.js"); |
86 } | 86 } |
87 | 87 |
88 void DebuggerShell::HandleWeakReference(v8::Persistent<v8::Value> obj, void* dat
a) { | 88 void DebuggerShell::HandleWeakReference(v8::Persistent<v8::Value> obj, |
| 89 void* data) { |
89 DebuggerNodeWrapper* node = static_cast<DebuggerNodeWrapper*>(data); | 90 DebuggerNodeWrapper* node = static_cast<DebuggerNodeWrapper*>(data); |
90 node->Release(); | 91 node->Release(); |
91 } | 92 } |
92 | 93 |
93 v8::Handle<v8::Value> DebuggerShell::SetDebuggerReady(const v8::Arguments& args, | 94 v8::Handle<v8::Value> DebuggerShell::SetDebuggerReady(const v8::Arguments& args, |
94 DebuggerShell* debugger) { | 95 DebuggerShell* debugger) { |
95 if (args[0]->IsBoolean()) { | 96 if (args[0]->IsBoolean()) { |
96 bool flag = args[0]->BooleanValue(); | 97 bool flag = args[0]->BooleanValue(); |
97 debugger->debugger_ready_ = flag; | 98 debugger->debugger_ready_ = flag; |
98 debugger->GetIo()->SetDebuggerReady(flag); | 99 debugger->GetIo()->SetDebuggerReady(flag); |
99 } | 100 } |
100 return v8::Undefined(); | 101 return v8::Undefined(); |
101 } | 102 } |
102 | 103 |
103 v8::Handle<v8::Value> DebuggerShell::SetDebuggerBreak(const v8::Arguments& args, | 104 v8::Handle<v8::Value> DebuggerShell::SetDebuggerBreak(const v8::Arguments& args, |
104 DebuggerShell* debugger) { | 105 DebuggerShell* debugger) { |
105 if (args[0]->IsBoolean()) { | 106 if (args[0]->IsBoolean()) { |
106 bool flag = args[0]->BooleanValue(); | 107 bool flag = args[0]->BooleanValue(); |
107 debugger->GetIo()->SetDebuggerBreak(flag); | 108 debugger->GetIo()->SetDebuggerBreak(flag); |
108 } | 109 } |
109 return v8::Undefined(); | 110 return v8::Undefined(); |
110 } | 111 } |
111 | 112 |
112 DebuggerInputOutput* DebuggerShell::GetIo() { | 113 DebuggerInputOutput* DebuggerShell::GetIo() { |
113 return io_.get(); | 114 return io_.get(); |
114 } | 115 } |
115 | 116 |
116 v8::Handle<v8::Value> DebuggerShell::DelegateSubshell(const v8::Arguments& args)
{ | 117 v8::Handle<v8::Value> DebuggerShell::DelegateSubshell( |
| 118 const v8::Arguments& args) { |
117 DebuggerShell* debugger = | 119 DebuggerShell* debugger = |
118 static_cast<DebuggerShell*>(v8::External::Cast(*args.Data())->Value()); | 120 static_cast<DebuggerShell*>(v8::External::Cast(*args.Data())->Value()); |
119 return debugger->Subshell(args); | 121 return debugger->Subshell(args); |
120 } | 122 } |
121 | 123 |
122 v8::Handle<v8::Value> DebuggerShell::Subshell(const v8::Arguments& args) { | 124 v8::Handle<v8::Value> DebuggerShell::Subshell(const v8::Arguments& args) { |
123 if (args.Length() != 1) { | 125 if (args.Length() != 1) { |
124 return v8::Undefined(); | 126 return v8::Undefined(); |
125 } | 127 } |
126 if (!shell_.IsEmpty()) { | 128 if (!shell_.IsEmpty()) { |
127 shell_.Dispose(); | 129 shell_.Dispose(); |
128 shell_.Clear(); | 130 shell_.Clear(); |
129 v8_context_->Global()->Delete(v8::String::New("shell_")); | 131 v8_context_->Global()->Delete(v8::String::New("shell_")); |
130 } | 132 } |
131 if (args[0]->IsFunction()) { | 133 if (args[0]->IsFunction()) { |
132 v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(args[0]); | 134 v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(args[0]); |
133 v8::Local<v8::Object> obj = func->NewInstance(); | 135 v8::Local<v8::Object> obj = func->NewInstance(); |
134 if (!obj->IsUndefined()) { | 136 if (!obj->IsUndefined()) { |
135 shell_ = v8::Persistent<v8::Object>::New(obj); | 137 shell_ = v8::Persistent<v8::Object>::New(obj); |
136 v8_context_->Global()->Set(v8::String::New("shell_"), shell_); | 138 v8_context_->Global()->Set(v8::String::New("shell_"), shell_); |
137 } | 139 } |
138 } else if (args[0]->IsObject()) { | 140 } else if (args[0]->IsObject()) { |
139 shell_ = v8::Persistent<v8::Object>::New(v8::Local<v8::Object>::Cast(args[0]
)); | 141 shell_ = |
| 142 v8::Persistent<v8::Object>::New(v8::Local<v8::Object>::Cast(args[0])); |
140 v8_context_->Global()->Set(v8::String::New("shell_"), shell_); | 143 v8_context_->Global()->Set(v8::String::New("shell_"), shell_); |
141 } | 144 } |
142 return v8::Undefined(); | 145 return v8::Undefined(); |
143 } | 146 } |
144 | 147 |
145 v8::Handle<v8::Value> DebuggerShell::SubshellFunction(const char* func, | 148 v8::Handle<v8::Value> DebuggerShell::SubshellFunction(const char* func, |
146 int argc, | 149 int argc, |
147 v8::Handle<v8::Value>* argv) { | 150 v8::Handle<v8::Value>* argv) { |
148 if (!shell_.IsEmpty()) { | 151 if (!shell_.IsEmpty()) { |
149 v8::Context::Scope scope(v8_context_); | 152 v8::Context::Scope scope(v8_context_); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 v8::Handle<v8::Value> argv[] = {node->NewInstance()}; | 231 v8::Handle<v8::Value> argv[] = {node->NewInstance()}; |
229 PrintObject(v8::Function::Cast(*function)->Call(global, 1, argv)); | 232 PrintObject(v8::Function::Cast(*function)->Call(global, 1, argv)); |
230 } | 233 } |
231 } | 234 } |
232 | 235 |
233 void DebuggerShell::DebugMessage(const std::wstring& msg) { | 236 void DebuggerShell::DebugMessage(const std::wstring& msg) { |
234 v8::Locker locked; | 237 v8::Locker locked; |
235 v8::HandleScope scope; | 238 v8::HandleScope scope; |
236 | 239 |
237 if (msg.length()) { | 240 if (msg.length()) { |
238 if ((msg[0] == L'{' || msg[0] == L'[' || msg[0] == L'(') && (!shell_.IsEmpty
())) { | 241 if ((msg[0] == L'{' || msg[0] == L'[' || msg[0] == L'(') && |
| 242 (!shell_.IsEmpty())) { |
239 // v8's wide String constructor requires uint16 rather than wchar | 243 // v8's wide String constructor requires uint16 rather than wchar |
240 const uint16* data = reinterpret_cast<const uint16* >(msg.c_str()); | 244 const uint16* data = reinterpret_cast<const uint16* >(msg.c_str()); |
241 v8::Handle<v8::Value> argv[] = {v8::String::New(data)}; | 245 v8::Handle<v8::Value> argv[] = {v8::String::New(data)}; |
242 PrintObject(SubshellFunction("response", 1, argv)); | 246 PrintObject(SubshellFunction("response", 1, argv)); |
243 PrintPrompt(); | 247 PrintPrompt(); |
244 } else { | 248 } else { |
245 if (msg[msg.length() - 1] == L'\n') | 249 if (msg[msg.length() - 1] == L'\n') |
246 PrintString(msg); | 250 PrintString(msg); |
247 else | 251 else |
248 PrintLine(msg); | 252 PrintLine(msg); |
249 } | 253 } |
250 } | 254 } |
251 } | 255 } |
252 | 256 |
253 void DebuggerShell::OnDebugAttach() { | 257 void DebuggerShell::OnDebugAttach() { |
254 v8::Locker locked; | 258 v8::Locker locked; |
255 v8::HandleScope scope; | 259 v8::HandleScope scope; |
256 SubshellFunction("on_attach", 0, NULL); | 260 SubshellFunction("on_attach", 0, NULL); |
257 } | 261 } |
258 | 262 |
259 void DebuggerShell::OnDebugDisconnect() { | 263 void DebuggerShell::OnDebugDisconnect() { |
260 v8::Locker locked; | 264 v8::Locker locked; |
261 v8::HandleScope scope; | 265 v8::HandleScope scope; |
262 SubshellFunction("on_disconnect", 0, NULL); | 266 SubshellFunction("on_disconnect", 0, NULL); |
263 } | 267 } |
264 | 268 |
265 void DebuggerShell::ObjectToString(v8::Handle<v8::Value> result, std::wstring* s
tr) { | 269 void DebuggerShell::ObjectToString(v8::Handle<v8::Value> result, |
| 270 std::wstring* str) { |
266 v8::HandleScope scope; | 271 v8::HandleScope scope; |
267 if (!result.IsEmpty() && !result->IsUndefined()) { | 272 if (!result.IsEmpty() && !result->IsUndefined()) { |
268 v8::Local<v8::String> str_obj = result->ToString(); | 273 v8::Local<v8::String> str_obj = result->ToString(); |
269 if (!str_obj.IsEmpty()) { | 274 if (!str_obj.IsEmpty()) { |
270 int length = str_obj->Length(); | 275 int length = str_obj->Length(); |
271 wchar_t* buf = new wchar_t[length + 1]; | 276 wchar_t* buf = new wchar_t[length + 1]; |
272 int size = str_obj->Write(reinterpret_cast<uint16_t*>(buf)); | 277 int size = str_obj->Write(reinterpret_cast<uint16_t*>(buf)); |
273 str->clear(); | 278 str->clear(); |
274 str->append(buf, size); | 279 str->append(buf, size); |
275 delete[] buf; | 280 delete[] buf; |
276 } | 281 } |
277 } | 282 } |
278 } | 283 } |
279 | 284 |
280 void DebuggerShell::ObjectToString(v8::Handle<v8::Value> result, std::string* st
r) { | 285 void DebuggerShell::ObjectToString(v8::Handle<v8::Value> result, |
| 286 std::string* str) { |
281 v8::HandleScope scope; | 287 v8::HandleScope scope; |
282 if (!result.IsEmpty() && !result->IsUndefined()) { | 288 if (!result.IsEmpty() && !result->IsUndefined()) { |
283 v8::Local<v8::String> str_obj = result->ToString(); | 289 v8::Local<v8::String> str_obj = result->ToString(); |
284 if (!str_obj.IsEmpty()) { | 290 if (!str_obj.IsEmpty()) { |
285 int length = str_obj->Length(); | 291 int length = str_obj->Length(); |
286 char* buf = new char[length + 1]; | 292 char* buf = new char[length + 1]; |
287 str_obj->WriteAscii(buf); | 293 str_obj->WriteAscii(buf); |
288 str->clear(); | 294 str->clear(); |
289 str->append(buf); | 295 str->append(buf); |
290 delete[] buf; | 296 delete[] buf; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 v8::Local<v8::Script> code = | 427 v8::Local<v8::Script> code = |
422 v8::Script::Compile(v8::String::New(utf16), &origin); | 428 v8::Script::Compile(v8::String::New(utf16), &origin); |
423 if (!code.IsEmpty()) { | 429 if (!code.IsEmpty()) { |
424 v8::Local<v8::Value> result = code->Run(); | 430 v8::Local<v8::Value> result = code->Run(); |
425 if (!result.IsEmpty()) { | 431 if (!result.IsEmpty()) { |
426 return result; | 432 return result; |
427 } | 433 } |
428 } | 434 } |
429 return v8::Undefined(); | 435 return v8::Undefined(); |
430 } | 436 } |
OLD | NEW |