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.
4
5 #include "chrome/test/chromedriver/chrome/chrome_impl.h"
6
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/version.h"
12 #include "chrome/test/chromedriver/chrome/web_view_impl.h"
13 #include "chrome/test/chromedriver/net/port_server.h"
14
~ChromeImpl()15 ChromeImpl::~ChromeImpl() {
16 if (!quit_)
17 port_reservation_->Leak();
18 }
19
GetAsDesktop()20 ChromeDesktopImpl* ChromeImpl::GetAsDesktop() {
21 return NULL;
22 }
23
GetBrowserInfo()24 const BrowserInfo* ChromeImpl::GetBrowserInfo() {
25 return devtools_http_client_->browser_info();
26 }
27
HasCrashedWebView()28 bool ChromeImpl::HasCrashedWebView() {
29 for (WebViewList::iterator it = web_views_.begin();
30 it != web_views_.end(); ++it) {
31 if ((*it)->WasCrashed())
32 return true;
33 }
34 return false;
35 }
36
GetWebViewIds(std::list<std::string> * web_view_ids)37 Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) {
38 WebViewsInfo views_info;
39 Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
40 if (status.IsError())
41 return status;
42
43 // Check if some web views are closed.
44 WebViewList::iterator it = web_views_.begin();
45 while (it != web_views_.end()) {
46 if (!views_info.GetForId((*it)->GetId())) {
47 it = web_views_.erase(it);
48 } else {
49 ++it;
50 }
51 }
52
53 // Check for newly-opened web views.
54 for (size_t i = 0; i < views_info.GetSize(); ++i) {
55 const WebViewInfo& view = views_info.Get(i);
56 if (view.type != WebViewInfo::kPage && view.type != WebViewInfo::kApp)
57 continue;
58
59 // Workaround to ignore generated background pages that are
60 // being returned as active windows for some builds of Chrome.
61 // TODO(bustamante): Once Chrome builds < 1755 are no longer
62 // supported this check can be removed.
63 int kBuildNumber = devtools_http_client_->browser_info()->build_no;
64 if (kBuildNumber < 1755 && view.type == WebViewInfo::kApp &&
65 view.url.find("_generated_background") != std::string::npos)
66 continue;
67
68 bool found = false;
69 for (WebViewList::const_iterator web_view_iter = web_views_.begin();
70 web_view_iter != web_views_.end(); ++web_view_iter) {
71 if ((*web_view_iter)->GetId() == view.id) {
72 found = true;
73 break;
74 }
75 }
76 if (!found) {
77 scoped_ptr<DevToolsClient> client(
78 devtools_http_client_->CreateClient(view.id));
79 for (ScopedVector<DevToolsEventListener>::const_iterator listener =
80 devtools_event_listeners_.begin();
81 listener != devtools_event_listeners_.end(); ++listener) {
82 client->AddListener(*listener);
83 // OnConnected will fire when DevToolsClient connects later.
84 }
85 web_views_.push_back(make_linked_ptr(new WebViewImpl(
86 view.id,
87 devtools_http_client_->browser_info(),
88 client.Pass(),
89 devtools_http_client_->device_metrics())));
90 }
91 }
92
93 std::list<std::string> web_view_ids_tmp;
94 for (WebViewList::const_iterator web_view_iter = web_views_.begin();
95 web_view_iter != web_views_.end(); ++web_view_iter) {
96 web_view_ids_tmp.push_back((*web_view_iter)->GetId());
97 }
98 web_view_ids->swap(web_view_ids_tmp);
99 return Status(kOk);
100 }
101
GetWebViewById(const std::string & id,WebView ** web_view)102 Status ChromeImpl::GetWebViewById(const std::string& id, WebView** web_view) {
103 for (WebViewList::iterator it = web_views_.begin();
104 it != web_views_.end(); ++it) {
105 if ((*it)->GetId() == id) {
106 *web_view = (*it).get();
107 return Status(kOk);
108 }
109 }
110 return Status(kUnknownError, "web view not found");
111 }
112
CloseWebView(const std::string & id)113 Status ChromeImpl::CloseWebView(const std::string& id) {
114 Status status = devtools_http_client_->CloseWebView(id);
115 if (status.IsError())
116 return status;
117 for (WebViewList::iterator iter = web_views_.begin();
118 iter != web_views_.end(); ++iter) {
119 if ((*iter)->GetId() == id) {
120 web_views_.erase(iter);
121 break;
122 }
123 }
124 return Status(kOk);
125 }
126
ActivateWebView(const std::string & id)127 Status ChromeImpl::ActivateWebView(const std::string& id) {
128 return devtools_http_client_->ActivateWebView(id);
129 }
130
IsMobileEmulationEnabled() const131 bool ChromeImpl::IsMobileEmulationEnabled() const {
132 return false;
133 }
134
Quit()135 Status ChromeImpl::Quit() {
136 Status status = QuitImpl();
137 if (status.IsOk())
138 quit_ = true;
139 return status;
140 }
141
ChromeImpl(scoped_ptr<DevToolsHttpClient> client,ScopedVector<DevToolsEventListener> & devtools_event_listeners,scoped_ptr<PortReservation> port_reservation)142 ChromeImpl::ChromeImpl(
143 scoped_ptr<DevToolsHttpClient> client,
144 ScopedVector<DevToolsEventListener>& devtools_event_listeners,
145 scoped_ptr<PortReservation> port_reservation)
146 : quit_(false),
147 devtools_http_client_(client.Pass()),
148 port_reservation_(port_reservation.Pass()) {
149 devtools_event_listeners_.swap(devtools_event_listeners);
150 }
151