| 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/test/chromedriver/chrome/chrome_impl.h" | 5 #include "chrome/test/chromedriver/chrome/chrome_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <list> | 8 #include <list> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 build_no_(0) {} | 206 build_no_(0) {} |
| 207 | 207 |
| 208 ChromeImpl::~ChromeImpl() { | 208 ChromeImpl::~ChromeImpl() { |
| 209 web_view_map_.clear(); | 209 web_view_map_.clear(); |
| 210 } | 210 } |
| 211 | 211 |
| 212 std::string ChromeImpl::GetVersion() { | 212 std::string ChromeImpl::GetVersion() { |
| 213 return version_; | 213 return version_; |
| 214 } | 214 } |
| 215 | 215 |
| 216 Status ChromeImpl::GetWebViews(std::list<WebView*>* web_views) { | 216 Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) { |
| 217 WebViewInfoList info_list; | 217 WebViewInfoList info_list; |
| 218 Status status = FetchWebViewsInfo( | 218 Status status = FetchWebViewsInfo( |
| 219 context_getter_, port_, &info_list); | 219 context_getter_, port_, &info_list); |
| 220 if (status.IsError()) | 220 if (status.IsError()) |
| 221 return status; | 221 return status; |
| 222 | 222 |
| 223 std::list<WebView*> internal_web_views; | 223 // Check if some web views are closed. |
| 224 std::list<std::string>::iterator it = web_view_ids_.begin(); |
| 225 while (it != web_view_ids_.end()) { |
| 226 if (!GetWebViewFromList(*it, info_list)) { |
| 227 web_view_map_.erase(*it); |
| 228 it = web_view_ids_.erase(it); |
| 229 } else { |
| 230 ++it; |
| 231 } |
| 232 } |
| 233 |
| 234 // Check for newly-opened web views. |
| 224 for (WebViewInfoList::const_iterator it = info_list.begin(); | 235 for (WebViewInfoList::const_iterator it = info_list.begin(); |
| 225 it != info_list.end(); ++it) { | 236 it != info_list.end(); ++it) { |
| 226 WebViewMap::const_iterator found = web_view_map_.find(it->id); | 237 if (it->type != internal::WebViewInfo::kPage) |
| 227 if (found != web_view_map_.end()) { | |
| 228 internal_web_views.push_back(found->second.get()); | |
| 229 continue; | 238 continue; |
| 239 |
| 240 if (std::find(web_view_ids_.begin(), web_view_ids_.end(), it->id) == |
| 241 web_view_ids_.end()) { |
| 242 web_view_ids_.push_back(it->id); |
| 230 } | 243 } |
| 231 | |
| 232 std::string ws_url = base::StringPrintf( | |
| 233 "ws://127.0.0.1:%d/devtools/page/%s", port_, it->id.c_str()); | |
| 234 DevToolsClientImpl::FrontendCloserFunc frontend_closer_func = base::Bind( | |
| 235 &CloseDevToolsFrontend, this, socket_factory_, | |
| 236 context_getter_, port_, it->id); | |
| 237 web_view_map_[it->id] = make_linked_ptr(new WebViewImpl( | |
| 238 it->id, | |
| 239 new DevToolsClientImpl(socket_factory_, ws_url, frontend_closer_func), | |
| 240 this, | |
| 241 base::Bind(&CloseWebView, context_getter_, port_, it->id))); | |
| 242 internal_web_views.push_back(web_view_map_[it->id].get()); | |
| 243 } | 244 } |
| 244 | 245 |
| 245 web_views->swap(internal_web_views); | 246 *web_view_ids = web_view_ids_; |
| 246 return Status(kOk); | 247 return Status(kOk); |
| 247 } | 248 } |
| 248 | 249 |
| 250 Status ChromeImpl::GetWebViewById(const std::string& id, WebView** web_view) { |
| 251 WebViewMap::const_iterator found = web_view_map_.find(id); |
| 252 if (found != web_view_map_.end()) { |
| 253 *web_view = found->second.get(); |
| 254 return Status(kOk); |
| 255 } |
| 256 |
| 257 WebViewInfoList info_list; |
| 258 Status status = FetchWebViewsInfo(context_getter_, port_, &info_list); |
| 259 if (status.IsError()) |
| 260 return status; |
| 261 for (WebViewInfoList::const_iterator it = info_list.begin(); |
| 262 it != info_list.end(); ++it) { |
| 263 if (it->id == id && it->type == internal::WebViewInfo::kPage) { |
| 264 std::string ws_url = base::StringPrintf( |
| 265 "ws://127.0.0.1:%d/devtools/page/%s", port_, it->id.c_str()); |
| 266 DevToolsClientImpl::FrontendCloserFunc frontend_closer_func = base::Bind( |
| 267 &CloseDevToolsFrontend, this, socket_factory_, |
| 268 context_getter_, port_, it->id); |
| 269 web_view_map_[it->id] = make_linked_ptr(new WebViewImpl( |
| 270 it->id, |
| 271 new DevToolsClientImpl(socket_factory_, ws_url, frontend_closer_func), |
| 272 this, |
| 273 base::Bind(&CloseWebView, context_getter_, port_, it->id))); |
| 274 *web_view = web_view_map_[it->id].get(); |
| 275 return Status(kOk); |
| 276 } |
| 277 } |
| 278 return Status(kUnknownError, "web view not found"); |
| 279 } |
| 280 |
| 249 Status ChromeImpl::IsJavaScriptDialogOpen(bool* is_open) { | 281 Status ChromeImpl::IsJavaScriptDialogOpen(bool* is_open) { |
| 250 JavaScriptDialogManager* manager; | 282 JavaScriptDialogManager* manager; |
| 251 Status status = GetDialogManagerForOpenDialog(&manager); | 283 Status status = GetDialogManagerForOpenDialog(&manager); |
| 252 if (status.IsError()) | 284 if (status.IsError()) |
| 253 return status; | 285 return status; |
| 254 *is_open = manager != NULL; | 286 *is_open = manager != NULL; |
| 255 return Status(kOk); | 287 return Status(kOk); |
| 256 } | 288 } |
| 257 | 289 |
| 258 Status ChromeImpl::GetJavaScriptDialogMessage(std::string* message) { | 290 Status ChromeImpl::GetJavaScriptDialogMessage(std::string* message) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 272 Status status = GetDialogManagerForOpenDialog(&manager); | 304 Status status = GetDialogManagerForOpenDialog(&manager); |
| 273 if (status.IsError()) | 305 if (status.IsError()) |
| 274 return status; | 306 return status; |
| 275 if (!manager) | 307 if (!manager) |
| 276 return Status(kNoAlertOpen); | 308 return Status(kNoAlertOpen); |
| 277 | 309 |
| 278 return manager->HandleDialog(accept, prompt_text); | 310 return manager->HandleDialog(accept, prompt_text); |
| 279 } | 311 } |
| 280 | 312 |
| 281 void ChromeImpl::OnWebViewClose(WebView* web_view) { | 313 void ChromeImpl::OnWebViewClose(WebView* web_view) { |
| 314 web_view_ids_.remove(web_view->GetId()); |
| 282 web_view_map_.erase(web_view->GetId()); | 315 web_view_map_.erase(web_view->GetId()); |
| 283 } | 316 } |
| 284 | 317 |
| 285 Status ChromeImpl::Init() { | 318 Status ChromeImpl::Init() { |
| 286 base::Time deadline = base::Time::Now() + base::TimeDelta::FromSeconds(20); | 319 base::Time deadline = base::Time::Now() + base::TimeDelta::FromSeconds(20); |
| 287 std::string version; | 320 std::string version; |
| 288 Status status(kOk); | 321 Status status(kOk); |
| 289 while (base::Time::Now() < deadline) { | 322 while (base::Time::Now() < deadline) { |
| 290 status = FetchVersionInfo(context_getter_, port_, &version); | 323 status = FetchVersionInfo(context_getter_, port_, &version); |
| 291 if (status.IsOk()) | 324 if (status.IsOk()) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 310 } | 343 } |
| 311 return Status(kUnknownError, "unable to discover open pages"); | 344 return Status(kUnknownError, "unable to discover open pages"); |
| 312 } | 345 } |
| 313 | 346 |
| 314 int ChromeImpl::GetPort() const { | 347 int ChromeImpl::GetPort() const { |
| 315 return port_; | 348 return port_; |
| 316 } | 349 } |
| 317 | 350 |
| 318 Status ChromeImpl::GetDialogManagerForOpenDialog( | 351 Status ChromeImpl::GetDialogManagerForOpenDialog( |
| 319 JavaScriptDialogManager** manager) { | 352 JavaScriptDialogManager** manager) { |
| 320 std::list<WebView*> web_views; | 353 std::list<std::string> web_view_ids; |
| 321 Status status = GetWebViews(&web_views); | 354 Status status = GetWebViewIds(&web_view_ids); |
| 322 if (status.IsError()) | 355 if (status.IsError()) |
| 323 return status; | 356 return status; |
| 324 | 357 |
| 325 for (std::list<WebView*>::const_iterator it = web_views.begin(); | 358 for (std::list<std::string>::const_iterator it = web_view_ids.begin(); |
| 326 it != web_views.end(); ++it) { | 359 it != web_view_ids.end(); ++it) { |
| 327 if ((*it)->GetJavaScriptDialogManager()->IsDialogOpen()) { | 360 WebView* web_view; |
| 328 *manager = (*it)->GetJavaScriptDialogManager(); | 361 status = GetWebViewById(*it, &web_view); |
| 362 if (status.IsError()) |
| 363 return status; |
| 364 if (web_view->GetJavaScriptDialogManager()->IsDialogOpen()) { |
| 365 *manager = web_view->GetJavaScriptDialogManager(); |
| 329 return Status(kOk); | 366 return Status(kOk); |
| 330 } | 367 } |
| 331 } | 368 } |
| 332 *manager = NULL; | 369 *manager = NULL; |
| 333 return Status(kOk); | 370 return Status(kOk); |
| 334 } | 371 } |
| 335 | 372 |
| 336 Status ChromeImpl::ParseAndCheckVersion(const std::string& version) { | 373 Status ChromeImpl::ParseAndCheckVersion(const std::string& version) { |
| 337 if (version.empty()) { | 374 if (version.empty()) { |
| 338 // Content Shell has an empty product version and a fake user agent. | 375 // Content Shell has an empty product version and a fake user agent. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 return Status(kUnknownError, "version info not a dictionary"); | 460 return Status(kUnknownError, "version info not a dictionary"); |
| 424 if (!dict->GetString("Browser", version)) { | 461 if (!dict->GetString("Browser", version)) { |
| 425 return Status( | 462 return Status( |
| 426 kUnknownError, "Chrome version must be >= 26", | 463 kUnknownError, "Chrome version must be >= 26", |
| 427 Status(kUnknownError, "version info doesn't include string 'Browser'")); | 464 Status(kUnknownError, "version info doesn't include string 'Browser'")); |
| 428 } | 465 } |
| 429 return Status(kOk); | 466 return Status(kOk); |
| 430 } | 467 } |
| 431 | 468 |
| 432 } // namespace internal | 469 } // namespace internal |
| OLD | NEW |