提交 48d4d99f 编写于 作者: J John McCutchan

Merge pull request #2574 from johnmccutchan/fix_canonicalization

Fix uri canonicalization in DartLibraryProviderFiles
上级 4f39fd21
...@@ -15,9 +15,31 @@ namespace sky { ...@@ -15,9 +15,31 @@ namespace sky {
namespace shell { namespace shell {
namespace { namespace {
void CopyComplete(base::FilePath file, bool success) { void CopyComplete(base::FilePath file, std::string uri, bool success) {
if (!success) if (!success)
LOG(FATAL) << "Failed to load " << file.AsUTF8Unsafe(); LOG(FATAL) << "Failed to load "
<< file.AsUTF8Unsafe()
<< " (" << uri << ")";
}
// Extract the scheme prefix ('package:' or 'file:' from )
static std::string ExtractSchemePrefix(std::string url) {
if (base::StartsWithASCII(url, "package:", true)) {
return "package:";
} else if (base::StartsWithASCII(url, "file:", true)) {
return "file:";
}
return "";
}
// Extract the path from a package: or file: url.
static std::string ExtractPath(std::string url) {
if (base::StartsWithASCII(url, "package:", true)) {
base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", "");
} else if (base::StartsWithASCII(url, "file:", true)) {
base::ReplaceFirstSubstringAfterOffset(&url, 0, "file:", "");
}
return url;
} }
base::FilePath SimplifyPath(const base::FilePath& path) { base::FilePath SimplifyPath(const base::FilePath& path) {
...@@ -66,15 +88,47 @@ void DartLibraryProviderFiles::GetLibraryAsStream( ...@@ -66,15 +88,47 @@ void DartLibraryProviderFiles::GetLibraryAsStream(
blink::DataPipeConsumerCallback callback) { blink::DataPipeConsumerCallback callback) {
mojo::DataPipe pipe; mojo::DataPipe pipe;
callback.Run(pipe.consumer_handle.Pass()); callback.Run(pipe.consumer_handle.Pass());
std::string path = GetFilePathForURL(name);
base::FilePath source(name); base::FilePath source(path);
scoped_refptr<base::TaskRunner> runner = scoped_refptr<base::TaskRunner> runner =
base::WorkerPool::GetTaskRunner(true); base::WorkerPool::GetTaskRunner(true);
mojo::common::CopyFromFile(source, pipe.producer_handle.Pass(), 0, mojo::common::CopyFromFile(source, pipe.producer_handle.Pass(), 0,
runner.get(), base::Bind(&CopyComplete, source)); runner.get(),
base::Bind(&CopyComplete, source, name));
}
Dart_Handle DartLibraryProviderFiles::CanonicalizeURL(Dart_Handle library,
Dart_Handle url) {
std::string string = blink::StdStringFromDart(url);
if (base::StartsWithASCII(string, "dart:", true))
return url;
if (base::StartsWithASCII(string, "package:", true))
return url;
if (base::StartsWithASCII(string, "file:", true)) {
base::ReplaceFirstSubstringAfterOffset(&string, 0, "file:", "");
return blink::StdStringToDart(string);;
}
std::string library_url = blink::StdStringFromDart(Dart_LibraryUrl(library));
std::string prefix = ExtractSchemePrefix(library_url);
std::string path = ExtractPath(library_url);
base::FilePath base_path(path);
base::FilePath resolved_path = base_path.DirName().Append(string);
base::FilePath normalized_path = SimplifyPath(resolved_path);
return blink::StdStringToDart(prefix + normalized_path.AsUTF8Unsafe());
}
std::string DartLibraryProviderFiles::GetFilePathForURL(std::string url) {
if (base::StartsWithASCII(url, "package:", true))
return GetFilePathForPackageURL(url);
if (base::StartsWithASCII(url, "file:", true))
return GetFilePathForFileURL(url);
return url;
} }
std::string DartLibraryProviderFiles::CanonicalizePackageURL(std::string url) { std::string DartLibraryProviderFiles::GetFilePathForPackageURL(
std::string url) {
DCHECK(base::StartsWithASCII(url, "package:", true)); DCHECK(base::StartsWithASCII(url, "package:", true));
base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", ""); base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", "");
size_t slash = url.find('/'); size_t slash = url.find('/');
...@@ -93,26 +147,11 @@ std::string DartLibraryProviderFiles::CanonicalizePackageURL(std::string url) { ...@@ -93,26 +147,11 @@ std::string DartLibraryProviderFiles::CanonicalizePackageURL(std::string url) {
return SimplifyPath(path).AsUTF8Unsafe(); return SimplifyPath(path).AsUTF8Unsafe();
} }
std::string DartLibraryProviderFiles::CanonicalizeFileURL(std::string url) { std::string DartLibraryProviderFiles::GetFilePathForFileURL(std::string url) {
DCHECK(base::StartsWithASCII(url, "file:", true)); DCHECK(base::StartsWithASCII(url, "file://", true));
base::ReplaceFirstSubstringAfterOffset(&url, 0, "file:", ""); base::ReplaceFirstSubstringAfterOffset(&url, 0, "file://", "");
return url; return url;
} }
Dart_Handle DartLibraryProviderFiles::CanonicalizeURL(Dart_Handle library,
Dart_Handle url) {
std::string string = blink::StdStringFromDart(url);
if (base::StartsWithASCII(string, "dart:", true))
return url;
if (base::StartsWithASCII(string, "package:", true))
return blink::StdStringToDart(CanonicalizePackageURL(string));
if (base::StartsWithASCII(string, "file:", true))
return blink::StdStringToDart(CanonicalizeFileURL(string));
base::FilePath base_path(blink::StdStringFromDart(Dart_LibraryUrl(library)));
base::FilePath resolved_path = base_path.DirName().Append(string);
base::FilePath normalized_path = SimplifyPath(resolved_path);
return blink::StdStringToDart(normalized_path.AsUTF8Unsafe());
}
} // namespace shell } // namespace shell
} // namespace sky } // namespace sky
...@@ -26,8 +26,9 @@ class DartLibraryProviderFiles : public blink::DartLibraryProvider { ...@@ -26,8 +26,9 @@ class DartLibraryProviderFiles : public blink::DartLibraryProvider {
Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url) override; Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url) override;
private: private:
std::string CanonicalizePackageURL(std::string url); std::string GetFilePathForURL(std::string url);
std::string CanonicalizeFileURL(std::string url); std::string GetFilePathForPackageURL(std::string url);
std::string GetFilePathForFileURL(std::string url);
base::FilePath packages_; base::FilePath packages_;
tonic::PackagesMap packages_map_; tonic::PackagesMap packages_map_;
......
...@@ -18,6 +18,26 @@ ...@@ -18,6 +18,26 @@
namespace { namespace {
// Extract the scheme prefix ('package:' or 'file:' from )
static std::string ExtractSchemePrefix(std::string url) {
if (base::StartsWithASCII(url, "package:", true)) {
return "package:";
} else if (base::StartsWithASCII(url, "file:", true)) {
return "file:";
}
return "";
}
// Extract the path from a package: or file: url.
static std::string ExtractPath(std::string url) {
if (base::StartsWithASCII(url, "package:", true)) {
base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", "");
} else if (base::StartsWithASCII(url, "file:", true)) {
base::ReplaceFirstSubstringAfterOffset(&url, 0, "file:", "");
}
return url;
}
base::FilePath SimplifyPath(const base::FilePath& path) { base::FilePath SimplifyPath(const base::FilePath& path) {
std::vector<base::FilePath::StringType> components; std::vector<base::FilePath::StringType> components;
path.GetComponents(&components); path.GetComponents(&components);
...@@ -43,8 +63,10 @@ class Loader { ...@@ -43,8 +63,10 @@ class Loader {
const std::set<std::string>& dependencies() const { return dependencies_; } const std::set<std::string>& dependencies() const { return dependencies_; }
std::string CanonicalizePackageURL(std::string url);
Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url); Dart_Handle CanonicalizeURL(Dart_Handle library, Dart_Handle url);
std::string GetFilePathForURL(std::string url);
std::string GetFilePathForPackageURL(std::string url);
std::string GetFilePathForFileURL(std::string url);
std::string Fetch(const std::string& url); std::string Fetch(const std::string& url);
Dart_Handle Import(Dart_Handle url); Dart_Handle Import(Dart_Handle url);
Dart_Handle Source(Dart_Handle library, Dart_Handle url); Dart_Handle Source(Dart_Handle library, Dart_Handle url);
...@@ -83,10 +105,39 @@ void Loader::LoadPackagesMap(const base::FilePath& packages) { ...@@ -83,10 +105,39 @@ void Loader::LoadPackagesMap(const base::FilePath& packages) {
} }
} }
std::string Loader::CanonicalizePackageURL(std::string url) { Dart_Handle Loader::CanonicalizeURL(Dart_Handle library, Dart_Handle url) {
std::string string = StringFromDart(url);
if (base::StartsWithASCII(string, "dart:", true))
return url;
if (base::StartsWithASCII(string, "package:", true))
return url;
if (base::StartsWithASCII(string, "file:", true)) {
base::ReplaceFirstSubstringAfterOffset(&string, 0, "file:", "");
return StringToDart(string);;
}
std::string library_url = StringFromDart(Dart_LibraryUrl(library));
std::string prefix = ExtractSchemePrefix(library_url);
std::string path = ExtractPath(library_url);
base::FilePath base_path(path);
base::FilePath resolved_path = base_path.DirName().Append(string);
base::FilePath normalized_path = SimplifyPath(resolved_path);
return StringToDart(prefix + normalized_path.AsUTF8Unsafe());
}
std::string Loader::GetFilePathForURL(std::string url) {
if (base::StartsWithASCII(url, "package:", true))
return GetFilePathForPackageURL(url);
if (base::StartsWithASCII(url, "file:", true))
return GetFilePathForFileURL(url);
return url;
}
std::string Loader::GetFilePathForPackageURL(
std::string url) {
DCHECK(base::StartsWithASCII(url, "package:", true)); DCHECK(base::StartsWithASCII(url, "package:", true));
base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", ""); base::ReplaceFirstSubstringAfterOffset(&url, 0, "package:", "");
if (packages_map_) {
size_t slash = url.find('/'); size_t slash = url.find('/');
if (slash == std::string::npos) if (slash == std::string::npos)
return std::string(); return std::string();
...@@ -98,24 +149,15 @@ std::string Loader::CanonicalizePackageURL(std::string url) { ...@@ -98,24 +149,15 @@ std::string Loader::CanonicalizePackageURL(std::string url) {
if (base::StartsWithASCII(package_path, "file://", true)) { if (base::StartsWithASCII(package_path, "file://", true)) {
base::ReplaceFirstSubstringAfterOffset(&package_path, 0, "file://", ""); base::ReplaceFirstSubstringAfterOffset(&package_path, 0, "file://", "");
return package_path + library_path; return package_path + library_path;
} else { }
auto path = packages_.DirName().Append(package_path).Append(library_path); auto path = packages_.DirName().Append(package_path).Append(library_path);
return SimplifyPath(path).AsUTF8Unsafe(); return SimplifyPath(path).AsUTF8Unsafe();
}
}
return package_root_.Append(url).AsUTF8Unsafe();
} }
Dart_Handle Loader::CanonicalizeURL(Dart_Handle library, Dart_Handle url) { std::string Loader::GetFilePathForFileURL(std::string url) {
std::string string = StringFromDart(url); DCHECK(base::StartsWithASCII(url, "file://", true));
if (base::StartsWithASCII(string, "dart:", true)) base::ReplaceFirstSubstringAfterOffset(&url, 0, "file://", "");
return url; return url;
if (base::StartsWithASCII(string, "package:", true))
return StringToDart(CanonicalizePackageURL(string));
base::FilePath base_path(StringFromDart(Dart_LibraryUrl(library)));
base::FilePath resolved_path = base_path.DirName().Append(string);
base::FilePath normalized_path = SimplifyPath(resolved_path);
return StringToDart(normalized_path.AsUTF8Unsafe());
} }
std::string Loader::Fetch(const std::string& url) { std::string Loader::Fetch(const std::string& url) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册