| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1099 FOR_EACH_OBSERVER(WebContentsObserver, | 1122 FOR_EACH_OBSERVER(WebContentsObserver, |
| 1100 observers_, | 1123 observers_, |
| 1101 DidCloneToNewWebContents(this, tc)); | 1124 DidCloneToNewWebContents(this, tc)); |
| 1102 return tc; | 1125 return tc; |
| 1103 } | 1126 } |
| 1104 | 1127 |
| 1105 void WebContentsImpl::Observe(int type, | 1128 void WebContentsImpl::Observe(int type, |
| 1106 const NotificationSource& source, | 1129 const NotificationSource& source, |
| 1107 const NotificationDetails& details) { | 1130 const NotificationDetails& details) { |
| 1108 switch (type) { | 1131 switch (type) { |
| 1109 case NOTIFICATION_WEB_CONTENTS_DESTROYED: | |
| 1110 OnWebContentsDestroyed(Source<WebContents>(source).ptr()); | |
| 1111 break; | |
| 1112 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { | 1132 case NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED: { |
| 1113 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); | 1133 RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); |
| 1114 for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); | 1134 for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); |
| 1115 i != pending_widget_views_.end(); ++i) { | 1135 i != pending_widget_views_.end(); ++i) { |
| 1116 if (host->GetView() == i->second) { | 1136 if (host->GetView() == i->second) { |
| 1117 pending_widget_views_.erase(i); | 1137 pending_widget_views_.erase(i); |
| 1118 break; | 1138 break; |
| 1119 } | 1139 } |
| 1120 } | 1140 } |
| 1121 break; | 1141 break; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1151 this, delegate, &render_view_host_delegate_view_)); | 1171 this, delegate, &render_view_host_delegate_view_)); |
| 1152 } | 1172 } |
| 1153 CHECK(render_view_host_delegate_view_); | 1173 CHECK(render_view_host_delegate_view_); |
| 1154 } | 1174 } |
| 1155 CHECK(view_.get()); | 1175 CHECK(view_.get()); |
| 1156 | 1176 |
| 1157 gfx::Size initial_size = params.initial_size; | 1177 gfx::Size initial_size = params.initial_size; |
| 1158 view_->CreateView(initial_size, params.context); | 1178 view_->CreateView(initial_size, params.context); |
| 1159 | 1179 |
| 1160 // Listen for whether our opener gets destroyed. | 1180 // Listen for whether our opener gets destroyed. |
| 1161 if (opener_) { | 1181 if (opener_) |
| 1162 registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, | 1182 AddDestructionObserver(opener_); |
| 1163 Source<WebContents>(opener_)); | |
| 1164 } | |
| 1165 | 1183 |
| 1166 registrar_.Add(this, | 1184 registrar_.Add(this, |
| 1167 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, | 1185 NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
| 1168 NotificationService::AllBrowserContextsAndSources()); | 1186 NotificationService::AllBrowserContextsAndSources()); |
| 1169 #if defined(ENABLE_JAVA_BRIDGE) | 1187 #if defined(ENABLE_JAVA_BRIDGE) |
| 1170 java_bridge_dispatcher_host_manager_.reset( | 1188 java_bridge_dispatcher_host_manager_.reset( |
| 1171 new JavaBridgeDispatcherHostManager(this)); | 1189 new JavaBridgeDispatcherHostManager(this)); |
| 1172 #endif | 1190 #endif |
| 1173 | 1191 |
| 1174 #if defined(OS_ANDROID) | 1192 #if defined(OS_ANDROID) |
| 1175 date_time_chooser_.reset(new DateTimeChooserAndroid()); | 1193 date_time_chooser_.reset(new DateTimeChooserAndroid()); |
| 1176 #endif | 1194 #endif |
| 1177 } | 1195 } |
| 1178 | 1196 |
| 1179 void WebContentsImpl::OnWebContentsDestroyed(WebContents* web_contents) { | 1197 void WebContentsImpl::OnWebContentsDestroyed(WebContentsImpl* web_contents) { |
| 1198 RemoveDestructionObserver(web_contents); |
| 1199 |
| 1180 // Clear the opener if it has been closed. | 1200 // Clear the opener if it has been closed. |
| 1181 if (web_contents == opener_) { | 1201 if (web_contents == opener_) { |
| 1182 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, | |
| 1183 Source<WebContents>(opener_)); | |
| 1184 opener_ = NULL; | 1202 opener_ = NULL; |
| 1185 return; | 1203 return; |
| 1186 } | 1204 } |
| 1187 // Clear a pending contents that has been closed before being shown. | 1205 // Clear a pending contents that has been closed before being shown. |
| 1188 for (PendingContents::iterator iter = pending_contents_.begin(); | 1206 for (PendingContents::iterator iter = pending_contents_.begin(); |
| 1189 iter != pending_contents_.end(); | 1207 iter != pending_contents_.end(); |
| 1190 ++iter) { | 1208 ++iter) { |
| 1191 if (iter->second != web_contents) | 1209 if (iter->second != web_contents) |
| 1192 continue; | 1210 continue; |
| 1193 pending_contents_.erase(iter); | 1211 pending_contents_.erase(iter); |
| 1194 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, | |
| 1195 Source<WebContents>(web_contents)); | |
| 1196 return; | 1212 return; |
| 1197 } | 1213 } |
| 1198 NOTREACHED(); | 1214 NOTREACHED(); |
| 1199 } | 1215 } |
| 1200 | 1216 |
| 1217 void WebContentsImpl::AddDestructionObserver(WebContentsImpl* web_contents) { |
| 1218 if (!ContainsKey(destruction_observers_, web_contents)) { |
| 1219 destruction_observers_[web_contents] = |
| 1220 new DestructionObserver(this, web_contents); |
| 1221 } |
| 1222 } |
| 1223 |
| 1224 void WebContentsImpl::RemoveDestructionObserver(WebContentsImpl* web_contents) { |
| 1225 DestructionObservers::iterator iter = |
| 1226 destruction_observers_.find(web_contents); |
| 1227 if (iter != destruction_observers_.end()) { |
| 1228 delete destruction_observers_[web_contents]; |
| 1229 destruction_observers_.erase(iter); |
| 1230 } |
| 1231 } |
| 1232 |
| 1201 void WebContentsImpl::AddObserver(WebContentsObserver* observer) { | 1233 void WebContentsImpl::AddObserver(WebContentsObserver* observer) { |
| 1202 observers_.AddObserver(observer); | 1234 observers_.AddObserver(observer); |
| 1203 } | 1235 } |
| 1204 | 1236 |
| 1205 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { | 1237 void WebContentsImpl::RemoveObserver(WebContentsObserver* observer) { |
| 1206 observers_.RemoveObserver(observer); | 1238 observers_.RemoveObserver(observer); |
| 1207 } | 1239 } |
| 1208 | 1240 |
| 1209 void WebContentsImpl::Activate() { | 1241 void WebContentsImpl::Activate() { |
| 1210 if (delegate_) | 1242 if (delegate_) |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1399 WebContentsViewPort* new_view = new_contents->view_.get(); | 1431 WebContentsViewPort* new_view = new_contents->view_.get(); |
| 1400 | 1432 |
| 1401 // TODO(brettw): It seems bogus that we have to call this function on the | 1433 // TODO(brettw): It seems bogus that we have to call this function on the |
| 1402 // newly created object and give it one of its own member variables. | 1434 // newly created object and give it one of its own member variables. |
| 1403 new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); | 1435 new_view->CreateViewForWidget(new_contents->GetRenderViewHost()); |
| 1404 } | 1436 } |
| 1405 // Save the created window associated with the route so we can show it | 1437 // Save the created window associated with the route so we can show it |
| 1406 // later. | 1438 // later. |
| 1407 DCHECK_NE(MSG_ROUTING_NONE, route_id); | 1439 DCHECK_NE(MSG_ROUTING_NONE, route_id); |
| 1408 pending_contents_[route_id] = new_contents; | 1440 pending_contents_[route_id] = new_contents; |
| 1409 registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, | 1441 AddDestructionObserver(new_contents); |
| 1410 Source<WebContents>(new_contents)); | |
| 1411 } | 1442 } |
| 1412 | 1443 |
| 1413 if (delegate_) { | 1444 if (delegate_) { |
| 1414 delegate_->WebContentsCreated( | 1445 delegate_->WebContentsCreated( |
| 1415 this, params.opener_frame_id, params.frame_name, | 1446 this, params.opener_frame_id, params.frame_name, |
| 1416 params.target_url, new_contents); | 1447 params.target_url, new_contents); |
| 1417 } | 1448 } |
| 1418 | 1449 |
| 1419 if (params.opener_suppressed) { | 1450 if (params.opener_suppressed) { |
| 1420 // When the opener is suppressed, the original renderer cannot access the | 1451 // When the opener is suppressed, the original renderer cannot access the |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1535 PendingContents::iterator iter = pending_contents_.find(route_id); | 1566 PendingContents::iterator iter = pending_contents_.find(route_id); |
| 1536 | 1567 |
| 1537 // Certain systems can block the creation of new windows. If we didn't succeed | 1568 // Certain systems can block the creation of new windows. If we didn't succeed |
| 1538 // in creating one, just return NULL. | 1569 // in creating one, just return NULL. |
| 1539 if (iter == pending_contents_.end()) { | 1570 if (iter == pending_contents_.end()) { |
| 1540 return NULL; | 1571 return NULL; |
| 1541 } | 1572 } |
| 1542 | 1573 |
| 1543 WebContentsImpl* new_contents = iter->second; | 1574 WebContentsImpl* new_contents = iter->second; |
| 1544 pending_contents_.erase(route_id); | 1575 pending_contents_.erase(route_id); |
| 1545 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, | 1576 RemoveDestructionObserver(new_contents); |
| 1546 Source<WebContents>(new_contents)); | |
| 1547 | 1577 |
| 1548 // Don't initialize the guest WebContents immediately. | 1578 // Don't initialize the guest WebContents immediately. |
| 1549 if (new_contents->GetRenderProcessHost()->IsGuest()) | 1579 if (new_contents->GetRenderProcessHost()->IsGuest()) |
| 1550 return new_contents; | 1580 return new_contents; |
| 1551 | 1581 |
| 1552 if (!new_contents->GetRenderProcessHost()->HasConnection() || | 1582 if (!new_contents->GetRenderProcessHost()->HasConnection() || |
| 1553 !new_contents->GetRenderViewHost()->GetView()) | 1583 !new_contents->GetRenderViewHost()->GetView()) |
| 1554 return NULL; | 1584 return NULL; |
| 1555 | 1585 |
| 1556 // TODO(brettw): It seems bogus to reach into here and initialize the host. | 1586 // TODO(brettw): It seems bogus to reach into here and initialize the host. |
| (...skipping 1427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2984 #if defined(OS_ANDROID) | 3014 #if defined(OS_ANDROID) |
| 2985 if (delegate_) | 3015 if (delegate_) |
| 2986 delegate_->LoadProgressChanged(this, progress); | 3016 delegate_->LoadProgressChanged(this, progress); |
| 2987 #endif | 3017 #endif |
| 2988 } | 3018 } |
| 2989 | 3019 |
| 2990 void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { | 3020 void WebContentsImpl::DidDisownOpener(RenderViewHost* rvh) { |
| 2991 if (opener_) { | 3021 if (opener_) { |
| 2992 // Clear our opener so that future cross-process navigations don't have an | 3022 // Clear our opener so that future cross-process navigations don't have an |
| 2993 // opener assigned. | 3023 // opener assigned. |
| 2994 registrar_.Remove(this, NOTIFICATION_WEB_CONTENTS_DESTROYED, | 3024 RemoveDestructionObserver(opener_); |
| 2995 Source<WebContents>(opener_)); | |
| 2996 opener_ = NULL; | 3025 opener_ = NULL; |
| 2997 } | 3026 } |
| 2998 | 3027 |
| 2999 // Notify all swapped out RenderViewHosts for this tab. This is important | 3028 // Notify all swapped out RenderViewHosts for this tab. This is important |
| 3000 // in case we go back to them, or if another window in those processes tries | 3029 // in case we go back to them, or if another window in those processes tries |
| 3001 // to access window.opener. | 3030 // to access window.opener. |
| 3002 render_manager_.DidDisownOpener(rvh); | 3031 render_manager_.DidDisownOpener(rvh); |
| 3003 } | 3032 } |
| 3004 | 3033 |
| 3005 void WebContentsImpl::DocumentAvailableInMainFrame( | 3034 void WebContentsImpl::DocumentAvailableInMainFrame( |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3518 } | 3547 } |
| 3519 | 3548 |
| 3520 BrowserPluginGuestManager* | 3549 BrowserPluginGuestManager* |
| 3521 WebContentsImpl::GetBrowserPluginGuestManager() const { | 3550 WebContentsImpl::GetBrowserPluginGuestManager() const { |
| 3522 return static_cast<BrowserPluginGuestManager*>( | 3551 return static_cast<BrowserPluginGuestManager*>( |
| 3523 GetBrowserContext()->GetUserData( | 3552 GetBrowserContext()->GetUserData( |
| 3524 browser_plugin::kBrowserPluginGuestManagerKeyName)); | 3553 browser_plugin::kBrowserPluginGuestManagerKeyName)); |
| 3525 } | 3554 } |
| 3526 | 3555 |
| 3527 } // namespace content | 3556 } // namespace content |
| OLD | NEW |