Chromium Code Reviews| 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 "chrome/browser/external_tab/external_tab_container_win.h" | 5 #include "chrome/browser/external_tab/external_tab_container_win.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 tab_container = reinterpret_cast<ExternalTabContainer*>( | 348 tab_container = reinterpret_cast<ExternalTabContainer*>( |
| 349 ViewProp::GetValue(native_window, kWindowObjectKey)); | 349 ViewProp::GetValue(native_window, kWindowObjectKey)); |
| 350 } | 350 } |
| 351 return tab_container; | 351 return tab_container; |
| 352 } | 352 } |
| 353 //////////////////////////////////////////////////////////////////////////////// | 353 //////////////////////////////////////////////////////////////////////////////// |
| 354 // ExternalTabContainer, content::WebContentsDelegate implementation: | 354 // ExternalTabContainer, content::WebContentsDelegate implementation: |
| 355 | 355 |
| 356 WebContents* ExternalTabContainer::OpenURLFromTab(WebContents* source, | 356 WebContents* ExternalTabContainer::OpenURLFromTab(WebContents* source, |
| 357 const OpenURLParams& params) { | 357 const OpenURLParams& params) { |
| 358 if (pending()) { | 358 GURL referrer_url = GURL(WebSecurityPolicy::generateReferrerHeader( |
| 359 pending_open_url_requests_.push_back(params); | 359 params.referrer.policy, |
| 360 return NULL; | 360 params.url, |
| 361 WebString::fromUTF8(params.referrer.url.spec())).utf8()); | |
| 362 content::Referrer referrer = content::Referrer(referrer_url, | |
| 363 params.referrer.policy); | |
| 364 return OpenUrlInExtenalHost(source, params.url, params.disposition, referrer); | |
| 365 } | |
| 366 | |
| 367 bool ExternalTabContainer::ShouldIgnoreNavigation( | |
| 368 WebContents* source, | |
| 369 const GURL& url, | |
| 370 const content::Referrer& referrer, | |
| 371 WindowOpenDisposition disposition, | |
| 372 bool is_content_initiated, | |
| 373 content::PageTransition transition_type) { | |
| 374 | |
| 375 if (is_content_initiated) { | |
| 376 return (NULL == OpenUrlInExtenalHost(source, url, disposition, referrer)); | |
|
ananta
2012/04/11 23:08:05
The OpenUrlInExtenalHost function will return NULL
mkosiba (inactive)
2012/04/12 10:12:52
Done.
| |
| 361 } | 377 } |
| 362 | 378 return false; |
| 363 switch (params.disposition) { | |
| 364 case CURRENT_TAB: | |
| 365 case SINGLETON_TAB: | |
| 366 case NEW_FOREGROUND_TAB: | |
| 367 case NEW_BACKGROUND_TAB: | |
| 368 case NEW_POPUP: | |
| 369 case NEW_WINDOW: | |
| 370 case SAVE_TO_DISK: | |
| 371 if (automation_) { | |
| 372 GURL referrer = GURL(WebSecurityPolicy::generateReferrerHeader( | |
| 373 params.referrer.policy, | |
| 374 params.url, | |
| 375 WebString::fromUTF8(params.referrer.url.spec())).utf8()); | |
| 376 automation_->Send(new AutomationMsg_OpenURL(tab_handle_, | |
| 377 params.url, | |
| 378 referrer, | |
| 379 params.disposition)); | |
| 380 // TODO(ananta) | |
| 381 // We should populate other fields in the | |
| 382 // ViewHostMsg_FrameNavigate_Params structure. Another option could be | |
| 383 // to refactor the UpdateHistoryForNavigation function in TabContents. | |
| 384 content::FrameNavigateParams nav_params; | |
| 385 nav_params.referrer = content::Referrer(referrer, | |
| 386 params.referrer.policy); | |
| 387 nav_params.url = params.url; | |
| 388 nav_params.page_id = -1; | |
| 389 nav_params.transition = content::PAGE_TRANSITION_LINK; | |
| 390 | |
| 391 content::LoadCommittedDetails details; | |
| 392 details.did_replace_entry = false; | |
| 393 | |
| 394 scoped_refptr<history::HistoryAddPageArgs> add_page_args( | |
| 395 tab_contents_->history_tab_helper()-> | |
| 396 CreateHistoryAddPageArgs(params.url, details, nav_params)); | |
| 397 tab_contents_->history_tab_helper()-> | |
| 398 UpdateHistoryForNavigation(add_page_args); | |
| 399 | |
| 400 return tab_contents_->web_contents(); | |
| 401 } | |
| 402 break; | |
| 403 default: | |
| 404 NOTREACHED(); | |
| 405 break; | |
| 406 } | |
| 407 | |
| 408 return NULL; | |
| 409 } | 379 } |
| 410 | 380 |
| 411 void ExternalTabContainer::NavigationStateChanged(const WebContents* source, | 381 void ExternalTabContainer::NavigationStateChanged(const WebContents* source, |
| 412 unsigned changed_flags) { | 382 unsigned changed_flags) { |
| 413 if (automation_) { | 383 if (automation_) { |
| 414 NavigationInfo nav_info; | 384 NavigationInfo nav_info; |
| 415 if (InitNavigationInfo(&nav_info, content::NAVIGATION_TYPE_NAV_IGNORE, 0)) | 385 if (InitNavigationInfo(&nav_info, content::NAVIGATION_TYPE_NAV_IGNORE, 0)) |
| 416 automation_->Send(new AutomationMsg_NavigationStateChanged( | 386 automation_->Send(new AutomationMsg_NavigationStateChanged( |
| 417 tab_handle_, changed_flags, nav_info)); | 387 tab_handle_, changed_flags, nav_info)); |
| 418 } | 388 } |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1143 ServicePendingOpenURLRequests(); | 1113 ServicePendingOpenURLRequests(); |
| 1144 } | 1114 } |
| 1145 | 1115 |
| 1146 void ExternalTabContainer::ServicePendingOpenURLRequests() { | 1116 void ExternalTabContainer::ServicePendingOpenURLRequests() { |
| 1147 DCHECK(pending()); | 1117 DCHECK(pending()); |
| 1148 | 1118 |
| 1149 set_pending(false); | 1119 set_pending(false); |
| 1150 | 1120 |
| 1151 for (size_t index = 0; index < pending_open_url_requests_.size(); | 1121 for (size_t index = 0; index < pending_open_url_requests_.size(); |
| 1152 ++index) { | 1122 ++index) { |
| 1153 const OpenURLParams& url_request = pending_open_url_requests_[index]; | 1123 const PendingOpenUrlRequest& url_request = |
| 1154 OpenURLFromTab(web_contents(), url_request); | 1124 pending_open_url_requests_[index]; |
| 1125 OpenUrlInExtenalHost(web_contents(), url_request.url, | |
| 1126 url_request.disposition, url_request.referrer); | |
| 1155 } | 1127 } |
| 1156 pending_open_url_requests_.clear(); | 1128 pending_open_url_requests_.clear(); |
| 1157 } | 1129 } |
| 1158 | 1130 |
| 1159 void ExternalTabContainer::SetupExternalTabView() { | 1131 void ExternalTabContainer::SetupExternalTabView() { |
| 1160 // Create a TabContentsContainer to handle focus cycling using Tab and | 1132 // Create a TabContentsContainer to handle focus cycling using Tab and |
| 1161 // Shift-Tab. | 1133 // Shift-Tab. |
| 1162 tab_contents_container_ = new TabContentsContainer; | 1134 tab_contents_container_ = new TabContentsContainer; |
| 1163 | 1135 |
| 1164 // The views created here will be destroyed when the ExternalTabContainer | 1136 // The views created here will be destroyed when the ExternalTabContainer |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1182 | 1154 |
| 1183 layout->StartRow(0, 0); | 1155 layout->StartRow(0, 0); |
| 1184 layout->AddView(info_bar_container); | 1156 layout->AddView(info_bar_container); |
| 1185 layout->StartRow(1, 0); | 1157 layout->StartRow(1, 0); |
| 1186 layout->AddView(tab_contents_container_); | 1158 layout->AddView(tab_contents_container_); |
| 1187 GetWidget()->SetContentsView(external_tab_view_); | 1159 GetWidget()->SetContentsView(external_tab_view_); |
| 1188 // Note that SetTabContents must be called after AddChildView is called | 1160 // Note that SetTabContents must be called after AddChildView is called |
| 1189 tab_contents_container_->ChangeWebContents(web_contents()); | 1161 tab_contents_container_->ChangeWebContents(web_contents()); |
| 1190 } | 1162 } |
| 1191 | 1163 |
| 1164 content::WebContents* ExternalTabContainer::OpenUrlInExtenalHost( | |
| 1165 content::WebContents* source, | |
| 1166 const GURL& url, | |
| 1167 WindowOpenDisposition disposition, | |
| 1168 const content::Referrer& referrer) { | |
| 1169 | |
| 1170 if (pending()) { | |
| 1171 PendingOpenUrlRequest pending_request; | |
| 1172 pending_request.url = url; | |
| 1173 pending_request.disposition = disposition; | |
| 1174 pending_request.referrer = referrer; | |
| 1175 pending_open_url_requests_.push_back(pending_request); | |
| 1176 return NULL; | |
| 1177 } | |
| 1178 | |
| 1179 switch (disposition) { | |
| 1180 case CURRENT_TAB: | |
| 1181 case SINGLETON_TAB: | |
| 1182 case NEW_FOREGROUND_TAB: | |
| 1183 case NEW_BACKGROUND_TAB: | |
| 1184 case NEW_POPUP: | |
| 1185 case NEW_WINDOW: | |
| 1186 case SAVE_TO_DISK: | |
| 1187 if (automation_) { | |
| 1188 automation_->Send(new AutomationMsg_OpenURL(tab_handle_, | |
| 1189 url, | |
| 1190 referrer.url, | |
| 1191 disposition)); | |
| 1192 // TODO(ananta) | |
| 1193 // We should populate other fields in the | |
| 1194 // ViewHostMsg_FrameNavigate_Params structure. Another option could be | |
| 1195 // to refactor the UpdateHistoryForNavigation function in TabContents. | |
| 1196 content::FrameNavigateParams nav_params; | |
| 1197 nav_params.referrer = referrer; | |
| 1198 nav_params.url = url; | |
| 1199 nav_params.page_id = -1; | |
| 1200 nav_params.transition = content::PAGE_TRANSITION_LINK; | |
| 1201 | |
| 1202 content::LoadCommittedDetails details; | |
| 1203 details.did_replace_entry = false; | |
| 1204 | |
| 1205 scoped_refptr<history::HistoryAddPageArgs> add_page_args( | |
| 1206 tab_contents_->history_tab_helper()-> | |
| 1207 CreateHistoryAddPageArgs(url, details, nav_params)); | |
| 1208 tab_contents_->history_tab_helper()-> | |
| 1209 UpdateHistoryForNavigation(add_page_args); | |
| 1210 | |
| 1211 return tab_contents_->web_contents(); | |
| 1212 } | |
| 1213 break; | |
| 1214 default: | |
| 1215 NOTREACHED(); | |
| 1216 break; | |
| 1217 } | |
| 1218 | |
| 1219 return NULL; | |
| 1220 } | |
| 1221 | |
| 1192 TemporaryPopupExternalTabContainer::TemporaryPopupExternalTabContainer( | 1222 TemporaryPopupExternalTabContainer::TemporaryPopupExternalTabContainer( |
| 1193 AutomationProvider* automation, | 1223 AutomationProvider* automation, |
| 1194 AutomationResourceMessageFilter* filter) | 1224 AutomationResourceMessageFilter* filter) |
| 1195 : ExternalTabContainer(automation, filter) { | 1225 : ExternalTabContainer(automation, filter) { |
| 1196 } | 1226 } |
| 1197 | 1227 |
| 1198 TemporaryPopupExternalTabContainer::~TemporaryPopupExternalTabContainer() { | 1228 TemporaryPopupExternalTabContainer::~TemporaryPopupExternalTabContainer() { |
| 1199 DVLOG(1) << __FUNCTION__; | 1229 DVLOG(1) << __FUNCTION__; |
| 1200 } | 1230 } |
| 1201 | 1231 |
| 1202 WebContents* TemporaryPopupExternalTabContainer::OpenURLFromTab( | 1232 WebContents* TemporaryPopupExternalTabContainer::OpenURLFromTab( |
| 1203 WebContents* source, | 1233 WebContents* source, |
| 1204 const OpenURLParams& params) { | 1234 const OpenURLParams& params) { |
| 1205 if (!automation_) | 1235 if (!automation_) |
| 1206 return NULL; | 1236 return NULL; |
| 1207 | 1237 |
| 1208 OpenURLParams forward_params = params; | 1238 OpenURLParams forward_params = params; |
| 1209 if (params.disposition == CURRENT_TAB) { | 1239 if (params.disposition == CURRENT_TAB) { |
| 1210 DCHECK(route_all_top_level_navigations_); | 1240 DCHECK(route_all_top_level_navigations_); |
| 1211 forward_params.disposition = NEW_FOREGROUND_TAB; | 1241 forward_params.disposition = NEW_FOREGROUND_TAB; |
| 1212 } | 1242 } |
| 1213 WebContents* new_contents = | 1243 WebContents* new_contents = |
| 1214 ExternalTabContainer::OpenURLFromTab(source, forward_params); | 1244 ExternalTabContainer::OpenURLFromTab(source, forward_params); |
| 1215 // support only one navigation for a dummy tab before it is killed. | 1245 // support only one navigation for a dummy tab before it is killed. |
| 1216 ::DestroyWindow(GetNativeView()); | 1246 ::DestroyWindow(GetNativeView()); |
| 1217 return new_contents; | 1247 return new_contents; |
| 1218 } | 1248 } |
| OLD | NEW |