summaryrefslogtreecommitdiff
path: root/deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template')
-rw-r--r--deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template104
1 files changed, 37 insertions, 67 deletions
diff --git a/deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template b/deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template
index 5403035cc4..9ad3eba91a 100644
--- a/deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template
+++ b/deps/v8/third_party/inspector_protocol/lib/DispatcherBase_cpp.template
@@ -68,10 +68,11 @@ DispatcherBase::WeakPtr::~WeakPtr()
m_dispatcher->m_weakPtrs.erase(this);
}
-DispatcherBase::Callback::Callback(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, int callbackId)
+DispatcherBase::Callback::Callback(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, const String& method, const String& message)
: m_backendImpl(std::move(backendImpl))
, m_callId(callId)
- , m_callbackId(callbackId) { }
+ , m_method(method)
+ , m_message(message) { }
DispatcherBase::Callback::~Callback() = default;
@@ -92,32 +93,18 @@ void DispatcherBase::Callback::fallThroughIfActive()
{
if (!m_backendImpl || !m_backendImpl->get())
return;
- m_backendImpl->get()->markFallThrough(m_callbackId);
+ m_backendImpl->get()->channel()->fallThrough(m_callId, m_method, m_message);
m_backendImpl = nullptr;
}
DispatcherBase::DispatcherBase(FrontendChannel* frontendChannel)
- : m_frontendChannel(frontendChannel)
- , m_lastCallbackId(0)
- , m_lastCallbackFallThrough(false) { }
+ : m_frontendChannel(frontendChannel) { }
DispatcherBase::~DispatcherBase()
{
clearFrontend();
}
-int DispatcherBase::nextCallbackId()
-{
- m_lastCallbackFallThrough = false;
- return ++m_lastCallbackId;
-}
-
-void DispatcherBase::markFallThrough(int callbackId)
-{
- DCHECK(callbackId == m_lastCallbackId);
- m_lastCallbackFallThrough = true;
-}
-
void DispatcherBase::sendResponse(int callId, const DispatchResponse& response, std::unique_ptr<protocol::DictionaryValue> result)
{
if (!m_frontendChannel)
@@ -218,13 +205,7 @@ std::unique_ptr<DispatcherBase::WeakPtr> DispatcherBase::weakPtr()
}
UberDispatcher::UberDispatcher(FrontendChannel* frontendChannel)
- : m_frontendChannel(frontendChannel)
- , m_fallThroughForNotFound(false) { }
-
-void UberDispatcher::setFallThroughForNotFound(bool fallThroughForNotFound)
-{
- m_fallThroughForNotFound = fallThroughForNotFound;
-}
+ : m_frontendChannel(frontendChannel) { }
void UberDispatcher::registerBackend(const String& name, std::unique_ptr<protocol::DispatcherBase> dispatcher)
{
@@ -237,81 +218,70 @@ void UberDispatcher::setupRedirects(const std::unordered_map<String, String>& re
m_redirects[pair.first] = pair.second;
}
-DispatchResponse::Status UberDispatcher::dispatch(std::unique_ptr<Value> parsedMessage, int* outCallId, String* outMethod)
-{
+bool UberDispatcher::parseCommand(Value* parsedMessage, int* outCallId, String* outMethod) {
if (!parsedMessage) {
reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kParseError, "Message must be a valid JSON");
- return DispatchResponse::kError;
+ return false;
}
- std::unique_ptr<protocol::DictionaryValue> messageObject = DictionaryValue::cast(std::move(parsedMessage));
+ protocol::DictionaryValue* messageObject = DictionaryValue::cast(parsedMessage);
if (!messageObject) {
reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kInvalidRequest, "Message must be an object");
- return DispatchResponse::kError;
+ return false;
}
int callId = 0;
protocol::Value* callIdValue = messageObject->get("id");
bool success = callIdValue && callIdValue->asInteger(&callId);
- if (outCallId)
- *outCallId = callId;
if (!success) {
reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kInvalidRequest, "Message must have integer 'id' property");
- return DispatchResponse::kError;
+ return false;
}
+ if (outCallId)
+ *outCallId = callId;
protocol::Value* methodValue = messageObject->get("method");
String method;
success = methodValue && methodValue->asString(&method);
- if (outMethod)
- *outMethod = method;
if (!success) {
reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kInvalidRequest, "Message must have string 'method' property", nullptr);
- return DispatchResponse::kError;
+ return false;
}
std::unordered_map<String, String>::iterator redirectIt = m_redirects.find(method);
if (redirectIt != m_redirects.end())
method = redirectIt->second;
+ if (outMethod)
+ *outMethod = method;
+ return true;
+}
+protocol::DispatcherBase* UberDispatcher::findDispatcher(const String& method) {
size_t dotIndex = StringUtil::find(method, ".");
- if (dotIndex == StringUtil::kNotFound) {
- if (m_fallThroughForNotFound)
- return DispatchResponse::kFallThrough;
- reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kMethodNotFound, "'" + method + "' wasn't found", nullptr);
- return DispatchResponse::kError;
- }
+ if (dotIndex == StringUtil::kNotFound)
+ return nullptr;
String domain = StringUtil::substring(method, 0, dotIndex);
auto it = m_dispatchers.find(domain);
- if (it == m_dispatchers.end()) {
- if (m_fallThroughForNotFound)
- return DispatchResponse::kFallThrough;
- reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kMethodNotFound, "'" + method + "' wasn't found", nullptr);
- return DispatchResponse::kError;
- }
- return it->second->dispatch(callId, method, std::move(messageObject));
+ if (it == m_dispatchers.end())
+ return nullptr;
+ if (!it->second->canDispatch(method))
+ return nullptr;
+ return it->second.get();
}
-bool UberDispatcher::getCommandName(const String& message, String* method, std::unique_ptr<protocol::DictionaryValue>* parsedMessage)
+bool UberDispatcher::canDispatch(const String& method)
{
- std::unique_ptr<protocol::Value> value = StringUtil::parseJSON(message);
- if (!value) {
- reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kParseError, "Message must be a valid JSON");
- return false;
- }
-
- protocol::DictionaryValue* object = DictionaryValue::cast(value.get());
- if (!object) {
- reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kInvalidRequest, "Message must be an object");
- return false;
- }
+ return !!findDispatcher(method);
+}
- if (!object->getString("method", method)) {
- reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kInvalidRequest, "Message must have string 'method' property");
- return false;
+void UberDispatcher::dispatch(int callId, const String& method, std::unique_ptr<Value> parsedMessage, const String& rawMessage)
+{
+ protocol::DispatcherBase* dispatcher = findDispatcher(method);
+ if (!dispatcher) {
+ reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kMethodNotFound, "'" + method + "' wasn't found", nullptr);
+ return;
}
-
- parsedMessage->reset(DictionaryValue::cast(value.release()));
- return true;
+ std::unique_ptr<protocol::DictionaryValue> messageObject = DictionaryValue::cast(std::move(parsedMessage));
+ dispatcher->dispatch(callId, method, rawMessage, std::move(messageObject));
}
UberDispatcher::~UberDispatcher() = default;