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

Side by Side Diff: content/browser/web_contents/web_contents_impl.cc

Issue 14651029: content: Remove usage of NOTIFICATION_WEB_CONTENTS_DESTROYED from content (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix typo, rebase Created 7 years, 7 months 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
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/shell/shell.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "content/browser/web_contents/web_contents_impl.h" 5 #include "content/browser/web_contents/web_contents_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 } 277 }
278 278
279 new_contents->Init(params); 279 new_contents->Init(params);
280 return new_contents; 280 return new_contents;
281 } 281 }
282 282
283 WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) { 283 WebContents* WebContents::FromRenderViewHost(const RenderViewHost* rvh) {
284 return rvh->GetDelegate()->GetAsWebContents(); 284 return rvh->GetDelegate()->GetAsWebContents();
285 } 285 }
286 286
287 // WebContentsImpl::DestructionObserver ----------------------------------------
288
289 class WebContentsImpl::DestructionObserver : public WebContentsObserver {
290 public:
291 DestructionObserver(WebContentsImpl* owner, WebContents* watched_contents)
292 : WebContentsObserver(watched_contents),
293 owner_(owner) {
294 }
295
296 // WebContentsObserver:
297 virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE {
298 owner_->OnWebContentsDestroyed(static_cast<WebContentsImpl*>(web_contents));
299 }
300
301 private:
302 WebContentsImpl* owner_;
303
304 DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
305 };
306
287 // WebContentsImpl ------------------------------------------------------------- 307 // WebContentsImpl -------------------------------------------------------------
288 308
289 WebContentsImpl::WebContentsImpl( 309 WebContentsImpl::WebContentsImpl(
290 BrowserContext* browser_context, 310 BrowserContext* browser_context,
291 WebContentsImpl* opener) 311 WebContentsImpl* opener)
292 : delegate_(NULL), 312 : delegate_(NULL),
293 controller_(this, browser_context), 313 controller_(this, browser_context),
294 render_view_host_delegate_view_(NULL), 314 render_view_host_delegate_view_(NULL),
295 opener_(opener), 315 opener_(opener),
296 #if defined(OS_WIN) && defined(USE_AURA) 316 #if defined(OS_WIN) && defined(USE_AURA)
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 unload_start_time = before_unload_end_time_; 384 unload_start_time = before_unload_end_time_;
365 UMA_HISTOGRAM_TIMES("Tab.Close", now - close_start_time_); 385 UMA_HISTOGRAM_TIMES("Tab.Close", now - close_start_time_);
366 UMA_HISTOGRAM_TIMES("Tab.Close.UnloadTime", now - unload_start_time); 386 UMA_HISTOGRAM_TIMES("Tab.Close.UnloadTime", now - unload_start_time);
367 } 387 }
368 388
369 FOR_EACH_OBSERVER(WebContentsObserver, 389 FOR_EACH_OBSERVER(WebContentsObserver,
370 observers_, 390 observers_,
371 WebContentsImplDestroyed()); 391 WebContentsImplDestroyed());
372 392
373 SetDelegate(NULL); 393 SetDelegate(NULL);
394
395 STLDeleteContainerPairSecondPointers(destruction_observers_.begin(),
396 destruction_observers_.end());
374 } 397 }
375 398
376 WebContentsImpl* WebContentsImpl::CreateWithOpener( 399 WebContentsImpl* WebContentsImpl::CreateWithOpener(
377 const WebContents::CreateParams& params, 400 const WebContents::CreateParams& params,
378 WebContentsImpl* opener) { 401 WebContentsImpl* opener) {
379 WebContentsImpl* new_contents = new WebContentsImpl( 402 WebContentsImpl* new_contents = new WebContentsImpl(
380 params.browser_context, opener); 403 params.browser_context, opener);
381 404
382 new_contents->Init(params); 405 new_contents->Init(params);
383 return new_contents; 406 return new_contents;
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 FOR_EACH_OBSERVER(WebContentsObserver, 1136 FOR_EACH_OBSERVER(WebContentsObserver,
1114 observers_, 1137 observers_,
1115 DidCloneToNewWebContents(this, tc)); 1138 DidCloneToNewWebContents(this, tc));
1116 return tc; 1139 return tc;
1117 } 1140 }
1118 1141
1119 void WebContentsImpl::Observe(int type, 1142 void WebContentsImpl::Observe(int type,
1120 const NotificationSource& source, 1143 const NotificationSource& source,
1121 const NotificationDetails& details) { 1144 const NotificationDetails& details) {
1122 switch (type) { 1145 switch (type) {
1123 case NOTIFICATION_WEB_CONTENTS_DESTROYED:
1124 OnWebContentsDestroyed(Source<WebContents>(source).ptr());
1125 break;
1126 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 1146 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: {
1127 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 1147 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr();
1128 for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 1148 for (PendingWidgetViews::iterator i = pending_widget_views_.begin();
1129 i != pending_widget_views_.end(); ++i) { 1149 i != pending_widget_views_.end(); ++i) {
1130 if (host->GetView() == i->second) { 1150 if (host->GetView() == i->second) {
1131 pending_widget_views_.erase(i); 1151 pending_widget_views_.erase(i);
1132 break; 1152 break;
1133 } 1153 }
1134 } 1154 }
1135 break; 1155 break;
(...skipping 29 matching lines...) Expand all
1165 this, delegate, &render_view_host_delegate_view_)); 1185 this, delegate, &render_view_host_delegate_view_));
1166 } 1186 }
1167 CHECK(render_view_host_delegate_view_); 1187 CHECK(render_view_host_delegate_view_);
1168 } 1188 }
1169 CHECK(view_.get()); 1189 CHECK(view_.get());
1170 1190
1171 gfx::Size initial_size = params.initial_size; 1191 gfx::Size initial_size = params.initial_size;
1172 view_->CreateView(initial_size, params.context); 1192 view_->CreateView(initial_size, params.context);
1173 1193
1174 // Listen for whether our opener gets destroyed. 1194 // Listen for whether our opener gets destroyed.
1175 if (opener_) { 1195 if (opener_)
1176 registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 1196 AddDestructionObserver(opener_);
1177 Source<WebContents>(opener_));
1178 }
1179 1197
1180 registrar_.Add(this, 1198 registrar_.Add(this,
1181 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 1199 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
1182 NotificationService::AllBrowserContextsAndSources()); 1200 NotificationService::AllBrowserContextsAndSources());
1183 #if defined(ENABLE_JAVA_BRIDGE) 1201 #if defined(ENABLE_JAVA_BRIDGE)
1184 java_bridge_dispatcher_host_manager_.reset( 1202 java_bridge_dispatcher_host_manager_.reset(
1185 new JavaBridgeDispatcherHostManager(this)); 1203 new JavaBridgeDispatcherHostManager(this));
1186 #endif 1204 #endif
1187 1205
1188 #if defined(OS_ANDROID) 1206 #if defined(OS_ANDROID)
1189 date_time_chooser_.reset(new DateTimeChooserAndroid()); 1207 date_time_chooser_.reset(new DateTimeChooserAndroid());
1190 #endif 1208 #endif
1191 } 1209 }
1192 1210
1193 void WebContentsImpl::OnWebContentsDestroyed(WebContents* web_contents) { 1211 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) {
1212 RemoveDestructionObserver(web_contents);
1213
1194 // Clear the opener if it has been closed. 1214 // Clear the opener if it has been closed.
1195 if (web_contents == opener_) { 1215 if (web_contents == opener_) {
1196 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED,
1197 Source<WebContents>(opener_));
1198 opener_ = NULL; 1216 opener_ = NULL;
1199 return; 1217 return;
1200 } 1218 }
1201 // Clear a pending contents that has been closed before being shown. 1219 // Clear a pending contents that has been closed before being shown.
1202 for (PendingContents::iterator iter = pending_contents_.begin(); 1220 for (PendingContents::iterator iter = pending_contents_.begin();
1203 iter != pending_contents_.end(); 1221 iter != pending_contents_.end();
1204 ++iter) { 1222 ++iter) {
1205 if (iter->second != web_contents) 1223 if (iter->second != web_contents)
1206 continue; 1224 continue;
1207 pending_contents_.erase(iter); 1225 pending_contents_.erase(iter);
1208 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED,
1209 Source<WebContents>(web_contents));
1210 return; 1226 return;
1211 } 1227 }
1212 NOTREACHED(); 1228 NOTREACHED();
1213 } 1229 }
1214 1230
1231 void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) {
1232 if (!ContainsKey(destruction_observers_, web_contents)) {
1233 destruction_observers_[web_contents] =
1234 new DestructionObserver(this, web_contents);
1235 }
1236 }
1237
1238 void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) {
1239 DestructionObservers::iterator iter =
1240 destruction_observers_.find(web_contents);
1241 if (iter != destruction_observers_.end()) {
1242 delete destruction_observers_[web_contents];
1243 destruction_observers_.erase(iter);
1244 }
1245 }
1246
1215 void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 1247 void WebContentsImpl::AddObserver(WebContentsObserver* observer) {
1216 observers_.AddObserver(observer); 1248 observers_.AddObserver(observer);
1217 } 1249 }
1218 1250
1219 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 1251 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) {
1220 observers_.RemoveObserver(observer); 1252 observers_.RemoveObserver(observer);
1221 } 1253 }
1222 1254
1223 void WebContentsImpl::Activate() { 1255 void WebContentsImpl::Activate() {
1224 if (delegate_) 1256 if (delegate_)
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1413 WebContentsViewPort* new_view = new_contents->view_.get(); 1445 WebContentsViewPort* new_view = new_contents->view_.get();
1414 1446
1415 // TODO(brettw): It seems bogus that we have to call this function on the 1447 // TODO(brettw): It seems bogus that we have to call this function on the
1416 // newly created object and give it one of its own member variables. 1448 // newly created object and give it one of its own member variables.
1417 new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1449 new_view->CreateViewForWidget(new_contents->GetRenderViewHost());
1418 } 1450 }
1419 // Save the created window associated with the route so we can show it 1451 // Save the created window associated with the route so we can show it
1420 // later. 1452 // later.
1421 DCHECK_NE(MSG_ROUTING_NONE, route_id); 1453 DCHECK_NE(MSG_ROUTING_NONE, route_id);
1422 pending_contents_[route_id] = new_contents; 1454 pending_contents_[route_id] = new_contents;
1423 registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 1455 AddDestructionObserver(new_contents);
1424 Source<WebContents>(new_contents));
1425 } 1456 }
1426 1457
1427 if (delegate_) { 1458 if (delegate_) {
1428 delegate_->WebContentsCreated( 1459 delegate_->WebContentsCreated(
1429 this, params.opener_frame_id, params.frame_name, 1460 this, params.opener_frame_id, params.frame_name,
1430 params.target_url, new_contents); 1461 params.target_url, new_contents);
1431 } 1462 }
1432 1463
1433 if (params.opener_suppressed) { 1464 if (params.opener_suppressed) {
1434 // When the opener is suppressed, the original renderer cannot access the 1465 // When the opener is suppressed, the original renderer cannot access the
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 PendingContents::iterator iter = pending_contents_.find(route_id); 1580 PendingContents::iterator iter = pending_contents_.find(route_id);
1550 1581
1551 // Certain systems can block the creation of new windows. If we didn't succeed 1582 // Certain systems can block the creation of new windows. If we didn't succeed
1552 // in creating one, just return NULL. 1583 // in creating one, just return NULL.
1553 if (iter == pending_contents_.end()) { 1584 if (iter == pending_contents_.end()) {
1554 return NULL; 1585 return NULL;
1555 } 1586 }
1556 1587
1557 WebContentsImpl* new_contents = iter->second; 1588 WebContentsImpl* new_contents = iter->second;
1558 pending_contents_.erase(route_id); 1589 pending_contents_.erase(route_id);
1559 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 1590 RemoveDestructionObserver(new_contents);
1560 Source<WebContents>(new_contents));
1561 1591
1562 // Don't initialize the guest WebContents immediately. 1592 // Don't initialize the guest WebContents immediately.
1563 if (new_contents->GetRenderProcessHost()->IsGuest()) 1593 if (new_contents->GetRenderProcessHost()->IsGuest())
1564 return new_contents; 1594 return new_contents;
1565 1595
1566 if (!new_contents->GetRenderProcessHost()->HasConnection() || 1596 if (!new_contents->GetRenderProcessHost()->HasConnection() ||
1567 !new_contents->GetRenderViewHost()->GetView()) 1597 !new_contents->GetRenderViewHost()->GetView())
1568 return NULL; 1598 return NULL;
1569 1599
1570 // TODO(brettw): It seems bogus to reach into here and initialize the host. 1600 // TODO(brettw): It seems bogus to reach into here and initialize the host.
(...skipping 1438 matching lines...) Expand 10 before | Expand all | Expand 10 after
3009 #if defined(OS_ANDROID) 3039 #if defined(OS_ANDROID)
3010 if (delegate_) 3040 if (delegate_)
3011 delegate_->LoadProgressChanged(this, progress); 3041 delegate_->LoadProgressChanged(this, progress);
3012 #endif 3042 #endif
3013 } 3043 }
3014 3044
3015 void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { 3045 void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) {
3016 if (opener_) { 3046 if (opener_) {
3017 // Clear our opener so that future cross-process navigations don't have an 3047 // Clear our opener so that future cross-process navigations don't have an
3018 // opener assigned. 3048 // opener assigned.
3019 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 3049 RemoveDestructionObserver(opener_);
3020 Source<WebContents>(opener_));
3021 opener_ = NULL; 3050 opener_ = NULL;
3022 } 3051 }
3023 3052
3024 // Notify all swapped out RenderViewHosts for this tab. This is important 3053 // Notify all swapped out RenderViewHosts for this tab. This is important
3025 // in case we go back to them, or if another window in those processes tries 3054 // in case we go back to them, or if another window in those processes tries
3026 // to access window.opener. 3055 // to access window.opener.
3027 render_manager_.DidDisownOpener(rvh); 3056 render_manager_.DidDisownOpener(rvh);
3028 } 3057 }
3029 3058
3030 void WebContentsImpl::DocumentAvailableInMainFrame( 3059 void WebContentsImpl::DocumentAvailableInMainFrame(
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
3543 } 3572 }
3544 3573
3545 BrowserPluginGuestManager* 3574 BrowserPluginGuestManager*
3546 WebContentsImpl::GetBrowserPluginGuestManager() const { 3575 WebContentsImpl::GetBrowserPluginGuestManager() const {
3547 return static_cast<BrowserPluginGuestManager*>( 3576 return static_cast<BrowserPluginGuestManager*>(
3548 GetBrowserContext()->GetUserData( 3577 GetBrowserContext()->GetUserData(
3549 browser_plugin::kBrowserPluginGuestManagerKeyName)); 3578 browser_plugin::kBrowserPluginGuestManagerKeyName));
3550 } 3579 }
3551 3580
3552 } // namespace content 3581 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/shell/shell.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698