• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_ENGINE_VERSION_ENUM_NAME = "ArkWebEngineVersion";
40 const std::string WEB_PRINT_DOCUMENT_CLASS_NAME = "WebPrintDocument";
41 const std::string WEB_SECURITY_LEVEL_ENUM_NAME = "WebSecurityLevel";
42 const std::string WEB_RENDER_PROCESS_MODE_ENUM_NAME = "RenderProcessMode";
43 const std::string OFFLINE_RESOURCE_TYPE_ENUM_NAME = "OfflineResourceType";
44 const std::string WEB_SCROLL_TYPE_ENUM_NAME = "ScrollType";
45 const std::string WEB_PRESSURE_LEVEL_ENUM_NAME = "PressureLevel";
46 const std::string WEB_CONTROLLER_ATTACHSTATE_ENUM_NAME = "ControllerAttachState";
47 const std::string WEB_BLANKLESS_ERROR_CODE_ENUM_NAME = "WebBlanklessErrorCode";
48 const std::string WEB_DESTROY_MODE_ENUM_NAME = "WebDestroyMode";
49 constexpr double TEN_MILLIMETER_TO_INCH = 0.39;
50 
51 struct Scheme {
52     std::string name;
53     bool isSupportCORS;
54     bool isSupportFetch;
55     bool isStandard;
56     bool isLocal;
57     bool isDisplayIsolated;
58     bool isSecure;
59     bool isCspBypassing;
60     bool isCodeCacheSupported;
61     int32_t option = 0;
62 };
63 
64 struct OfflineResourceValue {
65     napi_value urlList;
66     napi_value resource;
67     napi_value responseHeaders;
68     napi_value type;
69 };
70 
71 struct PDFMarginConfig {
72     double top = TEN_MILLIMETER_TO_INCH;
73     double bottom = TEN_MILLIMETER_TO_INCH;
74     double right = TEN_MILLIMETER_TO_INCH;
75     double left = TEN_MILLIMETER_TO_INCH;
76 };
77 
78 class NapiWebviewController {
79 public:
NapiWebviewController()80     NapiWebviewController() {}
81     ~NapiWebviewController() = default;
82 
83     static napi_value Init(napi_env env, napi_value exports);
84 
85 private:
86     static napi_value JsConstructor(napi_env env, napi_callback_info info);
87 
88     static napi_value InitializeWebEngine(napi_env env, napi_callback_info info);
89 
90     static napi_value SetHttpDns(napi_env env, napi_callback_info info);
91 
92     static napi_value SetWebDebuggingAccess(napi_env env, napi_callback_info info);
93 
94     static napi_value EnableSafeBrowsing(napi_env env, napi_callback_info info);
95 
96     static napi_value IsSafeBrowsingEnabled(napi_env env, napi_callback_info info);
97 
98     static napi_value InnerGetWebDebuggingAccess(napi_env env, napi_callback_info info);
99 
100     static napi_value InnerGetWebDebuggingPort(napi_env env, napi_callback_info info);
101 
102     static napi_value SetWebId(napi_env env, napi_callback_info info);
103 
104     static napi_value InnerJsProxy(napi_env env, napi_callback_info info);
105 
106     static napi_value InnerGetCustomeSchemeCmdLine(napi_env env, napi_callback_info info);
107 
108     static napi_value AccessForward(napi_env env, napi_callback_info info);
109 
110     static napi_value AccessBackward(napi_env env, napi_callback_info info);
111 
112     static napi_value Forward(napi_env env, napi_callback_info info);
113 
114     static napi_value Backward(napi_env env, napi_callback_info info);
115 
116     static napi_value AccessStep(napi_env env, napi_callback_info info);
117 
118     static napi_value ClearHistory(napi_env env, napi_callback_info info);
119 
120     static napi_value OnActive(napi_env env, napi_callback_info info);
121 
122     static napi_value OnInactive(napi_env env, napi_callback_info info);
123 
124     static napi_value Refresh(napi_env env, napi_callback_info info);
125 
126     static napi_value ZoomIn(napi_env env, napi_callback_info info);
127 
128     static napi_value ZoomOut(napi_env env, napi_callback_info info);
129 
130     static napi_value GetWebId(napi_env env, napi_callback_info info);
131 
132     static napi_value GetUserAgent(napi_env env, napi_callback_info info);
133 
134     static napi_value GetCustomUserAgent(napi_env env, napi_callback_info info);
135 
136     static napi_value SetCustomUserAgent(napi_env env, napi_callback_info info);
137 
138     static napi_value GetTitle(napi_env env, napi_callback_info info);
139 
140     static napi_value GetProgress(napi_env env, napi_callback_info info);
141 
142     static napi_value GetPageHeight(napi_env env, napi_callback_info info);
143 
144     static napi_value BackOrForward(napi_env env, napi_callback_info info);
145 
146     static napi_value StoreWebArchive(napi_env env, napi_callback_info info);
147 
148     static napi_value StoreWebArchiveInternal(napi_env env, napi_callback_info info,
149         const std::string &baseName, bool autoName);
150 
151     static napi_value CreateWebMessagePorts(napi_env env, napi_callback_info info);
152 
153     static napi_value PostMessage(napi_env env, napi_callback_info info);
154 
155     static napi_value GetHitTestValue(napi_env env, napi_callback_info info);
156 
157     static napi_value RequestFocus(napi_env env, napi_callback_info info);
158 
159     static napi_value LoadUrl(napi_env env, napi_callback_info info);
160 
161     static napi_value LoadUrlWithHttpHeaders(napi_env env, napi_callback_info info, const std::string& url,
162         const napi_value* argv, WebviewController* webviewController);
163 
164     static napi_value LoadData(napi_env env, napi_callback_info info);
165 
166     static napi_value GetHitTest(napi_env env, napi_callback_info info);
167 
168     static napi_value ClearMatches(napi_env env, napi_callback_info info);
169 
170     static napi_value SearchNext(napi_env env, napi_callback_info info);
171 
172     static napi_value SearchAllAsync(napi_env env, napi_callback_info info);
173 
174     static napi_value ClearSslCache(napi_env env, napi_callback_info info);
175 
176     static napi_value ClearClientAuthenticationCache(napi_env env, napi_callback_info info);
177 
178     static napi_value Stop(napi_env env, napi_callback_info info);
179 
180     static napi_value Zoom(napi_env env, napi_callback_info info);
181 
182     static napi_value InnerCompleteWindowNew(napi_env env, napi_callback_info info);
183 
184     static napi_value RegisterJavaScriptProxy(napi_env env, napi_callback_info info);
185 
186     static napi_value DeleteJavaScriptRegister(napi_env env, napi_callback_info info);
187 
188     static napi_value RunJavaScript(napi_env env, napi_callback_info info);
189 
190     static napi_value RunJavaScriptExt(napi_env env, napi_callback_info info);
191 
192     static napi_value RunJS(napi_env env, napi_callback_info info, bool extention);
193 
194     static napi_value RunJavaScriptInternal(napi_env env, napi_callback_info info,
195         const std::string &script, bool extention);
196 
197     static ErrCode ConstructFlowbuf(napi_env env, napi_value argv, int& fd, size_t& scriptLength);
198 
199     static napi_value RunJSBackToOriginal(napi_env env, napi_callback_info info,
200         bool extention, napi_value argv, napi_value result);
201 
202     static napi_value RunJavaScriptInternalExt(napi_env env, napi_callback_info info, bool extention);
203 
204     static napi_value RunCreatePDFExt(napi_env env, napi_callback_info info);
205 
206     static napi_value TerminateRenderProcess(napi_env env, napi_callback_info info);
207 
208     static napi_value GetUrl(napi_env env, napi_callback_info info);
209 
210     static napi_value GetOriginalUrl(napi_env env, napi_callback_info info);
211 
212     static napi_value SetNetworkAvailable(napi_env env, napi_callback_info info);
213 
214     static napi_value InnerGetWebId(napi_env env, napi_callback_info info);
215 
216     static napi_value HasImage(napi_env env, napi_callback_info info);
217 
218     static napi_value HasImageInternal(napi_env env, napi_callback_info info);
219 
220     static napi_value RemoveCache(napi_env env, napi_callback_info info);
221 
222     static napi_value getBackForwardEntries(napi_env env, napi_callback_info info);
223 
224     static napi_value GetFavicon(napi_env env, napi_callback_info info);
225 
226     static napi_value SerializeWebState(napi_env env, napi_callback_info info);
227 
228     static napi_value RestoreWebState(napi_env env, napi_callback_info info);
229 
230     static napi_value ScrollPageDown(napi_env env, napi_callback_info info);
231 
232     static napi_value ScrollPageUp(napi_env env, napi_callback_info info);
233 
234     static napi_value ScrollTo(napi_env env, napi_callback_info info);
235 
236     static napi_value ScrollBy(napi_env env, napi_callback_info info);
237 
238     static napi_value SlideScroll(napi_env env, napi_callback_info info);
239 
240     static napi_value SetScrollable(napi_env env, napi_callback_info info);
241 
242     static napi_value GetScrollable(napi_env env, napi_callback_info info);
243 
244     static napi_value CustomizeSchemes(napi_env env, napi_callback_info info);
245 
246     static napi_value InnerSetHapPath(napi_env env, napi_callback_info info);
247 
248     static napi_value InnerSetFavicon(napi_env env, napi_callback_info info);
249 
250     static napi_value InnerGetCertificate(napi_env env, napi_callback_info info);
251 
252     static napi_value SetAudioMuted(napi_env env, napi_callback_info info);
253 
254     static napi_value InnerGetThisVar(napi_env env, napi_callback_info info);
255 
256     static napi_value PrefetchPage(napi_env env, napi_callback_info info);
257 
258     static napi_value PrefetchPageWithHttpHeaders(napi_env env, napi_callback_info info, std::string& url,
259         const napi_value* argv, WebviewController* webviewController);
260 
261     static napi_value PrepareForPageLoad(napi_env env, napi_callback_info info);
262 
263     static napi_value CreateWebPrintDocumentAdapter(napi_env env, napi_callback_info info);
264 
265     static napi_value PostUrl(napi_env env, napi_callback_info info);
266 
267     static napi_value SetDownloadDelegate(napi_env env, napi_callback_info info);
268 
269     static napi_value StartDownload(napi_env env, napi_callback_info info);
270 
271     static napi_value SetConnectionTimeout(napi_env env, napi_callback_info info);
272 
273     static napi_value GetSecurityLevel(napi_env env, napi_callback_info info);
274 
275     static napi_value IsIncognitoMode(napi_env env, napi_callback_info info);
276 
277     static napi_value SetPrintBackground(napi_env env, napi_callback_info info);
278 
279     static napi_value GetPrintBackground(napi_env env, napi_callback_info info);
280 
281     static napi_value SetWebSchemeHandler(napi_env env, napi_callback_info info);
282 
283     static napi_value ClearWebSchemeHandler(napi_env env, napi_callback_info info);
284 
285     static napi_value SetServiceWorkerWebSchemeHandler(
286         napi_env env, napi_callback_info info);
287 
288     static napi_value ClearServiceWorkerWebSchemeHandler(
289         napi_env env, napi_callback_info info);
290 
291     static napi_value EnableIntelligentTrackingPrevention(
292         napi_env env, napi_callback_info info);
293 
294     static napi_value IsIntelligentTrackingPreventionEnabled(
295         napi_env env, napi_callback_info info);
296 
297     static napi_value AddIntelligentTrackingPreventionBypassingList(
298         napi_env env, napi_callback_info info);
299 
300     static napi_value RemoveIntelligentTrackingPreventionBypassingList(
301         napi_env env, napi_callback_info info);
302 
303     static napi_value ClearIntelligentTrackingPreventionBypassingList(
304         napi_env env, napi_callback_info info);
305 
306     static napi_value GetDefaultUserAgent(napi_env env, napi_callback_info info);
307 
308     static napi_value GetLastJavascriptProxyCallingFrameUrl(napi_env env, napi_callback_info info);
309 
310     static napi_value PauseAllTimers(napi_env env, napi_callback_info info);
311 
312     static napi_value ResumeAllTimers(napi_env env, napi_callback_info info);
313 
314     static napi_value StartCamera(napi_env env, napi_callback_info info);
315 
316     static napi_value StopCamera(napi_env env, napi_callback_info info);
317 
318     static napi_value CloseCamera(napi_env env, napi_callback_info info);
319 
320     static napi_value CloseAllMediaPresentations(napi_env env, napi_callback_info info);
321 
322     static napi_value StopAllMedia(napi_env env, napi_callback_info info);
323 
324     static napi_value ResumeAllMedia(napi_env env, napi_callback_info info);
325 
326     static napi_value PauseAllMedia(napi_env env, napi_callback_info info);
327 
328     static napi_value GetMediaPlaybackState(napi_env env, napi_callback_info info);
329 
330     static napi_value PrefetchResource(napi_env env, napi_callback_info info);
331 
332     static napi_value ClearPrefetchedResource(napi_env env, napi_callback_info info);
333 
334     static napi_value OnCreateNativeMediaPlayer(napi_env env, napi_callback_info info);
335 
336     static napi_value SetRenderProcessMode(napi_env env, napi_callback_info info);
337 
338     static napi_value GetRenderProcessMode(napi_env env, napi_callback_info info);
339 
340     static napi_value PrecompileJavaScript(napi_env env, napi_callback_info info);
341 
342     static napi_value InjectOfflineResources(napi_env env, napi_callback_info info);
343 
344     static void AddResourcesToMemoryCache(napi_env env,
345                                           napi_callback_info info,
346                                           napi_value& resourcesList);
347 
348     static void AddResourceItemToMemoryCache(napi_env env,
349                                              napi_callback_info info,
350                                              OfflineResourceValue resourceValue);
351 
352     static napi_value SetHostIP(napi_env env, napi_callback_info info);
353 
354     static napi_value ClearHostIP(napi_env env, napi_callback_info info);
355 
356     static napi_value SetAppCustomUserAgent(napi_env env, napi_callback_info info);
357 
358     static napi_value SetUserAgentForHosts(napi_env env, napi_callback_info info);
359 
360     static napi_value WarmupServiceWorker(napi_env env, napi_callback_info info);
361 
362     static napi_value GetSurfaceId(napi_env env, napi_callback_info info);
363 
364     static napi_value EnableWholeWebPageDrawing(napi_env env, napi_callback_info info);
365 
366     static napi_value EnableAdsBlock(napi_env env, napi_callback_info info);
367 
368     static napi_value IsAdsBlockEnabled(napi_env env, napi_callback_info info);
369 
370     static napi_value IsAdsBlockEnabledForCurPage(napi_env env, napi_callback_info info);
371 
372     static napi_value WebPageSnapshot(napi_env env, napi_callback_info info);
373 
374     static napi_value SetUrlTrustList(napi_env env, napi_callback_info info);
375 
376     static napi_value UpdateInstanceId(napi_env env, napi_callback_info info);
377 
378     static napi_value SetPathAllowingUniversalAccess(napi_env env, napi_callback_info info);
379 
380     static napi_value EnableBackForwardCache(napi_env env, napi_callback_info info);
381 
382     static napi_value SetBackForwardCacheOptions(napi_env env, napi_callback_info info);
383 
384     static napi_value ScrollByWithResult(napi_env env, napi_callback_info info);
385 
386     static napi_value GetScrollOffset(napi_env env, napi_callback_info info);
387 
388     static napi_value GetPageOffset(napi_env env, napi_callback_info info);
389 
390     static napi_value TrimMemoryByPressureLevel(napi_env env, napi_callback_info info);
391 
392     static napi_value RemoveAllCache(napi_env env, napi_callback_info info);
393 
394     static napi_value GetBlanklessInfoWithKey(napi_env env, napi_callback_info info);
395 
396     static napi_value SetBlanklessLoadingWithKey(napi_env env, napi_callback_info info);
397 
398     static napi_value SetBlanklessLoadingCacheCapacity(napi_env env, napi_callback_info info);
399 
400     static napi_value ClearBlanklessLoadingCache(napi_env env, napi_callback_info info);
401 
402     static napi_value SetWebDetach(napi_env env, napi_callback_info info);
403 
404     static int32_t maxFdNum_;
405     static std::atomic<int32_t> usedFd_;
406     static napi_value GetLastHitTest(napi_env env, napi_callback_info info);
407     static napi_value GetAttachState(napi_env env, napi_callback_info info);
408     static napi_value On(napi_env env, napi_callback_info info);
409     static napi_value Off(napi_env env, napi_callback_info info);
410     static napi_value WaitForAttached(napi_env env, napi_callback_info info);
411     static napi_value AvoidVisibleViewportBottom(napi_env env, napi_callback_info info);
412     static napi_value SetErrorPageEnabled(napi_env env, napi_callback_info info);
413     static napi_value GetErrorPageEnabled(napi_env env, napi_callback_info info);
414     static napi_value EnablePrivateNetworkAccess(napi_env env, napi_callback_info info);
415     static napi_value IsPrivateNetworkAccessEnabled(napi_env env, napi_callback_info info);
416     static napi_value SetWebDestroyMode(napi_env env, napi_callback_info info);
417     static napi_value SetActiveWebEngineVersion(napi_env env, napi_callback_info info);
418     static napi_value GetActiveWebEngineVersion(napi_env env, napi_callback_info info);
419     static napi_value IsActiveWebEngineEvergreen(napi_env env, napi_callback_info info);
420 };
421 
422 class ArkWebTransfer {
423 public:
424     ArkWebTransfer() = default;
425     ~ArkWebTransfer() = default;
426     static napi_value CreateBackForwardListTransfer(napi_env env, napi_callback_info info);
427     static napi_value CreateWebMessagePortTransfer(napi_env env, napi_callback_info info);
428 };
429 
430 class NWebValueCallbackImpl : public NWebMessageValueCallback {
431 public:
NWebValueCallbackImpl(napi_env env,napi_ref callback,bool extention)432     NWebValueCallbackImpl(napi_env env, napi_ref callback, bool extention)
433         : env_(env), callback_(callback), extention_(extention)
434     {}
435     ~NWebValueCallbackImpl();
436     void OnReceiveValue(std::shared_ptr<NWebMessage> result) override;
437     void OnReceiveValueV2(std::shared_ptr<NWebHapValue> result) override;
438 
439 private:
440     napi_env env_;
441     napi_ref callback_;
442     bool extention_;
443     static void UvWebMessageOnReceiveValueCallback(uv_work_t *work, int status);
444 };
445 
446 class NapiWebMessageExt {
447 public:
448     NapiWebMessageExt() = default;
449     ~NapiWebMessageExt() = default;
450 
451     static napi_value JsConstructor(napi_env env, napi_callback_info info);
452     static napi_value GetType(napi_env env, napi_callback_info info);
453     static napi_value GetString(napi_env env, napi_callback_info info);
454     static napi_value GetNumber(napi_env env, napi_callback_info info);
455     static napi_value GetBoolean(napi_env env, napi_callback_info info);
456     static napi_value GetArrayBuffer(napi_env env, napi_callback_info info);
457     static napi_value GetArray(napi_env env, napi_callback_info info);
458     static napi_value GetError(napi_env env, napi_callback_info info);
459     static napi_value SetType(napi_env env, napi_callback_info info);
460     static napi_value SetString(napi_env env, napi_callback_info info);
461     static napi_value SetNumber(napi_env env, napi_callback_info info);
462     static napi_value SetBoolean(napi_env env, napi_callback_info info);
463     static napi_value SetArrayBuffer(napi_env env, napi_callback_info info);
464     static napi_value SetArray(napi_env env, napi_callback_info info);
465     static napi_value SetError(napi_env env, napi_callback_info info);
466 };
467 
468 class NapiWebMessagePort {
469 public:
470     NapiWebMessagePort() = default;
471     ~NapiWebMessagePort() = default;
472 
473     struct WebMsgPortParam {
474         bool extention_;
475         napi_env env_;
476         napi_ref callback_;
477         std::shared_ptr<NWebMessage> msg_;
478         std::mutex mutex_;
479         bool ready_ = false;
480         std::condition_variable condition_;
481     };
482 
483     static napi_value JsConstructor(napi_env env, napi_callback_info info);
484 
485     static napi_value Close(napi_env env, napi_callback_info info);
486 
487     static napi_value PostMessageEvent(napi_env env, napi_callback_info info);
488 
489     static napi_value OnMessageEvent(napi_env env, napi_callback_info info);
490 
491     static napi_value PostMessageEventExt(napi_env env, napi_callback_info info);
492 
493     static napi_value OnMessageEventExt(napi_env env, napi_callback_info info);
494 };
495 
496 class NapiWebHistoryList {
497 public:
498     NapiWebHistoryList() = default;
499     ~NapiWebHistoryList() = default;
500 
501     static napi_value JsConstructor(napi_env env, napi_callback_info info);
502 
503     static napi_value GetItem(napi_env env, napi_callback_info info);
504 
505 private:
506     static napi_value GetFavicon(napi_env env, std::shared_ptr<NWebHistoryItem> item);
507 };
508 
509 class NapiWebPrintDocument {
510 public:
511     NapiWebPrintDocument() = default;
512     ~NapiWebPrintDocument() = default;
513 
514     static napi_value JsConstructor(napi_env env, napi_callback_info info);
515 
516     static napi_value OnStartLayoutWrite(napi_env env, napi_callback_info info);
517 
518     static napi_value OnJobStateChanged(napi_env env, napi_callback_info info);
519 };
520 } // namespace NWeb
521 } // namespace OHOS
522 
523 #endif // NWEB_NAPI_WEBVIEW_CONTROLLER_H
524