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

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: 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
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 722 matching lines...) Expand 10 before | Expand all | Expand 10 after
1106 FOR_EACH_OBSERVER(WebContentsObserver, 1129 FOR_EACH_OBSERVER(WebContentsObserver,
1107 observers_, 1130 observers_,
1108 DidCloneToNewWebContents(this, tc)); 1131 DidCloneToNewWebContents(this, tc));
1109 return tc; 1132 return tc;
1110 } 1133 }
1111 1134
1112 void WebContentsImpl::Observe(int type, 1135 void WebContentsImpl::Observe(int type,
1113 const NotificationSource& source, 1136 const NotificationSource& source,
1114 const NotificationDetails& details) { 1137 const NotificationDetails& details) {
1115 switch (type) { 1138 switch (type) {
1116 case NOTIFICATION_WEB_CONTENTS_DESTROYED:
1117 OnWebContentsDestroyed(Source<WebContents>(source).ptr());
1118 break;
1119 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { 1139 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: {
1120 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); 1140 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr();
1121 for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); 1141 for (PendingWidgetViews::iterator i = pending_widget_views_.begin();
1122 i != pending_widget_views_.end(); ++i) { 1142 i != pending_widget_views_.end(); ++i) {
1123 if (host->GetView() == i->second) { 1143 if (host->GetView() == i->second) {
1124 pending_widget_views_.erase(i); 1144 pending_widget_views_.erase(i);
1125 break; 1145 break;
1126 } 1146 }
1127 } 1147 }
1128 break; 1148 break;
(...skipping 29 matching lines...) Expand all
1158 this, delegate, &render_view_host_delegate_view_)); 1178 this, delegate, &render_view_host_delegate_view_));
1159 } 1179 }
1160 CHECK(render_view_host_delegate_view_); 1180 CHECK(render_view_host_delegate_view_);
1161 } 1181 }
1162 CHECK(view_.get()); 1182 CHECK(view_.get());
1163 1183
1164 gfx::Size initial_size = params.initial_size; 1184 gfx::Size initial_size = params.initial_size;
1165 view_->CreateView(initial_size, params.context); 1185 view_->CreateView(initial_size, params.context);
1166 1186
1167 // Listen for whether our opener gets destroyed. 1187 // Listen for whether our opener gets destroyed.
1168 if (opener_) { 1188 if (opener_)
1169 registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 1189 AddDestructionObserver(opener_);
1170 Source<WebContents>(opener_));
1171 }
1172 1190
1173 registrar_.Add(this, 1191 registrar_.Add(this,
1174 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 1192 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
1175 NotificationService::AllBrowserContextsAndSources()); 1193 NotificationService::AllBrowserContextsAndSources());
1176 #if defined(ENABLE_JAVA_BRIDGE) 1194 #if defined(ENABLE_JAVA_BRIDGE)
1177 java_bridge_dispatcher_host_manager_.reset( 1195 java_bridge_dispatcher_host_manager_.reset(
1178 new JavaBridgeDispatcherHostManager(this)); 1196 new JavaBridgeDispatcherHostManager(this));
1179 #endif 1197 #endif
1180 1198
1181 #if defined(OS_ANDROID) 1199 #if defined(OS_ANDROID)
1182 date_time_chooser_.reset(new DateTimeChooserAndroid()); 1200 date_time_chooser_.reset(new DateTimeChooserAndroid());
1183 #endif 1201 #endif
1184 } 1202 }
1185 1203
1186 void WebContentsImpl::OnWebContentsDestroyed(WebContents* web_contents) { 1204 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) {
1205 RemoveDestructionObserver(web_contents);
1206
1187 // Clear the opener if it has been closed. 1207 // Clear the opener if it has been closed.
1188 if (web_contents == opener_) { 1208 if (web_contents == opener_) {
1189 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED,
1190 Source<WebContents>(opener_));
1191 opener_ = NULL; 1209 opener_ = NULL;
1192 return; 1210 return;
1193 } 1211 }
1194 // Clear a pending contents that has been closed before being shown. 1212 // Clear a pending contents that has been closed before being shown.
1195 for (PendingContents::iterator iter = pending_contents_.begin(); 1213 for (PendingContents::iterator iter = pending_contents_.begin();
1196 iter != pending_contents_.end(); 1214 iter != pending_contents_.end();
1197 ++iter) { 1215 ++iter) {
1198 if (iter->second != web_contents) 1216 if (iter->second != web_contents)
1199 continue; 1217 continue;
1200 pending_contents_.erase(iter); 1218 pending_contents_.erase(iter);
1201 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED,
1202 Source<WebContents>(web_contents));
1203 return; 1219 return;
1204 } 1220 }
1205 NOTREACHED(); 1221 NOTREACHED();
1206 } 1222 }
1207 1223
1224 void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) {
1225 if (!ContainsKey(destruction_observers_, web_contents)) {
1226 destruction_observers_[web_contents] =
1227 new DestructionObserver(this, web_contents);
1228 }
1229 }
1230
1231 void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) {
1232 DestructionObservers::iterator iter =
1233 destruction_observers_.find(web_contents);
1234 if (iter != destruction_observers_.end()) {
1235 delete destruction_observers_[web_contents];
1236 destruction_observers_.erase(iter);
1237 }
1238 }
1239
1208 void WebContentsImpl::AddObserver(WebContentsObserver* observer) { 1240 void WebContentsImpl::AddObserver(WebContentsObserver* observer) {
1209 observers_.AddObserver(observer); 1241 observers_.AddObserver(observer);
1210 } 1242 }
1211 1243
1212 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { 1244 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) {
1213 observers_.RemoveObserver(observer); 1245 observers_.RemoveObserver(observer);
1214 } 1246 }
1215 1247
1216 void WebContentsImpl::Activate() { 1248 void WebContentsImpl::Activate() {
1217 if (delegate_) 1249 if (delegate_)
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 WebContentsViewPort* new_view = new_contents->view_.get(); 1438 WebContentsViewPort* new_view = new_contents->view_.get();
1407 1439
1408 // TODO(brettw): It seems bogus that we have to call this function on the 1440 // TODO(brettw): It seems bogus that we have to call this function on the
1409 // newly created object and give it one of its own member variables. 1441 // newly created object and give it one of its own member variables.
1410 new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); 1442 new_view->CreateViewForWidget(new_contents->GetRenderViewHost());
1411 } 1443 }
1412 // Save the created window associated with the route so we can show it 1444 // Save the created window associated with the route so we can show it
1413 // later. 1445 // later.
1414 DCHECK_NE(MSG_ROUTING_NONE, route_id); 1446 DCHECK_NE(MSG_ROUTING_NONE, route_id);
1415 pending_contents_[route_id] = new_contents; 1447 pending_contents_[route_id] = new_contents;
1416 registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 1448 AddDestructionObserver(new_contents);
1417 Source<WebContents>(new_contents));
1418 } 1449 }
1419 1450
1420 if (delegate_) { 1451 if (delegate_) {
1421 delegate_->WebContentsCreated( 1452 delegate_->WebContentsCreated(
1422 this, params.opener_frame_id, params.frame_name, 1453 this, params.opener_frame_id, params.frame_name,
1423 params.target_url, new_contents); 1454 params.target_url, new_contents);
1424 } 1455 }
1425 1456
1426 if (params.opener_suppressed) { 1457 if (params.opener_suppressed) {
1427 // When the opener is suppressed, the original renderer cannot access the 1458 // When the opener is suppressed, the original renderer cannot access the
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 PendingContents::iterator iter = pending_contents_.find(route_id); 1573 PendingContents::iterator iter = pending_contents_.find(route_id);
1543 1574
1544 // Certain systems can block the creation of new windows. If we didn't succeed 1575 // Certain systems can block the creation of new windows. If we didn't succeed
1545 // in creating one, just return NULL. 1576 // in creating one, just return NULL.
1546 if (iter == pending_contents_.end()) { 1577 if (iter == pending_contents_.end()) {
1547 return NULL; 1578 return NULL;
1548 } 1579 }
1549 1580
1550 WebContentsImpl* new_contents = iter->second; 1581 WebContentsImpl* new_contents = iter->second;
1551 pending_contents_.erase(route_id); 1582 pending_contents_.erase(route_id);
1552 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 1583 RemoveDestructionObserver(new_contents);
1553 Source<WebContents>(new_contents));
1554 1584
1555 // Don't initialize the guest WebContents immediately. 1585 // Don't initialize the guest WebContents immediately.
1556 if (new_contents->GetRenderProcessHost()->IsGuest()) 1586 if (new_contents->GetRenderProcessHost()->IsGuest())
1557 return new_contents; 1587 return new_contents;
1558 1588
1559 if (!new_contents->GetRenderProcessHost()->HasConnection() || 1589 if (!new_contents->GetRenderProcessHost()->HasConnection() ||
1560 !new_contents->GetRenderViewHost()->GetView()) 1590 !new_contents->GetRenderViewHost()->GetView())
1561 return NULL; 1591 return NULL;
1562 1592
1563 // TODO(brettw): It seems bogus to reach into here and initialize the host. 1593 // TODO(brettw): It seems bogus to reach into here and initialize the host.
(...skipping 1426 matching lines...) Expand 10 before | Expand all | Expand 10 after
2990 #if defined(OS_ANDROID) 3020 #if defined(OS_ANDROID)
2991 if (delegate_) 3021 if (delegate_)
2992 delegate_->LoadProgressChanged(this, progress); 3022 delegate_->LoadProgressChanged(this, progress);
2993 #endif 3023 #endif
2994 } 3024 }
2995 3025
2996 void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { 3026 void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) {
2997 if (opener_) { 3027 if (opener_) {
2998 // Clear our opener so that future cross-process navigations don't have an 3028 // Clear our opener so that future cross-process navigations don't have an
2999 // opener assigned. 3029 // opener assigned.
3000 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, 3030 RemoveDestructionObserver(opener_);
3001 Source<WebContents>(opener_));
3002 opener_ = NULL; 3031 opener_ = NULL;
3003 } 3032 }
3004 3033
3005 // Notify all swapped out RenderViewHosts for this tab. This is important 3034 // Notify all swapped out RenderViewHosts for this tab. This is important
3006 // in case we go back to them, or if another window in those processes tries 3035 // in case we go back to them, or if another window in those processes tries
3007 // to access window.opener. 3036 // to access window.opener.
3008 render_manager_.DidDisownOpener(rvh); 3037 render_manager_.DidDisownOpener(rvh);
3009 } 3038 }
3010 3039
3011 void WebContentsImpl::DocumentAvailableInMainFrame( 3040 void WebContentsImpl::DocumentAvailableInMainFrame(
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
3524 } 3553 }
3525 3554
3526 BrowserPluginGuestManager* 3555 BrowserPluginGuestManager*
3527 WebContentsImpl::GetBrowserPluginGuestManager() const { 3556 WebContentsImpl::GetBrowserPluginGuestManager() const {
3528 return static_cast<BrowserPluginGuestManager*>( 3557 return static_cast<BrowserPluginGuestManager*>(
3529 GetBrowserContext()->GetUserData( 3558 GetBrowserContext()->GetUserData(
3530 browser_plugin::kBrowserPluginGuestManagerKeyName)); 3559 browser_plugin::kBrowserPluginGuestManagerKeyName));
3531 } 3560 }
3532 3561
3533 } // namespace content 3562 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698