blob: 645a0e0ac83547ac31f922c738982899d42b5039 [file] [log] [blame]
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COBALT_WEBDRIVER_ELEMENT_DRIVER_H_
#define COBALT_WEBDRIVER_ELEMENT_DRIVER_H_
#include <string>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop_proxy.h"
#include "base/threading/thread_checker.h"
#include "cobalt/dom/element.h"
#include "cobalt/dom/keyboard_event.h"
#include "cobalt/webdriver/element_mapping.h"
#include "cobalt/webdriver/keyboard.h"
#include "cobalt/webdriver/protocol/element_id.h"
#include "cobalt/webdriver/protocol/keys.h"
#include "cobalt/webdriver/protocol/search_strategy.h"
#include "cobalt/webdriver/util/command_result.h"
namespace cobalt {
namespace webdriver {
class WindowDriver;
// ElementDriver could be considered a WebElement as described in the WebDriver
// spec.
// https://code.google.com/p/selenium/wiki/JsonWireProtocol#WebElement
// Commands that interact with a WebElement, such as:
// /session/:sessionId/element/:id/some_command
// will map to a method on this class.
class ElementDriver {
public:
typedef base::Callback<void(scoped_refptr<dom::Element>,
const dom::KeyboardEvent::Data&)>
KeyboardEventInjector;
ElementDriver(const protocol::ElementId& element_id,
const base::WeakPtr<dom::Element>& element,
ElementMapping* element_mapping,
KeyboardEventInjector keyboard_injector,
const scoped_refptr<base::MessageLoopProxy>& message_loop);
const protocol::ElementId& element_id() { return element_id_; }
util::CommandResult<std::string> GetTagName();
util::CommandResult<std::string> GetText();
util::CommandResult<bool> IsDisplayed();
util::CommandResult<void> SendKeys(const protocol::Keys& keys);
util::CommandResult<protocol::ElementId> FindElement(
const protocol::SearchStrategy& strategy);
util::CommandResult<std::vector<protocol::ElementId> > FindElements(
const protocol::SearchStrategy& strategy);
util::CommandResult<bool> Equals(const ElementDriver* other_element_driver);
util::CommandResult<base::optional<std::string> > GetAttribute(
const std::string& attribute_name);
util::CommandResult<std::string> GetCssProperty(
const std::string& property_name);
private:
typedef std::vector<protocol::ElementId> ElementIdVector;
// Get the dom::Element* that this ElementDriver wraps. This must be called
// on |element_message_loop_|.
dom::Element* GetWeakElement();
util::CommandResult<void> SendKeysInternal(
scoped_ptr<Keyboard::KeyboardEventVector> keyboard_events);
// Shared logic between FindElement and FindElements.
template <typename T>
util::CommandResult<T> FindElementsInternal(
const protocol::SearchStrategy& strategy);
util::CommandResult<bool> EqualsInternal(
const ElementDriver* other_element_driver);
protocol::ElementId element_id_;
// These should only be accessed from |element_message_loop_|.
base::WeakPtr<dom::Element> element_;
ElementMapping* element_mapping_;
KeyboardEventInjector keyboard_injector_;
scoped_refptr<base::MessageLoopProxy> element_message_loop_;
friend class WindowDriver;
};
} // namespace webdriver
} // namespace cobalt
#endif // COBALT_WEBDRIVER_ELEMENT_DRIVER_H_