1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
|
// 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/memory/scoped_ptr.h"
#include "base/time.h"
#include "base/values.h"
#include "chrome/browser/prerender/prerender_final_status.h"
#include "content/browser/tab_contents/tab_contents_observer.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/common/notification_registrar.h"
class Profile;
class RenderViewHost;
class TabContents;
class TabContentsWrapper;
struct FaviconURL;
struct ViewHostMsg_FrameNavigate_Params;
namespace base {
class ProcessMetrics;
}
namespace gfx {
class Rect;
}
namespace prerender {
class PrerenderManager;
class PrerenderRenderViewHostObserver;
class PrerenderTracker;
// 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 NotificationObserver,
public TabContentsObserver {
public:
// PrerenderContents::Create uses the currently registered Factory to create
// the PrerenderContents. Factory is intended for testing.
class Factory {
public:
Factory() {}
virtual ~Factory() {}
// Ownership is not transfered through this interface as prerender_manager,
// prerender_tracker, and profile are stored as weak pointers.
virtual PrerenderContents* CreatePrerenderContents(
PrerenderManager* prerender_manager,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
const GURL& referrer,
Origin origin,
uint8 experiment_id) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(Factory);
};
virtual ~PrerenderContents();
bool Init();
static Factory* CreateFactory();
// |source_render_view_host| is the RenderViewHost that initiated
// prerendering. It must be non-NULL and have its own view. It is used
// solely to determine the window bounds while prerendering.
virtual void StartPrerendering(const RenderViewHost* source_render_view_host);
// Verifies that the prerendering is not using too many resources, and kills
// it if not.
void DestroyWhenUsingTooManyResources();
RenderViewHost* render_view_host_mutable();
const RenderViewHost* render_view_host() const;
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_; }
const GURL& prerender_url() const { return prerender_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 { return final_status_; }
Origin origin() const { return origin_; }
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. |matching_url| is optional and will be
// set to the URL that is found as a match if it is provided.
bool MatchesURL(const GURL& url, GURL* matching_url) const;
void OnJSOutOfMemory();
void OnRunJavaScriptMessage(const string16& message,
const string16& default_prompt,
const GURL& frame_url,
const int flags,
bool* did_suppress_message,
string16* prompt_field);
virtual void OnRenderViewGone(int status, int exit_code);
// TabContentsObserver implementation.
virtual void DidStopLoading() OVERRIDE;
// NotificationObserver
virtual void Observe(int type,
const NotificationSource& source,
const NotificationDetails& details) OVERRIDE;
// Adds an alias URL, for one of the many redirections. If the URL can not
// be prerendered - for example, it's an ftp URL - |this| will be destroyed
// and false is returned. Otherwise, true is returned and the alias is
// remembered.
virtual bool AddAliasURL(const GURL& url);
// The preview TabContents (may be null).
TabContentsWrapper* prerender_contents() const {
return prerender_contents_.get();
}
TabContentsWrapper* ReleasePrerenderContents();
// Sets the final status, calls OnDestroy and adds |this| to the
// PrerenderManager's pending deletes list.
void Destroy(FinalStatus reason);
// Applies all the URL history encountered during prerendering to the
// new tab.
void CommitHistory(TabContentsWrapper* tab);
int32 starting_page_id() { return starting_page_id_; }
base::Value* GetAsValue() const;
// Returns whether a pending cross-site navigation is happening.
// This could happen with renderer-issued navigations, such as a
// MouseEvent being dispatched by a link to a website installed as an app.
bool IsCrossSiteNavigationPending() const;
protected:
PrerenderContents(PrerenderManager* prerender_manager,
PrerenderTracker* prerender_tracker,
Profile* profile,
const GURL& url,
const GURL& referrer,
Origin origin,
uint8 experiment_id);
NotificationRegistrar& notification_registrar() {
return notification_registrar_;
}
// Called whenever a RenderViewHost is created for prerendering. Only called
// once the RenderViewHost has a RenderView and RenderWidgetHostView.
virtual void OnRenderViewHostCreated(RenderViewHost* new_render_view_host);
private:
class TabContentsDelegateImpl;
// Needs to be able to call the constructor.
friend class PrerenderContentsFactoryImpl;
friend class PrerenderRenderViewHostObserver;
// Message handlers.
void OnDidStartProvisionalLoadForFrame(int64 frame_id,
bool main_frame,
bool has_opener_set,
const GURL& url);
void OnUpdateFaviconURL(int32 page_id, const std::vector<FaviconURL>& urls);
// Returns the RenderViewHost Delegate for this prerender.
RenderViewHostDelegate* GetRenderViewHostDelegate();
// Returns the ProcessMetrics for the render process, if it exists.
base::ProcessMetrics* MaybeGetProcessMetrics();
// The prerender manager owning this object.
PrerenderManager* prerender_manager_;
// The prerender tracker tracking prerenders.
PrerenderTracker* prerender_tracker_;
// 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 notification_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_;
// This must be the same value as the PrerenderTracker has recorded for
// |this|, when |this| has a RenderView.
FinalStatus final_status_;
bool prerendering_has_started_;
// Tracks whether or not prerendering has been cancelled by calling Destroy.
// Used solely to prevent double deletion.
bool prerendering_has_been_cancelled_;
// 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_;
// The prerendered TabContents; may be null.
scoped_ptr<TabContentsWrapper> prerender_contents_;
scoped_ptr<PrerenderRenderViewHostObserver> render_view_host_observer_;
scoped_ptr<TabContentsDelegateImpl> tab_contents_delegate_;
// These are -1 before a RenderView is created.
int child_id_;
int route_id_;
// Page ID at which prerendering started.
int32 starting_page_id_;
// Origin for this prerender.
Origin origin_;
// Experiment during which this prerender is performed.
uint8 experiment_id_;
// Offset by which to offset prerendered pages
static const int32 kPrerenderPageIdOffset = 10;
DISALLOW_COPY_AND_ASSIGN(PrerenderContents);
};
} // namespace prerender
#endif // CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
|