// 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"); // 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. #include "SetWindowRectCommandHandler.h" #include "errorcodes.h" #include "json.h" #include "../Browser.h" #include "../IECommandExecutor.h" namespace webdriver { SetWindowRectCommandHandler::SetWindowRectCommandHandler(void) { } SetWindowRectCommandHandler::~SetWindowRectCommandHandler(void) { } void SetWindowRectCommandHandler::ExecuteInternal( const IECommandExecutor& executor, const ParametersMap& command_parameters, Response* response) { int width = -1; int height = -1; int x = -1; int y = -1; std::string argument_error_message = ""; Json::Value width_parameter; bool is_width_defined = this->IsParameterDefined(command_parameters, "width", &width_parameter); if (is_width_defined) { if (!this->GetNumericParameter("width", true, width_parameter, &width, &argument_error_message)) { response->SetErrorResponse(ERROR_INVALID_ARGUMENT, argument_error_message); return; } } Json::Value height_parameter; bool is_height_defined = this->IsParameterDefined(command_parameters, "height", &height_parameter); if (is_height_defined) { if (!this->GetNumericParameter("height", true, height_parameter, &height, &argument_error_message)) { response->SetErrorResponse(ERROR_INVALID_ARGUMENT, argument_error_message); return; } } Json::Value x_parameter; bool is_x_defined = this->IsParameterDefined(command_parameters, "x", &x_parameter); if (is_x_defined) { if (!this->GetNumericParameter("x", false, x_parameter, &x, &argument_error_message)) { response->SetErrorResponse(ERROR_INVALID_ARGUMENT, argument_error_message); return; } } Json::Value y_parameter; bool is_y_defined = this->IsParameterDefined(command_parameters, "y", &y_parameter); if (is_y_defined) { if (!GetNumericParameter("y", false, y_parameter, &y, &argument_error_message)) { response->SetErrorResponse(ERROR_INVALID_ARGUMENT, argument_error_message); return; } } int status_code = WD_SUCCESS; BrowserHandle browser_wrapper; status_code = executor.GetCurrentBrowser(&browser_wrapper); if (status_code != WD_SUCCESS) { response->SetErrorResponse(ERROR_NO_SUCH_WINDOW, "Error retrieving current window"); return; } // If the window is minimized, maximized, or full screen, // the window needs to be restored. browser_wrapper->Restore(); HWND window_handle = browser_wrapper->GetTopLevelWindowHandle(); RECT current_window_rect; ::GetWindowRect(window_handle, ¤t_window_rect); if (!is_x_defined || !is_y_defined) { x = current_window_rect.left; y = current_window_rect.top; } if (!is_height_defined || !is_width_defined) { height = current_window_rect.bottom - current_window_rect.top; width = current_window_rect.right - current_window_rect.left; } BOOL set_window_pos_result = ::SetWindowPos(window_handle, NULL, x, y, width, height, 0); if (!set_window_pos_result) { response->SetErrorResponse(ERROR_UNKNOWN_ERROR, "Unexpected error setting window size (SetWindowPos API failed)"); return; } HWND browser_window_handle = browser_wrapper->GetTopLevelWindowHandle(); RECT window_rect; ::GetWindowRect(browser_window_handle, &window_rect); Json::Value returned_rect; returned_rect["width"] = window_rect.right - window_rect.left; returned_rect["height"] = window_rect.bottom - window_rect.top; returned_rect["x"] = window_rect.left; returned_rect["y"] = window_rect.top; response->SetSuccessResponse(returned_rect); } bool SetWindowRectCommandHandler::GetNumericParameter( const std::string& argument_name, const bool is_positive_required, const Json::Value& parameter_value, int* argument_value, std::string* error_message) { int max_value = MAXINT; std::string max_value_description = "2^31 - 1"; int min_value = MININT; std::string min_value_description = "-2^31"; if (is_positive_required) { min_value = 0; min_value_description = "zero"; } if (!parameter_value.isNumeric()) { *error_message = argument_name + " must be a numeric parameter."; return false; } int value = parameter_value.asInt(); if (value < min_value) { *error_message = argument_name + " must be a numeric parameter greater than " + min_value_description; return false; } if (value > max_value) { *error_message = argument_name + " must be a numeric parameter less than " + max_value_description; return false; } *argument_value = value; return true; } bool SetWindowRectCommandHandler::IsParameterDefined( const ParametersMap& command_parameters, const std::string& parameter_name, Json::Value* parameter_value) { ParametersMap::const_iterator parameter_iterator = command_parameters.find(parameter_name); if (parameter_iterator == command_parameters.end()) { return false; } if (parameter_iterator->second.isNull()) { return false; } *parameter_value = parameter_iterator->second; return true; } } // namespace webdriver