2015-04-13 12:09:26 -04:00
|
|
|
// Licensed to the Software Freedom Conservancy (SFC) under one
|
|
|
|
|
// or more contributor license agreements. See the NOTICE file
|
|
|
|
|
// distributed with this work for additional information
|
|
|
|
|
// regarding copyright ownership. The SFC licenses this file
|
|
|
|
|
// to you under the Apache License, Version 2.0 (the "License");
|
2013-01-11 22:18:32 +01:00
|
|
|
// 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 WEBDRIVER_IE_SCRIPT_H_
|
|
|
|
|
#define WEBDRIVER_IE_SCRIPT_H_
|
|
|
|
|
|
|
|
|
|
#include <string>
|
2013-07-05 11:09:15 -04:00
|
|
|
#include <vector>
|
2014-08-19 21:11:00 +00:00
|
|
|
|
2017-02-14 09:48:56 -08:00
|
|
|
#include "CustomTypes.h"
|
|
|
|
|
|
2018-07-24 13:15:39 -07:00
|
|
|
#define ANONYMOUS_FUNCTION_START L"(function() { "
|
|
|
|
|
#define ANONYMOUS_FUNCTION_END L" })();"
|
|
|
|
|
|
2017-02-14 09:48:56 -08:00
|
|
|
// Forward declaration of classes.
|
2014-08-19 21:11:00 +00:00
|
|
|
namespace Json {
|
|
|
|
|
class Value;
|
|
|
|
|
} // namespace Json
|
2013-01-11 22:18:32 +01:00
|
|
|
|
|
|
|
|
namespace webdriver {
|
|
|
|
|
|
2018-02-07 12:04:43 -08:00
|
|
|
struct ElementInfo {
|
|
|
|
|
std::string element_id;
|
|
|
|
|
LPSTREAM element_stream;
|
|
|
|
|
};
|
|
|
|
|
|
2018-02-21 05:49:29 -08:00
|
|
|
struct RemappedElementInfo {
|
|
|
|
|
std::string original_element_id;
|
|
|
|
|
std::string element_id;
|
|
|
|
|
};
|
|
|
|
|
|
2017-02-14 09:48:56 -08:00
|
|
|
// Forward declaration of classes.
|
2013-01-11 22:18:32 +01:00
|
|
|
class IECommandExecutor;
|
2018-02-07 12:04:43 -08:00
|
|
|
class IElementManager;
|
2013-01-11 22:18:32 +01:00
|
|
|
|
|
|
|
|
class Script {
|
|
|
|
|
public:
|
|
|
|
|
Script(IHTMLDocument2* document,
|
|
|
|
|
std::string script_source,
|
|
|
|
|
unsigned long argument_count);
|
|
|
|
|
Script(IHTMLDocument2* document,
|
|
|
|
|
std::wstring script_source,
|
|
|
|
|
unsigned long argument_count);
|
2018-02-01 16:08:30 -08:00
|
|
|
Script(IHTMLDocument2* document,
|
|
|
|
|
std::string script_source);
|
|
|
|
|
Script(IHTMLDocument2* document,
|
|
|
|
|
std::wstring script_source);
|
2013-01-11 22:18:32 +01:00
|
|
|
~Script(void);
|
|
|
|
|
|
|
|
|
|
std::wstring source_code() const { return this->source_code_; }
|
|
|
|
|
VARIANT result() { return this->result_; }
|
|
|
|
|
void set_result(VARIANT value) {
|
2013-03-25 13:34:23 -04:00
|
|
|
this->result_.Copy(&value);
|
2013-01-11 22:18:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AddArgument(const std::string& argument);
|
|
|
|
|
void AddArgument(const std::wstring& argument);
|
|
|
|
|
void AddArgument(const int argument);
|
|
|
|
|
void AddArgument(const double argument);
|
|
|
|
|
void AddArgument(const bool argument);
|
|
|
|
|
void AddArgument(ElementHandle argument);
|
|
|
|
|
void AddArgument(IHTMLElement* argument);
|
|
|
|
|
void AddArgument(VARIANT argument);
|
|
|
|
|
void AddNullArgument(void);
|
|
|
|
|
|
2018-02-07 12:04:43 -08:00
|
|
|
int AddArguments(IElementManager* element_manager, const Json::Value& arguments);
|
2018-02-01 16:08:30 -08:00
|
|
|
|
2013-01-11 22:18:32 +01:00
|
|
|
bool ResultIsEmpty(void);
|
|
|
|
|
bool ResultIsString(void);
|
|
|
|
|
bool ResultIsInteger(void);
|
|
|
|
|
bool ResultIsBoolean(void);
|
|
|
|
|
bool ResultIsDouble(void);
|
|
|
|
|
bool ResultIsArray(void);
|
|
|
|
|
bool ResultIsObject(void);
|
|
|
|
|
bool ResultIsElement(void);
|
|
|
|
|
bool ResultIsElementCollection(void);
|
|
|
|
|
bool ResultIsIDispatch(void);
|
|
|
|
|
|
|
|
|
|
int Execute(void);
|
2018-02-14 14:32:04 -08:00
|
|
|
int Execute(const IECommandExecutor& command_executor,
|
|
|
|
|
const Json::Value& args,
|
|
|
|
|
Json::Value* result);
|
|
|
|
|
int ExecuteAsync(const IECommandExecutor& command_executor,
|
|
|
|
|
const Json::Value& args,
|
|
|
|
|
HWND* async_executor_handle);
|
2018-02-07 12:04:43 -08:00
|
|
|
int ExecuteAsync(const IECommandExecutor& command_executor,
|
|
|
|
|
const Json::Value& args,
|
|
|
|
|
const int timeout_override_in_milliseconds,
|
|
|
|
|
HWND* async_executor_handle);
|
2013-01-11 22:18:32 +01:00
|
|
|
int ConvertResultToJsonValue(const IECommandExecutor& executor,
|
|
|
|
|
Json::Value* value);
|
2018-02-07 12:04:43 -08:00
|
|
|
int ConvertResultToJsonValue(IElementManager* element_manager,
|
2018-02-01 16:08:30 -08:00
|
|
|
Json::Value* value);
|
2013-01-11 22:18:32 +01:00
|
|
|
|
2018-02-07 12:04:43 -08:00
|
|
|
std::wstring polling_source_code(void) const { return this->polling_source_code_; }
|
|
|
|
|
void set_polling_source_code(const std::wstring& value) { this->polling_source_code_ = value; }
|
|
|
|
|
|
2013-01-11 22:18:32 +01:00
|
|
|
private:
|
|
|
|
|
bool CreateAnonymousFunction(VARIANT* result);
|
2018-02-07 12:04:43 -08:00
|
|
|
int CreateAsyncScriptExecutor(HWND element_repository_handle,
|
|
|
|
|
const std::wstring& serialized_args,
|
|
|
|
|
HWND* async_executor_handle);
|
|
|
|
|
int SetAsyncScriptDocument(HWND async_executor_handle);
|
|
|
|
|
int SetAsyncScriptElementArgument(HWND async_executor_handle,
|
|
|
|
|
const IECommandExecutor& command_executor,
|
|
|
|
|
const std::string& element_id);
|
2013-01-11 22:18:32 +01:00
|
|
|
void Initialize(IHTMLDocument2* document,
|
|
|
|
|
const std::wstring& script_source,
|
|
|
|
|
const unsigned long argument_count);
|
|
|
|
|
|
2018-02-07 12:04:43 -08:00
|
|
|
int AddArgument(IElementManager* element_manager,
|
|
|
|
|
const Json::Value& arg);
|
|
|
|
|
int WalkArray(IElementManager* element_manager,
|
|
|
|
|
const Json::Value& array_value);
|
|
|
|
|
int WalkObject(IElementManager* element_manager,
|
|
|
|
|
const Json::Value& object_value);
|
2018-02-01 16:08:30 -08:00
|
|
|
|
2013-01-11 22:18:32 +01:00
|
|
|
CComPtr<IHTMLDocument2> script_engine_host_;
|
|
|
|
|
unsigned long argument_count_;
|
|
|
|
|
std::wstring source_code_;
|
|
|
|
|
long current_arg_index_;
|
2018-02-01 16:08:30 -08:00
|
|
|
|
2018-02-07 12:04:43 -08:00
|
|
|
std::wstring polling_source_code_;
|
|
|
|
|
|
2018-02-01 16:08:30 -08:00
|
|
|
HWND element_repository_handle_;
|
2013-07-11 17:46:24 -04:00
|
|
|
std::vector<CComVariant> argument_array_;
|
2013-03-25 13:34:23 -04:00
|
|
|
CComVariant result_;
|
2013-01-11 22:18:32 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace webdriver
|
|
|
|
|
|
|
|
|
|
#endif // WEBDRIVER_IE_SCRIPT_H_
|