10826e83eSopenharmony_ci/* 20826e83eSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40826e83eSopenharmony_ci * you may not use this file except in compliance with the License. 50826e83eSopenharmony_ci * You may obtain a copy of the License at 60826e83eSopenharmony_ci * 70826e83eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80826e83eSopenharmony_ci * 90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120826e83eSopenharmony_ci * See the License for the specific language governing permissions and 130826e83eSopenharmony_ci * limitations under the License. 140826e83eSopenharmony_ci */ 150826e83eSopenharmony_ci 160826e83eSopenharmony_ci#include "nweb_create_window.h" 170826e83eSopenharmony_ci#include <cstring> 180826e83eSopenharmony_ci#include <securec.h> 190826e83eSopenharmony_ci#include <ui/rs_surface_node.h> 200826e83eSopenharmony_ci#include <unordered_map> 210826e83eSopenharmony_ci 220826e83eSopenharmony_ci#include "nweb_adapter_helper.h" 230826e83eSopenharmony_ci 240826e83eSopenharmony_ciusing namespace OHOS; 250826e83eSopenharmony_cinamespace OHOS::NWeb { 260826e83eSopenharmony_cinamespace { 270826e83eSopenharmony_ciconst std::string ARG_URL = "--url"; 280826e83eSopenharmony_ciconst std::string ARG_DUMP = "--dump-path"; 290826e83eSopenharmony_ciconst std::string ARG_FRAME_INFO = "--frame-info"; 300826e83eSopenharmony_ciconst std::string ARG_ADD_WEB_ENGINE_ARG = "--add-args"; 310826e83eSopenharmony_ciconst std::string ARG_DELETE_WEB_ENGINE_ARG = "--delete-args"; 320826e83eSopenharmony_ciconst std::string ARG_MULTI_RENDER_PROCESS = "--multi-renderer-process"; 330826e83eSopenharmony_ciconst std::string ARG_NWEB_TEST_MOCK_BUNDLEPATH = "--bundle-installation-dir"; 340826e83eSopenharmony_ciconst std::string MOCK_INSTALLATION_DIR = "/data/app/el1/bundle/public/com.ohos.arkwebcore"; 350826e83eSopenharmony_ciconst std::string ARG_WIDTH = "--width"; 360826e83eSopenharmony_ciconst std::string ARG_HEIGHT = "--height"; 370826e83eSopenharmony_cistd::unordered_map<std::string, std::string> g_argsMap; 380826e83eSopenharmony_cisptr<Surface> g_surface = nullptr; 390826e83eSopenharmony_ci} // namespace 400826e83eSopenharmony_ci 410826e83eSopenharmony_cistatic bool HasArg(const std::string& arg) 420826e83eSopenharmony_ci{ 430826e83eSopenharmony_ci return (!g_argsMap.empty()) && (g_argsMap.find(arg) != g_argsMap.end()); 440826e83eSopenharmony_ci} 450826e83eSopenharmony_ci 460826e83eSopenharmony_cistatic std::string GetArgValue(const std::string& arg) 470826e83eSopenharmony_ci{ 480826e83eSopenharmony_ci if (!HasArg(arg)) { 490826e83eSopenharmony_ci return ""; 500826e83eSopenharmony_ci } 510826e83eSopenharmony_ci return g_argsMap.at(arg); 520826e83eSopenharmony_ci} 530826e83eSopenharmony_ci 540826e83eSopenharmony_cistatic std::list<std::string> GetWebEngineArgs(const std::string& arg) 550826e83eSopenharmony_ci{ 560826e83eSopenharmony_ci std::string webEngineArgValue = GetArgValue(arg); 570826e83eSopenharmony_ci std::list<std::string> webEngineArgList; 580826e83eSopenharmony_ci if (webEngineArgValue.empty()) { 590826e83eSopenharmony_ci return webEngineArgList; 600826e83eSopenharmony_ci } 610826e83eSopenharmony_ci uint32_t start = 0; 620826e83eSopenharmony_ci uint32_t pos = 0; 630826e83eSopenharmony_ci while (pos < webEngineArgValue.size()) { 640826e83eSopenharmony_ci if (webEngineArgValue[pos] == ',') { 650826e83eSopenharmony_ci webEngineArgList.emplace_back(webEngineArgValue.substr(start, pos - start)); 660826e83eSopenharmony_ci pos++; 670826e83eSopenharmony_ci start = pos; 680826e83eSopenharmony_ci } else { 690826e83eSopenharmony_ci pos++; 700826e83eSopenharmony_ci } 710826e83eSopenharmony_ci } 720826e83eSopenharmony_ci webEngineArgList.emplace_back(webEngineArgValue.substr(start, pos - start)); 730826e83eSopenharmony_ci webEngineArgList.emplace_back(ARG_NWEB_TEST_MOCK_BUNDLEPATH + "=" + MOCK_INSTALLATION_DIR); 740826e83eSopenharmony_ci return webEngineArgList; 750826e83eSopenharmony_ci} 760826e83eSopenharmony_ci 770826e83eSopenharmony_cistd::shared_ptr<NWebEngineInitArgsImpl> GetInitArgs(void) 780826e83eSopenharmony_ci{ 790826e83eSopenharmony_ci std::shared_ptr<NWebEngineInitArgsImpl> initArgs = std::make_shared<NWebEngineInitArgsImpl>(); 800826e83eSopenharmony_ci initArgs->SetDumpPath(GetArgValue(ARG_DUMP)); 810826e83eSopenharmony_ci initArgs->SetIsFrameInfoDump(HasArg(ARG_FRAME_INFO) ? true : false); 820826e83eSopenharmony_ci initArgs->SetIsMultiRendererProcess(HasArg(ARG_MULTI_RENDER_PROCESS) ? true : false); 830826e83eSopenharmony_ci initArgs->SetArgsToAdd(GetWebEngineArgs(ARG_ADD_WEB_ENGINE_ARG)); 840826e83eSopenharmony_ci initArgs->SetArgsToDelete(GetWebEngineArgs(ARG_DELETE_WEB_ENGINE_ARG)); 850826e83eSopenharmony_ci return initArgs; 860826e83eSopenharmony_ci} 870826e83eSopenharmony_ci 880826e83eSopenharmony_cistd::shared_ptr<NWeb> GetNwebForTest() 890826e83eSopenharmony_ci{ 900826e83eSopenharmony_ci if (!g_surface) { 910826e83eSopenharmony_ci Rosen::RSSurfaceNodeConfig config; 920826e83eSopenharmony_ci config.SurfaceNodeName = "webTestSurfaceName"; 930826e83eSopenharmony_ci auto surfaceNode = Rosen::RSSurfaceNode::Create(config, false); 940826e83eSopenharmony_ci if (surfaceNode == nullptr) { 950826e83eSopenharmony_ci return nullptr; 960826e83eSopenharmony_ci } 970826e83eSopenharmony_ci g_surface = surfaceNode->GetSurface(); 980826e83eSopenharmony_ci if (g_surface== nullptr) { 990826e83eSopenharmony_ci return nullptr; 1000826e83eSopenharmony_ci } 1010826e83eSopenharmony_ci } 1020826e83eSopenharmony_ci return NWebAdapterHelper::Instance().CreateNWeb(g_surface, GetInitArgs()); 1030826e83eSopenharmony_ci} 1040826e83eSopenharmony_ci} // namespace OHOS::NWeb 105