1 // Copyright 2014 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.
7 #include "content/browser/appcache/appcache_manifest_parser.h"
8 #include "testing/gtest/include/gtest/gtest.h"
13 class AppCacheManifestParserTest
: public testing::Test
{
16 TEST(AppCacheManifestParserTest
, NoData
) {
18 AppCacheManifest manifest
;
19 EXPECT_FALSE(ParseManifest(url
, "", 0,
20 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
21 EXPECT_FALSE(ParseManifest(url
, "CACHE MANIFEST\r", 0, // Len is 0.
22 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
25 TEST(AppCacheManifestParserTest
, CheckSignature
) {
27 AppCacheManifest manifest
;
29 const std::string kBadSignatures
[] = {
31 "CACHE MANIFEST;V2\r", // not followed by whitespace
32 "CACHE MANIFEST#bad\r", // no whitespace before comment
33 "cache manifest ", // wrong case
34 "#CACHE MANIFEST\r", // comment
35 "xCACHE MANIFEST\n", // bad first char
36 " CACHE MANIFEST\r", // begins with whitespace
37 "\xEF\xBE\xBF" "CACHE MANIFEST\r", // bad UTF-8 BOM value
40 for (size_t i
= 0; i
< arraysize(kBadSignatures
); ++i
) {
41 const std::string bad
= kBadSignatures
[i
];
42 EXPECT_FALSE(ParseManifest(url
, bad
.c_str(), bad
.length(),
43 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
46 const std::string kGoodSignatures
[] = {
52 "CACHE MANIFEST\t# ignore me\r",
53 "CACHE MANIFEST ignore\r\n",
54 "CHROMIUM CACHE MANIFEST\r\n",
55 "\xEF\xBB\xBF" "CACHE MANIFEST \r\n", // BOM present
58 for (size_t i
= 0; i
< arraysize(kGoodSignatures
); ++i
) {
59 const std::string good
= kGoodSignatures
[i
];
60 EXPECT_TRUE(ParseManifest(url
, good
.c_str(), good
.length(),
61 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
65 TEST(AppCacheManifestParserTest
, NoManifestUrl
) {
66 AppCacheManifest manifest
;
67 const std::string
kData("CACHE MANIFEST\r"
68 "relative/tobase.com\r"
69 "http://absolute.com/addme.com");
71 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
72 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
73 EXPECT_TRUE(manifest
.explicit_urls
.empty());
74 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
75 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
76 EXPECT_FALSE(manifest
.online_whitelist_all
);
79 TEST(AppCacheManifestParserTest
, ExplicitUrls
) {
80 AppCacheManifest manifest
;
81 const GURL
kUrl("http://www.foo.com");
82 const std::string
kData("CACHE MANIFEST\r"
85 "http://www.foo.com/two#strip\r\n"
88 "HTTP://www.diff.com/three\r"
90 " \t # another comment with leading whitespace\n"
92 "http://www.foo.com/ignore\r"
95 "https://www.foo.com/diffscheme \t \r"
96 " \t relative/four#stripme\n\r"
99 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
100 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
101 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
102 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
103 EXPECT_FALSE(manifest
.online_whitelist_all
);
105 base::hash_set
<std::string
> urls
= manifest
.explicit_urls
;
106 const size_t kExpected
= 5;
107 ASSERT_EQ(kExpected
, urls
.size());
108 EXPECT_TRUE(urls
.find("http://www.foo.com/relative/one") != urls
.end());
109 EXPECT_TRUE(urls
.find("http://www.foo.com/two") != urls
.end());
110 EXPECT_TRUE(urls
.find("http://www.diff.com/three") != urls
.end());
111 EXPECT_TRUE(urls
.find("http://www.foo.com/relative/four") != urls
.end());
113 // Wildcard is treated as a relative URL in explicit section.
114 EXPECT_TRUE(urls
.find("http://www.foo.com/*") != urls
.end());
116 // We should get the same results with intercepts disallowed.
117 manifest
= AppCacheManifest();
118 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
119 PARSE_MANIFEST_PER_STANDARD
, manifest
));
120 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
121 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
122 EXPECT_FALSE(manifest
.online_whitelist_all
);
124 urls
= manifest
.explicit_urls
;
125 ASSERT_EQ(kExpected
, urls
.size());
126 EXPECT_TRUE(urls
.find("http://www.foo.com/relative/one") != urls
.end());
127 EXPECT_TRUE(urls
.find("http://www.foo.com/two") != urls
.end());
128 EXPECT_TRUE(urls
.find("http://www.diff.com/three") != urls
.end());
129 EXPECT_TRUE(urls
.find("http://www.foo.com/relative/four") != urls
.end());
131 // Wildcard is treated as a relative URL in explicit section.
132 EXPECT_TRUE(urls
.find("http://www.foo.com/*") != urls
.end());
135 TEST(AppCacheManifestParserTest
, WhitelistUrls
) {
136 AppCacheManifest manifest
;
137 const GURL
kUrl("http://www.bar.com");
138 const std::string
kData("CACHE MANIFEST\r"
142 "http://www.bar.com/two\r"
143 "HTTP://www.diff.com/three#strip\n\r"
147 "http://www.bar.com/ignore\r"
150 "https://www.wrongscheme.com\n"
151 "relative/four#stripref \t \r"
152 "http://www.five.com\r\n"
155 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
156 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
157 EXPECT_TRUE(manifest
.explicit_urls
.empty());
158 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
159 EXPECT_TRUE(manifest
.intercept_namespaces
.empty());
160 EXPECT_FALSE(manifest
.online_whitelist_all
);
162 const AppCacheNamespaceVector
& online
= manifest
.online_whitelist_namespaces
;
163 const size_t kExpected
= 6;
164 ASSERT_EQ(kExpected
, online
.size());
165 EXPECT_EQ(APPCACHE_NETWORK_NAMESPACE
, online
[0].type
);
166 EXPECT_FALSE(online
[0].is_pattern
);
167 EXPECT_TRUE(online
[0].target_url
.is_empty());
168 EXPECT_EQ(GURL("http://www.bar.com/relative/one"), online
[0].namespace_url
);
169 EXPECT_EQ(GURL("http://www.bar.com/two"), online
[1].namespace_url
);
170 EXPECT_EQ(GURL("http://www.diff.com/three"), online
[2].namespace_url
);
171 EXPECT_EQ(GURL("http://www.bar.com/relative/four"), online
[3].namespace_url
);
172 EXPECT_EQ(GURL("http://www.five.com"), online
[4].namespace_url
);
173 EXPECT_EQ(GURL("http://www.bar.com/*foo"), online
[5].namespace_url
);
176 TEST(AppCacheManifestParserTest
, FallbackUrls
) {
177 AppCacheManifest manifest
;
178 const GURL
kUrl("http://glorp.com");
179 const std::string
kData("CACHE MANIFEST\r"
185 "relative/one \t \t http://glorp.com/onefb \t \r"
187 "https://glorp.com/wrong http://glorp.com/wrongfb\r"
188 "http://glorp.com/two#strip relative/twofb\r"
189 "HTTP://glorp.com/three relative/threefb#strip\n"
190 "http://glorp.com/three http://glorp.com/three-dup\r"
191 "http://glorp.com/solo \t \r\n"
192 "http://diff.com/ignore http://glorp.com/wronghost\r"
193 "http://glorp.com/wronghost http://diff.com/ohwell\r"
194 "relative/badscheme ftp://glorp.com/ignored\r"
197 "# only fallback urls in this test\r"
199 "relative/four#strip relative/fourfb#strip\r"
200 "http://www.glorp.com/notsame relative/skipped\r");
202 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
203 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
204 EXPECT_TRUE(manifest
.explicit_urls
.empty());
205 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
206 EXPECT_FALSE(manifest
.online_whitelist_all
);
208 const AppCacheNamespaceVector
& fallbacks
= manifest
.fallback_namespaces
;
209 const size_t kExpected
= 5;
210 ASSERT_EQ(kExpected
, fallbacks
.size());
211 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[0].type
);
212 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[1].type
);
213 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[2].type
);
214 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[3].type
);
215 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[4].type
);
216 EXPECT_EQ(GURL("http://glorp.com/relative/one"),
217 fallbacks
[0].namespace_url
);
218 EXPECT_EQ(GURL("http://glorp.com/onefb"),
219 fallbacks
[0].target_url
);
220 EXPECT_EQ(GURL("http://glorp.com/two"),
221 fallbacks
[1].namespace_url
);
222 EXPECT_EQ(GURL("http://glorp.com/relative/twofb"),
223 fallbacks
[1].target_url
);
224 EXPECT_EQ(GURL("http://glorp.com/three"),
225 fallbacks
[2].namespace_url
);
226 EXPECT_EQ(GURL("http://glorp.com/relative/threefb"),
227 fallbacks
[2].target_url
);
228 EXPECT_EQ(GURL("http://glorp.com/three"), // duplicates are stored
229 fallbacks
[3].namespace_url
);
230 EXPECT_EQ(GURL("http://glorp.com/three-dup"),
231 fallbacks
[3].target_url
);
232 EXPECT_EQ(GURL("http://glorp.com/relative/four"),
233 fallbacks
[4].namespace_url
);
234 EXPECT_EQ(GURL("http://glorp.com/relative/fourfb"),
235 fallbacks
[4].target_url
);
237 EXPECT_TRUE(manifest
.intercept_namespaces
.empty());
240 TEST(AppCacheManifestParserTest
, FallbackUrlsWithPort
) {
241 AppCacheManifest manifest
;
242 const GURL
kUrl("http://www.portme.com:1234");
243 const std::string
kData("CACHE MANIFEST\r"
245 "http://www.portme.com:1234/one relative/onefb\r"
246 "HTTP://www.portme.com:9876/wrong http://www.portme.com:1234/ignore\r"
247 "http://www.portme.com:1234/stillwrong http://www.portme.com:42/boo\r"
248 "relative/two relative/twofb\r"
249 "http://www.portme.com:1234/three HTTP://www.portme.com:1234/threefb\r"
250 "http://www.portme.com/noport http://www.portme.com:1234/skipped\r"
251 "http://www.portme.com:1234/skipme http://www.portme.com/noport\r");
253 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
254 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
255 EXPECT_TRUE(manifest
.explicit_urls
.empty());
256 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
257 EXPECT_FALSE(manifest
.online_whitelist_all
);
259 const AppCacheNamespaceVector
& fallbacks
= manifest
.fallback_namespaces
;
260 const size_t kExpected
= 3;
261 ASSERT_EQ(kExpected
, fallbacks
.size());
262 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[0].type
);
263 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[1].type
);
264 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[2].type
);
265 EXPECT_EQ(GURL("http://www.portme.com:1234/one"),
266 fallbacks
[0].namespace_url
);
267 EXPECT_EQ(GURL("http://www.portme.com:1234/relative/onefb"),
268 fallbacks
[0].target_url
);
269 EXPECT_EQ(GURL("http://www.portme.com:1234/relative/two"),
270 fallbacks
[1].namespace_url
);
271 EXPECT_EQ(GURL("http://www.portme.com:1234/relative/twofb"),
272 fallbacks
[1].target_url
);
273 EXPECT_EQ(GURL("http://www.portme.com:1234/three"),
274 fallbacks
[2].namespace_url
);
275 EXPECT_EQ(GURL("http://www.portme.com:1234/threefb"),
276 fallbacks
[2].target_url
);
278 EXPECT_TRUE(manifest
.intercept_namespaces
.empty());
281 TEST(AppCacheManifestParserTest
, InterceptUrls
) {
282 AppCacheManifest manifest
;
283 const GURL
kUrl("http://www.portme.com:1234");
284 const std::string
kData("CHROMIUM CACHE MANIFEST\r"
285 "CHROMIUM-INTERCEPT:\r"
286 "http://www.portme.com:1234/one return relative/int1\r"
287 "HTTP://www.portme.com:9/wrong return http://www.portme.com:1234/ignore\r"
288 "http://www.portme.com:1234/wrong return http://www.portme.com:9/boo\r"
289 "relative/two return relative/int2\r"
290 "relative/three wrong relative/threefb\r"
291 "http://www.portme.com:1234/three return HTTP://www.portme.com:1234/int3\r"
292 "http://www.portme.com/noport return http://www.portme.com:1234/skipped\r"
293 "http://www.portme.com:1234/skipme return http://www.portme.com/noport\r"
294 "relative/wrong/again missing/intercept_type\r");
296 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
297 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
298 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
299 EXPECT_TRUE(manifest
.explicit_urls
.empty());
300 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
301 EXPECT_FALSE(manifest
.online_whitelist_all
);
303 const AppCacheNamespaceVector
& intercepts
= manifest
.intercept_namespaces
;
304 const size_t kExpected
= 3;
305 ASSERT_EQ(kExpected
, intercepts
.size());
306 EXPECT_EQ(APPCACHE_INTERCEPT_NAMESPACE
, intercepts
[0].type
);
307 EXPECT_EQ(APPCACHE_INTERCEPT_NAMESPACE
, intercepts
[1].type
);
308 EXPECT_EQ(APPCACHE_INTERCEPT_NAMESPACE
, intercepts
[2].type
);
309 EXPECT_EQ(GURL("http://www.portme.com:1234/one"),
310 intercepts
[0].namespace_url
);
311 EXPECT_EQ(GURL("http://www.portme.com:1234/relative/int1"),
312 intercepts
[0].target_url
);
313 EXPECT_EQ(GURL("http://www.portme.com:1234/relative/two"),
314 intercepts
[1].namespace_url
);
315 EXPECT_EQ(GURL("http://www.portme.com:1234/relative/int2"),
316 intercepts
[1].target_url
);
317 EXPECT_EQ(GURL("http://www.portme.com:1234/three"),
318 intercepts
[2].namespace_url
);
319 EXPECT_EQ(GURL("http://www.portme.com:1234/int3"),
320 intercepts
[2].target_url
);
322 // Disallow intercepts ths time.
323 manifest
= AppCacheManifest();
324 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
325 PARSE_MANIFEST_PER_STANDARD
, manifest
));
326 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
327 EXPECT_TRUE(manifest
.explicit_urls
.empty());
328 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
329 EXPECT_TRUE(manifest
.intercept_namespaces
.empty());
330 EXPECT_FALSE(manifest
.online_whitelist_all
);
333 TEST(AppCacheManifestParserTest
, ComboUrls
) {
334 AppCacheManifest manifest
;
335 const GURL
kUrl("http://combo.com:42");
336 const std::string
kData("CACHE MANIFEST\r"
337 "relative/explicit-1\r"
339 "http://combo.com:99/explicit-2#strip\r"
341 "http://combo.com/whitelist-1\r"
342 "HTTP://www.diff.com/whitelist-2#strip\r"
345 "http://www.diff.com/explicit-3\r"
347 "http://combo.com:42/fallback-1 http://combo.com:42/fallback-1b\r"
348 "relative/fallback-2 relative/fallback-2b\r"
350 "http://combo.com/ignoreme\r"
351 "relative/still-ignored\r"
353 "relative/whitelist-3#strip\r"
354 "http://combo.com:99/whitelist-4\r");
355 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
356 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
357 EXPECT_TRUE(manifest
.online_whitelist_all
);
359 base::hash_set
<std::string
> urls
= manifest
.explicit_urls
;
361 ASSERT_EQ(expected
, urls
.size());
362 EXPECT_TRUE(urls
.find("http://combo.com:42/relative/explicit-1") !=
364 EXPECT_TRUE(urls
.find("http://combo.com:99/explicit-2") != urls
.end());
365 EXPECT_TRUE(urls
.find("http://www.diff.com/explicit-3") != urls
.end());
367 const AppCacheNamespaceVector
& online
= manifest
.online_whitelist_namespaces
;
369 ASSERT_EQ(expected
, online
.size());
370 EXPECT_EQ(GURL("http://combo.com/whitelist-1"),
371 online
[0].namespace_url
);
372 EXPECT_EQ(GURL("http://www.diff.com/whitelist-2"),
373 online
[1].namespace_url
);
374 EXPECT_EQ(GURL("http://combo.com:42/relative/whitelist-3"),
375 online
[2].namespace_url
);
376 EXPECT_EQ(GURL("http://combo.com:99/whitelist-4"),
377 online
[3].namespace_url
);
379 const AppCacheNamespaceVector
& fallbacks
= manifest
.fallback_namespaces
;
381 ASSERT_EQ(expected
, fallbacks
.size());
382 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[0].type
);
383 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, fallbacks
[1].type
);
384 EXPECT_EQ(GURL("http://combo.com:42/fallback-1"),
385 fallbacks
[0].namespace_url
);
386 EXPECT_EQ(GURL("http://combo.com:42/fallback-1b"),
387 fallbacks
[0].target_url
);
388 EXPECT_EQ(GURL("http://combo.com:42/relative/fallback-2"),
389 fallbacks
[1].namespace_url
);
390 EXPECT_EQ(GURL("http://combo.com:42/relative/fallback-2b"),
391 fallbacks
[1].target_url
);
393 EXPECT_TRUE(manifest
.intercept_namespaces
.empty());
396 TEST(AppCacheManifestParserTest
, UnusualUtf8
) {
397 AppCacheManifest manifest
;
398 const GURL
kUrl("http://bad.com");
399 const std::string
kData("CACHE MANIFEST\r"
400 "\xC0" "invalidutf8\r"
401 "nonbmp" "\xF1\x84\xAB\xBC\r");
402 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
403 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
404 base::hash_set
<std::string
> urls
= manifest
.explicit_urls
;
405 EXPECT_TRUE(urls
.find("http://bad.com/%EF%BF%BDinvalidutf8") != urls
.end());
406 EXPECT_TRUE(urls
.find("http://bad.com/nonbmp%F1%84%AB%BC") != urls
.end());
409 TEST(AppCacheManifestParserTest
, IgnoreAfterSpace
) {
410 AppCacheManifest manifest
;
411 const GURL
kUrl("http://smorg.borg");
412 const std::string
kData(
414 "resource.txt this stuff after the white space should be ignored\r");
415 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
416 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
418 base::hash_set
<std::string
> urls
= manifest
.explicit_urls
;
419 EXPECT_TRUE(urls
.find("http://smorg.borg/resource.txt") != urls
.end());
422 TEST(AppCacheManifestParserTest
, DifferentOriginUrlWithSecureScheme
) {
423 AppCacheManifest manifest
;
424 const GURL
kUrl("https://www.foo.com");
425 const std::string
kData("CACHE MANIFEST\r"
427 "relative/secureschemesameorigin\r"
428 "https://www.foo.com/secureschemesameorigin\r"
429 "http://www.xyz.com/secureschemedifforigin\r"
430 "https://www.xyz.com/secureschemedifforigin\r");
432 EXPECT_TRUE(ParseManifest(kUrl
, kData
.c_str(), kData
.length(),
433 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
434 EXPECT_TRUE(manifest
.fallback_namespaces
.empty());
435 EXPECT_TRUE(manifest
.online_whitelist_namespaces
.empty());
437 base::hash_set
<std::string
> urls
= manifest
.explicit_urls
;
438 const size_t kExpected
= 3;
439 ASSERT_EQ(kExpected
, urls
.size());
440 EXPECT_TRUE(urls
.find("https://www.foo.com/relative/secureschemesameorigin")
442 EXPECT_TRUE(urls
.find("https://www.foo.com/secureschemesameorigin") !=
444 EXPECT_FALSE(urls
.find("http://www.xyz.com/secureschemedifforigin") !=
446 EXPECT_TRUE(urls
.find("https://www.xyz.com/secureschemedifforigin") !=
450 TEST(AppCacheManifestParserTest
, PatternMatching
) {
451 const GURL
kUrl("http://foo.com/manifest");
452 const std::string
kManifestBody(
455 "http://foo.com/page.html\r"
456 "CHROMIUM-INTERCEPT:\r"
457 "http://foo.com/intercept_prefix return /prefix\r"
458 "http://foo.com/intercept_pattern return /pattern isPattern\r"
459 "http://foo.com/*/intercept_pattern?query return /pattern isPattern\r"
461 "http://foo.com/fallback_prefix /prefix wrongAnnotation\r"
462 "http://foo.com/fallback_pattern* /pattern\tisPattern \r"
465 "isPattern\r" // should not be interpretted as a pattern
466 "http://foo.com/network_pattern* isPattern\r");
469 AppCacheManifest manifest
;
470 EXPECT_TRUE(ParseManifest(kUrl
, kManifestBody
.c_str(),
471 kManifestBody
.length(),
472 PARSE_MANIFEST_ALLOWING_INTERCEPTS
, manifest
));
473 EXPECT_TRUE(manifest
.online_whitelist_all
);
474 EXPECT_EQ(1u, manifest
.explicit_urls
.size());
475 EXPECT_EQ(3u, manifest
.intercept_namespaces
.size());
476 EXPECT_EQ(2u, manifest
.fallback_namespaces
.size());
477 EXPECT_EQ(2u, manifest
.online_whitelist_namespaces
.size());
478 EXPECT_EQ(APPCACHE_INTERCEPT_NAMESPACE
,
479 manifest
.intercept_namespaces
[0].type
);
480 EXPECT_EQ(APPCACHE_FALLBACK_NAMESPACE
, manifest
.fallback_namespaces
[0].type
);
481 EXPECT_EQ(APPCACHE_NETWORK_NAMESPACE
,
482 manifest
.online_whitelist_namespaces
[0].type
);
483 EXPECT_FALSE(manifest
.intercept_namespaces
[0].is_pattern
);
484 EXPECT_TRUE(manifest
.intercept_namespaces
[1].is_pattern
);
485 EXPECT_TRUE(manifest
.intercept_namespaces
[2].is_pattern
);
486 EXPECT_FALSE(manifest
.fallback_namespaces
[0].is_pattern
);
487 EXPECT_TRUE(manifest
.fallback_namespaces
[1].is_pattern
);
488 EXPECT_FALSE(manifest
.online_whitelist_namespaces
[0].is_pattern
);
489 EXPECT_TRUE(manifest
.online_whitelist_namespaces
[1].is_pattern
);
491 GURL("http://foo.com/*/intercept_pattern?query"),
492 manifest
.intercept_namespaces
[2].namespace_url
);
494 GURL("http://foo.com/pattern"),
495 manifest
.intercept_namespaces
[2].target_url
);
497 GURL("http://foo.com/fallback_pattern*"),
498 manifest
.fallback_namespaces
[1].namespace_url
);
500 GURL("http://foo.com/pattern"),
501 manifest
.fallback_namespaces
[1].target_url
);
503 GURL("http://foo.com/isPattern"),
504 manifest
.online_whitelist_namespaces
[0].namespace_url
);
507 manifest
.online_whitelist_namespaces
[0].target_url
);
509 GURL("http://foo.com/network_pattern*"),
510 manifest
.online_whitelist_namespaces
[1].namespace_url
);
513 manifest
.online_whitelist_namespaces
[1].target_url
);
516 } // namespace content