session.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/chromedriver/session.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/chrome.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/version.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/web_view.h" 14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/test/chromedriver/logging.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FrameInfo::FrameInfo(const std::string& parent_frame_id, 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& frame_id, 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& chromedriver_frame_id) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : parent_frame_id(parent_frame_id), 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame_id(frame_id), 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromedriver_frame_id(chromedriver_frame_id) {} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Session::Session(const std::string& id) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id(id), 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thread(("SessionThread_" + id).c_str()), 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detach(false), 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sticky_modifiers(0), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_position(0, 0), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) implicit_wait(0), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_load_timeout(0), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_timeout(0) { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Session::Session(const std::string& id, scoped_ptr<Chrome> chrome) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id(id), 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thread(("SessionThread_" + id).c_str()), 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detach(false), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome(chrome.Pass()), 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sticky_modifiers(0), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_position(0, 0), 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) implicit_wait(0), 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_load_timeout(0), 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) script_timeout(0), 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capabilities(CreateCapabilities()) { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Session::~Session() {} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Status Session::GetTargetWindow(WebView** web_view) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!chrome) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Status(kNoSuchWindow, "no chrome started in this session"); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Status status = chrome->GetWebViewById(window, web_view); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (status.IsError()) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status = Status(kNoSuchWindow, "target window already closed", status); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return status; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Session::SwitchToTopFrame() { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frames.clear(); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Session::SwitchToSubFrame(const std::string& frame_id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& chromedriver_frame_id) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string parent_frame_id; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!frames.empty()) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_frame_id = frames.back().frame_id; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frames.push_back(FrameInfo(parent_frame_id, frame_id, chromedriver_frame_id)); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string Session::GetCurrentFrameId() const { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (frames.empty()) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return frames.back().frame_id; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<base::DictionaryValue> Session::CreateCapabilities() { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> caps(new base::DictionaryValue()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetString("browserName", "chrome"); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetString("version", chrome->GetVersion()); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) caps->SetString("chrome.chromedriverVersion", kChromeDriverVersion); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetString("platform", chrome->GetOperatingSystemName()); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("javascriptEnabled", true); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("takesScreenshot", true); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("handlesAlerts", true); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("databaseEnabled", true); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("locationContextEnabled", true); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("applicationCacheEnabled", false); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("browserConnectionEnabled", false); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("cssSelectorsEnabled", true); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("webStorageEnabled", true); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("rotatable", false); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("acceptSslCerts", true); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) caps->SetBoolean("nativeEvents", true); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return caps.Pass(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionAccessorImpl::SessionAccessorImpl(scoped_ptr<Session> session) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : session_(session.Pass()) {} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Session* SessionAccessorImpl::Access(scoped_ptr<base::AutoLock>* lock) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock->reset(new base::AutoLock(session_lock_)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return session_.get(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SessionAccessorImpl::DeleteSession() { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) session_.reset(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SessionAccessorImpl::~SessionAccessorImpl() {} 111