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