blob: 330cdb2b66e5b5c3f2fa1e2525d72eb0aee667b5 [file] [log] [blame]
// Copyright 2015 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 "src/inspector/remote-object-id.h"
#include "../../third_party/inspector_protocol/crdtp/json.h"
#include "src/inspector/protocol/Protocol.h"
#include "src/inspector/string-util.h"
namespace v8_inspector {
namespace {
String16 serializeId(uint64_t isolateId, int injectedScriptId, int id) {
return String16::concat(
String16::fromInteger64(static_cast<int64_t>(isolateId)), ".",
String16::fromInteger(injectedScriptId), ".", String16::fromInteger(id));
}
} // namespace
RemoteObjectIdBase::RemoteObjectIdBase()
: m_isolateId(0), m_injectedScriptId(0), m_id(0) {}
bool RemoteObjectIdBase::parseId(const String16& objectId) {
const UChar dot = '.';
size_t firstDotPos = objectId.find(dot);
if (firstDotPos == String16::kNotFound) return false;
bool ok = false;
int64_t isolateId = objectId.substring(0, firstDotPos).toInteger64(&ok);
if (!ok) return false;
firstDotPos++;
size_t secondDotPos = objectId.find(dot, firstDotPos);
if (secondDotPos == String16::kNotFound) return false;
int injectedScriptId =
objectId.substring(firstDotPos, secondDotPos - firstDotPos)
.toInteger(&ok);
if (!ok) return false;
secondDotPos++;
int id = objectId.substring(secondDotPos).toInteger(&ok);
if (!ok) return false;
m_isolateId = static_cast<uint64_t>(isolateId);
m_injectedScriptId = injectedScriptId;
m_id = id;
return true;
}
Response RemoteObjectId::parse(const String16& objectId,
std::unique_ptr<RemoteObjectId>* result) {
std::unique_ptr<RemoteObjectId> remoteObjectId(new RemoteObjectId());
if (!remoteObjectId->parseId(objectId))
return Response::ServerError("Invalid remote object id");
*result = std::move(remoteObjectId);
return Response::Success();
}
String16 RemoteObjectId::serialize(uint64_t isolateId, int injectedScriptId,
int id) {
return serializeId(isolateId, injectedScriptId, id);
}
Response RemoteCallFrameId::parse(const String16& objectId,
std::unique_ptr<RemoteCallFrameId>* result) {
std::unique_ptr<RemoteCallFrameId> remoteCallFrameId(new RemoteCallFrameId());
if (!remoteCallFrameId->parseId(objectId))
return Response::ServerError("Invalid call frame id");
*result = std::move(remoteCallFrameId);
return Response::Success();
}
String16 RemoteCallFrameId::serialize(uint64_t isolateId, int injectedScriptId,
int frameOrdinal) {
return serializeId(isolateId, injectedScriptId, frameOrdinal);
}
} // namespace v8_inspector