| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project 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 "src/inspector/V8Console.h" | 5 #include "src/inspector/V8Console.h" |
| 6 | 6 |
| 7 #include "src/base/macros.h" |
| 7 #include "src/inspector/InjectedScript.h" | 8 #include "src/inspector/InjectedScript.h" |
| 8 #include "src/inspector/InspectedContext.h" | 9 #include "src/inspector/InspectedContext.h" |
| 9 #include "src/inspector/StringUtil.h" | 10 #include "src/inspector/StringUtil.h" |
| 10 #include "src/inspector/V8Compat.h" | |
| 11 #include "src/inspector/V8ConsoleMessage.h" | 11 #include "src/inspector/V8ConsoleMessage.h" |
| 12 #include "src/inspector/V8DebuggerAgentImpl.h" | 12 #include "src/inspector/V8DebuggerAgentImpl.h" |
| 13 #include "src/inspector/V8InspectorImpl.h" | 13 #include "src/inspector/V8InspectorImpl.h" |
| 14 #include "src/inspector/V8InspectorSessionImpl.h" | 14 #include "src/inspector/V8InspectorSessionImpl.h" |
| 15 #include "src/inspector/V8ProfilerAgentImpl.h" | 15 #include "src/inspector/V8ProfilerAgentImpl.h" |
| 16 #include "src/inspector/V8RuntimeAgentImpl.h" | 16 #include "src/inspector/V8RuntimeAgentImpl.h" |
| 17 #include "src/inspector/V8StackTraceImpl.h" | 17 #include "src/inspector/V8StackTraceImpl.h" |
| 18 #include "src/inspector/V8ValueCopier.h" | 18 #include "src/inspector/V8ValueCopier.h" |
| 19 #include "src/inspector/public/V8InspectorClient.h" | 19 |
| 20 #include "include/v8-inspector.h" |
| 20 | 21 |
| 21 namespace v8_inspector { | 22 namespace v8_inspector { |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 24 | 25 |
| 25 v8::Local<v8::Private> inspectedContextPrivateKey(v8::Isolate* isolate) { | 26 v8::Local<v8::Private> inspectedContextPrivateKey(v8::Isolate* isolate) { |
| 26 return v8::Private::ForApi( | 27 return v8::Private::ForApi( |
| 27 isolate, toV8StringInternalized(isolate, "V8Console#InspectedContext")); | 28 isolate, toV8StringInternalized(isolate, "V8Console#InspectedContext")); |
| 28 } | 29 } |
| 29 | 30 |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 } | 248 } |
| 248 | 249 |
| 249 void createBoundFunctionProperty(v8::Local<v8::Context> context, | 250 void createBoundFunctionProperty(v8::Local<v8::Context> context, |
| 250 v8::Local<v8::Object> console, | 251 v8::Local<v8::Object> console, |
| 251 const char* name, | 252 const char* name, |
| 252 v8::FunctionCallback callback, | 253 v8::FunctionCallback callback, |
| 253 const char* description = nullptr) { | 254 const char* description = nullptr) { |
| 254 v8::Local<v8::String> funcName = | 255 v8::Local<v8::String> funcName = |
| 255 toV8StringInternalized(context->GetIsolate(), name); | 256 toV8StringInternalized(context->GetIsolate(), name); |
| 256 v8::Local<v8::Function> func; | 257 v8::Local<v8::Function> func; |
| 257 if (!V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, callback, console, 0) | 258 if (!v8::Function::New(context, callback, console, 0, |
| 259 v8::ConstructorBehavior::kThrow) |
| 258 .ToLocal(&func)) | 260 .ToLocal(&func)) |
| 259 return; | 261 return; |
| 260 func->SetName(funcName); | 262 func->SetName(funcName); |
| 261 if (description) { | 263 if (description) { |
| 262 v8::Local<v8::String> returnValue = | 264 v8::Local<v8::String> returnValue = |
| 263 toV8String(context->GetIsolate(), description); | 265 toV8String(context->GetIsolate(), description); |
| 264 v8::Local<v8::Function> toStringFunction; | 266 v8::Local<v8::Function> toStringFunction; |
| 265 if (V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, returnDataCallback, | 267 if (v8::Function::New(context, returnDataCallback, returnValue, 0, |
| 266 returnValue, 0) | 268 v8::ConstructorBehavior::kThrow) |
| 267 .ToLocal(&toStringFunction)) | 269 .ToLocal(&toStringFunction)) |
| 268 createDataProperty(context, func, toV8StringInternalized( | 270 createDataProperty(context, func, toV8StringInternalized( |
| 269 context->GetIsolate(), "toString"), | 271 context->GetIsolate(), "toString"), |
| 270 toStringFunction); | 272 toStringFunction); |
| 271 } | 273 } |
| 272 createDataProperty(context, console, funcName, func); | 274 createDataProperty(context, console, funcName, func); |
| 273 } | 275 } |
| 274 | 276 |
| 275 } // namespace | 277 } // namespace |
| 276 | 278 |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 v8::Local<v8::Context> context = inspectedContext->context(); | 656 v8::Local<v8::Context> context = inspectedContext->context(); |
| 655 v8::Context::Scope contextScope(context); | 657 v8::Context::Scope contextScope(context); |
| 656 v8::Isolate* isolate = context->GetIsolate(); | 658 v8::Isolate* isolate = context->GetIsolate(); |
| 657 v8::MicrotasksScope microtasksScope(isolate, | 659 v8::MicrotasksScope microtasksScope(isolate, |
| 658 v8::MicrotasksScope::kDoNotRunMicrotasks); | 660 v8::MicrotasksScope::kDoNotRunMicrotasks); |
| 659 | 661 |
| 660 v8::Local<v8::Object> console = v8::Object::New(isolate); | 662 v8::Local<v8::Object> console = v8::Object::New(isolate); |
| 661 bool success = | 663 bool success = |
| 662 console->SetPrototype(context, v8::Object::New(isolate)).FromMaybe(false); | 664 console->SetPrototype(context, v8::Object::New(isolate)).FromMaybe(false); |
| 663 DCHECK(success); | 665 DCHECK(success); |
| 666 USE(success); |
| 664 | 667 |
| 665 createBoundFunctionProperty(context, console, "debug", | 668 createBoundFunctionProperty(context, console, "debug", |
| 666 V8Console::debugCallback); | 669 V8Console::debugCallback); |
| 667 createBoundFunctionProperty(context, console, "error", | 670 createBoundFunctionProperty(context, console, "error", |
| 668 V8Console::errorCallback); | 671 V8Console::errorCallback); |
| 669 createBoundFunctionProperty(context, console, "info", | 672 createBoundFunctionProperty(context, console, "info", |
| 670 V8Console::infoCallback); | 673 V8Console::infoCallback); |
| 671 createBoundFunctionProperty(context, console, "log", V8Console::logCallback); | 674 createBoundFunctionProperty(context, console, "log", V8Console::logCallback); |
| 672 createBoundFunctionProperty(context, console, "warn", | 675 createBoundFunctionProperty(context, console, "warn", |
| 673 V8Console::warnCallback); | 676 V8Console::warnCallback); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 703 createBoundFunctionProperty(context, console, "time", | 706 createBoundFunctionProperty(context, console, "time", |
| 704 V8Console::timeCallback); | 707 V8Console::timeCallback); |
| 705 createBoundFunctionProperty(context, console, "timeEnd", | 708 createBoundFunctionProperty(context, console, "timeEnd", |
| 706 V8Console::timeEndCallback); | 709 V8Console::timeEndCallback); |
| 707 createBoundFunctionProperty(context, console, "timeStamp", | 710 createBoundFunctionProperty(context, console, "timeStamp", |
| 708 V8Console::timeStampCallback); | 711 V8Console::timeStampCallback); |
| 709 | 712 |
| 710 if (hasMemoryAttribute) | 713 if (hasMemoryAttribute) |
| 711 console->SetAccessorProperty( | 714 console->SetAccessorProperty( |
| 712 toV8StringInternalized(isolate, "memory"), | 715 toV8StringInternalized(isolate, "memory"), |
| 713 V8_FUNCTION_NEW_REMOVE_PROTOTYPE( | 716 v8::Function::New(context, V8Console::memoryGetterCallback, console, 0, |
| 714 context, V8Console::memoryGetterCallback, console, 0) | 717 v8::ConstructorBehavior::kThrow) |
| 715 .ToLocalChecked(), | 718 .ToLocalChecked(), |
| 716 V8_FUNCTION_NEW_REMOVE_PROTOTYPE( | 719 v8::Function::New(context, V8Console::memorySetterCallback, |
| 717 context, V8Console::memorySetterCallback, v8::Local<v8::Value>(), 0) | 720 v8::Local<v8::Value>(), 0, |
| 721 v8::ConstructorBehavior::kThrow) |
| 718 .ToLocalChecked(), | 722 .ToLocalChecked(), |
| 719 static_cast<v8::PropertyAttribute>(v8::None), v8::DEFAULT); | 723 static_cast<v8::PropertyAttribute>(v8::None), v8::DEFAULT); |
| 720 | 724 |
| 721 console->SetPrivate(context, inspectedContextPrivateKey(isolate), | 725 console->SetPrivate(context, inspectedContextPrivateKey(isolate), |
| 722 v8::External::New(isolate, inspectedContext)); | 726 v8::External::New(isolate, inspectedContext)); |
| 723 return console; | 727 return console; |
| 724 } | 728 } |
| 725 | 729 |
| 726 void V8Console::clearInspectedContextIfNeeded(v8::Local<v8::Context> context, | 730 void V8Console::clearInspectedContextIfNeeded(v8::Local<v8::Context> context, |
| 727 v8::Local<v8::Object> console) { | 731 v8::Local<v8::Object> console) { |
| 728 v8::Isolate* isolate = context->GetIsolate(); | 732 v8::Isolate* isolate = context->GetIsolate(); |
| 729 console->SetPrivate(context, inspectedContextPrivateKey(isolate), | 733 console->SetPrivate(context, inspectedContextPrivateKey(isolate), |
| 730 v8::External::New(isolate, nullptr)); | 734 v8::External::New(isolate, nullptr)); |
| 731 } | 735 } |
| 732 | 736 |
| 733 v8::Local<v8::Object> V8Console::createCommandLineAPI( | 737 v8::Local<v8::Object> V8Console::createCommandLineAPI( |
| 734 InspectedContext* inspectedContext) { | 738 InspectedContext* inspectedContext) { |
| 735 v8::Local<v8::Context> context = inspectedContext->context(); | 739 v8::Local<v8::Context> context = inspectedContext->context(); |
| 736 v8::Isolate* isolate = context->GetIsolate(); | 740 v8::Isolate* isolate = context->GetIsolate(); |
| 737 v8::MicrotasksScope microtasksScope(isolate, | 741 v8::MicrotasksScope microtasksScope(isolate, |
| 738 v8::MicrotasksScope::kDoNotRunMicrotasks); | 742 v8::MicrotasksScope::kDoNotRunMicrotasks); |
| 739 | 743 |
| 740 v8::Local<v8::Object> commandLineAPI = v8::Object::New(isolate); | 744 v8::Local<v8::Object> commandLineAPI = v8::Object::New(isolate); |
| 741 bool success = | 745 bool success = |
| 742 commandLineAPI->SetPrototype(context, v8::Null(isolate)).FromMaybe(false); | 746 commandLineAPI->SetPrototype(context, v8::Null(isolate)).FromMaybe(false); |
| 743 DCHECK(success); | 747 DCHECK(success); |
| 748 USE(success); |
| 744 | 749 |
| 745 createBoundFunctionProperty(context, commandLineAPI, "dir", | 750 createBoundFunctionProperty(context, commandLineAPI, "dir", |
| 746 V8Console::dirCallback, | 751 V8Console::dirCallback, |
| 747 "function dir(value) { [Command Line API] }"); | 752 "function dir(value) { [Command Line API] }"); |
| 748 createBoundFunctionProperty(context, commandLineAPI, "dirxml", | 753 createBoundFunctionProperty(context, commandLineAPI, "dirxml", |
| 749 V8Console::dirxmlCallback, | 754 V8Console::dirxmlCallback, |
| 750 "function dirxml(value) { [Command Line API] }"); | 755 "function dirxml(value) { [Command Line API] }"); |
| 751 createBoundFunctionProperty(context, commandLineAPI, "profile", | 756 createBoundFunctionProperty(context, commandLineAPI, "profile", |
| 752 V8Console::profileCallback, | 757 V8Console::profileCallback, |
| 753 "function profile(title) { [Command Line API] }"); | 758 "function profile(title) { [Command Line API] }"); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 void V8Console::CommandLineAPIScope::accessorGetterCallback( | 822 void V8Console::CommandLineAPIScope::accessorGetterCallback( |
| 818 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { | 823 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 819 CommandLineAPIScope* scope = static_cast<CommandLineAPIScope*>( | 824 CommandLineAPIScope* scope = static_cast<CommandLineAPIScope*>( |
| 820 info.Data().As<v8::External>()->Value()); | 825 info.Data().As<v8::External>()->Value()); |
| 821 DCHECK(scope); | 826 DCHECK(scope); |
| 822 | 827 |
| 823 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); | 828 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
| 824 if (scope->m_cleanup) { | 829 if (scope->m_cleanup) { |
| 825 bool removed = info.Holder()->Delete(context, name).FromMaybe(false); | 830 bool removed = info.Holder()->Delete(context, name).FromMaybe(false); |
| 826 DCHECK(removed); | 831 DCHECK(removed); |
| 832 USE(removed); |
| 827 return; | 833 return; |
| 828 } | 834 } |
| 829 v8::Local<v8::Object> commandLineAPI = scope->m_commandLineAPI; | 835 v8::Local<v8::Object> commandLineAPI = scope->m_commandLineAPI; |
| 830 | 836 |
| 831 v8::Local<v8::Value> value; | 837 v8::Local<v8::Value> value; |
| 832 if (!commandLineAPI->Get(context, name).ToLocal(&value)) return; | 838 if (!commandLineAPI->Get(context, name).ToLocal(&value)) return; |
| 833 if (isCommandLineAPIGetter(toProtocolStringWithTypeCheck(name))) { | 839 if (isCommandLineAPIGetter(toProtocolStringWithTypeCheck(name))) { |
| 834 DCHECK(value->IsFunction()); | 840 DCHECK(value->IsFunction()); |
| 835 v8::MicrotasksScope microtasks(info.GetIsolate(), | 841 v8::MicrotasksScope microtasks(info.GetIsolate(), |
| 836 v8::MicrotasksScope::kDoNotRunMicrotasks); | 842 v8::MicrotasksScope::kDoNotRunMicrotasks); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 848 const v8::PropertyCallbackInfo<void>& info) { | 854 const v8::PropertyCallbackInfo<void>& info) { |
| 849 CommandLineAPIScope* scope = static_cast<CommandLineAPIScope*>( | 855 CommandLineAPIScope* scope = static_cast<CommandLineAPIScope*>( |
| 850 info.Data().As<v8::External>()->Value()); | 856 info.Data().As<v8::External>()->Value()); |
| 851 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); | 857 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
| 852 if (!info.Holder()->Delete(context, name).FromMaybe(false)) return; | 858 if (!info.Holder()->Delete(context, name).FromMaybe(false)) return; |
| 853 if (!info.Holder()->CreateDataProperty(context, name, value).FromMaybe(false)) | 859 if (!info.Holder()->CreateDataProperty(context, name, value).FromMaybe(false)) |
| 854 return; | 860 return; |
| 855 bool removed = | 861 bool removed = |
| 856 scope->m_installedMethods->Delete(context, name).FromMaybe(false); | 862 scope->m_installedMethods->Delete(context, name).FromMaybe(false); |
| 857 DCHECK(removed); | 863 DCHECK(removed); |
| 864 USE(removed); |
| 858 } | 865 } |
| 859 | 866 |
| 860 V8Console::CommandLineAPIScope::CommandLineAPIScope( | 867 V8Console::CommandLineAPIScope::CommandLineAPIScope( |
| 861 v8::Local<v8::Context> context, v8::Local<v8::Object> commandLineAPI, | 868 v8::Local<v8::Context> context, v8::Local<v8::Object> commandLineAPI, |
| 862 v8::Local<v8::Object> global) | 869 v8::Local<v8::Object> global) |
| 863 : m_context(context), | 870 : m_context(context), |
| 864 m_commandLineAPI(commandLineAPI), | 871 m_commandLineAPI(commandLineAPI), |
| 865 m_global(global), | 872 m_global(global), |
| 866 m_installedMethods(v8::Set::New(context->GetIsolate())), | 873 m_installedMethods(v8::Set::New(context->GetIsolate())), |
| 867 m_cleanup(false) { | 874 m_cleanup(false) { |
| 868 v8::Local<v8::Array> names; | 875 v8::Local<v8::Array> names; |
| 869 if (!m_commandLineAPI->GetOwnPropertyNames(context).ToLocal(&names)) return; | 876 if (!m_commandLineAPI->GetOwnPropertyNames(context).ToLocal(&names)) return; |
| 870 v8::Local<v8::External> externalThis = | 877 v8::Local<v8::External> externalThis = |
| 871 v8::External::New(context->GetIsolate(), this); | 878 v8::External::New(context->GetIsolate(), this); |
| 872 for (size_t i = 0; i < names->Length(); ++i) { | 879 for (size_t i = 0; i < names->Length(); ++i) { |
| 873 v8::Local<v8::Value> name; | 880 v8::Local<v8::Value> name; |
| 874 if (!names->Get(context, i).ToLocal(&name) || !name->IsName()) continue; | 881 if (!names->Get(context, i).ToLocal(&name) || !name->IsName()) continue; |
| 875 if (m_global->Has(context, name).FromMaybe(true)) continue; | 882 if (m_global->Has(context, name).FromMaybe(true)) continue; |
| 876 if (!m_installedMethods->Add(context, name).ToLocal(&m_installedMethods)) | 883 if (!m_installedMethods->Add(context, name).ToLocal(&m_installedMethods)) |
| 877 continue; | 884 continue; |
| 878 if (!m_global | 885 if (!m_global |
| 879 ->SetAccessor(context, v8::Local<v8::Name>::Cast(name), | 886 ->SetAccessor(context, v8::Local<v8::Name>::Cast(name), |
| 880 CommandLineAPIScope::accessorGetterCallback, | 887 CommandLineAPIScope::accessorGetterCallback, |
| 881 CommandLineAPIScope::accessorSetterCallback, | 888 CommandLineAPIScope::accessorSetterCallback, |
| 882 externalThis, v8::DEFAULT, v8::DontEnum) | 889 externalThis, v8::DEFAULT, v8::DontEnum) |
| 883 .FromMaybe(false)) { | 890 .FromMaybe(false)) { |
| 884 bool removed = m_installedMethods->Delete(context, name).FromMaybe(false); | 891 bool removed = m_installedMethods->Delete(context, name).FromMaybe(false); |
| 885 DCHECK(removed); | 892 DCHECK(removed); |
| 893 USE(removed); |
| 886 continue; | 894 continue; |
| 887 } | 895 } |
| 888 } | 896 } |
| 889 } | 897 } |
| 890 | 898 |
| 891 V8Console::CommandLineAPIScope::~CommandLineAPIScope() { | 899 V8Console::CommandLineAPIScope::~CommandLineAPIScope() { |
| 892 m_cleanup = true; | 900 m_cleanup = true; |
| 893 v8::Local<v8::Array> names = m_installedMethods->AsArray(); | 901 v8::Local<v8::Array> names = m_installedMethods->AsArray(); |
| 894 for (size_t i = 0; i < names->Length(); ++i) { | 902 for (size_t i = 0; i < names->Length(); ++i) { |
| 895 v8::Local<v8::Value> name; | 903 v8::Local<v8::Value> name; |
| 896 if (!names->Get(m_context, i).ToLocal(&name) || !name->IsName()) continue; | 904 if (!names->Get(m_context, i).ToLocal(&name) || !name->IsName()) continue; |
| 897 if (name->IsString()) { | 905 if (name->IsString()) { |
| 898 v8::Local<v8::Value> descriptor; | 906 v8::Local<v8::Value> descriptor; |
| 899 bool success = m_global | 907 bool success = m_global |
| 900 ->GetOwnPropertyDescriptor( | 908 ->GetOwnPropertyDescriptor( |
| 901 m_context, v8::Local<v8::String>::Cast(name)) | 909 m_context, v8::Local<v8::String>::Cast(name)) |
| 902 .ToLocal(&descriptor); | 910 .ToLocal(&descriptor); |
| 903 DCHECK(success); | 911 DCHECK(success); |
| 912 USE(success); |
| 904 } | 913 } |
| 905 } | 914 } |
| 906 } | 915 } |
| 907 | 916 |
| 908 } // namespace v8_inspector | 917 } // namespace v8_inspector |
| OLD | NEW |