15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern_set.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iterator> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <ostream> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/stl_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/error_utils.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "url/url_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kInvalidURLPatternError[] = "Invalid url pattern '*'"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLPatternSet::CreateDifference(const URLPatternSet& set1, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLPatternSet& set2, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet* out) { 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) out->patterns_ = base::STLSetDifference<std::set<URLPattern> >( 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) set1.patterns_, set2.patterns_); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLPatternSet::CreateIntersection(const URLPatternSet& set1, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLPatternSet& set2, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet* out) { 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out->patterns_ = base::STLSetIntersection<std::set<URLPattern> >( 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu set1.patterns_, set2.patterns_); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLPatternSet::CreateUnion(const URLPatternSet& set1, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const URLPatternSet& set2, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet* out) { 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out->patterns_ = base::STLSetUnion<std::set<URLPattern> >( 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu set1.patterns_, set2.patterns_); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLPatternSet::CreateUnion(const std::vector<URLPatternSet>& sets, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet* out) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out->ClearPatterns(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sets.empty()) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // N-way union algorithm is basic O(nlog(n)) merge algorithm. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do the first merge step into a working set so that we don't mutate any of 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the input. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<URLPatternSet> working; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < sets.size(); i += 2) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i + 1 < sets.size()) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet u; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet::CreateUnion(sets[i], sets[i + 1], &u); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) working.push_back(u); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) working.push_back(sets[i]); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t skip = 1; skip < working.size(); skip *= 2) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < (working.size() - skip); i += skip) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet u; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPatternSet::CreateUnion(working[i], working[i + skip], &u); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) working[i].patterns_.swap(u.patterns_); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out->patterns_.swap(working[0].patterns_); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLPatternSet::URLPatternSet() {} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLPatternSet::URLPatternSet(const URLPatternSet& rhs) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : patterns_(rhs.patterns_) {} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLPatternSet::URLPatternSet(const std::set<URLPattern>& patterns) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : patterns_(patterns) {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLPatternSet::~URLPatternSet() {} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLPatternSet& URLPatternSet::operator=(const URLPatternSet& rhs) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patterns_ = rhs.patterns_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::operator==(const URLPatternSet& other) const { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return patterns_ == other.patterns_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::ostream& operator<<(std::ostream& out, 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const URLPatternSet& url_pattern_set) { 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch out << "{ "; 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::set<URLPattern>::const_iterator iter = 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_pattern_set.patterns().begin(); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!url_pattern_set.patterns().empty()) { 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch out << *iter; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iter; 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (;iter != url_pattern_set.patterns().end(); ++iter) 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch out << ", " << *iter; 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!url_pattern_set.patterns().empty()) 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch out << " "; 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch out << "}"; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return out; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::is_empty() const { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return patterns_.empty(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t URLPatternSet::size() const { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return patterns_.size(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::AddPattern(const URLPattern& pattern) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return patterns_.insert(pattern).second; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLPatternSet::AddPatterns(const URLPatternSet& set) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patterns_.insert(set.patterns().begin(), 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set.patterns().end()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void URLPatternSet::ClearPatterns() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patterns_.clear(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool URLPatternSet::AddOrigin(int valid_schemes, const GURL& origin) { 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_EQ(origin.GetOrigin(), origin); 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) URLPattern origin_pattern(valid_schemes); 1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Origin adding could fail if |origin| does not match |valid_schemes|. 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (origin_pattern.Parse(origin.GetOrigin().spec()) != 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) URLPattern::PARSE_SUCCESS) { 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) origin_pattern.SetPath("/*"); 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return AddPattern(origin_pattern); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool URLPatternSet::Contains(const URLPatternSet& other) const { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (URLPatternSet::const_iterator it = other.begin(); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != other.end(); ++it) { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ContainsPattern(*it)) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)bool URLPatternSet::ContainsPattern(const URLPattern& pattern) const { 1685e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) for (URLPatternSet::const_iterator it = begin(); 1695e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) it != end(); ++it) { 1705e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (it->Contains(pattern)) 1715e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) return true; 1725e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 1735e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) return false; 1745e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)} 1755e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::MatchesURL(const GURL& url) const { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (URLPatternSet::const_iterator pattern = patterns_.begin(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pattern != patterns_.end(); ++pattern) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pattern->MatchesURL(url)) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool URLPatternSet::MatchesAllURLs() const { 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (URLPatternSet::const_iterator host = begin(); host != end(); ++host) { 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (host->match_all_urls() || 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) (host->match_subdomains() && host->host().empty())) 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::MatchesSecurityOrigin(const GURL& origin) const { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (URLPatternSet::const_iterator pattern = patterns_.begin(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pattern != patterns_.end(); ++pattern) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pattern->MatchesSecurityOrigin(origin)) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::OverlapsWith(const URLPatternSet& other) const { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two extension extents overlap if there is any one URL that would match at 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // least one pattern in each of the extents. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (URLPatternSet::const_iterator i = patterns_.begin(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != patterns_.end(); ++i) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (URLPatternSet::const_iterator j = other.patterns().begin(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j != other.patterns().end(); ++j) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i->OverlapsWith(*j)) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<base::ListValue> URLPatternSet::ToValue() const { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ListValue> value(new base::ListValue); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (URLPatternSet::const_iterator i = patterns_.begin(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != patterns_.end(); ++i) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value->AppendIfNotPresent(new base::StringValue(i->GetAsString())); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value.Pass(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::Populate(const std::vector<std::string>& patterns, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int valid_schemes, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_file_access, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* error) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearPatterns(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < patterns.size(); ++i) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLPattern pattern(valid_schemes); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pattern.Parse(patterns[i]) != URLPattern::PARSE_SUCCESS) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error) { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error = ErrorUtils::FormatErrorMessage(kInvalidURLPatternError, 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) patterns[i]); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid url pattern: " << patterns[i]; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!allow_file_access && pattern.MatchesScheme(url::kFileScheme)) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pattern.SetValidSchemes( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pattern.valid_schemes() & ~URLPattern::SCHEME_FILE); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPattern(pattern); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<std::vector<std::string> > URLPatternSet::ToStringVector() const { 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<std::vector<std::string> > value(new std::vector<std::string>); 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (URLPatternSet::const_iterator i = patterns_.begin(); 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) i != patterns_.end(); 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ++i) { 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) value->push_back(i->GetAsString()); 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::unique(value->begin(), value->end()); 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return value.Pass(); 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLPatternSet::Populate(const base::ListValue& value, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int valid_schemes, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_file_access, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* error) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> patterns; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < value.GetSize(); ++i) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string item; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.GetString(i, &item)) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) patterns.push_back(item); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Populate(patterns, valid_schemes, allow_file_access, error); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 279