Chromium Code Reviews| Index: chrome/browser/ui/webui/ntp/thumbnail_source.cc |
| diff --git a/chrome/browser/ui/webui/ntp/thumbnail_source.cc b/chrome/browser/ui/webui/ntp/thumbnail_source.cc |
| index ac6bcbe62f635338b27e9c01e9e2231733a0ad3b..ffdc0d51a6fe633aa51b40682738a04e50c6f90c 100644 |
| --- a/chrome/browser/ui/webui/ntp/thumbnail_source.cc |
| +++ b/chrome/browser/ui/webui/ntp/thumbnail_source.cc |
| @@ -24,7 +24,6 @@ using content::BrowserThread; |
| // Set ThumbnailService now as Profile isn't thread safe. |
| ThumbnailSource::ThumbnailSource(Profile* profile) |
| : thumbnail_service_(ThumbnailServiceFactory::GetForProfile(profile)), |
| - current_request_(NULL), |
| profile_(profile) { |
| } |
| @@ -40,11 +39,16 @@ void ThumbnailSource::StartDataRequest( |
| bool is_incognito, |
| const content::URLDataSource::GotDataCallback& callback) { |
| // Translate to regular path if |raw_path| is of the form |
| - // chrome-search://favicon/<rid>, where rid is a uint64. |
| + // chrome-search://favicon/<id> or chrome-search://thumb/<id>, where <id> is |
| + // an integer. |
| std::string path = raw_path; |
| if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
| - path = InstantService::MaybeTranslateInstantPathOnIO( |
| - current_request_, raw_path); |
| + std::map<std::string, std::string>::iterator it = |
| + id_to_url_map_.find(raw_path); |
| + if (it != id_to_url_map_.end()) { |
| + path = id_to_url_map_[raw_path]; |
| + id_to_url_map_.erase(it); |
| + } |
| } else if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| path = InstantService::MaybeTranslateInstantPathOnUI(profile_, raw_path); |
| } |
| @@ -56,7 +60,6 @@ void ThumbnailSource::StartDataRequest( |
| } else { |
| callback.Run(default_thumbnail_); |
| } |
| - current_request_ = NULL; |
| } |
| std::string ThumbnailSource::GetMimeType(const std::string&) const { |
| @@ -74,10 +77,21 @@ MessageLoop* ThumbnailSource::MessageLoopForRequestPath( |
| bool ThumbnailSource::ShouldServiceRequest( |
| const net::URLRequest* request) const { |
| - current_request_ = request; |
| if (request->url().SchemeIs(chrome::kChromeSearchScheme)) { |
| - return InstantService::IsInstantPath(request->url()) && |
| - InstantIOContext::ShouldServiceRequest(request); |
| + if (InstantService::IsInstantPath(request->url()) && |
| + InstantIOContext::ShouldServiceRequest(request)) { |
| + // If this request will be serviced on the IO thread, then do the |
| + // translation from raw_path to path here, where we have the |request| |
| + // object in-hand, saving the result for later use. |
| + std::string raw_path = request->url().path().substr(1); |
|
Dan Beam
2013/03/20 19:26:13
why .substr(1)?
dhollowa
2013/03/20 19:58:54
Done. Added comment.
|
| + if (!MessageLoopForRequestPath(raw_path)) { |
| + std::string path = |
| + InstantService::MaybeTranslateInstantPathOnIO(request, raw_path); |
| + id_to_url_map_[raw_path] = path; |
|
Dan Beam
2013/03/20 19:26:13
nit:
id_to_url_map_[raw_path] =
InstantSe
dhollowa
2013/03/20 19:58:54
Done.
|
| + } |
| + return true; |
| + } |
|
Dan Beam
2013/03/20 19:26:13
should there be a NOTREACHED() here or anything?
dhollowa
2013/03/20 19:58:54
Not really, no. It is allowable to request a non-
|
| + return false; |
| } |
| return URLDataSource::ShouldServiceRequest(request); |
| } |