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