- add sources.
[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/web_view_impl.h"
12 #include "chrome/test/chromedriver/net/port_server.h"
13
14 ChromeImpl::~ChromeImpl() {
15   if (!quit_)
16     port_reservation_->Leak();
17 }
18
19 ChromeDesktopImpl* ChromeImpl::GetAsDesktop() {
20   return NULL;
21 }
22
23 std::string ChromeImpl::GetVersion() {
24   return devtools_http_client_->version();
25 }
26
27 int ChromeImpl::GetBuildNo() {
28   return devtools_http_client_->build_no();
29 }
30
31 bool ChromeImpl::HasCrashedWebView() {
32   for (WebViewList::iterator it = web_views_.begin();
33        it != web_views_.end(); ++it) {
34     if ((*it)->WasCrashed())
35       return true;
36   }
37   return false;
38 }
39
40 Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) {
41   WebViewsInfo views_info;
42   Status status = devtools_http_client_->GetWebViewsInfo(&views_info);
43   if (status.IsError())
44     return status;
45
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);
51     } else {
52       ++it;
53     }
54   }
55
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)
60       continue;
61
62     bool found = false;
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) {
66         found = true;
67         break;
68       }
69     }
70     if (!found) {
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.
78       }
79       web_views_.push_back(make_linked_ptr(new WebViewImpl(
80           view.id, GetBuildNo(), client.Pass())));
81     }
82   }
83
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());
88   }
89   web_view_ids->swap(web_view_ids_tmp);
90   return Status(kOk);
91 }
92
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();
98       return Status(kOk);
99     }
100   }
101   return Status(kUnknownError, "web view not found");
102 }
103
104 Status ChromeImpl::CloseWebView(const std::string& id) {
105   Status status = devtools_http_client_->CloseWebView(id);
106   if (status.IsError())
107     return status;
108   for (WebViewList::iterator iter = web_views_.begin();
109        iter != web_views_.end(); ++iter) {
110     if ((*iter)->GetId() == id) {
111       web_views_.erase(iter);
112       break;
113     }
114   }
115   return Status(kOk);
116 }
117
118 Status ChromeImpl::ActivateWebView(const std::string& id) {
119   return devtools_http_client_->ActivateWebView(id);
120 }
121
122 Status ChromeImpl::Quit() {
123   Status status = QuitImpl();
124   if (status.IsOk())
125     quit_ = true;
126   return status;
127 }
128
129 ChromeImpl::ChromeImpl(
130     scoped_ptr<DevToolsHttpClient> client,
131     ScopedVector<DevToolsEventListener>& devtools_event_listeners,
132     scoped_ptr<PortReservation> port_reservation)
133     : quit_(false),
134       devtools_http_client_(client.Pass()),
135       port_reservation_(port_reservation.Pass()) {
136   devtools_event_listeners_.swap(devtools_event_listeners);
137 }