Commit 20ca225e authored by huangs's avatar huangs Committed by Commit bot

[Thumbnails] Injecting TopSites into ThumbnailListSource.

Previously we store Profile and use it to retrieve TopSites. This caused
debug mode crash when we tried to retrieve TopSites from Profile from a
different thread. By storing TopSites directly this problem is averted.

BUG=468141

Review URL: https://codereview.chromium.org/1021803002

Cr-Commit-Position: refs/heads/master@{#321488}
parent e32b923c
...@@ -18,9 +18,12 @@ ...@@ -18,9 +18,12 @@
#include "chrome/browser/thumbnails/thumbnail_service_factory.h" #include "chrome/browser/thumbnails/thumbnail_service_factory.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "components/history/core/browser/top_sites.h" #include "components/history/core/browser/top_sites.h"
#include "content/public/browser/browser_thread.h"
#include "net/base/escape.h" #include "net/base/escape.h"
#include "net/url_request/url_request.h" #include "net/url_request/url_request.h"
using content::BrowserThread;
namespace { namespace {
const char kHtmlHeader[] = const char kHtmlHeader[] =
...@@ -79,7 +82,7 @@ void RenderMostVisitedURLList( ...@@ -79,7 +82,7 @@ void RenderMostVisitedURLList(
ThumbnailListSource::ThumbnailListSource(Profile* profile) ThumbnailListSource::ThumbnailListSource(Profile* profile)
: thumbnail_service_(ThumbnailServiceFactory::GetForProfile(profile)), : thumbnail_service_(ThumbnailServiceFactory::GetForProfile(profile)),
profile_(profile), top_sites_(TopSitesFactory::GetForProfile(profile)),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
} }
...@@ -95,14 +98,13 @@ void ThumbnailListSource::StartDataRequest( ...@@ -95,14 +98,13 @@ void ThumbnailListSource::StartDataRequest(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
const content::URLDataSource::GotDataCallback& callback) { const content::URLDataSource::GotDataCallback& callback) {
scoped_refptr<history::TopSites> top_sites = DCHECK_CURRENTLY_ON(BrowserThread::IO);
TopSitesFactory::GetForProfile(profile_); if (!top_sites_) {
if (!top_sites) {
callback.Run(NULL); callback.Run(NULL);
return; return;
} }
top_sites->GetMostVisitedURLs( top_sites_->GetMostVisitedURLs(
base::Bind(&ThumbnailListSource::OnMostVisitedURLsAvailable, base::Bind(&ThumbnailListSource::OnMostVisitedURLsAvailable,
weak_ptr_factory_.GetWeakPtr(), callback), weak_ptr_factory_.GetWeakPtr(), callback),
true); true);
...@@ -133,6 +135,7 @@ bool ThumbnailListSource::ShouldReplaceExistingSource() const { ...@@ -133,6 +135,7 @@ bool ThumbnailListSource::ShouldReplaceExistingSource() const {
void ThumbnailListSource::OnMostVisitedURLsAvailable( void ThumbnailListSource::OnMostVisitedURLsAvailable(
const content::URLDataSource::GotDataCallback& callback, const content::URLDataSource::GotDataCallback& callback,
const history::MostVisitedURLList& mvurl_list) { const history::MostVisitedURLList& mvurl_list) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
const size_t num_mv = mvurl_list.size(); const size_t num_mv = mvurl_list.size();
size_t num_mv_with_thumb = 0; size_t num_mv_with_thumb = 0;
......
...@@ -19,6 +19,10 @@ namespace base { ...@@ -19,6 +19,10 @@ namespace base {
class RefCountedMemory; class RefCountedMemory;
} }
namespace history {
class TopSites;
}
namespace thumbnails { namespace thumbnails {
class ThumbnailService; class ThumbnailService;
} }
...@@ -33,11 +37,13 @@ class ThumbnailListSource : public content::URLDataSource { ...@@ -33,11 +37,13 @@ class ThumbnailListSource : public content::URLDataSource {
// content::URLDataSource implementation. // content::URLDataSource implementation.
std::string GetSource() const override; std::string GetSource() const override;
// Called on the IO thread.
void StartDataRequest( void StartDataRequest(
const std::string& path, const std::string& path,
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
const content::URLDataSource::GotDataCallback& callback) override; const content::URLDataSource::GotDataCallback& callback) override;
std::string GetMimeType(const std::string& path) const override; std::string GetMimeType(const std::string& path) const override;
base::MessageLoop* MessageLoopForRequestPath( base::MessageLoop* MessageLoopForRequestPath(
const std::string& path) const override; const std::string& path) const override;
...@@ -47,6 +53,7 @@ class ThumbnailListSource : public content::URLDataSource { ...@@ -47,6 +53,7 @@ class ThumbnailListSource : public content::URLDataSource {
private: private:
~ThumbnailListSource() override; ~ThumbnailListSource() override;
// Called on the IO thread.
void OnMostVisitedURLsAvailable( void OnMostVisitedURLsAvailable(
const content::URLDataSource::GotDataCallback& callback, const content::URLDataSource::GotDataCallback& callback,
const history::MostVisitedURLList& mvurl_list); const history::MostVisitedURLList& mvurl_list);
...@@ -54,8 +61,7 @@ class ThumbnailListSource : public content::URLDataSource { ...@@ -54,8 +61,7 @@ class ThumbnailListSource : public content::URLDataSource {
// ThumbnailService. // ThumbnailService.
scoped_refptr<thumbnails::ThumbnailService> thumbnail_service_; scoped_refptr<thumbnails::ThumbnailService> thumbnail_service_;
// Only used when servicing requests on the UI thread. scoped_refptr<history::TopSites> top_sites_;
Profile* const profile_;
// For callbacks may be run after destruction. // For callbacks may be run after destruction.
base::WeakPtrFactory<ThumbnailListSource> weak_ptr_factory_; base::WeakPtrFactory<ThumbnailListSource> weak_ptr_factory_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment