| Index: ios/web/public/favicon_url.cc
 | 
| diff --git a/ios/web/public/favicon_url.cc b/ios/web/public/favicon_url.cc
 | 
| index 9906b357185d4d594a78fc1cca584cfc5095562c..08ec682d654cc30492317e7dfac8c08f7bf69760 100644
 | 
| --- a/ios/web/public/favicon_url.cc
 | 
| +++ b/ios/web/public/favicon_url.cc
 | 
| @@ -4,6 +4,8 @@
 | 
|  
 | 
|  #include "ios/web/public/favicon_url.h"
 | 
|  
 | 
| +#include "base/values.h"
 | 
| +
 | 
|  namespace web {
 | 
|  
 | 
|  FaviconURL::FaviconURL()
 | 
| @@ -20,4 +22,31 @@ FaviconURL::FaviconURL(const FaviconURL& other) = default;
 | 
|  FaviconURL::~FaviconURL() {
 | 
|  }
 | 
|  
 | 
| +bool ExtractFaviconURL(base::ListValue* favicons,
 | 
| +                       std::vector<web::FaviconURL>& result_urls) {
 | 
| +  for (size_t fav_idx = 0; fav_idx != favicons->GetSize(); ++fav_idx) {
 | 
| +    base::DictionaryValue* favicon = nullptr;
 | 
| +    if (!favicons->GetDictionary(fav_idx, &favicon))
 | 
| +      return false;
 | 
| +    std::string href;
 | 
| +    std::string rel;
 | 
| +    if (!favicon->GetString("href", &href)) {
 | 
| +      DLOG(WARNING) << "JS message parameter not found: href";
 | 
| +      return false;
 | 
| +    }
 | 
| +    if (!favicon->GetString("rel", &rel)) {
 | 
| +      DLOG(WARNING) << "JS message parameter not found: rel";
 | 
| +      return false;
 | 
| +    }
 | 
| +    web::FaviconURL::IconType icon_type = web::FaviconURL::FAVICON;
 | 
| +    if (rel == "apple-touch-icon")
 | 
| +      icon_type = web::FaviconURL::TOUCH_ICON;
 | 
| +    else if (rel == "apple-touch-icon-precomposed")
 | 
| +      icon_type = web::FaviconURL::TOUCH_PRECOMPOSED_ICON;
 | 
| +    result_urls.push_back(
 | 
| +        web::FaviconURL(GURL(href), icon_type, std::vector<gfx::Size>()));
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
|  } // namespace web
 | 
| 
 |