| Index: content/browser/devtools/devtools_browser_target.cc
|
| diff --git a/content/browser/devtools/devtools_browser_target.cc b/content/browser/devtools/devtools_browser_target.cc
|
| index f3de3e2141ddea349f0e15ab5c645dd4e9c57881..59ee903e6a5ef73907639e4f7b9956d21a7bce62 100644
|
| --- a/content/browser/devtools/devtools_browser_target.cc
|
| +++ b/content/browser/devtools/devtools_browser_target.cc
|
| @@ -14,79 +14,73 @@
|
| #include "base/values.h"
|
| #include "net/server/http_server.h"
|
|
|
| -namespace content {
|
| -
|
| namespace {
|
|
|
| -class NotifierImpl : public DevToolsBrowserTarget::Notifier {
|
| - public:
|
| - NotifierImpl(
|
| - base::MessageLoopProxy* message_loop_proxy,
|
| - net::HttpServer* http_server,
|
| - int connection_id)
|
| - : message_loop_proxy_(message_loop_proxy),
|
| - server_(http_server),
|
| - connection_id_(connection_id) {
|
| - }
|
| -
|
| - virtual ~NotifierImpl() {}
|
| -
|
| - // DevToolsBrowserTarget::Notifier
|
| - virtual void Notify(const std::string& data) OVERRIDE {
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&net::HttpServer::SendOverWebSocket,
|
| - server_,
|
| - connection_id_,
|
| - data));
|
| - }
|
| +base::Value* CreateErrorObject(int error_code, const std::string& message) {
|
| + base::DictionaryValue* error_object = new base::DictionaryValue();
|
| + error_object->SetInteger("code", error_code);
|
| + error_object->SetString("message", message);
|
| + return error_object;
|
| +}
|
|
|
| - private:
|
| - base::MessageLoopProxy* const message_loop_proxy_;
|
| - net::HttpServer* const server_;
|
| - const int connection_id_;
|
| +} // namespace
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(NotifierImpl);
|
| -};
|
| +namespace content {
|
|
|
| -} // namespace
|
| +DevToolsBrowserTarget::DomainHandler::~DomainHandler() {
|
| +}
|
|
|
| -DevToolsBrowserTarget::Handler::Handler()
|
| - : notifier_(NULL) {
|
| +void DevToolsBrowserTarget::DomainHandler::RegisterCommandHandler(
|
| + const std::string& command,
|
| + CommandHandler handler) {
|
| + command_handlers_[command] = handler;
|
| }
|
|
|
| -DevToolsBrowserTarget::Handler::~Handler() {
|
| +DevToolsBrowserTarget::DomainHandler::DomainHandler(const std::string& domain)
|
| + : domain_(domain) {
|
| }
|
|
|
| -void DevToolsBrowserTarget::Handler::set_notifier(
|
| - DevToolsBrowserTarget::Notifier* notifier) {
|
| - notifier_ = notifier;
|
| +base::DictionaryValue* DevToolsBrowserTarget::DomainHandler::HandleCommand(
|
| + const std::string& command,
|
| + const base::DictionaryValue* params,
|
| + base::Value** error_out) {
|
| + CommandHandlers::iterator it = command_handlers_.find(command);
|
| + if (it == command_handlers_.end()) {
|
| + *error_out = CreateErrorObject(-1, "Invalid method");
|
| + return NULL;
|
| + }
|
| + return (it->second).Run(params, error_out);
|
| }
|
|
|
| -DevToolsBrowserTarget::Notifier* DevToolsBrowserTarget::Handler::notifier()
|
| - const {
|
| - return notifier_;
|
| +void DevToolsBrowserTarget::DomainHandler::SendNotification(
|
| + const std::string& method,
|
| + base::DictionaryValue* params,
|
| + base::Value* error) {
|
| + notifier_.Run(method, params, error);
|
| }
|
|
|
| DevToolsBrowserTarget::DevToolsBrowserTarget(
|
| base::MessageLoopProxy* message_loop_proxy,
|
| net::HttpServer* http_server,
|
| int connection_id)
|
| - : notifier_(
|
| - new NotifierImpl(message_loop_proxy, http_server, connection_id)),
|
| - connection_id_(connection_id) {
|
| + : message_loop_proxy_(message_loop_proxy),
|
| + http_server_(http_server),
|
| + connection_id_(connection_id),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
|
| }
|
|
|
| DevToolsBrowserTarget::~DevToolsBrowserTarget() {
|
| - for (HandlersMap::iterator i = handlers_.begin(); i != handlers_.end(); ++i)
|
| + for (DomainHandlerMap::iterator i = handlers_.begin(); i != handlers_.end();
|
| + ++i)
|
| delete i->second;
|
| }
|
|
|
| -void DevToolsBrowserTarget::RegisterHandler(Handler* handler) {
|
| - std::string domain = handler->Domain();
|
| +void DevToolsBrowserTarget::RegisterDomainHandler(DomainHandler* handler) {
|
| + std::string domain = handler->domain();
|
| DCHECK(handlers_.find(domain) == handlers_.end());
|
| handlers_[domain] = handler;
|
| - handler->set_notifier(notifier_.get());
|
| + handler->set_notifier(Bind(&DevToolsBrowserTarget::SendNotification,
|
| + weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| std::string DevToolsBrowserTarget::HandleMessage(const std::string& data) {
|
| @@ -126,19 +120,35 @@ std::string DevToolsBrowserTarget::HandleMessage(const std::string& data) {
|
| request_id, CreateErrorObject(-1, "Domain unsupported"));
|
|
|
| base::Value* error_object = NULL;
|
| - base::Value* domain_result = handlers_[domain]->OnProtocolCommand(
|
| + base::DictionaryValue* domain_result = handlers_[domain]->HandleCommand(
|
| method, params, &error_object);
|
|
|
| if (error_object)
|
| return SerializeErrorResponse(request_id, error_object);
|
|
|
| - if (!domain_result)
|
| - return SerializeErrorResponse(
|
| - request_id, CreateErrorObject(-1, "Invalid call"));
|
| + return SerializeResponse(request_id, domain_result);
|
| +}
|
|
|
| - DictionaryValue* response = new DictionaryValue();
|
| - response->Set("result", domain_result);
|
| - return SerializeResponse(request_id, response);
|
| +void DevToolsBrowserTarget::SendNotification(const std::string& method,
|
| + DictionaryValue* params,
|
| + Value* error) {
|
| + scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue());
|
| + response->SetString("method", method);
|
| + if (error)
|
| + response->Set("error", error);
|
| + else if (params)
|
| + response->Set("params", params);
|
| +
|
| + // Serialize response.
|
| + std::string json_response;
|
| + base::JSONWriter::Write(response.get(), &json_response);
|
| +
|
| + message_loop_proxy_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&net::HttpServer::SendOverWebSocket,
|
| + http_server_,
|
| + connection_id_,
|
| + json_response));
|
| }
|
|
|
| std::string DevToolsBrowserTarget::SerializeErrorResponse(
|
| @@ -152,23 +162,16 @@ std::string DevToolsBrowserTarget::SerializeErrorResponse(
|
| return json_response;
|
| }
|
|
|
| -base::Value* DevToolsBrowserTarget::CreateErrorObject(
|
| - int error_code, const std::string& message) {
|
| - base::DictionaryValue* error_object = new base::DictionaryValue();
|
| - error_object->SetInteger("code", error_code);
|
| - error_object->SetString("message", message);
|
| - return error_object;
|
| -}
|
| -
|
| std::string DevToolsBrowserTarget::SerializeResponse(
|
| - int request_id, base::Value* response) {
|
| - scoped_ptr<base::DictionaryValue> ret(new base::DictionaryValue());
|
| - ret->SetInteger("id", request_id);
|
| - ret->Set("response", response);
|
| + int request_id, base::DictionaryValue* result) {
|
| + scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue());
|
| + response->SetInteger("id", request_id);
|
| + if (result)
|
| + response->Set("result", result);
|
|
|
| // Serialize response.
|
| std::string json_response;
|
| - base::JSONWriter::Write(ret.get(), &json_response);
|
| + base::JSONWriter::Write(response.get(), &json_response);
|
| return json_response;
|
| }
|
|
|
|
|