OLD | NEW |
(Empty) | |
| 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. |
| 4 |
| 5 #include "ios/chrome/browser/google/google_logo_service.h" |
| 6 |
| 7 #import <Foundation/Foundation.h> |
| 8 |
| 9 #include "base/bind.h" |
| 10 #include "base/strings/sys_string_conversions.h" |
| 11 #include "base/threading/thread_task_runner_handle.h" |
| 12 #include "components/search_engines/template_url_service.h" |
| 13 #include "components/search_provider_logos/google_logo_api.h" |
| 14 #include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
| 15 #include "ios/chrome/browser/search_engines/template_url_service_factory.h" |
| 16 #include "ios/chrome/browser/search_engines/ui_thread_search_terms_data.h" |
| 17 #include "ios/web/public/web_thread.h" |
| 18 #include "net/url_request/url_request_context_getter.h" |
| 19 #include "ui/gfx/image/image.h" |
| 20 |
| 21 using search_provider_logos::Logo; |
| 22 using search_provider_logos::LogoDelegate; |
| 23 using search_provider_logos::LogoTracker; |
| 24 |
| 25 namespace { |
| 26 |
| 27 const char kGoogleDoodleURLPath[] = "async/newtab_mobile"; |
| 28 static NSArray* const kDoodleCacheDirectory = @[ @"Chromium", @"Doodle" ]; |
| 29 |
| 30 // Cache directory for doodle. |
| 31 base::FilePath DoodleDirectory() { |
| 32 NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, |
| 33 NSUserDomainMask, YES); |
| 34 NSString* path = [paths objectAtIndex:0]; |
| 35 NSArray* path_components = |
| 36 [NSArray arrayWithObjects:path, kDoodleCacheDirectory[0], |
| 37 kDoodleCacheDirectory[1], nil]; |
| 38 return base::FilePath( |
| 39 base::SysNSStringToUTF8([NSString pathWithComponents:path_components])); |
| 40 } |
| 41 |
| 42 // Returns the URL where the doodle can be downloaded, e.g. |
| 43 // https://www.google.com/async/newtab_mobile. This depends on the user's |
| 44 // Google domain. |
| 45 GURL GetGoogleDoodleURL(ios::ChromeBrowserState* browser_state) { |
| 46 GURL google_base_url( |
| 47 ios::UIThreadSearchTermsData(browser_state).GoogleBaseURLValue()); |
| 48 // SetPathStr() requires its argument to stay in scope as long as |
| 49 // |replacements| is, so a std::string is needed, instead of a char*. |
| 50 std::string path = kGoogleDoodleURLPath; |
| 51 GURL::Replacements replacements; |
| 52 replacements.SetPathStr(path); |
| 53 |
| 54 return google_base_url.ReplaceComponents(replacements); |
| 55 } |
| 56 |
| 57 class IOSChromeLogoDelegate : public search_provider_logos::LogoDelegate { |
| 58 public: |
| 59 IOSChromeLogoDelegate() {} |
| 60 ~IOSChromeLogoDelegate() override {} |
| 61 |
| 62 // search_provider_logos::LogoDelegate implementation. |
| 63 void DecodeUntrustedImage( |
| 64 const scoped_refptr<base::RefCountedString>& encoded_image, |
| 65 base::Callback<void(const SkBitmap&)> image_decoded_callback) override { |
| 66 SkBitmap bitmap = gfx::Image::CreateFrom1xPNGBytes(encoded_image->front(), |
| 67 encoded_image->size()) |
| 68 .AsBitmap(); |
| 69 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 70 FROM_HERE, base::Bind(image_decoded_callback, bitmap)); |
| 71 } |
| 72 |
| 73 private: |
| 74 DISALLOW_COPY_AND_ASSIGN(IOSChromeLogoDelegate); |
| 75 }; |
| 76 |
| 77 } // namespace |
| 78 |
| 79 GoogleLogoService::GoogleLogoService(ios::ChromeBrowserState* browser_state) |
| 80 : browser_state_(browser_state) {} |
| 81 |
| 82 GoogleLogoService::~GoogleLogoService() {} |
| 83 |
| 84 void GoogleLogoService::GetLogo(search_provider_logos::LogoObserver* observer) { |
| 85 TemplateURLService* template_url_service = |
| 86 ios::TemplateURLServiceFactory::GetForBrowserState(browser_state_); |
| 87 if (!template_url_service) |
| 88 return; |
| 89 |
| 90 TemplateURL* template_url = template_url_service->GetDefaultSearchProvider(); |
| 91 if (!template_url || |
| 92 !template_url->url_ref().HasGoogleBaseURLs( |
| 93 template_url_service->search_terms_data())) |
| 94 return; |
| 95 |
| 96 if (!logo_tracker_) { |
| 97 logo_tracker_.reset(new LogoTracker( |
| 98 DoodleDirectory(), |
| 99 web::WebThread::GetTaskRunnerForThread(web::WebThread::FILE), |
| 100 web::WebThread::GetBlockingPool(), browser_state_->GetRequestContext(), |
| 101 std::unique_ptr<search_provider_logos::LogoDelegate>( |
| 102 new IOSChromeLogoDelegate()))); |
| 103 } |
| 104 |
| 105 logo_tracker_->SetServerAPI( |
| 106 GetGoogleDoodleURL(browser_state_), |
| 107 base::Bind(&search_provider_logos::GoogleParseLogoResponse), |
| 108 base::Bind(&search_provider_logos::GoogleAppendQueryparamsToLogoURL), |
| 109 true, false /* transparent */); |
| 110 logo_tracker_->GetLogo(observer); |
| 111 } |
| 112 |
| 113 void GoogleLogoService::SetCachedLogo(const search_provider_logos::Logo* logo) { |
| 114 if (logo) { |
| 115 if (cached_metadata_.fingerprint == logo->metadata.fingerprint) { |
| 116 return; |
| 117 } |
| 118 logo->image.deepCopyTo(&cached_image_); |
| 119 cached_metadata_ = logo->metadata; |
| 120 } else { |
| 121 cached_image_ = SkBitmap(); |
| 122 cached_metadata_ = empty_metadata; |
| 123 } |
| 124 } |
| 125 |
| 126 search_provider_logos::Logo GoogleLogoService::GetCachedLogo() { |
| 127 search_provider_logos::Logo logo; |
| 128 logo.image = cached_image_; |
| 129 logo.metadata = cached_metadata_; |
| 130 return logo; |
| 131 } |
OLD | NEW |