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
3 // found in the LICENSE file.
5 #include "chrome/test/chromedriver/chrome/chrome_impl.h"
7 #include "chrome/test/chromedriver/chrome/devtools_client.h"
8 #include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
9 #include "chrome/test/chromedriver/chrome/devtools_http_client.h"
10 #include "chrome/test/chromedriver/chrome/status.h"
11 #include "chrome/test/chromedriver/chrome/web_view_impl.h"
12 #include "chrome/test/chromedriver/net/port_server.h"
14 ChromeImpl::~ChromeImpl() {
16 port_reservation_->Leak();
19 ChromeDesktopImpl* ChromeImpl::GetAsDesktop() {
23 const BrowserInfo* ChromeImpl::GetBrowserInfo() {
24 return devtools_http_client_->browser_info();
27 bool ChromeImpl::HasCrashedWebView() {
28 for (WebViewList::iterator it = web_views_.begin();
29 it != web_views_.end(); ++it) {
30 if ((*it)->WasCrashed())
36 Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) {
37 WebViewsInfo views_info;
38 Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
42 // Check if some web views are closed.
43 WebViewList::iterator it = web_views_.begin();
44 while (it != web_views_.end()) {
45 if (!views_info.GetForId((*it)->GetId())) {
46 it = web_views_.erase(it);
52 // Check for newly-opened web views.
53 for (size_t i = 0; i < views_info.GetSize(); ++i) {
54 const WebViewInfo& view = views_info.Get(i);
55 if (view.type != WebViewInfo::kPage && view.type != WebViewInfo::kApp)
59 for (WebViewList::const_iterator web_view_iter = web_views_.begin();
60 web_view_iter != web_views_.end(); ++web_view_iter) {
61 if ((*web_view_iter)->GetId() == view.id) {
67 scoped_ptr<DevToolsClient> client(
68 devtools_http_client_->CreateClient(view.id));
69 for (ScopedVector<DevToolsEventListener>::const_iterator listener =
70 devtools_event_listeners_.begin();
71 listener != devtools_event_listeners_.end(); ++listener) {
72 client->AddListener(*listener);
73 // OnConnected will fire when DevToolsClient connects later.
75 web_views_.push_back(make_linked_ptr(new WebViewImpl(
77 devtools_http_client_->browser_info(),
79 devtools_http_client_->device_metrics())));
83 std::list<std::string> web_view_ids_tmp;
84 for (WebViewList::const_iterator web_view_iter = web_views_.begin();
85 web_view_iter != web_views_.end(); ++web_view_iter) {
86 web_view_ids_tmp.push_back((*web_view_iter)->GetId());
88 web_view_ids->swap(web_view_ids_tmp);
92 Status ChromeImpl::GetWebViewById(const std::string& id, WebView** web_view) {
93 for (WebViewList::iterator it = web_views_.begin();
94 it != web_views_.end(); ++it) {
95 if ((*it)->GetId() == id) {
96 *web_view = (*it).get();
100 return Status(kUnknownError, "web view not found");
103 Status ChromeImpl::CloseWebView(const std::string& id) {
104 Status status = devtools_http_client_->CloseWebView(id);
105 if (status.IsError())
107 for (WebViewList::iterator iter = web_views_.begin();
108 iter != web_views_.end(); ++iter) {
109 if ((*iter)->GetId() == id) {
110 web_views_.erase(iter);
117 Status ChromeImpl::ActivateWebView(const std::string& id) {
118 return devtools_http_client_->ActivateWebView(id);
121 bool ChromeImpl::IsMobileEmulationEnabled() const {
125 Status ChromeImpl::Quit() {
126 Status status = QuitImpl();
132 ChromeImpl::ChromeImpl(
133 scoped_ptr<DevToolsHttpClient> http_client,
134 scoped_ptr<DevToolsClient> websocket_client,
135 ScopedVector<DevToolsEventListener>& devtools_event_listeners,
136 scoped_ptr<PortReservation> port_reservation)
138 devtools_http_client_(http_client.Pass()),
139 devtools_websocket_client_(websocket_client.Pass()),
140 port_reservation_(port_reservation.Pass()) {
141 devtools_event_listeners_.swap(devtools_event_listeners);