Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc

Issue 2949993002: Don't ignore manifest icons for sites that don't have a service worker. (Closed)
Patch Set: Create InstallableManager in the unit test Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h" 5 #include "chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 30 matching lines...) Expand all
41 const int kDataTimeoutInMilliseconds = 4000; 41 const int kDataTimeoutInMilliseconds = 4000;
42 42
43 // Looks up the original, online URL of the site requested. The URL from the 43 // Looks up the original, online URL of the site requested. The URL from the
44 // WebContents may be a distilled article which is not appropriate for a home 44 // WebContents may be a distilled article which is not appropriate for a home
45 // screen shortcut. 45 // screen shortcut.
46 GURL GetShortcutUrl(content::BrowserContext* browser_context, 46 GURL GetShortcutUrl(content::BrowserContext* browser_context,
47 const GURL& actual_url) { 47 const GURL& actual_url) {
48 return dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl(actual_url); 48 return dom_distiller::url_utils::GetOriginalUrlFromDistillerUrl(actual_url);
49 } 49 }
50 50
51 InstallableParams ParamsToPerformManifestAndIconFetch(
52 int ideal_icon_size_in_px,
53 int minimum_icon_size_in_px) {
54 InstallableParams params;
55 params.ideal_primary_icon_size_in_px = ideal_icon_size_in_px;
56 params.minimum_primary_icon_size_in_px = minimum_icon_size_in_px;
57 params.fetch_valid_primary_icon = true;
58 return params;
59 }
60
51 InstallableParams ParamsToPerformInstallableCheck( 61 InstallableParams ParamsToPerformInstallableCheck(
52 int ideal_icon_size_in_px, 62 int ideal_icon_size_in_px,
53 int minimum_icon_size_in_px, 63 int minimum_icon_size_in_px,
54 int badge_size_in_px, 64 int badge_size_in_px,
55 bool check_webapk_compatibility) { 65 bool check_webapk_compatibility) {
56 InstallableParams params; 66 InstallableParams params = ParamsToPerformManifestAndIconFetch(
57 params.ideal_primary_icon_size_in_px = ideal_icon_size_in_px; 67 ideal_icon_size_in_px, minimum_icon_size_in_px);
58 params.minimum_primary_icon_size_in_px = minimum_icon_size_in_px;
59 params.check_installable = check_webapk_compatibility;
60 params.fetch_valid_primary_icon = true;
61 if (check_webapk_compatibility) { 68 if (check_webapk_compatibility) {
69 params.check_installable = check_webapk_compatibility;
62 params.ideal_badge_icon_size_in_px = badge_size_in_px; 70 params.ideal_badge_icon_size_in_px = badge_size_in_px;
63 params.minimum_badge_icon_size_in_px = badge_size_in_px; 71 params.minimum_badge_icon_size_in_px = badge_size_in_px;
64 params.fetch_valid_badge_icon = true; 72 params.fetch_valid_badge_icon = true;
65 } 73 }
66 return params; 74 return params;
67 } 75 }
68 76
69 } // namespace 77 } // namespace
70 78
71 AddToHomescreenDataFetcher::AddToHomescreenDataFetcher( 79 AddToHomescreenDataFetcher::AddToHomescreenDataFetcher(
72 content::WebContents* web_contents, 80 content::WebContents* web_contents,
73 int ideal_icon_size_in_px, 81 int ideal_icon_size_in_px,
74 int minimum_icon_size_in_px, 82 int minimum_icon_size_in_px,
75 int ideal_splash_image_size_in_px, 83 int ideal_splash_image_size_in_px,
76 int minimum_splash_image_size_in_px, 84 int minimum_splash_image_size_in_px,
77 int badge_size_in_px, 85 int badge_size_in_px,
78 bool check_webapk_compatibility, 86 bool check_webapk_compatibility,
79 Observer* observer) 87 Observer* observer)
80 : WebContentsObserver(web_contents), 88 : WebContentsObserver(web_contents),
81 background_task_runner_( 89 background_task_runner_(
82 content::BrowserThread::GetBlockingPool() 90 content::BrowserThread::GetBlockingPool()
83 ->GetTaskRunnerWithShutdownBehavior( 91 ->GetTaskRunnerWithShutdownBehavior(
84 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)), 92 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)),
93 installable_manager_(InstallableManager::FromWebContents(web_contents)),
85 weak_observer_(observer), 94 weak_observer_(observer),
86 shortcut_info_(GetShortcutUrl(web_contents->GetBrowserContext(), 95 shortcut_info_(GetShortcutUrl(web_contents->GetBrowserContext(),
87 web_contents->GetLastCommittedURL())), 96 web_contents->GetLastCommittedURL())),
88 ideal_icon_size_in_px_(ideal_icon_size_in_px), 97 ideal_icon_size_in_px_(ideal_icon_size_in_px),
89 minimum_icon_size_in_px_(minimum_icon_size_in_px), 98 minimum_icon_size_in_px_(minimum_icon_size_in_px),
90 ideal_splash_image_size_in_px_(ideal_splash_image_size_in_px), 99 ideal_splash_image_size_in_px_(ideal_splash_image_size_in_px),
91 minimum_splash_image_size_in_px_(minimum_splash_image_size_in_px), 100 minimum_splash_image_size_in_px_(minimum_splash_image_size_in_px),
92 badge_size_in_px_(badge_size_in_px), 101 badge_size_in_px_(badge_size_in_px),
93 check_webapk_compatibility_(check_webapk_compatibility), 102 check_webapk_compatibility_(check_webapk_compatibility),
94 is_waiting_for_web_application_info_(true), 103 is_waiting_for_web_application_info_(true),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 case WebApplicationInfo::MOBILE_CAPABLE_APPLE: 146 case WebApplicationInfo::MOBILE_CAPABLE_APPLE:
138 base::RecordAction( 147 base::RecordAction(
139 base::UserMetricsAction("webapps.AddShortcut.AppShortcutApple")); 148 base::UserMetricsAction("webapps.AddShortcut.AppShortcutApple"));
140 break; 149 break;
141 case WebApplicationInfo::MOBILE_CAPABLE_UNSPECIFIED: 150 case WebApplicationInfo::MOBILE_CAPABLE_UNSPECIFIED:
142 base::RecordAction( 151 base::RecordAction(
143 base::UserMetricsAction("webapps.AddShortcut.Bookmark")); 152 base::UserMetricsAction("webapps.AddShortcut.Bookmark"));
144 break; 153 break;
145 } 154 }
146 155
147 InstallableManager::CreateForWebContents(web_contents());
148 InstallableManager* manager =
149 InstallableManager::FromWebContents(web_contents());
150 DCHECK(manager);
151
152 // Kick off a timeout for downloading data. If we haven't finished within the 156 // Kick off a timeout for downloading data. If we haven't finished within the
153 // timeout, fall back to using a dynamically-generated launcher icon. 157 // timeout, fall back to using a dynamically-generated launcher icon.
154 data_timeout_timer_.Start( 158 data_timeout_timer_.Start(
155 FROM_HERE, base::TimeDelta::FromMilliseconds(kDataTimeoutInMilliseconds), 159 FROM_HERE, base::TimeDelta::FromMilliseconds(kDataTimeoutInMilliseconds),
156 base::Bind(&AddToHomescreenDataFetcher::OnDataTimedout, this)); 160 base::Bind(&AddToHomescreenDataFetcher::OnDataTimedout, this));
157 161
158 manager->GetData( 162 installable_manager_->GetData(
159 ParamsToPerformInstallableCheck(ideal_icon_size_in_px_, 163 ParamsToPerformManifestAndIconFetch(ideal_icon_size_in_px_,
160 minimum_icon_size_in_px_, 164 minimum_icon_size_in_px_),
161 badge_size_in_px_, 165 base::Bind(&AddToHomescreenDataFetcher::OnDidGetManifestAndIcon, this));
162 check_webapk_compatibility_),
163 base::Bind(&AddToHomescreenDataFetcher::OnDidPerformInstallableCheck,
164 this));
165 } 166 }
166 167
167 AddToHomescreenDataFetcher::~AddToHomescreenDataFetcher() { 168 AddToHomescreenDataFetcher::~AddToHomescreenDataFetcher() {
168 DCHECK(!weak_observer_); 169 DCHECK(!weak_observer_);
169 } 170 }
170 171
171 bool AddToHomescreenDataFetcher::OnMessageReceived( 172 bool AddToHomescreenDataFetcher::OnMessageReceived(
172 const IPC::Message& message, 173 const IPC::Message& message,
173 content::RenderFrameHost* sender) { 174 content::RenderFrameHost* sender) {
174 if (!is_waiting_for_web_application_info_) 175 if (!is_waiting_for_web_application_info_)
(...skipping 18 matching lines...) Expand all
193 is_installable_check_complete_ = true; 194 is_installable_check_complete_ = true;
194 if (check_webapk_compatibility_) 195 if (check_webapk_compatibility_)
195 weak_observer_->OnDidDetermineWebApkCompatibility(false); 196 weak_observer_->OnDidDetermineWebApkCompatibility(false);
196 weak_observer_->OnUserTitleAvailable(shortcut_info_.user_title); 197 weak_observer_->OnUserTitleAvailable(shortcut_info_.user_title);
197 } 198 }
198 199
199 badge_icon_.reset(); 200 badge_icon_.reset();
200 CreateLauncherIcon(SkBitmap()); 201 CreateLauncherIcon(SkBitmap());
201 } 202 }
202 203
204 void AddToHomescreenDataFetcher::OnDidGetManifestAndIcon(
205 const InstallableData& data) {
206 if (!web_contents() || !weak_observer_ || is_installable_check_complete_)
207 return;
208
209 if (!data.manifest.IsEmpty()) {
210 base::RecordAction(base::UserMetricsAction("webapps.AddShortcut.Manifest"));
211 shortcut_info_.UpdateFromManifest(data.manifest);
212 shortcut_info_.manifest_url = data.manifest_url;
213 }
214
215 installable_manager_->GetData(
216 ParamsToPerformInstallableCheck(
217 ideal_icon_size_in_px_, minimum_icon_size_in_px_, badge_size_in_px_,
218 check_webapk_compatibility_),
219 base::Bind(&AddToHomescreenDataFetcher::OnDidPerformInstallableCheck,
220 this));
221 }
222
203 void AddToHomescreenDataFetcher::OnDidPerformInstallableCheck( 223 void AddToHomescreenDataFetcher::OnDidPerformInstallableCheck(
204 const InstallableData& data) { 224 const InstallableData& data) {
205 data_timeout_timer_.Stop(); 225 data_timeout_timer_.Stop();
206 badge_icon_.reset(); 226 badge_icon_.reset();
207 227
208 if (!web_contents() || !weak_observer_ || is_installable_check_complete_) 228 if (!web_contents() || !weak_observer_ || is_installable_check_complete_)
209 return; 229 return;
210 230
211 is_installable_check_complete_ = true; 231 is_installable_check_complete_ = true;
212 232
213 bool webapk_compatible = false; 233 bool webapk_compatible = false;
214 if (check_webapk_compatibility_) { 234 if (check_webapk_compatibility_) {
215 webapk_compatible = (data.error_code == NO_ERROR_DETECTED && 235 webapk_compatible = (data.error_code == NO_ERROR_DETECTED &&
216 AreWebManifestUrlsWebApkCompatible(data.manifest)); 236 AreWebManifestUrlsWebApkCompatible(data.manifest));
217 weak_observer_->OnDidDetermineWebApkCompatibility(webapk_compatible); 237 weak_observer_->OnDidDetermineWebApkCompatibility(webapk_compatible);
238 }
218 239
219 if (webapk_compatible) { 240 if (webapk_compatible) {
220 // WebAPKs are wholly defined by the Web Manifest. Ignore the <meta> tag 241 shortcut_info_.UpdateSource(ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_PWA);
221 // data received in OnDidGetWebApplicationInfo(). 242
222 shortcut_info_ = ShortcutInfo(GURL()); 243 if (data.badge_icon && !data.badge_icon->drawsNothing()) {
244 shortcut_info_.best_badge_icon_url = data.badge_icon_url;
245 badge_icon_ = *data.badge_icon;
223 } 246 }
224 } 247 }
225 248
226 if (!data.manifest.IsEmpty()) {
227 base::RecordAction(base::UserMetricsAction("webapps.AddShortcut.Manifest"));
228 shortcut_info_.UpdateFromManifest(data.manifest);
229 shortcut_info_.manifest_url = data.manifest_url;
230
231 if (webapk_compatible) {
232 shortcut_info_.UpdateSource(ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_PWA);
233
234 if (data.badge_icon && !data.badge_icon->drawsNothing()) {
235 shortcut_info_.best_badge_icon_url = data.badge_icon_url;
236 badge_icon_ = *data.badge_icon;
237 }
238 }
239 }
240
241 // Save the splash screen URL for the later download. 249 // Save the splash screen URL for the later download.
242 shortcut_info_.splash_image_url = 250 shortcut_info_.splash_image_url =
243 content::ManifestIconSelector::FindBestMatchingIcon( 251 content::ManifestIconSelector::FindBestMatchingIcon(
244 data.manifest.icons, ideal_splash_image_size_in_px_, 252 data.manifest.icons, ideal_splash_image_size_in_px_,
245 minimum_splash_image_size_in_px_, 253 minimum_splash_image_size_in_px_,
246 content::Manifest::Icon::IconPurpose::ANY); 254 content::Manifest::Icon::IconPurpose::ANY);
247 shortcut_info_.ideal_splash_image_size_in_px = ideal_splash_image_size_in_px_; 255 shortcut_info_.ideal_splash_image_size_in_px = ideal_splash_image_size_in_px_;
248 shortcut_info_.minimum_splash_image_size_in_px = 256 shortcut_info_.minimum_splash_image_size_in_px =
249 minimum_splash_image_size_in_px_; 257 minimum_splash_image_size_in_px_;
250 258
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 353
346 void AddToHomescreenDataFetcher::NotifyObserver(const SkBitmap& primary_icon) { 354 void AddToHomescreenDataFetcher::NotifyObserver(const SkBitmap& primary_icon) {
347 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 355 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
348 if (!web_contents() || !weak_observer_ || is_icon_saved_) 356 if (!web_contents() || !weak_observer_ || is_icon_saved_)
349 return; 357 return;
350 358
351 is_icon_saved_ = true; 359 is_icon_saved_ = true;
352 primary_icon_ = primary_icon; 360 primary_icon_ = primary_icon;
353 weak_observer_->OnDataAvailable(shortcut_info_, primary_icon_, badge_icon_); 361 weak_observer_->OnDataAvailable(shortcut_info_, primary_icon_, badge_icon_);
354 } 362 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698