Home | History | Annotate | Download | only in suggestions
      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