da85877eefcdb96386f4f91016ef508878ae22bf
[platform/framework/web/crosswalk.git] / src / chrome / test / chromedriver / chrome / chrome_impl.cc
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
15 ChromeImpl::~ChromeImpl() {
16   if (!quit_)
17     port_reservation_->Leak();
18 }
19
20 ChromeDesktopImpl* ChromeImpl::GetAsDesktop() {
21   return NULL;
22 }
23
24 const BrowserInfo* ChromeImpl::GetBrowserInfo() {
25   return devtools_http_client_->browser_info();
26 }
27
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
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
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
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
127 Status ChromeImpl::ActivateWebView(const std::string& id) {
128   return devtools_http_client_->ActivateWebView(id);
129 }
130
131 bool ChromeImpl::IsMobileEmulationEnabled() const {
132   return false;
133 }
134
135 Status ChromeImpl::Quit() {
136   Status status = QuitImpl();
137   if (status.IsOk())
138     quit_ = true;
139   return status;
140 }
141
142 ChromeImpl::ChromeImpl(
143     scoped_ptr<DevToolsHttpClient> http_client,
144     scoped_ptr<DevToolsClient> websocket_client,
145     ScopedVector<DevToolsEventListener>& devtools_event_listeners,
146     scoped_ptr<PortReservation> port_reservation)
147     : quit_(false),
148       devtools_http_client_(http_client.Pass()),
149       devtools_websocket_client_(websocket_client.Pass()),
150       port_reservation_(port_reservation.Pass()) {
151   devtools_event_listeners_.swap(devtools_event_listeners);
152 }