| // 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_ |