blob: 6ff1e4e7153958bee9b07f22630ca1af9b81685e [file] [log] [blame]
[email protected]bebe1d02012-08-02 20:17:091// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]5ba5dab2010-11-18 02:31:042// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/convert_web_app.h"
6
avia2f4804a2015-12-24 23:11:137#include <stddef.h>
8
Jinho Bangb5216cec2018-01-17 19:43:119#include <memory>
[email protected]5ba5dab2010-11-18 02:31:0410#include <string>
11#include <vector>
12
[email protected]57999812013-02-24 05:40:5213#include "base/files/file_path.h"
thestig18dfb7a52014-08-26 10:44:0414#include "base/files/file_util.h"
[email protected]ea1a3f62012-11-16 20:34:2315#include "base/files/scoped_temp_dir.h"
[email protected]5ba5dab2010-11-18 02:31:0416#include "base/path_service.h"
Avi Drissman5f0fb8c2018-12-25 23:20:4917#include "base/stl_util.h"
[email protected]00e7bef2013-06-10 20:35:1718#include "base/strings/stringprintf.h"
[email protected]112158af2013-06-07 23:46:1819#include "base/strings/utf_string_conversions.h"
[email protected]41a17c52013-06-28 00:27:5320#include "base/time/time.h"
[email protected]5ba5dab2010-11-18 02:31:0421#include "base/version.h"
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:1522#include "chrome/browser/extensions/bookmark_app_helper.h"
[email protected]5ba5dab2010-11-18 02:31:0423#include "chrome/common/chrome_paths.h"
[email protected]6b414c232013-06-05 07:53:3424#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
[email protected]93f50462013-05-10 04:40:4025#include "chrome/common/web_application_info.h"
[email protected]e4452d32013-11-15 23:07:4126#include "extensions/common/extension.h"
[email protected]4b7908842014-04-07 23:50:2227#include "extensions/common/extension_icon_set.h"
[email protected]993da5e2013-03-23 21:25:1628#include "extensions/common/extension_resource.h"
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:1529#include "extensions/common/manifest_constants.h"
[email protected]0db486f2014-04-09 19:32:2230#include "extensions/common/manifest_handlers/icons_handler.h"
[email protected]5a55f3f2013-10-29 01:08:2931#include "extensions/common/permissions/permission_set.h"
[email protected]076ebeda2014-06-06 21:47:2632#include "extensions/common/permissions/permissions_data.h"
[email protected]885c0e92012-11-13 20:27:4233#include "extensions/common/url_pattern.h"
[email protected]5ba5dab2010-11-18 02:31:0434#include "testing/gtest/include/gtest/gtest.h"
[email protected]08397d52011-02-05 01:53:3835#include "ui/gfx/codec/png_codec.h"
[email protected]a6483d22013-07-03 22:11:0036#include "url/gurl.h"
[email protected]5ba5dab2010-11-18 02:31:0437
[email protected]b1912d592012-08-17 22:29:3838namespace extensions {
39
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:1540namespace keys = manifest_keys;
41
[email protected]5ba5dab2010-11-18 02:31:0442namespace {
43
44// Returns an icon info corresponding to a canned icon.
45WebApplicationInfo::IconInfo GetIconInfo(const GURL& url, int size) {
46 WebApplicationInfo::IconInfo result;
47
[email protected]650b2d52013-02-10 03:41:4548 base::FilePath icon_file;
Avi Drissman9098f9002018-05-04 00:11:5249 if (!base::PathService::Get(chrome::DIR_TEST_DATA, &icon_file)) {
[email protected]5ba5dab2010-11-18 02:31:0450 ADD_FAILURE() << "Could not get test data directory.";
51 return result;
52 }
53
54 icon_file = icon_file.AppendASCII("extensions")
55 .AppendASCII("convert_web_app")
[email protected]7d3cbc92013-03-18 22:33:0456 .AppendASCII(base::StringPrintf("%i.png", size));
[email protected]5ba5dab2010-11-18 02:31:0457
58 result.url = url;
59 result.width = size;
60 result.height = size;
61
62 std::string icon_data;
[email protected]82f84b92013-08-30 18:23:5063 if (!base::ReadFileToString(icon_file, &icon_data)) {
[email protected]5ba5dab2010-11-18 02:31:0464 ADD_FAILURE() << "Could not read test icon.";
65 return result;
66 }
67
[email protected]da87eec22013-05-14 09:25:2868 if (!gfx::PNGCodec::Decode(
69 reinterpret_cast<const unsigned char*>(icon_data.c_str()),
70 icon_data.size(), &result.data)) {
71 ADD_FAILURE() << "Could not decode test icon.";
72 return result;
73 }
[email protected]5ba5dab2010-11-18 02:31:0474
75 return result;
76}
77
78base::Time GetTestTime(int year, int month, int day, int hour, int minute,
79 int second, int millisecond) {
80 base::Time::Exploded exploded = {0};
81 exploded.year = year;
82 exploded.month = month;
83 exploded.day_of_month = day;
84 exploded.hour = hour;
85 exploded.minute = minute;
86 exploded.second = second;
87 exploded.millisecond = millisecond;
maksim.sisovb4dbc73d2016-07-07 09:17:2788 base::Time out_time;
89 EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &out_time));
90 return out_time;
[email protected]5ba5dab2010-11-18 02:31:0491}
92
93} // namespace
94
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:1595TEST(ExtensionFromWebApp, GetScopeURLFromBookmarkApp) {
96 base::ScopedTempDir extensions_dir;
97 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
98
99 base::DictionaryValue manifest;
100 manifest.SetString(keys::kName, "Test App");
101 manifest.SetString(keys::kVersion, "0");
102 manifest.SetString(keys::kLaunchWebURL, "http://aaronboodman.com/gearpad/");
103
104 // Create a "url_handlers" dictionary with one URL handler generated from
105 // the scope.
106 // {
107 // "scope": {
108 // "matches": [ "http://aaronboodman.com/gearpad/*" ],
109 // "title": "Test App"
110 // },
111 // }
112 GURL scope_url = GURL("http://aaronboodman.com/gearpad/");
113 manifest.SetDictionary(keys::kUrlHandlers,
114 CreateURLHandlersForBookmarkApp(
115 scope_url, base::ASCIIToUTF16("Test App")));
116
117 std::string error;
118 scoped_refptr<Extension> bookmark_app =
119 Extension::Create(extensions_dir.GetPath(), Manifest::INTERNAL, manifest,
120 Extension::FROM_BOOKMARK, &error);
121 ASSERT_TRUE(bookmark_app.get());
122
123 EXPECT_EQ(scope_url, GetScopeURLFromBookmarkApp(bookmark_app.get()));
124}
125
126TEST(ExtensionFromWebApp, GetScopeURLFromBookmarkApp_NoURLHandlers) {
127 base::ScopedTempDir extensions_dir;
128 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
129
130 base::DictionaryValue manifest;
131 manifest.SetString(keys::kName, "Test App");
132 manifest.SetString(keys::kVersion, "0");
133 manifest.SetString(keys::kLaunchWebURL, "http://aaronboodman.com/gearpad/");
134 manifest.SetDictionary(keys::kUrlHandlers,
Jinho Bangb5216cec2018-01-17 19:43:11135 std::make_unique<base::DictionaryValue>());
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15136
137 std::string error;
138 scoped_refptr<Extension> bookmark_app =
139 Extension::Create(extensions_dir.GetPath(), Manifest::INTERNAL, manifest,
140 Extension::FROM_BOOKMARK, &error);
141 ASSERT_TRUE(bookmark_app.get());
142
143 EXPECT_EQ(GURL(), GetScopeURLFromBookmarkApp(bookmark_app.get()));
144}
145
146TEST(ExtensionFromWebApp, GetScopeURLFromBookmarkApp_WrongURLHandler) {
147 base::ScopedTempDir extensions_dir;
148 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
149
150 base::DictionaryValue manifest;
151 manifest.SetString(keys::kName, "Test App");
152 manifest.SetString(keys::kVersion, "0");
153 manifest.SetString(keys::kLaunchWebURL, "http://aaronboodman.com/gearpad/");
154
155 // Create a "url_handlers" dictionary with one URL handler not generated
156 // from the scope.
157 // {
158 // "test_url_handler": {
159 // "matches": [ "http://*.aaronboodman.com/" ],
160 // "title": "test handler"
161 // }
162 // }
Jinho Bangb5216cec2018-01-17 19:43:11163 auto test_matches = std::make_unique<base::ListValue>();
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15164 test_matches->AppendString("http://*.aaronboodman.com/");
165
Jinho Bangb5216cec2018-01-17 19:43:11166 auto test_handler = std::make_unique<base::DictionaryValue>();
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15167 test_handler->SetList(keys::kMatches, std::move(test_matches));
168 test_handler->SetString(keys::kUrlHandlerTitle, "test handler");
169
Jinho Bangb5216cec2018-01-17 19:43:11170 auto url_handlers = std::make_unique<base::DictionaryValue>();
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15171 url_handlers->SetDictionary("test_url_handler", std::move(test_handler));
172 manifest.SetDictionary(keys::kUrlHandlers, std::move(url_handlers));
173
174 std::string error;
175 scoped_refptr<Extension> bookmark_app =
176 Extension::Create(extensions_dir.GetPath(), Manifest::INTERNAL, manifest,
177 Extension::FROM_BOOKMARK, &error);
178 ASSERT_TRUE(bookmark_app.get());
179
180 EXPECT_EQ(GURL(), GetScopeURLFromBookmarkApp(bookmark_app.get()));
181}
182
183TEST(ExtensionFromWebApp, GetScopeURLFromBookmarkApp_ExtraURLHandler) {
184 base::ScopedTempDir extensions_dir;
185 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
186
187 base::DictionaryValue manifest;
188 manifest.SetString(keys::kName, "Test App");
189 manifest.SetString(keys::kVersion, "0");
190 manifest.SetString(keys::kLaunchWebURL, "http://aaronboodman.com/gearpad/");
191
192 // Create a "url_handlers" dictionary with two URL handlers. One for
193 // the scope and and extra one for testing.
194 // {
195 // "scope": {
196 // "matches": [ "http://aaronboodman.com/gearpad/*" ],
197 // "title": "Test App"
198 // },
199 // "test_url_handler": {
200 // "matches": [ "http://*.aaronboodman.com/" ],
201 // "title": "test handler"
202 // }
203 // }
204 GURL scope_url = GURL("http://aaronboodman.com/gearpad/");
205 std::unique_ptr<base::DictionaryValue> url_handlers =
206 CreateURLHandlersForBookmarkApp(scope_url,
207 base::ASCIIToUTF16("Test App"));
208
Jinho Bangb5216cec2018-01-17 19:43:11209 auto test_matches = std::make_unique<base::ListValue>();
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15210 test_matches->AppendString("http://*.aaronboodman.com/");
211
Jinho Bangb5216cec2018-01-17 19:43:11212 auto test_handler = std::make_unique<base::DictionaryValue>();
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15213 test_handler->SetList(keys::kMatches, std::move(test_matches));
214 test_handler->SetString(keys::kUrlHandlerTitle, "test handler");
215
216 url_handlers->SetDictionary("test_url_handler", std::move(test_handler));
217 manifest.SetDictionary(keys::kUrlHandlers, std::move(url_handlers));
218
219 std::string error;
220 scoped_refptr<Extension> bookmark_app =
221 Extension::Create(extensions_dir.GetPath(), Manifest::INTERNAL, manifest,
222 Extension::FROM_BOOKMARK, &error);
223 ASSERT_TRUE(bookmark_app.get());
224
225 // Check that we can retrieve the scope even if there is an extra
226 // url handler.
227 EXPECT_EQ(scope_url, GetScopeURLFromBookmarkApp(bookmark_app.get()));
228}
229
[email protected]d592b1bd2013-05-06 06:40:47230TEST(ExtensionFromWebApp, GenerateVersion) {
[email protected]5ba5dab2010-11-18 02:31:04231 EXPECT_EQ("2010.1.1.0",
232 ConvertTimeToExtensionVersion(
233 GetTestTime(2010, 1, 1, 0, 0, 0, 0)));
234 EXPECT_EQ("2010.12.31.22111",
235 ConvertTimeToExtensionVersion(
236 GetTestTime(2010, 12, 31, 8, 5, 50, 500)));
237 EXPECT_EQ("2010.10.1.65535",
238 ConvertTimeToExtensionVersion(
239 GetTestTime(2010, 10, 1, 23, 59, 59, 999)));
240}
241
[email protected]d592b1bd2013-05-06 06:40:47242TEST(ExtensionFromWebApp, Basic) {
[email protected]ea1a3f62012-11-16 20:34:23243 base::ScopedTempDir extensions_dir;
[email protected]171ab92d2012-10-19 01:16:34244 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
245
[email protected]5ba5dab2010-11-18 02:31:04246 WebApplicationInfo web_app;
[email protected]04338722013-12-24 23:18:05247 web_app.title = base::ASCIIToUTF16("Gearpad");
248 web_app.description =
249 base::ASCIIToUTF16("The best text editor in the universe!");
[email protected]5ba5dab2010-11-18 02:31:04250 web_app.app_url = GURL("http://aaronboodman.com/gearpad/");
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15251 web_app.scope = GURL("http://aaronboodman.com/gearpad/");
[email protected]5ba5dab2010-11-18 02:31:04252
253 const int sizes[] = {16, 48, 128};
Avi Drissman5f0fb8c2018-12-25 23:20:49254 for (size_t i = 0; i < base::size(sizes); ++i) {
[email protected]7d3cbc92013-03-18 22:33:04255 GURL icon_url(
256 web_app.app_url.Resolve(base::StringPrintf("%i.png", sizes[i])));
[email protected]5ba5dab2010-11-18 02:31:04257 web_app.icons.push_back(GetIconInfo(icon_url, sizes[i]));
258 }
259
[email protected]b1912d592012-08-17 22:29:38260 scoped_refptr<Extension> extension = ConvertWebAppToExtension(
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56261 web_app, GetTestTime(1978, 12, 11, 0, 0, 0, 0), extensions_dir.GetPath(),
262 Extension::NO_FLAGS, Manifest::INTERNAL);
[email protected]5ba5dab2010-11-18 02:31:04263 ASSERT_TRUE(extension.get());
264
[email protected]ea1a3f62012-11-16 20:34:23265 base::ScopedTempDir extension_dir;
[email protected]2d57f5d2011-01-13 14:20:12266 EXPECT_TRUE(extension_dir.Set(extension->path()));
[email protected]5ba5dab2010-11-18 02:31:04267
268 EXPECT_TRUE(extension->is_app());
269 EXPECT_TRUE(extension->is_hosted_app());
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56270 EXPECT_TRUE(extension->from_bookmark());
[email protected]c4f459d2012-09-28 04:40:10271 EXPECT_FALSE(extension->is_legacy_packaged_app());
[email protected]5ba5dab2010-11-18 02:31:04272
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56273 EXPECT_FALSE(extension->was_installed_by_default());
274 EXPECT_FALSE(extension->was_installed_by_oem());
275 EXPECT_FALSE(extension->from_webstore());
276 EXPECT_EQ(Manifest::INTERNAL, extension->location());
277
[email protected]f8bbf6b2014-01-30 07:23:27278 EXPECT_EQ("zVvdNZy3Mp7CFU8JVSyXNlDuHdVLbP7fDO3TGVzj/0w=",
[email protected]5ba5dab2010-11-18 02:31:04279 extension->public_key());
[email protected]f8bbf6b2014-01-30 07:23:27280 EXPECT_EQ("oplhagaaipaimkjlbekcdjkffijdockj", extension->id());
Devlin Cronin03bf2d22017-12-20 08:21:05281 EXPECT_EQ("1978.12.11.0", extension->version().GetString());
[email protected]04338722013-12-24 23:18:05282 EXPECT_EQ(base::UTF16ToUTF8(web_app.title), extension->name());
283 EXPECT_EQ(base::UTF16ToUTF8(web_app.description), extension->description());
[email protected]cadac622013-06-11 16:46:36284 EXPECT_EQ(web_app.app_url, AppLaunchInfo::GetFullLaunchURL(extension.get()));
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15285 EXPECT_EQ(web_app.scope, GetScopeURLFromBookmarkApp(extension.get()));
[email protected]076ebeda2014-06-06 21:47:26286 EXPECT_EQ(0u,
rdevlin.cronind630c302015-09-30 20:19:33287 extension->permissions_data()->active_permissions().apis().size());
[email protected]f8bbf6b2014-01-30 07:23:27288 ASSERT_EQ(0u, extension->web_extent().patterns().size());
[email protected]5ba5dab2010-11-18 02:31:04289
[email protected]dc24976f2013-06-02 21:15:09290 EXPECT_EQ(web_app.icons.size(),
291 IconsInfo::GetIcons(extension.get()).map().size());
[email protected]5ba5dab2010-11-18 02:31:04292 for (size_t i = 0; i < web_app.icons.size(); ++i) {
[email protected]7d3cbc92013-03-18 22:33:04293 EXPECT_EQ(base::StringPrintf("icons/%i.png", web_app.icons[i].width),
[email protected]dc24976f2013-06-02 21:15:09294 IconsInfo::GetIcons(extension.get()).Get(
[email protected]702d8b42013-02-27 20:55:50295 web_app.icons[i].width, ExtensionIconSet::MATCH_EXACTLY));
[email protected]dc24976f2013-06-02 21:15:09296 ExtensionResource resource =
297 IconsInfo::GetIconResource(extension.get(),
298 web_app.icons[i].width,
299 ExtensionIconSet::MATCH_EXACTLY);
[email protected]5ba5dab2010-11-18 02:31:04300 ASSERT_TRUE(!resource.empty());
[email protected]7567484142013-07-11 17:36:07301 EXPECT_TRUE(base::PathExists(resource.GetFilePath()));
[email protected]5ba5dab2010-11-18 02:31:04302 }
303}
304
[email protected]d592b1bd2013-05-06 06:40:47305TEST(ExtensionFromWebApp, Minimal) {
[email protected]ea1a3f62012-11-16 20:34:23306 base::ScopedTempDir extensions_dir;
[email protected]171ab92d2012-10-19 01:16:34307 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
308
[email protected]5ba5dab2010-11-18 02:31:04309 WebApplicationInfo web_app;
[email protected]04338722013-12-24 23:18:05310 web_app.title = base::ASCIIToUTF16("Gearpad");
[email protected]5ba5dab2010-11-18 02:31:04311 web_app.app_url = GURL("http://aaronboodman.com/gearpad/");
312
[email protected]b1912d592012-08-17 22:29:38313 scoped_refptr<Extension> extension = ConvertWebAppToExtension(
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56314 web_app, GetTestTime(1978, 12, 11, 0, 0, 0, 0), extensions_dir.GetPath(),
315 Extension::NO_FLAGS, Manifest::INTERNAL);
[email protected]5ba5dab2010-11-18 02:31:04316 ASSERT_TRUE(extension.get());
317
[email protected]ea1a3f62012-11-16 20:34:23318 base::ScopedTempDir extension_dir;
[email protected]2d57f5d2011-01-13 14:20:12319 EXPECT_TRUE(extension_dir.Set(extension->path()));
[email protected]5ba5dab2010-11-18 02:31:04320
321 EXPECT_TRUE(extension->is_app());
322 EXPECT_TRUE(extension->is_hosted_app());
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56323 EXPECT_TRUE(extension->from_bookmark());
[email protected]c4f459d2012-09-28 04:40:10324 EXPECT_FALSE(extension->is_legacy_packaged_app());
[email protected]5ba5dab2010-11-18 02:31:04325
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56326 EXPECT_FALSE(extension->was_installed_by_default());
327 EXPECT_FALSE(extension->was_installed_by_oem());
328 EXPECT_FALSE(extension->from_webstore());
329 EXPECT_EQ(Manifest::INTERNAL, extension->location());
330
[email protected]f8bbf6b2014-01-30 07:23:27331 EXPECT_EQ("zVvdNZy3Mp7CFU8JVSyXNlDuHdVLbP7fDO3TGVzj/0w=",
[email protected]5ba5dab2010-11-18 02:31:04332 extension->public_key());
[email protected]f8bbf6b2014-01-30 07:23:27333 EXPECT_EQ("oplhagaaipaimkjlbekcdjkffijdockj", extension->id());
Devlin Cronin03bf2d22017-12-20 08:21:05334 EXPECT_EQ("1978.12.11.0", extension->version().GetString());
[email protected]04338722013-12-24 23:18:05335 EXPECT_EQ(base::UTF16ToUTF8(web_app.title), extension->name());
[email protected]5ba5dab2010-11-18 02:31:04336 EXPECT_EQ("", extension->description());
[email protected]cadac622013-06-11 16:46:36337 EXPECT_EQ(web_app.app_url, AppLaunchInfo::GetFullLaunchURL(extension.get()));
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15338 EXPECT_TRUE(GetScopeURLFromBookmarkApp(extension.get()).is_empty());
[email protected]dc24976f2013-06-02 21:15:09339 EXPECT_EQ(0u, IconsInfo::GetIcons(extension.get()).map().size());
[email protected]076ebeda2014-06-06 21:47:26340 EXPECT_EQ(0u,
rdevlin.cronind630c302015-09-30 20:19:33341 extension->permissions_data()->active_permissions().apis().size());
[email protected]f8bbf6b2014-01-30 07:23:27342 ASSERT_EQ(0u, extension->web_extent().patterns().size());
[email protected]5ba5dab2010-11-18 02:31:04343}
[email protected]b1912d592012-08-17 22:29:38344
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56345TEST(ExtensionFromWebApp, ExtraInstallationFlags) {
346 base::ScopedTempDir extensions_dir;
347 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
348
349 WebApplicationInfo web_app;
350 web_app.title = base::ASCIIToUTF16("Gearpad");
351 web_app.app_url = GURL("http://aaronboodman.com/gearpad/");
352
353 scoped_refptr<Extension> extension = ConvertWebAppToExtension(
354 web_app, GetTestTime(1978, 12, 11, 0, 0, 0, 0), extensions_dir.GetPath(),
355 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_OEM,
356 Manifest::INTERNAL);
357 ASSERT_TRUE(extension.get());
358
359 EXPECT_TRUE(extension->is_app());
360 EXPECT_TRUE(extension->is_hosted_app());
361 EXPECT_TRUE(extension->from_bookmark());
362 EXPECT_FALSE(extension->is_legacy_packaged_app());
363
364 EXPECT_TRUE(extension->was_installed_by_oem());
365 EXPECT_TRUE(extension->from_webstore());
366 EXPECT_FALSE(extension->was_installed_by_default());
367 EXPECT_EQ(Manifest::INTERNAL, extension->location());
368}
369
370TEST(ExtensionFromWebApp, ExternalPolicyLocation) {
371 base::ScopedTempDir extensions_dir;
372 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
373
374 WebApplicationInfo web_app;
375 web_app.title = base::ASCIIToUTF16("Gearpad");
376 web_app.app_url = GURL("http://aaronboodman.com/gearpad/");
377
378 scoped_refptr<Extension> extension = ConvertWebAppToExtension(
379 web_app, GetTestTime(1978, 12, 11, 0, 0, 0, 0), extensions_dir.GetPath(),
380 Extension::NO_FLAGS, Manifest::EXTERNAL_POLICY);
381 ASSERT_TRUE(extension.get());
382
383 EXPECT_TRUE(extension->is_app());
384 EXPECT_TRUE(extension->is_hosted_app());
385 EXPECT_TRUE(extension->from_bookmark());
386 EXPECT_FALSE(extension->is_legacy_packaged_app());
387
388 EXPECT_EQ(Manifest::EXTERNAL_POLICY, extension->location());
389}
390
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15391// Tests that a scope not ending in "/" works correctly.
392// The tested behavior is unexpected but is working correctly according
393// to the Web Manifest spec. https://github.com/w3c/manifest/issues/554
394TEST(ExtensionFromWebApp, ScopeDoesNotEndInSlash) {
395 base::ScopedTempDir extensions_dir;
396 ASSERT_TRUE(extensions_dir.CreateUniqueTempDir());
397
398 WebApplicationInfo web_app;
399 web_app.title = base::ASCIIToUTF16("Gearpad");
400 web_app.description =
401 base::ASCIIToUTF16("The best text editor in the universe!");
402 web_app.app_url = GURL("http://aaronboodman.com/gearpad/");
403 web_app.scope = GURL("http://aaronboodman.com/gear");
404
405 scoped_refptr<Extension> extension = ConvertWebAppToExtension(
Giovanni Ortuño Urquidi1e567fd2018-08-13 07:04:56406 web_app, GetTestTime(1978, 12, 11, 0, 0, 0, 0), extensions_dir.GetPath(),
407 Extension::NO_FLAGS, Manifest::INTERNAL);
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15408 ASSERT_TRUE(extension.get());
409 EXPECT_EQ(web_app.scope, GetScopeURLFromBookmarkApp(extension.get()));
410}
411
[email protected]b1912d592012-08-17 22:29:38412} // namespace extensions