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

Unified Diff: sky/tools/debugger/prompt/prompt.cc

Issue 840973002: Make skydb just a ctl-style helper (e.g. apachectl) (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: sky/tools/debugger/prompt/prompt.cc
diff --git a/sky/tools/debugger/prompt/prompt.cc b/sky/tools/debugger/prompt/prompt.cc
index fc137b533770bf6cd3d29bf049908f54962ecd3c..4a69c0c192234ad1193bd40c8e701a021562ea9a 100644
--- a/sky/tools/debugger/prompt/prompt.cc
+++ b/sky/tools/debugger/prompt/prompt.cc
@@ -8,29 +8,17 @@
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
+#include "net/server/http_server.h"
+#include "net/server/http_server_request_info.h"
+#include "net/socket/tcp_server_socket.h"
#include "services/tracing/tracing.mojom.h"
#include "sky/tools/debugger/debugger.mojom.h"
#include <iostream>
namespace sky {
namespace debugger {
-namespace {
-
-std::string GetCommand() {
- std::cout << "(skydb) ";
- std::cout.flush();
-
- std::string command;
- std::getline(std::cin, command);
- // Any errors (including eof) just quit the debugger:
- if (!std::cin.good())
- command = 'q';
- return command;
-}
-
-}
-class Prompt : public mojo::ApplicationDelegate {
+class Prompt : public mojo::ApplicationDelegate, public net::HttpServer::Delegate {
public:
Prompt()
: is_tracing_(false),
@@ -49,6 +37,12 @@ class Prompt : public mojo::ApplicationDelegate {
url_ = "https://raw.githubusercontent.com/domokit/mojo/master/sky/"
"examples/home.sky";
}
+ scoped_ptr<net::ServerSocket> server_socket(
+ new net::TCPServerSocket(NULL, net::NetLog::Source()));
+ // FIXME: This port needs to be configurable, as-is we can only run
+ // one copy of mojo_shell with sky at a time!
+ server_socket->ListenWithAddressAndPort("0.0.0.0", 7777, 1);
+ web_server_.reset(new net::HttpServer(server_socket.Pass(), this));
}
virtual bool ConfigureIncomingConnection(
@@ -56,93 +50,86 @@ class Prompt : public mojo::ApplicationDelegate {
connection->ConnectToService(&debugger_);
std::cout << "Loading " << url_ << std::endl;
Reload();
-#if !defined(OS_ANDROID)
- // FIXME: To support device-centric development we need to re-write
- // prompt.cc to just be a server and have all the command handling move
- // to python (skydb). prompt.cc would just run until told to quit.
- // If we don't comment this out then prompt.cc just quits when run headless
- // as it immediately recieves EOF which it treats as quit.
- ScheduleWaitForInput();
-#endif
return true;
}
- bool ExecuteCommand(const std::string& command) {
- if (command == "help" || command == "h") {
- PrintHelp();
- return true;
- }
- if (command == "trace") {
- ToggleTracing();
- return true;
- }
- if (command == "reload" || command == "r") {
- Reload();
- return true;
- }
- if (command == "inspect") {
- Inspect();
- return true;
- }
- if (command == "quit" || command == "q") {
- Quit();
- return true;
- }
- if (command.size() == 1) {
- std::cout << "Unknown command: " << command << std::endl;
- return true;
- }
- return false;
+ // net::HttpServer::Delegate
+ void OnConnect(int connection_id) override {
}
- void WaitForInput() {
- std::string command = GetCommand();
+ void OnClose(int connection_id) override {
+ }
- if (!ExecuteCommand(command)) {
- if (command.size() > 0) {
- url_ = command;
- Reload();
- }
+ void OnHttpRequest(
+ int connection_id, const net::HttpServerRequestInfo& info) override {
+
+ // FIXME: We should use use a fancier lookup system more like what
+ // services/http_server/http_server.cc does with AddHandler.
+ if (info.path == "/trace")
+ ToggleTracing(connection_id);
+ else if (info.path == "/reload")
+ Load(connection_id, url_);
+ else if (info.path == "/inspect")
+ Inspect(connection_id);
+ else if (info.path == "/quit")
+ Quit(connection_id);
+ else if (info.path == "/load")
+ Load(connection_id, info.data);
+ else {
+ Help(info.path, connection_id);
}
+ }
+
+ void OnWebSocketRequest(
+ int connection_id, const net::HttpServerRequestInfo& info) override {
+ web_server_->Send500(connection_id, "http only");
+ }
+
+ void OnWebSocketMessage(
+ int connection_id, const std::string& data) override {
+ web_server_->Send500(connection_id, "http only");
+ }
- ScheduleWaitForInput();
+ void Respond(int connection_id, std::string response) {
+ web_server_->Send200(connection_id, response, "text/plain");
}
- void ScheduleWaitForInput() {
- base::MessageLoop::current()->PostTask(FROM_HERE,
- base::Bind(&Prompt::WaitForInput, weak_ptr_factory_.GetWeakPtr()));
+ void Help(std::string path, int connection_id) {
+ std::string help = "Sky Debugger\n"
+ "Supported URLs:\n"
+ "/toggle_tracing -- Start/stop tracing\n"
+ "/reload -- Reload the current page\n"
+ "/inspect -- Start inspector server for current page\n"
+ "/quit -- Quit\n"
+ "/load -- Load a new URL, url in POST body.\n";
+ if (path != "/")
+ help = "Unknown path: " + path + "\n\n" + help;
+ Respond(connection_id, help);
}
- void PrintHelp() {
- std::cout
- << "Sky Debugger" << std::endl
- << "============" << std::endl
- << "Type a URL to load in the debugger, enter to reload." << std::endl
- << "Commands: help -- Help" << std::endl
- << " trace -- Capture a trace" << std::endl
- << " reload -- Reload the current page" << std::endl
- << " inspect -- Inspect the current page" << std::endl
- << " quit -- Quit" << std::endl;
+ void Load(int connection_id, std::string url) {
+ url_ = url;
+ Reload();
+ Respond(connection_id, "OK\n");
}
void Reload() {
debugger_->NavigateToURL(url_);
}
- void Inspect() {
+ void Inspect(int connection_id) {
debugger_->InjectInspector();
- std::cout
- << "Open the following URL in Chrome:" << std::endl
- << "chrome-devtools://devtools/bundled/devtools.html?ws=localhost:9898"
- << std::endl;
+ Respond(connection_id,
+ "Open the following URL in Chrome:\n"
+ "chrome-devtools://devtools/bundled/devtools.html?ws=localhost:9898\n");
}
- void Quit() {
+ void Quit(int connection_id) {
std::cout << "quitting" << std::endl;
debugger_->Shutdown();
}
- void ToggleTracing() {
+ void ToggleTracing(int connection_id) {
if (is_tracing_) {
std::cout << "Stopping trace (writing to sky_viewer.trace)" << std::endl;
tracing_->StopAndFlush();
@@ -151,6 +138,7 @@ class Prompt : public mojo::ApplicationDelegate {
tracing_->Start(mojo::String("sky_viewer"), mojo::String("*"));
}
is_tracing_ = !is_tracing_;
+ Respond(connection_id, "OK\n");
}
bool is_tracing_;
@@ -158,6 +146,7 @@ class Prompt : public mojo::ApplicationDelegate {
tracing::TraceCoordinatorPtr tracing_;
std::string url_;
base::WeakPtrFactory<Prompt> weak_ptr_factory_;
+ scoped_ptr<net::HttpServer> web_server_;
DISALLOW_COPY_AND_ASSIGN(Prompt);
};
@@ -167,5 +156,6 @@ class Prompt : public mojo::ApplicationDelegate {
MojoResult MojoMain(MojoHandle shell_handle) {
mojo::ApplicationRunnerChromium runner(new sky::debugger::Prompt);
+ runner.set_message_loop_type(base::MessageLoop::TYPE_IO);
return runner.Run(shell_handle);
}
« no previous file with comments | « sky/tools/debugger/prompt/BUILD.gn ('k') | sky/tools/skydb » ('j') | sky/tools/skydb » ('J')

Powered by Google App Engine
This is Rietveld 408576698