blob: 7ee06aefaa4be08e5f14690cff13f0dd289c1e6b [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sky/shell/dart/dart_library_provider_network.h"
#include "base/bind.h"
#include "base/strings/string_util.h"
#include "sky/engine/tonic/dart_converter.h"
#include "url/gurl.h"
namespace sky {
namespace shell {
namespace {
mojo::URLLoaderPtr Fetch(mojo::NetworkService* network_service,
const std::string& url,
base::Callback<void(mojo::URLResponsePtr)> callback) {
mojo::URLLoaderPtr loader;
network_service->CreateURLLoader(GetProxy(&loader));
mojo::URLRequestPtr request = mojo::URLRequest::New();
request->url = url;
request->auto_follow_redirects = true;
loader->Start(request.Pass(), callback);
return loader.Pass();
}
} // namespace
class DartLibraryProviderNetwork::Job {
public:
Job(DartLibraryProviderNetwork* provider,
const std::string& name,
blink::DataPipeConsumerCallback callback)
: provider_(provider), callback_(callback), weak_factory_(this) {
url_loader_ =
Fetch(provider_->network_service(), name,
base::Bind(&Job::OnReceivedResponse, weak_factory_.GetWeakPtr()));
}
private:
void OnReceivedResponse(mojo::URLResponsePtr response) {
mojo::ScopedDataPipeConsumerHandle data;
if (response->status_code == 200)
data = response->body.Pass();
callback_.Run(data.Pass());
provider_->jobs_.remove(this);
// We're deleted now.
}
DartLibraryProviderNetwork* provider_;
blink::DataPipeConsumerCallback callback_;
mojo::URLLoaderPtr url_loader_;
base::WeakPtrFactory<Job> weak_factory_;
};
DartLibraryProviderNetwork::DartLibraryProviderNetwork(
mojo::NetworkService* network_service)
: network_service_(network_service) {
}
DartLibraryProviderNetwork::~DartLibraryProviderNetwork() {
}
void DartLibraryProviderNetwork::GetLibraryAsStream(
const std::string& name,
blink::DataPipeConsumerCallback callback) {
jobs_.add(adoptPtr(new Job(this, name, callback)));
}
Dart_Handle DartLibraryProviderNetwork::CanonicalizeURL(Dart_Handle library,
Dart_Handle url) {
std::string string = blink::StdStringFromDart(url);
if (base::StartsWithASCII(string, "dart:", true))
return url;
// TODO(abarth): The package root should be configurable.
if (base::StartsWithASCII(string, "package:", true))
base::ReplaceFirstSubstringAfterOffset(&string, 0, "package:", "/packages/");
GURL library_url(blink::StdStringFromDart(Dart_LibraryUrl(library)));
GURL resolved_url = library_url.Resolve(string);
return blink::StdStringToDart(resolved_url.spec());
}
} // namespace shell
} // namespace sky