// 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 "SwitchToFrameCommandHandler.h" #include "errorcodes.h" #include "../Browser.h" #include "../Element.h" #include "../IECommandExecutor.h" namespace webdriver { SwitchToFrameCommandHandler::SwitchToFrameCommandHandler(void) { } SwitchToFrameCommandHandler::~SwitchToFrameCommandHandler(void) { } void SwitchToFrameCommandHandler::ExecuteInternal( const IECommandExecutor& executor, const ParametersMap& command_parameters, Response* response) { Json::Value frame_id = Json::Value::null; ParametersMap::const_iterator it = command_parameters.find("id"); if (it != command_parameters.end()) { frame_id = it->second; } else { response->SetErrorResponse(ERROR_INVALID_ARGUMENT, "Missing parameter: id"); return; } BrowserHandle browser_wrapper; int status_code = executor.GetCurrentBrowser(&browser_wrapper); if (status_code != WD_SUCCESS) { response->SetErrorResponse(ERROR_NO_SUCH_WINDOW, "Unable to get browser"); return; } std::string error_message = "No frame found"; if (frame_id.isNull()) { status_code = browser_wrapper->SetFocusedFrameByElement(NULL); } else if (frame_id.isObject()) { Json::Value element_id = frame_id.get(JSON_ELEMENT_PROPERTY_NAME, Json::Value::null); if (element_id.isNull()) { status_code = EINVALIDARGUMENT; error_message = "Frame identifier was an object, but not a web element reference"; } else { std::string frame_element_id = element_id.asString(); ElementHandle frame_element_wrapper; status_code = this->GetElement(executor, frame_element_id, &frame_element_wrapper); if (status_code == WD_SUCCESS) { status_code = browser_wrapper->SetFocusedFrameByElement(frame_element_wrapper->element()); } } } else if(frame_id.isIntegral()) { int frame_index = frame_id.asInt(); if (frame_index < 0 || frame_index > 65535) { status_code = EINVALIDARGUMENT; error_message = "Frame identifier was an integer, but must be between 0 and 65535 inclusive"; } else { status_code = browser_wrapper->SetFocusedFrameByIndex(frame_index); } } else { status_code = EINVALIDARGUMENT; error_message = "Frame identifier argument must be null, an integer, or a web element reference"; } if (status_code != WD_SUCCESS) { response->SetErrorResponse(status_code, error_message); } else { response->SetSuccessResponse(Json::Value::null); } } } // namespace webdriver