Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(620)

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.h

Issue 117693002: Make RenderFrameHostManager swap RenderFrameHosts, not RenderViewHosts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ 5 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_
6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ 6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/weak_ptr.h" 11 #include "base/memory/weak_ptr.h"
12 #include "content/browser/renderer_host/render_view_host_delegate.h" 12 #include "content/browser/renderer_host/render_view_host_delegate.h"
13 #include "content/browser/site_instance_impl.h" 13 #include "content/browser/site_instance_impl.h"
14 #include "content/common/content_export.h" 14 #include "content/common/content_export.h"
15 #include "content/public/browser/notification_observer.h" 15 #include "content/public/browser/notification_observer.h"
16 #include "content/public/browser/notification_registrar.h" 16 #include "content/public/browser/notification_registrar.h"
17 #include "content/public/common/referrer.h" 17 #include "content/public/common/referrer.h"
18 18
19 19
20 namespace content { 20 namespace content {
21 class BrowserContext; 21 class BrowserContext;
22 class InterstitialPageImpl; 22 class InterstitialPageImpl;
23 class FrameTreeNode;
23 class NavigationControllerImpl; 24 class NavigationControllerImpl;
24 class NavigationEntry; 25 class NavigationEntry;
25 class NavigationEntryImpl; 26 class NavigationEntryImpl;
26 class RenderFrameHostDelegate; 27 class RenderFrameHostDelegate;
28 class RenderFrameHostImpl;
27 class RenderFrameHostManagerTest; 29 class RenderFrameHostManagerTest;
28 class RenderViewHost; 30 class RenderViewHost;
29 class RenderViewHostImpl; 31 class RenderViewHostImpl;
30 class RenderWidgetHostDelegate; 32 class RenderWidgetHostDelegate;
31 class RenderWidgetHostView; 33 class RenderWidgetHostView;
32 class TestWebContents; 34 class TestWebContents;
33 class WebUIImpl; 35 class WebUIImpl;
34 36
35 // Manages RenderFrameHosts for a FrameTreeNode. This class acts as a state 37 // Manages RenderFrameHosts for a FrameTreeNode. This class acts as a state
36 // machine to make cross-process navigations in a frame possible. 38 // machine to make cross-process navigations in a frame possible.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 virtual ~Delegate() {} 109 virtual ~Delegate() {}
108 }; 110 };
109 111
110 // All three delegate pointers must be non-NULL and are not owned by this 112 // All three delegate pointers must be non-NULL and are not owned by this
111 // class. They must outlive this class. The RenderViewHostDelegate and 113 // class. They must outlive this class. The RenderViewHostDelegate and
112 // RenderWidgetHostDelegate are what will be installed into all 114 // RenderWidgetHostDelegate are what will be installed into all
113 // RenderViewHosts that are created. 115 // RenderViewHosts that are created.
114 // 116 //
115 // You must call Init() before using this class. 117 // You must call Init() before using this class.
116 RenderFrameHostManager( 118 RenderFrameHostManager(
119 FrameTreeNode* frame_tree_node,
117 RenderFrameHostDelegate* render_frame_delegate, 120 RenderFrameHostDelegate* render_frame_delegate,
118 RenderViewHostDelegate* render_view_delegate, 121 RenderViewHostDelegate* render_view_delegate,
119 RenderWidgetHostDelegate* render_widget_delegate, 122 RenderWidgetHostDelegate* render_widget_delegate,
120 Delegate* delegate); 123 Delegate* delegate);
121 virtual ~RenderFrameHostManager(); 124 virtual ~RenderFrameHostManager();
122 125
123 // For arguments, see WebContentsImpl constructor. 126 // For arguments, see WebContentsImpl constructor.
124 void Init(BrowserContext* browser_context, 127 void Init(BrowserContext* browser_context,
125 SiteInstance* site_instance, 128 SiteInstance* site_instance,
126 int routing_id, 129 int view_routing_id,
127 int main_frame_routing_id); 130 int frame_routing_id);
128 131
129 // Returns the currently active RenderViewHost. 132 // Returns the currently active RenderFrameHost.
130 // 133 //
131 // This will be non-NULL between Init() and Shutdown(). You may want to NULL 134 // This will be non-NULL between Init() and Shutdown(). You may want to NULL
132 // check it in many cases, however. Windows can send us messages during the 135 // check it in many cases, however. Windows can send us messages during the
133 // destruction process after it has been shut down. 136 // destruction process after it has been shut down.
137 RenderFrameHostImpl* current_frame_host() const {
138 return render_frame_host_;
139 }
140
141 // TODO(creis): Remove this when we no longer use RVH for navigation.
134 RenderViewHostImpl* current_host() const; 142 RenderViewHostImpl* current_host() const;
135 143
136 // Returns the view associated with the current RenderViewHost, or NULL if 144 // Returns the view associated with the current RenderViewHost, or NULL if
137 // there is no current one. 145 // there is no current one.
138 RenderWidgetHostView* GetRenderWidgetHostView() const; 146 RenderWidgetHostView* GetRenderWidgetHostView() const;
139 147
140 // Returns the pending render view host, or NULL if there is no pending one. 148 // Returns the pending RenderFrameHost, or NULL if there is no pending one.
149 RenderFrameHostImpl* pending_frame_host() const {
150 return pending_render_frame_host_;
151 }
152
153 // TODO(creis): Remove this when we no longer use RVH for navigation.
141 RenderViewHostImpl* pending_render_view_host() const; 154 RenderViewHostImpl* pending_render_view_host() const;
142 155
143 // Returns the current committed Web UI or NULL if none applies. 156 // Returns the current committed Web UI or NULL if none applies.
144 WebUIImpl* web_ui() const { return web_ui_.get(); } 157 WebUIImpl* web_ui() const { return web_ui_.get(); }
145 158
146 // Returns the Web UI for the pending navigation, or NULL of none applies. 159 // Returns the Web UI for the pending navigation, or NULL of none applies.
147 WebUIImpl* pending_web_ui() const { 160 WebUIImpl* pending_web_ui() const {
148 return pending_web_ui_.get() ? pending_web_ui_.get() : 161 return pending_web_ui_.get() ? pending_web_ui_.get() :
149 pending_and_current_web_ui_.get(); 162 pending_and_current_web_ui_.get();
150 } 163 }
(...skipping 25 matching lines...) Expand all
176 // The RenderViewHost has been swapped out, so we should resume the pending 189 // The RenderViewHost has been swapped out, so we should resume the pending
177 // network response and allow the pending RenderViewHost to commit. 190 // network response and allow the pending RenderViewHost to commit.
178 void SwappedOut(RenderViewHost* render_view_host); 191 void SwappedOut(RenderViewHost* render_view_host);
179 192
180 // Called when a renderer's main frame navigates. 193 // Called when a renderer's main frame navigates.
181 void DidNavigateMainFrame(RenderViewHost* render_view_host); 194 void DidNavigateMainFrame(RenderViewHost* render_view_host);
182 195
183 // Called when a renderer sets its opener to null. 196 // Called when a renderer sets its opener to null.
184 void DidDisownOpener(RenderViewHost* render_view_host); 197 void DidDisownOpener(RenderViewHost* render_view_host);
185 198
186 // Helper method to create a RenderViewHost. If |swapped_out| is true, it 199 // Helper method to create and initialize a RenderFrameHost. If |swapped_out|
187 // will be initially placed on the swapped out hosts list. Otherwise, it 200 // is true, it will be initially placed on the swapped out hosts list.
188 // will be used for a pending cross-site navigation. 201 // Otherwise, it will be used for a pending cross-site navigation.
189 int CreateRenderView(SiteInstance* instance, 202 int CreateRenderFrame(SiteInstance* instance,
190 int opener_route_id, 203 int opener_route_id,
191 bool swapped_out, 204 bool swapped_out,
192 bool hidden); 205 bool hidden);
193 206
194 // Called when a provisional load on the given renderer is aborted. 207 // Called when a provisional load on the given renderer is aborted.
195 void RendererAbortedProvisionalLoad(RenderViewHost* render_view_host); 208 void RendererAbortedProvisionalLoad(RenderViewHost* render_view_host);
196 209
197 // Sets the passed passed interstitial as the currently showing interstitial. 210 // Sets the passed passed interstitial as the currently showing interstitial.
198 // |interstitial_page| should be non NULL (use the remove_interstitial_page 211 // |interstitial_page| should be non NULL (use the remove_interstitial_page
199 // method to unset the interstitial) and no interstitial page should be set 212 // method to unset the interstitial) and no interstitial page should be set
200 // when there is already a non NULL interstitial page set. 213 // when there is already a non NULL interstitial page set.
201 void set_interstitial_page(InterstitialPageImpl* interstitial_page) { 214 void set_interstitial_page(InterstitialPageImpl* interstitial_page) {
202 DCHECK(!interstitial_page_ && interstitial_page); 215 DCHECK(!interstitial_page_ && interstitial_page);
(...skipping 26 matching lines...) Expand all
229 bool should_replace_current_entry) OVERRIDE; 242 bool should_replace_current_entry) OVERRIDE;
230 243
231 // NotificationObserver implementation. 244 // NotificationObserver implementation.
232 virtual void Observe(int type, 245 virtual void Observe(int type,
233 const NotificationSource& source, 246 const NotificationSource& source,
234 const NotificationDetails& details) OVERRIDE; 247 const NotificationDetails& details) OVERRIDE;
235 248
236 // Called when a RenderViewHost is about to be deleted. 249 // Called when a RenderViewHost is about to be deleted.
237 void RenderViewDeleted(RenderViewHost* rvh); 250 void RenderViewDeleted(RenderViewHost* rvh);
238 251
239 // Returns whether the given RenderViewHost is on the list of swapped out 252 // Returns whether the given RenderFrameHost (or its associated
240 // RenderViewHosts. 253 // RenderViewHost) is on the list of swapped out RenderFrameHosts.
241 bool IsOnSwappedOutList(RenderViewHost* rvh) const; 254 bool IsRVHOnSwappedOutList(RenderViewHostImpl* rvh) const;
255 bool IsOnSwappedOutList(RenderFrameHostImpl* rfh) const;
242 256
243 // Returns the swapped out RenderViewHost for the given SiteInstance, if any. 257 // Returns the swapped out RenderViewHost or RenderFrameHost for the given
244 RenderViewHostImpl* GetSwappedOutRenderViewHost(SiteInstance* instance); 258 // SiteInstance, if any.
259 RenderViewHostImpl* GetSwappedOutRenderViewHost(SiteInstance* instance) const;
260 RenderFrameHostImpl* GetSwappedOutRenderFrameHost(
261 SiteInstance* instance) const;
245 262
246 // Runs the unload handler in the current page, when we know that a pending 263 // Runs the unload handler in the current page, when we know that a pending
247 // cross-process navigation is going to commit. We may initiate a transfer 264 // cross-process navigation is going to commit. We may initiate a transfer
248 // to a new process after this completes or times out. 265 // to a new process after this completes or times out.
249 void SwapOutOldPage(); 266 void SwapOutOldPage();
250 267
251 private: 268 private:
252 friend class RenderFrameHostManagerTest; 269 friend class RenderFrameHostManagerTest;
253 friend class TestWebContents; 270 friend class TestWebContents;
254 271
255 // Tracks information about a navigation while a cross-process transition is 272 // Tracks information about a navigation while a cross-process transition is
256 // in progress, in case we need to transfer it to a new RenderViewHost. 273 // in progress, in case we need to transfer it to a new RenderFrameHost.
257 struct PendingNavigationParams { 274 struct PendingNavigationParams {
258 PendingNavigationParams(); 275 PendingNavigationParams();
259 PendingNavigationParams(const GlobalRequestID& global_request_id, 276 PendingNavigationParams(const GlobalRequestID& global_request_id,
260 bool is_transfer, 277 bool is_transfer,
261 const std::vector<GURL>& transfer_url, 278 const std::vector<GURL>& transfer_url,
262 Referrer referrer, 279 Referrer referrer,
263 PageTransition page_transition, 280 PageTransition page_transition,
264 int64 frame_id, 281 int64 frame_id,
265 bool should_replace_current_entry); 282 bool should_replace_current_entry);
266 ~PendingNavigationParams(); 283 ~PendingNavigationParams();
(...skipping 21 matching lines...) Expand all
288 PageTransition page_transition; 305 PageTransition page_transition;
289 306
290 // If |is_transfer|, this is the frame ID to use in RequestTransferURL. 307 // If |is_transfer|, this is the frame ID to use in RequestTransferURL.
291 int64 frame_id; 308 int64 frame_id;
292 309
293 // If |is_transfer|, this is whether the navigation should replace the 310 // If |is_transfer|, this is whether the navigation should replace the
294 // current history entry. 311 // current history entry.
295 bool should_replace_current_entry; 312 bool should_replace_current_entry;
296 }; 313 };
297 314
315 // Used with FrameTree::ForEach to erase inactive RenderFrameHosts from a
316 // FrameTreeNode's RenderFrameHostManager.
317 static bool ClearSwappedOutRFHsInSiteInstance(int32 site_instance_id,
318 FrameTreeNode* node);
319
298 // Returns whether this tab should transition to a new renderer for 320 // Returns whether this tab should transition to a new renderer for
299 // cross-site URLs. Enabled unless we see the --process-per-tab command line 321 // cross-site URLs. Enabled unless we see the --process-per-tab command line
300 // switch. Can be overridden in unit tests. 322 // switch. Can be overridden in unit tests.
301 bool ShouldTransitionCrossSite(); 323 bool ShouldTransitionCrossSite();
302 324
303 // Returns true if for the navigation from |current_entry| to |new_entry|, 325 // Returns true if for the navigation from |current_entry| to |new_entry|,
304 // a new SiteInstance and BrowsingInstance should be created (even if we are 326 // a new SiteInstance and BrowsingInstance should be created (even if we are
305 // in a process model that doesn't usually swap). This forces a process swap 327 // in a process model that doesn't usually swap). This forces a process swap
306 // and severs script connections with existing tabs. Cases where this can 328 // and severs script connections with existing tabs. Cases where this can
307 // happen include transitions between WebUI and regular web pages. 329 // happen include transitions between WebUI and regular web pages.
(...skipping 10 matching lines...) Expand all
318 340
319 // Returns an appropriate SiteInstance object for the given NavigationEntry, 341 // Returns an appropriate SiteInstance object for the given NavigationEntry,
320 // possibly reusing the current SiteInstance. If --process-per-tab is used, 342 // possibly reusing the current SiteInstance. If --process-per-tab is used,
321 // this is only called when ShouldSwapBrowsingInstancesForNavigation returns 343 // this is only called when ShouldSwapBrowsingInstancesForNavigation returns
322 // true. 344 // true.
323 SiteInstance* GetSiteInstanceForEntry( 345 SiteInstance* GetSiteInstanceForEntry(
324 const NavigationEntryImpl& entry, 346 const NavigationEntryImpl& entry,
325 SiteInstance* current_instance, 347 SiteInstance* current_instance,
326 bool force_browsing_instance_swap); 348 bool force_browsing_instance_swap);
327 349
328 // Sets up the necessary state for a new RenderViewHost with the given opener. 350 // Creates a RenderFrameHost and corresponding RenderViewHost if necessary.
351 RenderFrameHostImpl* CreateRenderFrameHost(SiteInstance* instance,
352 int view_routing_id,
353 int frame_routing_id,
354 bool swapped_out,
355 bool hidden);
356
357 // Sets up the necessary state for a new RenderViewHost with the given opener,
358 // if necessary. Returns early if the RenderViewHost has already been
359 // initialized for another RenderFrameHost.
360 // TODO(creis): opener_route_id is currently for the RenderViewHost but should
361 // be for the RenderFrame, since frames can have openers.
329 bool InitRenderView(RenderViewHost* render_view_host, int opener_route_id); 362 bool InitRenderView(RenderViewHost* render_view_host, int opener_route_id);
330 363
331 // Sets the pending RenderViewHost/WebUI to be the active one. Note that this 364 // Sets the pending RenderFrameHost/WebUI to be the active one. Note that this
332 // doesn't require the pending render_view_host_ pointer to be non-NULL, since 365 // doesn't require the pending render_frame_host_ pointer to be non-NULL,
333 // there could be Web UI switching as well. Call this for every commit. 366 // since there could be Web UI switching as well. Call this for every commit.
334 void CommitPending(); 367 void CommitPending();
335 368
336 // Shutdown all RenderViewHosts in a SiteInstance. This is called 369 // Shutdown all RenderFrameHosts in a SiteInstance. This is called to shutdown
337 // to shutdown views when all the views in a SiteInstance are 370 // frames when all the frames in a SiteInstance are confirmed to be swapped
338 // confirmed to be swapped out. 371 // out.
339 void ShutdownRenderViewHostsInSiteInstance(int32 site_instance_id); 372 void ShutdownRenderFrameHostsInSiteInstance(int32 site_instance_id);
340 373
341 // Helper method to terminate the pending RenderViewHost. 374 // Helper method to terminate the pending RenderViewHost.
342 void CancelPending(); 375 void CancelPending();
343 376
344 RenderViewHostImpl* UpdateRendererStateForNavigate( 377 RenderFrameHostImpl* UpdateRendererStateForNavigate(
345 const NavigationEntryImpl& entry); 378 const NavigationEntryImpl& entry);
346 379
347 // Called when a renderer process is starting to close. We should not 380 // Called when a renderer process is starting to close. We should not
348 // schedule new navigations in its swapped out RenderViewHosts after this. 381 // schedule new navigations in its swapped out RenderFrameHosts after this.
349 void RendererProcessClosing(RenderProcessHost* render_process_host); 382 void RendererProcessClosing(RenderProcessHost* render_process_host);
350 383
384 // For use in creating RenderFrameHosts.
385 FrameTreeNode* frame_tree_node_;
386
351 // Our delegate, not owned by us. Guaranteed non-NULL. 387 // Our delegate, not owned by us. Guaranteed non-NULL.
352 Delegate* delegate_; 388 Delegate* delegate_;
353 389
354 // Whether a navigation requiring different RenderView's is pending. This is 390 // Whether a navigation requiring different RenderFrameHosts is pending. This
355 // either cross-site request is (in the new process model), or when required 391 // is either for cross-site requests or when required for the process type
356 // for the view type (like view source versus not). 392 // (like WebUI).
357 bool cross_navigation_pending_; 393 bool cross_navigation_pending_;
358 394
359 // Implemented by the owner of this class, these delegates are installed into 395 // Implemented by the owner of this class. These delegates are installed into
360 // all the RenderViewHosts that we create. 396 // all the RenderFrameHosts that we create.
361 RenderFrameHostDelegate* render_frame_delegate_; 397 RenderFrameHostDelegate* render_frame_delegate_;
362 RenderViewHostDelegate* render_view_delegate_; 398 RenderViewHostDelegate* render_view_delegate_;
363 RenderWidgetHostDelegate* render_widget_delegate_; 399 RenderWidgetHostDelegate* render_widget_delegate_;
364 400
365 // Our RenderView host and its associated Web UI (if any, will be NULL for 401 // Our RenderFrameHost and its associated Web UI (if any, will be NULL for
366 // non-DOM-UI pages). This object is responsible for all communication with 402 // non-WebUI pages). This object is responsible for all communication with
367 // a child RenderView instance. 403 // a child RenderFrame instance.
368 RenderViewHostImpl* render_view_host_; 404 // For now, RenderFrameHost keeps a RenderViewHost in its SiteInstance alive.
405 // Eventually, RenderViewHost will be replaced with a page context.
406 RenderFrameHostImpl* render_frame_host_;
369 scoped_ptr<WebUIImpl> web_ui_; 407 scoped_ptr<WebUIImpl> web_ui_;
370 408
371 // A RenderViewHost used to load a cross-site page. This remains hidden 409 // A RenderFrameHost used to load a cross-site page. This remains hidden
372 // while a cross-site request is pending until it calls DidNavigate. It may 410 // while a cross-site request is pending until it calls DidNavigate. It may
373 // have an associated Web UI, in which case the Web UI pointer will be non- 411 // have an associated Web UI, in which case the Web UI pointer will be non-
374 // NULL. 412 // NULL.
375 // 413 //
376 // The |pending_web_ui_| may be non-NULL even when the 414 // The |pending_web_ui_| may be non-NULL even when the
377 // |pending_render_view_host_| is NULL. This will happen when we're 415 // |pending_render_frame_host_| is NULL. This will happen when we're
378 // transitioning between two Web UI pages: the RVH won't be swapped, so the 416 // transitioning between two Web UI pages: the RFH won't be swapped, so the
379 // pending pointer will be unused, but there will be a pending Web UI 417 // pending pointer will be unused, but there will be a pending Web UI
380 // associated with the navigation. 418 // associated with the navigation.
381 RenderViewHostImpl* pending_render_view_host_; 419 RenderFrameHostImpl* pending_render_frame_host_;
382 420
383 // Tracks information about any current pending cross-process navigation. 421 // Tracks information about any current pending cross-process navigation.
384 scoped_ptr<PendingNavigationParams> pending_nav_params_; 422 scoped_ptr<PendingNavigationParams> pending_nav_params_;
385 423
386 // If either of these is non-NULL, the pending navigation is to a chrome: 424 // If either of these is non-NULL, the pending navigation is to a chrome:
387 // page. The scoped_ptr is used if pending_web_ui_ != web_ui_, the WeakPtr is 425 // page. The scoped_ptr is used if pending_web_ui_ != web_ui_, the WeakPtr is
388 // used for when they reference the same object. If either is non-NULL, the 426 // used for when they reference the same object. If either is non-NULL, the
389 // other should be NULL. 427 // other should be NULL.
390 scoped_ptr<WebUIImpl> pending_web_ui_; 428 scoped_ptr<WebUIImpl> pending_web_ui_;
391 base::WeakPtr<WebUIImpl> pending_and_current_web_ui_; 429 base::WeakPtr<WebUIImpl> pending_and_current_web_ui_;
392 430
393 // A map of site instance ID to swapped out RenderViewHosts. This may include 431 // A map of site instance ID to swapped out RenderFrameHosts. This may
394 // pending_render_view_host_ for navigations to existing entries. 432 // include pending_render_frame_host_ for navigations to existing entries.
395 typedef base::hash_map<int32, RenderViewHostImpl*> RenderViewHostMap; 433 typedef base::hash_map<int32, RenderFrameHostImpl*> RenderFrameHostMap;
396 RenderViewHostMap swapped_out_hosts_; 434 RenderFrameHostMap swapped_out_hosts_;
397 435
398 // The intersitial page currently shown if any, not own by this class 436 // The intersitial page currently shown if any, not own by this class
399 // (the InterstitialPage is self-owned, it deletes itself when hidden). 437 // (the InterstitialPage is self-owned, it deletes itself when hidden).
400 InterstitialPageImpl* interstitial_page_; 438 InterstitialPageImpl* interstitial_page_;
401 439
402 NotificationRegistrar registrar_; 440 NotificationRegistrar registrar_;
403 441
404 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager); 442 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager);
405 }; 443 };
406 444
407 } // namespace content 445 } // namespace content
408 446
409 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ 447 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698