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

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

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

Powered by Google App Engine
This is Rietveld 408576698