// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_WEB_APP_H__ #define CHROME_BROWSER_WEB_APP_H__ #include #include "base/ref_counted.h" #include "chrome/browser/cancelable_request.h" #include "chrome/browser/gears_integration.h" #include "chrome/browser/history/history.h" #include "chrome/browser/webdata/web_data_service.h" #include "googleurl/src/gurl.h" #include "skia/include/SkBitmap.h" class Profile; class WebContents; // A WebApp represents a page that Gears has installed a shortcut for. A WebApp // has a name, url and set of images (potentially empty). The images are lazily // loaded when asked for. // // The images are first loaded from the WebDatabase. If the images are not in // the WebDB, the list of images is obtained from Gears then downloaded via the // WebContents set by SetWebContents. As images are loaded they are pushed to // the WebDatabase. Observers are notified any time the set of images changes. class WebApp : public base::RefCounted, public WebDataServiceConsumer { public: typedef std::vector Images; // The Observer is notified any time the set of images contained in the WebApp // changes. class Observer { public: virtual void WebAppImagesChanged(WebApp* web_app) = 0; }; // Creates a WebApp by name and url. This variant is only used if Gears // doesn't know about the shortcut. WebApp(Profile* profile, const GURL& url, const std::wstring& name); // Creates a WebApp from a Gears shortcut. WebApp(Profile* profile, const GearsShortcutData& shortcut); ~WebApp(); // Sets the specified image. This is invoked from the WebContents when an // image finishes downloading. If image_url is one of the images this WebApp // asked to download, it is pushed to the database and the observer is // notified. If the image isn't one that was asked for by this WebApp, nothing // happens. void SetImage(const GURL& image_url, const SkBitmap& image); // Returns the set of images. If the images haven't been loaded yet, they are // asked for. const Images& GetImages(); // Convenience to get the favicon from the set of images. If a favicon sized // image isn't found, an empty image is returned. SkBitmap GetFavIcon(); // Name of the app. const std::wstring& name() const { return name_; } // URL to the app. const GURL& url() const { return url_; } // Sets the WebContents that is using this WebApp. This is used if the // database doesn't have all the images. If NULL, images won't be downloaded // if they aren't in the db. void SetWebContents(WebContents* host); // WebContents used to download images; may be null. WebContents* web_contents() { return web_contents_; } void AddObserver(Observer* obs); void RemoveObserver(Observer* obs); private: // Requests the images for this app from the web db. Does nothing if the // images have already been requested. void LoadImagesFromWebData(); // Notification from the WebDB that our request for the images has completed. // This adds all the images from the request to this WebApp, and if not all // images have been downloaded, the images are requested from the webContents. // Similarly if a favicon sized image isn't available, one is asked for from // history. virtual void OnWebDataServiceRequestDone(WebDataService::Handle h, const WDTypedResult* result); // Callback from history when the favicon is available. If we don't have a // favicon sized image, the image is added to this WebApp's list of images. void OnFavIconFromHistory(HistoryService::Handle handle, bool know_favicon, scoped_refptr data, bool expired, GURL icon_url); // Requests the favicon from history. void LoadFavIconFromHistory(); // Asks the hosting WebApp to download all the images. void DownloadImagesFromSite(); // Returns the position of the favicon, or images_.end() if no favicon sized // image is available Images::iterator GetFavIconIterator(); // An URLs in image_urls_ that are data encoded PNGs are extracted and added // to images_. void ExtractPNGEncodedURLs(); void NotifyObservers(); // WebContents used to download images, may be null. WebContents* web_contents_; // Profile used for WebDataservice and History. Profile* profile_; // URL of the app. const GURL url_; // Name of the app. const std::wstring name_; // Have the images been loaded from the WebDB? This is initially false and set // true when GetImages is invoked. bool loaded_images_from_web_data_; // If non-zero, indicates we have a loading pending from the WebDB. WebDataService::Handle image_load_handle_; // Set of images. Images images_; // Set of image urls. std::set image_urls_; // Should the images be downloaded from the page? This is false if we don't // know the set of image urls (weren't created from a GearsShortcutData) or // the image urls in the GearsShortcutData were empty. bool download_images_; // Used for history request for the favicon. CancelableRequestConsumer request_consumer_; ObserverList observer_list_; DISALLOW_EVIL_CONSTRUCTORS(WebApp); }; #endif // CHROME_BROWSER_WEB_APP_H__