Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(269)

Side by Side Diff: third_party/WebKit/Source/platform/inspector_protocol/DispatcherBase_cpp.template

Issue 2282283002: [DevTools] Prepare inspector_protocol build to move. (Closed)
Patch Set: NOTREACHED Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 //#include "DispatcherBase.h"
6 //#include "Parser.h"
7
8 {% for namespace in config.protocol.namespace %}
9 namespace {{namespace}} {
10 {% endfor %}
11
12 // static
13 const char DispatcherBase::kInvalidRequest[] = "Invalid request";
14
15 DispatcherBase::WeakPtr::WeakPtr(DispatcherBase* dispatcher) : m_dispatcher(disp atcher) { }
16
17 DispatcherBase::WeakPtr::~WeakPtr()
18 {
19 if (m_dispatcher)
20 m_dispatcher->m_weakPtrs.erase(this);
21 }
22
23 DispatcherBase::Callback::Callback(std::unique_ptr<DispatcherBase::WeakPtr> back endImpl, int callId)
24 : m_backendImpl(std::move(backendImpl))
25 , m_callId(callId) { }
26
27 DispatcherBase::Callback::~Callback() = default;
28
29 void DispatcherBase::Callback::dispose()
30 {
31 m_backendImpl = nullptr;
32 }
33
34 void DispatcherBase::Callback::sendIfActive(std::unique_ptr<protocol::Dictionary Value> partialMessage, const ErrorString& invocationError)
35 {
36 if (!m_backendImpl || !m_backendImpl->get())
37 return;
38 m_backendImpl->get()->sendResponse(m_callId, invocationError, nullptr, std:: move(partialMessage));
39 m_backendImpl = nullptr;
40 }
41
42 DispatcherBase::DispatcherBase(FrontendChannel* frontendChannel)
43 : m_frontendChannel(frontendChannel) { }
44
45 DispatcherBase::~DispatcherBase()
46 {
47 clearFrontend();
48 }
49
50 // static
51 bool DispatcherBase::getCommandName(const String& message, String* result)
52 {
53 std::unique_ptr<protocol::Value> value = parseJSON(message);
54 if (!value)
55 return false;
56
57 protocol::DictionaryValue* object = DictionaryValue::cast(value.get());
58 if (!object)
59 return false;
60
61 if (!object->getString("method", result))
62 return false;
63
64 return true;
65 }
66
67 void DispatcherBase::sendResponse(int callId, const ErrorString& invocationError , ErrorSupport* errors, std::unique_ptr<protocol::DictionaryValue> result)
68 {
69 if (invocationError.length() || (errors && errors->hasErrors())) {
70 reportProtocolError(callId, ServerError, invocationError, errors);
71 return;
72 }
73
74 std::unique_ptr<protocol::DictionaryValue> responseMessage = DictionaryValue ::create();
75 responseMessage->setInteger("id", callId);
76 responseMessage->setObject("result", std::move(result));
77 if (m_frontendChannel)
78 m_frontendChannel->sendProtocolResponse(callId, responseMessage->toJSONS tring());
79 }
80
81 void DispatcherBase::sendResponse(int callId, const ErrorString& invocationError , std::unique_ptr<protocol::DictionaryValue> result)
82 {
83 sendResponse(callId, invocationError, nullptr, std::move(result));
84 }
85
86 void DispatcherBase::sendResponse(int callId, const ErrorString& invocationError )
87 {
88 sendResponse(callId, invocationError, nullptr, DictionaryValue::create());
89 }
90
91 static void reportProtocolErrorTo(FrontendChannel* frontendChannel, int callId, DispatcherBase::CommonErrorCode code, const String& errorMessage, ErrorSupport* errors)
92 {
93 std::unique_ptr<protocol::DictionaryValue> error = DictionaryValue::create() ;
94 error->setInteger("code", code);
95 error->setString("message", errorMessage);
96 DCHECK(error);
97 if (errors && errors->hasErrors())
98 error->setString("data", errors->errors());
99 std::unique_ptr<protocol::DictionaryValue> message = DictionaryValue::create ();
100 message->setObject("error", std::move(error));
101 message->setInteger("id", callId);
102 frontendChannel->sendProtocolResponse(callId, message->toJSONString());
103 }
104
105 void DispatcherBase::reportProtocolError(int callId, CommonErrorCode code, const String& errorMessage, ErrorSupport* errors)
106 {
107 if (m_frontendChannel)
108 reportProtocolErrorTo(m_frontendChannel, callId, code, errorMessage, err ors);
109 }
110
111 void DispatcherBase::clearFrontend()
112 {
113 m_frontendChannel = nullptr;
114 for (auto& weak : m_weakPtrs)
115 weak->dispose();
116 m_weakPtrs.clear();
117 }
118
119 std::unique_ptr<DispatcherBase::WeakPtr> DispatcherBase::weakPtr()
120 {
121 std::unique_ptr<DispatcherBase::WeakPtr> weak(new DispatcherBase::WeakPtr(th is));
122 m_weakPtrs.insert(weak.get());
123 return weak;
124 }
125
126 UberDispatcher::UberDispatcher(FrontendChannel* frontendChannel)
127 : m_frontendChannel(frontendChannel) { }
128
129 void UberDispatcher::registerBackend(const String& name, std::unique_ptr<protoco l::DispatcherBase> dispatcher)
130 {
131 m_dispatchers[name] = std::move(dispatcher);
132 }
133
134 void UberDispatcher::dispatch(std::unique_ptr<Value> parsedMessage)
135 {
136 if (!parsedMessage)
137 return;
138 std::unique_ptr<protocol::DictionaryValue> messageObject = DictionaryValue:: cast(std::move(parsedMessage));
139 if (!messageObject)
140 return;
141
142 int callId = 0;
143 protocol::Value* callIdValue = messageObject->get("id");
144 bool success = callIdValue->asInteger(&callId);
145 if (!success)
146 return;
147
148 protocol::Value* methodValue = messageObject->get("method");
149 String method;
150 success = methodValue && methodValue->asString(&method);
151 if (!success)
152 return;
153
154 size_t dotIndex = method.find(".");
155 if (dotIndex == StringUtil::kNotFound) {
156 reportProtocolErrorTo(m_frontendChannel, callId, DispatcherBase::MethodN otFound, "'" + method + "' wasn't found", nullptr);
157 return;
158 }
159 String domain = StringUtil::substring(method, 0, dotIndex);
160 auto it = m_dispatchers.find(domain);
161 if (it == m_dispatchers.end()) {
162 reportProtocolErrorTo(m_frontendChannel, callId, DispatcherBase::MethodN otFound, "'" + method + "' wasn't found", nullptr);
163 return;
164 }
165 it->second->dispatch(callId, method, std::move(messageObject));
166 }
167
168 UberDispatcher::~UberDispatcher() = default;
169
170 {% for namespace in config.protocol.namespace %}
171 } // namespace {{namespace}}
172 {% endfor %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698