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 #ifndef CHROME_BROWSER_SEARCH_SUGGESTIONS_SUGGESTIONS_SOURCE_H_ 6 #define CHROME_BROWSER_SEARCH_SUGGESTIONS_SUGGESTIONS_SOURCE_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/basictypes.h" 12 #include "base/callback.h" 13 #include "base/memory/weak_ptr.h" 14 #include "chrome/browser/search/suggestions/proto/suggestions.pb.h" 15 #include "content/public/browser/url_data_source.h" 16 #include "url/gurl.h" 17 18 class Profile; 19 class SkBitmap; 20 21 namespace base { 22 class RefCountedMemory; 23 } // namespace base 24 25 namespace suggestions { 26 27 // SuggestionsSource renders a webpage to list SuggestionsService data. 28 class SuggestionsSource : public content::URLDataSource { 29 public: 30 explicit SuggestionsSource(Profile* profile); 31 32 // content::URLDataSource implementation. 33 virtual std::string GetSource() const OVERRIDE; 34 virtual void StartDataRequest( 35 const std::string& path, int render_process_id, int render_frame_id, 36 const content::URLDataSource::GotDataCallback& callback) OVERRIDE; 37 virtual std::string GetMimeType(const std::string& path) const OVERRIDE; 38 virtual base::MessageLoop* MessageLoopForRequestPath( 39 const std::string& path) const OVERRIDE; 40 virtual bool ShouldServiceRequest( 41 const net::URLRequest* request) const OVERRIDE; 42 43 private: 44 virtual ~SuggestionsSource(); 45 46 // Container for the state of a request. 47 struct RequestContext { 48 RequestContext( 49 const suggestions::SuggestionsProfile& suggestions_profile_in, 50 const content::URLDataSource::GotDataCallback& callback_in); 51 ~RequestContext(); 52 53 const suggestions::SuggestionsProfile suggestions_profile; 54 const content::URLDataSource::GotDataCallback callback; 55 std::map<GURL, std::string> base64_encoded_pngs; 56 }; 57 58 // Callback for suggestions from SuggestionsService. 59 void OnSuggestionsAvailable( 60 const content::URLDataSource::GotDataCallback& callback, 61 const SuggestionsProfile& suggestions_profile); 62 63 // Callback for responses from each ThumbnailManager request. 64 void OnThumbnailAvailable(RequestContext* context, base::Closure barrier, 65 const GURL& url, const SkBitmap* bitmap); 66 67 // Callback for when all requests are complete. Renders the output webpage and 68 // passes the result to the original caller. 69 void OnThumbnailsFetched(RequestContext* context); 70 71 // Only used when servicing requests on the UI thread. 72 Profile* const profile_; 73 74 // For callbacks may be run after destruction. 75 base::WeakPtrFactory<SuggestionsSource> weak_ptr_factory_; 76 77 DISALLOW_COPY_AND_ASSIGN(SuggestionsSource); 78 }; 79 80 } // namespace suggestions 81 82 #endif // CHROME_BROWSER_SEARCH_SUGGESTIONS_SUGGESTIONS_SOURCE_H_ 83