1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef NWEB_NAPI_WEBVIEW_CONTROLLER_H
17 #define NWEB_NAPI_WEBVIEW_CONTROLLER_H
18 
19 #include <atomic>
20 #include <condition_variable>
21 #include <mutex>
22 
23 #include "napi/native_api.h"
24 #include "napi/native_common.h"
25 #include "napi/native_node_api.h"
26 #include "uv.h"
27 #include "webview_controller.h"
28 
29 namespace OHOS {
30 namespace NWeb {
31 const std::string WEBVIEW_CONTROLLER_CLASS_NAME = "WebviewController";
32 const std::string WEB_MESSAGE_PORT_CLASS_NAME = "WebMessagePort";
33 const std::string WEB_PORT_MSG_ENUM_NAME = "WebMessageType";
34 const std::string WEB_EXT_MSG_CLASS_NAME = "WebMessageExt";
35 const std::string WEB_HITTESTTYPE_V9_ENUM_NAME = "HitTestTypeV9";
36 const std::string WEB_HITTESTTYPE_ENUM_NAME = "WebHitTestType";
37 const std::string WEB_HISTORY_LIST_CLASS_NAME = "WebHistoryList";
38 const std::string WEB_SECURE_DNS_MODE_ENUM_NAME = "SecureDnsMode";
39 const std::string WEB_PRINT_DOCUMENT_CLASS_NAME = "WebPrintDocument";
40 const std::string WEB_SECURITY_LEVEL_ENUM_NAME = "WebSecurityLevel";
41 const std::string WEB_RENDER_PROCESS_MODE_ENUM_NAME = "RenderProcessMode";
42 const std::string OFFLINE_RESOURCE_TYPE_ENUM_NAME = "OfflineResourceType";
43 const std::string WEB_SCROLL_TYPE_ENUM_NAME = "ScrollType";
44 const std::string WEB_PRESSURE_LEVEL_ENUM_NAME = "PressureLevel";
45 constexpr double TEN_MILLIMETER_TO_INCH = 0.39;
46 
47 struct Scheme {
48     std::string name;
49     bool isSupportCORS;
50     bool isSupportFetch;
51     bool isStandard;
52     bool isLocal;
53     bool isDisplayIsolated;
54     bool isSecure;
55     bool isCspBypassing;
56     bool isCodeCacheSupported;
57     int32_t option = 0;
58 };
59 
60 struct OfflineResourceValue {
61     napi_value urlList;
62     napi_value resource;
63     napi_value responseHeaders;
64     napi_value type;
65 };
66 
67 struct PDFMarginConfig {
68     double top = TEN_MILLIMETER_TO_INCH;
69     double bottom = TEN_MILLIMETER_TO_INCH;
70     double right = TEN_MILLIMETER_TO_INCH;
71     double left = TEN_MILLIMETER_TO_INCH;
72 };
73 
74 class NapiWebviewController {
75 public:
NapiWebviewController()76     NapiWebviewController() {}
77     ~NapiWebviewController() = default;
78 
79     static napi_value Init(napi_env env, napi_value exports);
80 
81 private:
82     static napi_value JsConstructor(napi_env env, napi_callback_info info);
83 
84     static napi_value InitializeWebEngine(napi_env env, napi_callback_info info);
85 
86     static napi_value SetHttpDns(napi_env env, napi_callback_info info);
87 
88     static napi_value SetWebDebuggingAccess(napi_env env, napi_callback_info info);
89 
90     static napi_value EnableSafeBrowsing(napi_env env, napi_callback_info info);
91 
92     static napi_value IsSafeBrowsingEnabled(napi_env env, napi_callback_info info);
93 
94     static napi_value InnerGetWebDebuggingAccess(napi_env env, napi_callback_info info);
95 
96     static napi_value SetWebId(napi_env env, napi_callback_info info);
97 
98     static napi_value InnerJsProxy(napi_env env, napi_callback_info info);
99 
100     static napi_value InnerGetCustomeSchemeCmdLine(napi_env env, napi_callback_info info);
101 
102     static napi_value AccessForward(napi_env env, napi_callback_info info);
103 
104     static napi_value AccessBackward(napi_env env, napi_callback_info info);
105 
106     static napi_value Forward(napi_env env, napi_callback_info info);
107 
108     static napi_value Backward(napi_env env, napi_callback_info info);
109 
110     static napi_value AccessStep(napi_env env, napi_callback_info info);
111 
112     static napi_value ClearHistory(napi_env env, napi_callback_info info);
113 
114     static napi_value OnActive(napi_env env, napi_callback_info info);
115 
116     static napi_value OnInactive(napi_env env, napi_callback_info info);
117 
118     static napi_value Refresh(napi_env env, napi_callback_info info);
119 
120     static napi_value ZoomIn(napi_env env, napi_callback_info info);
121 
122     static napi_value ZoomOut(napi_env env, napi_callback_info info);
123 
124     static napi_value GetWebId(napi_env env, napi_callback_info info);
125 
126     static napi_value GetUserAgent(napi_env env, napi_callback_info info);
127 
128     static napi_value GetCustomUserAgent(napi_env env, napi_callback_info info);
129 
130     static napi_value SetCustomUserAgent(napi_env env, napi_callback_info info);
131 
132     static napi_value GetTitle(napi_env env, napi_callback_info info);
133 
134     static napi_value GetPageHeight(napi_env env, napi_callback_info info);
135 
136     static napi_value BackOrForward(napi_env env, napi_callback_info info);
137 
138     static napi_value StoreWebArchive(napi_env env, napi_callback_info info);
139 
140     static napi_value StoreWebArchiveInternal(napi_env env, napi_callback_info info,
141         const std::string &baseName, bool autoName);
142 
143     static napi_value CreateWebMessagePorts(napi_env env, napi_callback_info info);
144 
145     static napi_value PostMessage(napi_env env, napi_callback_info info);
146 
147     static napi_value GetHitTestValue(napi_env env, napi_callback_info info);
148 
149     static napi_value RequestFocus(napi_env env, napi_callback_info info);
150 
151     static napi_value LoadUrl(napi_env env, napi_callback_info info);
152 
153     static napi_value LoadUrlWithHttpHeaders(napi_env env, napi_callback_info info, const std::string& url,
154         const napi_value* argv, WebviewController* webviewController);
155 
156     static napi_value LoadData(napi_env env, napi_callback_info info);
157 
158     static napi_value GetHitTest(napi_env env, napi_callback_info info);
159 
160     static napi_value ClearMatches(napi_env env, napi_callback_info info);
161 
162     static napi_value SearchNext(napi_env env, napi_callback_info info);
163 
164     static napi_value SearchAllAsync(napi_env env, napi_callback_info info);
165 
166     static napi_value ClearSslCache(napi_env env, napi_callback_info info);
167 
168     static napi_value ClearClientAuthenticationCache(napi_env env, napi_callback_info info);
169 
170     static napi_value Stop(napi_env env, napi_callback_info info);
171 
172     static napi_value Zoom(napi_env env, napi_callback_info info);
173 
174     static napi_value InnerCompleteWindowNew(napi_env env, napi_callback_info info);
175 
176     static napi_value RegisterJavaScriptProxy(napi_env env, napi_callback_info info);
177 
178     static napi_value DeleteJavaScriptRegister(napi_env env, napi_callback_info info);
179 
180     static napi_value RunJavaScript(napi_env env, napi_callback_info info);
181 
182     static napi_value RunJavaScriptExt(napi_env env, napi_callback_info info);
183 
184     static napi_value RunJS(napi_env env, napi_callback_info info, bool extention);
185 
186     static napi_value RunJavaScriptInternal(napi_env env, napi_callback_info info,
187         const std::string &script, bool extention);
188 
189     static ErrCode ConstructFlowbuf(napi_env env, napi_value argv, int& fd, size_t& scriptLength);
190 
191     static napi_value RunJSBackToOriginal(napi_env env, napi_callback_info info,
192         bool extention, napi_value argv, napi_value result);
193 
194     static napi_value RunJavaScriptInternalExt(napi_env env, napi_callback_info info, bool extention);
195 
196     static napi_value RunCreatePDFExt(napi_env env, napi_callback_info info);
197 
198     static napi_value TerminateRenderProcess(napi_env env, napi_callback_info info);
199 
200     static napi_value GetUrl(napi_env env, napi_callback_info info);
201 
202     static napi_value GetOriginalUrl(napi_env env, napi_callback_info info);
203 
204     static napi_value SetNetworkAvailable(napi_env env, napi_callback_info info);
205 
206     static napi_value InnerGetWebId(napi_env env, napi_callback_info info);
207 
208     static napi_value HasImage(napi_env env, napi_callback_info info);
209 
210     static napi_value HasImageInternal(napi_env env, napi_callback_info info);
211 
212     static napi_value RemoveCache(napi_env env, napi_callback_info info);
213 
214     static napi_value getBackForwardEntries(napi_env env, napi_callback_info info);
215 
216     static napi_value GetFavicon(napi_env env, napi_callback_info info);
217 
218     static napi_value SerializeWebState(napi_env env, napi_callback_info info);
219 
220     static napi_value RestoreWebState(napi_env env, napi_callback_info info);
221 
222     static napi_value ScrollPageDown(napi_env env, napi_callback_info info);
223 
224     static napi_value ScrollPageUp(napi_env env, napi_callback_info info);
225 
226     static napi_value ScrollTo(napi_env env, napi_callback_info info);
227 
228     static napi_value ScrollBy(napi_env env, napi_callback_info info);
229 
230     static napi_value SlideScroll(napi_env env, napi_callback_info info);
231 
232     static napi_value SetScrollable(napi_env env, napi_callback_info info);
233 
234     static napi_value GetScrollable(napi_env env, napi_callback_info info);
235 
236     static napi_value CustomizeSchemes(napi_env env, napi_callback_info info);
237 
238     static napi_value InnerSetHapPath(napi_env env, napi_callback_info info);
239 
240     static napi_value InnerGetCertificate(napi_env env, napi_callback_info info);
241 
242     static napi_value SetAudioMuted(napi_env env, napi_callback_info info);
243 
244     static napi_value InnerGetThisVar(napi_env env, napi_callback_info info);
245 
246     static napi_value PrefetchPage(napi_env env, napi_callback_info info);
247 
248     static napi_value PrefetchPageWithHttpHeaders(napi_env env, napi_callback_info info, std::string& url,
249         const napi_value* argv, WebviewController* webviewController);
250 
251     static napi_value PrepareForPageLoad(napi_env env, napi_callback_info info);
252 
253     static napi_value CreateWebPrintDocumentAdapter(napi_env env, napi_callback_info info);
254 
255     static napi_value PostUrl(napi_env env, napi_callback_info info);
256 
257     static napi_value SetDownloadDelegate(napi_env env, napi_callback_info info);
258 
259     static napi_value StartDownload(napi_env env, napi_callback_info info);
260 
261     static napi_value SetConnectionTimeout(napi_env env, napi_callback_info info);
262 
263     static napi_value GetSecurityLevel(napi_env env, napi_callback_info info);
264 
265     static napi_value IsIncognitoMode(napi_env env, napi_callback_info info);
266 
267     static napi_value SetPrintBackground(napi_env env, napi_callback_info info);
268 
269     static napi_value GetPrintBackground(napi_env env, napi_callback_info info);
270 
271     static napi_value SetWebSchemeHandler(napi_env env, napi_callback_info info);
272 
273     static napi_value ClearWebSchemeHandler(napi_env env, napi_callback_info info);
274 
275     static napi_value SetServiceWorkerWebSchemeHandler(
276         napi_env env, napi_callback_info info);
277 
278     static napi_value ClearServiceWorkerWebSchemeHandler(
279         napi_env env, napi_callback_info info);
280 
281     static napi_value EnableIntelligentTrackingPrevention(
282         napi_env env, napi_callback_info info);
283 
284     static napi_value IsIntelligentTrackingPreventionEnabled(
285         napi_env env, napi_callback_info info);
286 
287     static napi_value AddIntelligentTrackingPreventionBypassingList(
288         napi_env env, napi_callback_info info);
289 
290     static napi_value RemoveIntelligentTrackingPreventionBypassingList(
291         napi_env env, napi_callback_info info);
292 
293     static napi_value ClearIntelligentTrackingPreventionBypassingList(
294         napi_env env, napi_callback_info info);
295 
296     static napi_value GetLastJavascriptProxyCallingFrameUrl(napi_env env, napi_callback_info info);
297 
298     static napi_value GetDefaultUserAgent(napi_env env, napi_callback_info info);
299 
300     static napi_value PauseAllTimers(napi_env env, napi_callback_info info);
301 
302     static napi_value ResumeAllTimers(napi_env env, napi_callback_info info);
303 
304     static napi_value StartCamera(napi_env env, napi_callback_info info);
305 
306     static napi_value StopCamera(napi_env env, napi_callback_info info);
307 
308     static napi_value CloseCamera(napi_env env, napi_callback_info info);
309 
310     static napi_value CloseAllMediaPresentations(napi_env env, napi_callback_info info);
311 
312     static napi_value StopAllMedia(napi_env env, napi_callback_info info);
313 
314     static napi_value ResumeAllMedia(napi_env env, napi_callback_info info);
315 
316     static napi_value PauseAllMedia(napi_env env, napi_callback_info info);
317 
318     static napi_value GetMediaPlaybackState(napi_env env, napi_callback_info info);
319 
320     static napi_value PrefetchResource(napi_env env, napi_callback_info info);
321 
322     static napi_value ClearPrefetchedResource(napi_env env, napi_callback_info info);
323 
324     static napi_value OnCreateNativeMediaPlayer(napi_env env, napi_callback_info info);
325 
326     static napi_value SetRenderProcessMode(napi_env env, napi_callback_info info);
327 
328     static napi_value GetRenderProcessMode(napi_env env, napi_callback_info info);
329 
330     static napi_value PrecompileJavaScript(napi_env env, napi_callback_info info);
331 
332     static napi_value InjectOfflineResources(napi_env env, napi_callback_info info);
333 
334     static void AddResourcesToMemoryCache(napi_env env,
335                                           napi_callback_info info,
336                                           napi_value& resourcesList);
337 
338     static void AddResourceItemToMemoryCache(napi_env env,
339                                              napi_callback_info info,
340                                              OfflineResourceValue resourceValue);
341 
342     static napi_value SetHostIP(napi_env env, napi_callback_info info);
343 
344     static napi_value ClearHostIP(napi_env env, napi_callback_info info);
345 
346     static napi_value WarmupServiceWorker(napi_env env, napi_callback_info info);
347 
348     static napi_value GetSurfaceId(napi_env env, napi_callback_info info);
349 
350     static napi_value EnableWholeWebPageDrawing(napi_env env, napi_callback_info info);
351 
352     static napi_value EnableAdsBlock(napi_env env, napi_callback_info info);
353 
354     static napi_value IsAdsBlockEnabled(napi_env env, napi_callback_info info);
355 
356     static napi_value IsAdsBlockEnabledForCurPage(napi_env env, napi_callback_info info);
357 
358     static napi_value WebPageSnapshot(napi_env env, napi_callback_info info);
359 
360     static napi_value SetUrlTrustList(napi_env env, napi_callback_info info);
361 
362     static napi_value UpdateInstanceId(napi_env env, napi_callback_info info);
363 
364     static napi_value SetPathAllowingUniversalAccess(napi_env env, napi_callback_info info);
365 
366     static napi_value EnableBackForwardCache(napi_env env, napi_callback_info info);
367 
368     static napi_value SetBackForwardCacheOptions(napi_env env, napi_callback_info info);
369 
370     static napi_value ScrollByWithResult(napi_env env, napi_callback_info info);
371 
372     static napi_value GetScrollOffset(napi_env env, napi_callback_info info);
373 
374     static napi_value TrimMemoryByPressureLevel(napi_env env, napi_callback_info info);
375 
376     static int32_t maxFdNum_;
377     static std::atomic<int32_t> usedFd_;
378 };
379 
380 class NWebValueCallbackImpl : public NWebMessageValueCallback {
381 public:
NWebValueCallbackImpl(napi_env env,napi_ref callback,bool extention)382     NWebValueCallbackImpl(napi_env env, napi_ref callback, bool extention)
383         : env_(env), callback_(callback), extention_(extention)
384     {}
385     ~NWebValueCallbackImpl();
386     void OnReceiveValue(std::shared_ptr<NWebMessage> result) override;
387 
388 private:
389     napi_env env_;
390     napi_ref callback_;
391     bool extention_;
392     static void UvWebMessageOnReceiveValueCallback(uv_work_t *work, int status);
393 };
394 
395 class NapiWebMessageExt {
396 public:
397     NapiWebMessageExt() = default;
398     ~NapiWebMessageExt() = default;
399 
400     static napi_value JsConstructor(napi_env env, napi_callback_info info);
401     static napi_value GetType(napi_env env, napi_callback_info info);
402     static napi_value GetString(napi_env env, napi_callback_info info);
403     static napi_value GetNumber(napi_env env, napi_callback_info info);
404     static napi_value GetBoolean(napi_env env, napi_callback_info info);
405     static napi_value GetArrayBuffer(napi_env env, napi_callback_info info);
406     static napi_value GetArray(napi_env env, napi_callback_info info);
407     static napi_value GetError(napi_env env, napi_callback_info info);
408     static napi_value SetType(napi_env env, napi_callback_info info);
409     static napi_value SetString(napi_env env, napi_callback_info info);
410     static napi_value SetNumber(napi_env env, napi_callback_info info);
411     static napi_value SetBoolean(napi_env env, napi_callback_info info);
412     static napi_value SetArrayBuffer(napi_env env, napi_callback_info info);
413     static napi_value SetArray(napi_env env, napi_callback_info info);
414     static napi_value SetError(napi_env env, napi_callback_info info);
415 };
416 
417 class NapiWebMessagePort {
418 public:
419     NapiWebMessagePort() = default;
420     ~NapiWebMessagePort() = default;
421 
422     struct WebMsgPortParam {
423         bool extention_;
424         napi_env env_;
425         napi_ref callback_;
426         std::shared_ptr<NWebMessage> msg_;
427         std::mutex mutex_;
428         bool ready_ = false;
429         std::condition_variable condition_;
430     };
431 
432     static napi_value JsConstructor(napi_env env, napi_callback_info info);
433 
434     static napi_value Close(napi_env env, napi_callback_info info);
435 
436     static napi_value PostMessageEvent(napi_env env, napi_callback_info info);
437 
438     static napi_value OnMessageEvent(napi_env env, napi_callback_info info);
439 
440     static napi_value PostMessageEventExt(napi_env env, napi_callback_info info);
441 
442     static napi_value OnMessageEventExt(napi_env env, napi_callback_info info);
443 };
444 
445 class NapiWebHistoryList {
446 public:
447     NapiWebHistoryList() = default;
448     ~NapiWebHistoryList() = default;
449 
450     static napi_value JsConstructor(napi_env env, napi_callback_info info);
451 
452     static napi_value GetItem(napi_env env, napi_callback_info info);
453 
454 private:
455     static napi_value GetFavicon(napi_env env, std::shared_ptr<NWebHistoryItem> item);
456 };
457 
458 class NapiWebPrintDocument {
459 public:
460     NapiWebPrintDocument() = default;
461     ~NapiWebPrintDocument() = default;
462 
463     static napi_value JsConstructor(napi_env env, napi_callback_info info);
464 
465     static napi_value OnStartLayoutWrite(napi_env env, napi_callback_info info);
466 
467     static napi_value OnJobStateChanged(napi_env env, napi_callback_info info);
468 };
469 } // namespace NWeb
470 } // namespace OHOS
471 
472 #endif // NWEB_NAPI_WEBVIEW_CONTROLLER_H
473