1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/resource_provider/file_utils.h"
7 #include "base/files/file_path.h"
8 #include "base/path_service.h"
9 #include "base/strings/string_split.h"
10 #include "base/strings/string_util.h"
13 namespace resource_provider
{
16 bool IsPathNameValid(const std::string
& name
) {
17 if (name
.empty() || name
== "." || name
== "..")
21 if (!base::IsAsciiAlpha(c
) && !base::IsAsciiDigit(c
) &&
30 base::FilePath
GetPathForApplicationUrl(const GURL
& application_url
) {
31 if (application_url
.scheme() != "mojo")
32 return base::FilePath();
34 std::string path
= application_url
.path();
35 base::TrimString(path
, "/", &path
);
37 if (!IsPathNameValid(path
))
38 return base::FilePath();
40 base::FilePath base_path
;
41 #if defined(OS_ANDROID)
42 PathService::Get(base::DIR_ANDROID_APP_DATA
, &base_path
);
43 // |base_path| on android has an additional path, need to go up a level to get
44 // at other apps resources.
45 base_path
= base_path
.DirName();
46 base_path
= base_path
.AppendASCII("app_cached_apps");
48 PathService::Get(base::DIR_EXE
, &base_path
);
50 return base_path
.AppendASCII(path
).AppendASCII("resources");
53 base::FilePath
GetPathForResourceNamed(const base::FilePath
& app_path
,
54 const std::string
& resource_path
) {
55 CHECK(!app_path
.empty());
57 if (resource_path
.empty() || resource_path
[0] == '/' ||
58 resource_path
[resource_path
.size() - 1] == '/' ||
59 resource_path
.find("//") != std::string::npos
)
60 return base::FilePath();
62 std::vector
<std::string
> path_components
= base::SplitString(
63 resource_path
, "/", base::KEEP_WHITESPACE
, base::SPLIT_WANT_NONEMPTY
);
64 if (path_components
.empty())
65 return base::FilePath();
67 base::FilePath
result(app_path
);
68 for (const auto& path_component
: path_components
) {
69 if (!IsPathNameValid(path_component
))
70 return base::FilePath();
71 result
= result
.AppendASCII(path_component
);
76 } // namespace resource_provider