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