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 std::string ChromeImpl::GetVersion() {
24 return devtools_http_client_->version();
27 int ChromeImpl::GetBuildNo() {
28 return devtools_http_client_->build_no();
31 bool ChromeImpl::HasCrashedWebView() {
32 for (WebViewList::iterator it = web_views_.begin();
33 it != web_views_.end(); ++it) {
34 if ((*it)->WasCrashed())
40 Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) {
41 WebViewsInfo views_info;
42 Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
46 // Check if some web views are closed.
47 WebViewList::iterator it = web_views_.begin();
48 while (it != web_views_.end()) {
49 if (!views_info.GetForId((*it)->GetId())) {
50 it = web_views_.erase(it);
56 // Check for newly-opened web views.
57 for (size_t i = 0; i < views_info.GetSize(); ++i) {
58 const WebViewInfo& view = views_info.Get(i);
59 if (view.type != WebViewInfo::kPage)
63 for (WebViewList::const_iterator web_view_iter = web_views_.begin();
64 web_view_iter != web_views_.end(); ++web_view_iter) {
65 if ((*web_view_iter)->GetId() == view.id) {
71 scoped_ptr<DevToolsClient> client(
72 devtools_http_client_->CreateClient(view.id));
73 for (ScopedVector<DevToolsEventListener>::const_iterator listener =
74 devtools_event_listeners_.begin();
75 listener != devtools_event_listeners_.end(); ++listener) {
76 client->AddListener(*listener);
77 // OnConnected will fire when DevToolsClient connects later.
79 web_views_.push_back(make_linked_ptr(new WebViewImpl(
80 view.id, GetBuildNo(), client.Pass())));
84 std::list<std::string> web_view_ids_tmp;
85 for (WebViewList::const_iterator web_view_iter = web_views_.begin();
86 web_view_iter != web_views_.end(); ++web_view_iter) {
87 web_view_ids_tmp.push_back((*web_view_iter)->GetId());
89 web_view_ids->swap(web_view_ids_tmp);
93 Status ChromeImpl::GetWebViewById(const std::string& id, WebView** web_view) {
94 for (WebViewList::iterator it = web_views_.begin();
95 it != web_views_.end(); ++it) {
96 if ((*it)->GetId() == id) {
97 *web_view = (*it).get();
101 return Status(kUnknownError, "web view not found");
104 Status ChromeImpl::CloseWebView(const std::string& id) {
105 Status status = devtools_http_client_->CloseWebView(id);
106 if (status.IsError())
108 for (WebViewList::iterator iter = web_views_.begin();
109 iter != web_views_.end(); ++iter) {
110 if ((*iter)->GetId() == id) {
111 web_views_.erase(iter);
118 Status ChromeImpl::ActivateWebView(const std::string& id) {
119 return devtools_http_client_->ActivateWebView(id);
122 Status ChromeImpl::Quit() {
123 Status status = QuitImpl();
129 ChromeImpl::ChromeImpl(
130 scoped_ptr<DevToolsHttpClient> client,
131 ScopedVector<DevToolsEventListener>& devtools_event_listeners,
132 scoped_ptr<PortReservation> port_reservation)
134 devtools_http_client_(client.Pass()),
135 port_reservation_(port_reservation.Pass()) {
136 devtools_event_listeners_.swap(devtools_event_listeners);