diff --git a/sdk/example/stocks/lib/stock_data.dart b/sdk/example/stocks/lib/stock_data.dart index 57d73ecd48b..5526a9c9cd4 100644 --- a/sdk/example/stocks/lib/stock_data.dart +++ b/sdk/example/stocks/lib/stock_data.dart @@ -59,7 +59,7 @@ String _urlToFetch(int chunk) { } class StockDataFetcher { - int _currentChunk = 0; + int _nextChunk = 0; final StockDataCallback callback; StockDataFetcher(this.callback) { @@ -67,13 +67,17 @@ class StockDataFetcher { } void _fetchNextChunk() { - fetchBody(_urlToFetch(_currentChunk++)).then((Response response) { + fetchBody(_urlToFetch(_nextChunk++)).then((Response response) { String json = response.bodyAsString(); + if (json == null) { + print("Failed to load stock data chunk ${_nextChunk - 1}"); + return; + } JsonDecoder decoder = new JsonDecoder(); callback(new StockData(decoder.convert(json))); - if (_currentChunk < _kChunkCount) + if (_nextChunk < _kChunkCount) _fetchNextChunk(); }); } diff --git a/sdk/lib/mojo/net/fetch.dart b/sdk/lib/mojo/net/fetch.dart index 834112c01e6..dd3834e66cd 100644 --- a/sdk/lib/mojo/net/fetch.dart +++ b/sdk/lib/mojo/net/fetch.dart @@ -19,22 +19,28 @@ class Response { Response(this.body); String bodyAsString() { + if (body == null) + return null; return new String.fromCharCodes(new Uint8List.view(body.buffer)); } } Future fetch(UrlRequest request) async { - NetworkServiceProxy net = new NetworkServiceProxy.unbound(); - shell.requestService("mojo:authenticated_network_service", net); + try { + NetworkServiceProxy net = new NetworkServiceProxy.unbound(); + shell.requestService("mojo:authenticated_network_service", net); - UrlLoaderProxy loader = new UrlLoaderProxy.unbound(); - net.ptr.createUrlLoader(loader); + UrlLoaderProxy loader = new UrlLoaderProxy.unbound(); + net.ptr.createUrlLoader(loader); - UrlResponse response = (await loader.ptr.start(request)).response; + UrlResponse response = (await loader.ptr.start(request)).response; - loader.close(); - net.close(); - return response; + loader.close(); + net.close(); + return response; + } catch (e) { + return new UrlResponse()..statusCode = 500; + } } Future fetchUrl(String relativeUrl) async { diff --git a/shell/linux/main.cc b/shell/linux/main.cc index 0ed81d3fc4f..06759977a73 100644 --- a/shell/linux/main.cc +++ b/shell/linux/main.cc @@ -27,6 +27,7 @@ void Usage() { std::cerr << "Usage: sky_shell" << " --" << switches::kNonInteractive << " --" << switches::kPackageRoot << "=PACKAGE_ROOT" + << " --" << switches::kSnapshot << "=SNAPSHOT" << " [ MAIN_DART ]" << std::endl; } @@ -42,19 +43,27 @@ void Init() { std::string package_root = command_line.GetSwitchValueASCII(switches::kPackageRoot); - - std::string main; - auto args = command_line.GetArgs(); - if (!args.empty()) - main = args[0]; - runner.set_package_root(package_root); - runner.Start(main); + + scoped_ptr single_test; + if (command_line.HasSwitch(switches::kSnapshot)) { + single_test.reset(new TestRunner::SingleTest); + single_test->path = command_line.GetSwitchValueASCII(switches::kSnapshot); + single_test->is_snapshot = true; + } else { + auto args = command_line.GetArgs(); + if (!args.empty()) { + single_test.reset(new TestRunner::SingleTest); + single_test->path = args[0]; + } + } + + runner.Start(single_test.Pass()); } } // namespace -} // namespace shell -} // namespace sky +} // namespace shell +} // namespace sky int main(int argc, const char* argv[]) { base::AtExitManager exit_manager; @@ -63,7 +72,8 @@ int main(int argc, const char* argv[]) { base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); if (command_line.HasSwitch(sky::shell::switches::kHelp) || - !command_line.HasSwitch(sky::shell::switches::kPackageRoot)) { + (!command_line.HasSwitch(sky::shell::switches::kPackageRoot) && + !command_line.HasSwitch(sky::shell::switches::kSnapshot))) { sky::shell::Usage(); return 0; } diff --git a/shell/testing/test_runner.cc b/shell/testing/test_runner.cc index ff75c706762..c4bf2dca7e9 100644 --- a/shell/testing/test_runner.cc +++ b/shell/testing/test_runner.cc @@ -21,6 +21,7 @@ struct UrlData { std::string url; std::string expected_pixel_hash; bool enable_pixel_dumping = false; + bool is_snapshot = false; }; void WaitForURL(UrlData& data) { @@ -76,8 +77,8 @@ TestRunner& TestRunner::Shared() { return *g_test_runner; } -void TestRunner::Start(const std::string& single_test_url) { - single_test_url_ = single_test_url; +void TestRunner::Start(scoped_ptr single_test) { + single_test_ = single_test.Pass(); PrintAndFlush("#READY\n"); ScheduleRun(); } @@ -92,7 +93,7 @@ void TestRunner::OnTestComplete(const mojo::String& test_result, std::cerr.flush(); bindings_.CloseAllBindings(); - if (single_test_url_.length()) + if (single_test_) exit(0); ScheduleRun(); } @@ -113,8 +114,9 @@ void TestRunner::ScheduleRun() { void TestRunner::Run() { UrlData data; - if (single_test_url_.length()) { - data.url = single_test_url_; + if (single_test_) { + data.url = single_test_->path; + data.is_snapshot = single_test_->is_snapshot; } else { WaitForURL(data); } @@ -124,7 +126,11 @@ void TestRunner::Run() { if (StartsWithASCII(data.url, kFileUrlPrefix, true)) ReplaceFirstSubstringAfterOffset(&data.url, 0, kFileUrlPrefix, ""); - sky_engine_->RunFromFile(data.url, package_root_); + + if (data.is_snapshot) + sky_engine_->RunFromSnapshot(data.url); + else + sky_engine_->RunFromFile(data.url, package_root_); } } // namespace shell diff --git a/shell/testing/test_runner.h b/shell/testing/test_runner.h index 7b326abd554..82d34ed46fc 100644 --- a/shell/testing/test_runner.h +++ b/shell/testing/test_runner.h @@ -27,7 +27,12 @@ class TestRunner : public mojo::InterfaceFactory, package_root_ = package_root; } - void Start(const std::string& single_test_url); + struct SingleTest { + std::string path; + bool is_snapshot = false; + }; + + void Start(scoped_ptr single_test); private: // mojo::InterfaceFactory implementation: @@ -48,7 +53,7 @@ class TestRunner : public mojo::InterfaceFactory, scoped_ptr shell_view_; SkyEnginePtr sky_engine_; - std::string single_test_url_; + scoped_ptr single_test_; mojo::WeakBindingSet bindings_; base::WeakPtrFactory weak_ptr_factory_;