blob: 81152e3f8701ff9e6d7545bb09a3be454999f389 [file] [log] [blame]
// Copyright (c) 2011 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_PRERENDER_PRERENDER_CONTENTS_H_
#define CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
#pragma once
#include <string>
#include <vector>
#include "base/scoped_ptr.h"
#include "base/time.h"
#include "chrome/browser/prerender/prerender_final_status.h"
#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h"
#include "chrome/common/view_types.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/common/notification_registrar.h"
#include "content/common/window_container_type.h"
#include "webkit/glue/window_open_disposition.h"
class TabContents;
struct FaviconURL;
struct WebPreferences;
struct ViewHostMsg_FrameNavigate_Params;
namespace base {
class ProcessMetrics;
}
namespace gfx {
class Rect;
}
namespace prerender {
class PrerenderManager;
// This class is a peer of TabContents. It can host a renderer, but does not
// have any visible display. Its navigation is not managed by a
// NavigationController because is has no facility for navigating (other than
// programatically view window.location.href) or RenderViewHostManager because
// it is never allowed to navigate across a SiteInstance boundary.
class PrerenderContents : public RenderViewHostDelegate,
public RenderViewHostDelegate::View,
public NotificationObserver,
public JavaScriptAppModalDialogDelegate {
public:
// PrerenderContents::Create uses the currently registered Factory to create
// the PrerenderContents. Factory is intended for testing.
class Factory {
public:
Factory() {}
virtual ~Factory() {}
virtual PrerenderContents* CreatePrerenderContents(
PrerenderManager* prerender_manager, Profile* profile, const GURL& url,
const std::vector<GURL>& alias_urls, const GURL& referrer) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(Factory);
};
virtual ~PrerenderContents();
static Factory* CreateFactory();
virtual void StartPrerendering();
// Verifies that the prerendering is not using too many resources, and kills
// it if not.
void DestroyWhenUsingTooManyResources();
RenderViewHost* render_view_host() { return render_view_host_; }
// Allows replacing of the RenderViewHost owned by this class, including
// replacing with a NULL value. When a caller uses this, the caller will
// own (and is responsible for freeing) the old RVH.
void set_render_view_host(RenderViewHost* rvh) { render_view_host_ = rvh; }
ViewHostMsg_FrameNavigate_Params* navigate_params() {
return navigate_params_.get();
}
string16 title() const { return title_; }
int32 page_id() const { return page_id_; }
GURL icon_url() const { return icon_url_; }
bool has_stopped_loading() const { return has_stopped_loading_; }
bool prerendering_has_started() const { return prerendering_has_started_; }
// Sets the parameter to the value of the associated RenderViewHost's child id
// and returns a boolean indicating the validity of that id.
virtual bool GetChildId(int* child_id) const;
// Sets the parameter to the value of the associated RenderViewHost's route id
// and returns a boolean indicating the validity of that id.
virtual bool GetRouteId(int* route_id) const;
// Set the final status for how the PrerenderContents was used. This
// should only be called once, and should be called before the prerender
// contents are destroyed.
void set_final_status(FinalStatus final_status);
FinalStatus final_status() const;
base::TimeTicks load_start_time() const { return load_start_time_; }
// Indicates whether this prerendered page can be used for the provided
// URL, i.e. whether there is a match.
bool MatchesURL(const GURL& url) const;
// RenderViewHostDelegate implementation.
virtual RenderViewHostDelegate::View* GetViewDelegate();
virtual const GURL& GetURL() const;
virtual ViewType::Type GetRenderViewType() const;
virtual int GetBrowserWindowID() const;
virtual void DidNavigate(RenderViewHost* render_view_host,
const ViewHostMsg_FrameNavigate_Params& params);
virtual void UpdateTitle(RenderViewHost* render_view_host,
int32 page_id,
const std::wstring& title);
virtual WebPreferences GetWebkitPrefs();
virtual void RunJavaScriptMessage(const std::wstring& message,
const std::wstring& default_prompt,
const GURL& frame_url,
const int flags,
IPC::Message* reply_msg,
bool* did_suppress_message);
virtual void Close(RenderViewHost* render_view_host);
virtual void DidStopLoading();
virtual RendererPreferences GetRendererPrefs(Profile* profile) const;
// RenderViewHostDelegate::View
virtual void CreateNewWindow(
int route_id,
const ViewHostMsg_CreateWindow_Params& params);
virtual void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type);
virtual void CreateNewFullscreenWidget(int route_id);
virtual void ShowCreatedWindow(int route_id,
WindowOpenDisposition disposition,
const gfx::Rect& initial_pos,
bool user_gesture);
virtual void ShowCreatedWidget(int route_id,
const gfx::Rect& initial_pos);
virtual void ShowCreatedFullscreenWidget(int route_id);
virtual void ShowContextMenu(const ContextMenuParams& params) {}
virtual void ShowPopupMenu(const gfx::Rect& bounds,
int item_height,
double item_font_size,
int selected_item,
const std::vector<WebMenuItem>& items,
bool right_aligned) {}
virtual void StartDragging(const WebDropData& drop_data,
WebKit::WebDragOperationsMask allowed_operations,
const SkBitmap& image,
const gfx::Point& image_offset) {}
virtual void UpdateDragCursor(WebKit::WebDragOperation operation) {}
virtual void GotFocus() {}
virtual void TakeFocus(bool reverse) {}
virtual void LostCapture() {}
virtual void Activate() {}
virtual void Deactivate() {}
virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut);
virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
virtual void HandleMouseMove() {}
virtual void HandleMouseDown() {}
virtual void HandleMouseLeave() {}
virtual void HandleMouseUp() {}
virtual void HandleMouseActivate() {}
virtual void UpdatePreferredSize(const gfx::Size& new_size) {}
// NotificationObserver
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Overridden from JavaScriptAppModalDialogDelegate:
virtual void OnMessageBoxClosed(IPC::Message* reply_msg,
bool success,
const std::wstring& prompt);
virtual void SetSuppressMessageBoxes(bool suppress_message_boxes) {}
virtual gfx::NativeWindow GetMessageBoxRootWindow();
virtual TabContents* AsTabContents();
virtual ExtensionHost* AsExtensionHost();
virtual void UpdateInspectorSetting(const std::string& key,
const std::string& value);
virtual void ClearInspectorSettings();
virtual void OnJSOutOfMemory();
virtual void RendererUnresponsive(RenderViewHost* render_view_host,
bool is_during_unload);
protected:
PrerenderContents(PrerenderManager* prerender_manager, Profile* profile,
const GURL& url, const std::vector<GURL>& alias_urls,
const GURL& referrer);
// from RenderViewHostDelegate.
virtual bool OnMessageReceived(const IPC::Message& message);
const GURL& prerender_url() const { return prerender_url_; }
private:
// Needs to be able to call the constructor.
friend class PrerenderContentsFactoryImpl;
// Message handlers.
void OnDidStartProvisionalLoadForFrame(int64 frame_id,
bool main_frame,
const GURL& url);
void OnUpdateFaviconURL(int32 page_id, const std::vector<FaviconURL>& urls);
void OnMaybeCancelPrerenderForHTML5Media();
// Adds an alias URL, for one of the many redirections. Returns whether
// the URL is valid.
bool AddAliasURL(const GURL& url);
// Remove |this| from the PrerenderManager, set a final status, and
// delete |this|.
void Destroy(FinalStatus reason);
// Returns the ProcessMetrics for the render process, if it exists.
base::ProcessMetrics* MaybeGetProcessMetrics();
// The prerender manager owning this object.
PrerenderManager* prerender_manager_;
// The host for our HTML content.
RenderViewHost* render_view_host_;
// Common implementations of some RenderViewHostDelegate::View methods.
RenderViewHostDelegateViewHelper delegate_view_helper_;
// The URL being prerendered.
GURL prerender_url_;
// The referrer.
GURL referrer_;
// The NavigationParameters of the finished navigation.
scoped_ptr<ViewHostMsg_FrameNavigate_Params> navigate_params_;
// The profile being used
Profile* profile_;
// Information about the title and URL of the page that this class as a
// RenderViewHostDelegate has received from the RenderView.
// Used to apply to the new RenderViewHost delegate that might eventually
// own the contained RenderViewHost when the prerendered page is shown
// in a TabContents.
string16 title_;
int32 page_id_;
GURL url_;
GURL icon_url_;
NotificationRegistrar registrar_;
// A vector of URLs that this prerendered page matches against.
// This array can contain more than element as a result of redirects,
// such as HTTP redirects or javascript redirects.
std::vector<GURL> alias_urls_;
bool has_stopped_loading_;
FinalStatus final_status_;
bool prerendering_has_started_;
// Time at which we started to load the URL. This is used to compute
// the time elapsed from initiating a prerender until the time the
// (potentially only partially) prerendered page is shown to the user.
base::TimeTicks load_start_time_;
// Process Metrics of the render process associated with the
// RenderViewHost for this object.
scoped_ptr<base::ProcessMetrics> process_metrics_;
// Maximum amount of private memory that may be used per PrerenderContents,
// in MB.
static const int kMaxPrerenderPrivateMB = 100;
DISALLOW_COPY_AND_ASSIGN(PrerenderContents);
};
} // prerender
#endif // CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_