| // Copyright 2018 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <memory> |
| |
| #include "test/cctest/cctest.h" |
| |
| #include "include/v8-inspector.h" |
| #include "include/v8.h" |
| #include "src/inspector/protocol/Runtime.h" |
| #include "src/inspector/string-16.h" |
| |
| using v8_inspector::String16; |
| using v8_inspector::StringBuffer; |
| using v8_inspector::StringView; |
| using v8_inspector::V8ContextInfo; |
| using v8_inspector::V8Inspector; |
| using v8_inspector::V8InspectorSession; |
| |
| namespace { |
| |
| class NoopChannel : public V8Inspector::Channel { |
| public: |
| ~NoopChannel() override = default; |
| void sendResponse(int callId, |
| std::unique_ptr<StringBuffer> message) override {} |
| void sendNotification(std::unique_ptr<StringBuffer> message) override {} |
| void flushProtocolNotifications() override {} |
| }; |
| |
| void WrapOnInterrupt(v8::Isolate* isolate, void* data) { |
| const char* object_group = ""; |
| StringView object_group_view(reinterpret_cast<const uint8_t*>(object_group), |
| strlen(object_group)); |
| reinterpret_cast<V8InspectorSession*>(data)->wrapObject( |
| isolate->GetCurrentContext(), v8::Null(isolate), object_group_view, |
| false); |
| } |
| |
| } // namespace |
| |
| TEST(WrapInsideWrapOnInterrupt) { |
| LocalContext env; |
| v8::Isolate* isolate = env->GetIsolate(); |
| v8::HandleScope handle_scope(isolate); |
| |
| v8_inspector::V8InspectorClient default_client; |
| std::unique_ptr<V8Inspector> inspector = |
| V8Inspector::create(isolate, &default_client); |
| const char* name = ""; |
| StringView name_view(reinterpret_cast<const uint8_t*>(name), strlen(name)); |
| V8ContextInfo context_info(env.local(), 1, name_view); |
| inspector->contextCreated(context_info); |
| |
| NoopChannel channel; |
| const char* state = "{}"; |
| StringView state_view(reinterpret_cast<const uint8_t*>(state), strlen(state)); |
| std::unique_ptr<V8InspectorSession> session = |
| inspector->connect(1, &channel, state_view); |
| |
| const char* object_group = ""; |
| StringView object_group_view(reinterpret_cast<const uint8_t*>(object_group), |
| strlen(object_group)); |
| isolate->RequestInterrupt(&WrapOnInterrupt, session.get()); |
| session->wrapObject(env.local(), v8::Null(isolate), object_group_view, false); |
| } |
| |
| TEST(String16EndianTest) { |
| const v8_inspector::UChar* expected = |
| reinterpret_cast<const v8_inspector::UChar*>(u"Hello, \U0001F30E."); |
| const uint16_t* utf16le = reinterpret_cast<const uint16_t*>( |
| "H\0e\0l\0l\0o\0,\0 \0\x3c\xd8\x0e\xdf.\0"); // Same text in UTF16LE |
| // encoding |
| |
| String16 utf16_str = String16::fromUTF16LE(utf16le, 10); |
| String16 expected_str = expected; |
| |
| CHECK_EQ(utf16_str, expected_str); |
| } |