blob: 394481f7e21e6f9a198a415027308f31860642dd [file] [log] [blame]
// 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 <vector>
#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<WebApp>, public WebDataServiceConsumer {
public:
typedef std::vector<SkBitmap> 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<RefCountedBytes> 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<GURL> 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> observer_list_;
DISALLOW_EVIL_CONSTRUCTORS(WebApp);
};
#endif // CHROME_BROWSER_WEB_APP_H__