;i(CdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddlmZddlmZddlmZddlmZdd lmZmZdd lmZddlZdd lmZdd lmZerdd lm Z ej!Z"dZ#ej$dZ%Gdde Z&dJdZ'dJdZ(dKdZ)dLdZ*dMdZ+dNdOd!Z,dPd%Z-dQd(Z.dRd,Z/dSd2Z0dTd3Z1dLd4Z2dUd6Z3dVd8Z4dWd;Z5dXd=Z6d>d?dYdBZ7dZdDZ8dLdEZ9d[dIZ:dS)\zm (C) 2014-2019 Roman Sirokov and contributors Licensed under BSD license http://github.com/r0x0r/pywebview/ ) annotationsN)UserDict)glob) SimpleCookie) architecture)Thread) TYPE_CHECKINGAny)uuid4) _dnd_state)WebViewException)Windowz pywebviewc0eZdZdZddZfdZdZxZS) ImmutableDictz " A dictionary that does not allow adding new keys or deleting existing ones. Only existing keys can be modified. Nc i|_|r|j||r|j|dSdSN)dataupdate)self initial_datakwargss @C:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\webview/util.py__init__zImmutableDict.__init__6sU  + I  \ * * *  % I  V $ $ $ $ $ % %c||jvrtd|dt||dS)NzCannot add new key 'z&'. Only existing keys can be modified.)rKeyErrorsuper __setitem__)rkeyvalue __class__s rrzImmutableDict.__setitem__=sJ di  ]#]]]^^ ^ C'''''rc td)NzDeleting keys is not allowed.)r)rr s r __delitem__zImmutableDict.__delitem__Bs6777rr)__name__ __module__ __qualname____doc__rrr$ __classcell__)r"s@rrr0se %%%%((((( 8888888rrurlstr | callable | Nonereturnboolc t|S)z,Returns true if 'url' is a WSGI or ASGI app.)callabler*s ris_appr1Fs C==rct|pA| p>|dp)|dp|d S)Nzhttp://zhttps://file://)r1 startswithr0s r is_local_urlr5Ks]  W )y)) )z** )~~i((  rurls list[str]c4td|DS)NcNg|]"}t|st| |#S)r1r5).0r*s r z needs_server..Xs0KKKK S8I8IKKKKr)r-)r6s r needs_serverr=Ws KKKKK L LLrstrcttdr tjStjdrtjdSt tddr)tjtjSdtj vrWtjdrCtj tjtddSttd rtjd Stjtj tj d S) z0 Gets the file root of the application. _MEIPASS RESOURCEPATHfrozenFpytestPYWEBVIEW_TESTz..testsgetandroidapilevelANDROID_APP_PATHr)hasattrsysr@osgetenvgetattrpathdirname executablemodulesjoin__file__realpathargvr:rr get_app_rootrU[s sJ| y  )y(((sHe$$/ws~...3;29-=#>#>w||BGOOH55tWEEEs())-y+,,, 7??27++CHQK88 9 99rrMctj|}tj|s,tjt |}tj|S)z8 Make path absolute, using the application root )rJfspathrMisabsrQrUnormpath)rMs rabspathrZrsV 9T??D 7==  2w||LNND11 7  D ! !!r relative_pathct}tj|st d|ddtj||S)z@Get absolute path to resource, works for dev and for PyInstallerzPath z does not existr3)rUrJrMexists ValueErrorrQ)r\ base_paths rbase_urira|sYI 7>>) $ $=;;;;<<< =RW\\)];; = ==rinput_dict[Any, Any] | strSimpleCookie[str]ct|trt}|d}|d||<|d||d<|d||d<|d||d<|d||d<|d||d<tjjdkr3tjjd kr|d ||d <|St|trt|Std ) Nnamer!rMdomainexpiressecurehttponlysamesitezUnknown input to create_cookie) isinstancedictrrI version_infomajorminorgetr>r )rbcookierfs r create_cookierus&$ f~gt %f~t V!'!1t X"("3t Y!'!1t X#)*#5t Z   !Q & &3+;+AQ+F+F'-zz*'='=F4L $ &#$F### ; < <>> ? ??rplatformwindowrc. gddddfd fd  fd }jjtdt |\ t |}|dS)a " Generates and injects a global window.pywebview object. The object contains exposed API functions as well as utility functions required by pywebview. The function fires before_load event before injecting the object and loaded event after the object is injected. funcobjectcRttj|j}|Sr)listinspectgetfullargspecargsrparamss rget_argsz"inject_pywebview..get_argss"g,T22788 rr[Nobj base_namer> functionsdict[str, object]ct|}| vr|S ||i}t|D]} |r|d|n|}t||}|dst|dddkrJt||}t j|r |dd||<nUt j|s4t|tr,t|st|dr  |||#t$r+}td|d |Yd}~ d}~wwxYw|S) N._ _serializableTFryr&zError while processing z: )idappenddirrLr4rismethodisclassrnrr/rH Exceptionloggererror) rrrobj_idrf full_name target_objattreexposed_objectsr get_functionss rrz'inject_pywebview..get_functionssC _ $ $   " "6 * * *  IHH  D 5>Hy114111D $S$// ??3''7:PT+U+UY^+^+^sD))#D))>+38D>>!""+=Ii((_T**>tV,,>5=d^^>HOPTVbHcHc>"M$ 9===    GyGGAGGHHH s AD BD E$ E  Ec j}tjdkr&fdjD}ni}||d|DS)Nrc.i|]\}}||Sr:r:)r;rffrs r z;inject_pywebview..generate_func..s'[[[gdAhhqkk[[[rcg|] \}}||d S)rr:)r;rfrs rr<z;inject_pywebview..generate_func..s$WWW\T600WWWr)_js_apilen _functionsitemsr)rexpose_functionsrrrs r generate_funcz'inject_pywebview..generate_funcs!M&.11 v ! !A % %[[[[ARAXAXAZAZ[[[  ! )***WWY__EVEVWWWWrc`jjtd j5}dtj|izjj tdddddS#1swxYwYdS#t$rC}t |jj Yd}~dSd}~wwxYw)Nz_pywebviewready event firedrzloaded event fired) run_jsevents_pywebviewreadysetrdebug _expose_lockjsondumpsloadedr exception) func_listr finish_scriptrjs_coders rgenerate_js_objectz,inject_pywebview..generate_js_objectsj g %))+++ 2333 '$ 3 3)MOO  m{DJyrr)r before_loadrrr load_js_filesrstart) rrrthreadrrrrrrs ` @@@@@@rinject_pywebviewrs O@ X X X X X X X ' ' ' ' ' ' ' ' M!!### LLFGGG*68<<G] - . . .F LLNNNNNr func_nameparamr value_idNonecfd}d!d}dkr j|dSd kr-|d }|d }jj|}|sdS|d d kr|ddg} | D]fdtdD} t | dkr/t j| ddd<td | d|j |d gD](} t| |f} | )dSdkrp|tj|nd} tjrj| nt"d| j=dSdkr*j|d|dddSdkrd|z}t+j|dSjp|jU |t|} | dS#t0$rt"dYdSwxYwt"d dS)"z Calls a function from the JS API and executes it in Python. The function is executed in a separate thread to prevent blocking the UI thread. The result is then passed back to the JS API. c L }tj|dddd}d|d}n#t$r}tt jt|t|j t jd}tj|dddd}d|d}Yd}~nd}~wwxYw d d d |d dS) N\\\'\'z {value: 'z'})messagerfstackz{isError: true, value: 'z)window.pywebview._returnValuesCallbacks["z"]["z"]()) rrreplacerrr traceback format_excr>typer% evaluate_js) resultretvalrrrr func_paramsrrs r_callzjs_bridge_call.._callsB =T;'FZ''//f==EEc5QQF-&---FF = = = LL-// 0 0 0 #AQ0@9K_KaKabbEZ&&..tV<<DDS%PPF<<<cf|d}|D]}t||d}|dS|S)Nr)splitrL)rr attributesrs rget_nested_attributez,js_bridge_call..get_nested_attribute sI^^C((   D#tT**C{tt rpywebviewMoveWindowNpywebviewEventHandlereventnodeIdrdrop dataTransferfilescrg|]3}tj|ddk1|4S)rrf)urllibparseunquote)r;itemfiles rr<z"js_bridge_call.."sF|++DG44V DDDDDrpathsrrypywebviewFullPath)rrpywebviewAsyncCallbackzEAsync function executed and callback is not callable. Returned value pywebviewStateUpdater r!FpywebviewStateDelete__pywebviewHaltUpdate__rz+Error occurred while evaluating function %szFunction %s() does not exist)rrrr>)movedom _elementsrsr rrrrremove_event_handlersrrrloadsr/ _callbacksrrstate __setattr__delattrrrrr)rrrrrrrnode_idelementrrMhandlerrr! special_keyrrrs`` ` @@@rjs_bridge_callrs^          ))) U+++g/*&**733  F =F " ".)--gr::E 4 4 *7 3 t99>>,2L,@,@a,L,L()7#**473333.225="EE  G7%:::F LLNNNN,,,%*%6 5!!!D F%h/ 0 0  'F h ' . . . . LL_X]__     h '***   uuW~uEEE***/%7  k***    + + ^/C/CFNT]/^/^D  WK5)))F LLNNNNN W W W   JI V V V V V V W  3Y?????s&I88%J! J!c t}td|ttj|ddd}t|}d}d}|D]}t|5}tj tj |d} | } i} | dkrt||j |jd } n| d krt|jt"jd tt"jd t|jt|jt|d ko |jo|jd} nR| dkrdt/j|ji} n0| dkr| } dddR| dkr|dkr dddl|| | zz }dddn #1swxYwY||fS)z Load JS files in the order they should be loaded. The order is polyfill, api, the rest and finish.js. Return the concatenated JS code and the finish script, which must be loaded last and separately in order to zLoading JS files from %sz**z*.jsT) recursiver[rapi)tokenruidjs_api_endpoint customizeDRAG_REGION_SELECTORDRAG_REGION_DIRECT_TARGET_ONLY edgechromium) text_select drag_selectordrag_region_direct_target_onlyzoomable draggable easy_dragrfinishNpolyfillmshtml) get_js_dirrrrrJrMrQ sort_js_filesopensplitextbasenameread_TOKENrr r>rwebviewsettingsrrr framelessrrr) rrjs_dirjs_filesordered_js_filesrrrrrfcontentrs rrrVsw\\F LL+V444BGLLv66$GGGH$X..GM "("( $ZZ! (17##BG$4$4T$:$:;;A>DffhhGFu}}# (!:'-'=  $$#&v'9#:#:%,%56L%M69()IJ77!$FO 4 4!$V%5!6!6!$ N2\v7G\FL\""  !4:fl#;#;<!! ' ;! (! (! (! (! (! (! (<##H(<(<?! (! (! (! (! (! (! (B w' 'GC! (! (! (! (! (! (! (! (! (! (! (! (! (! (! (F M !!sD3G/ G/G//G3 6G3 ctjtjtjt d}tj|r|Sd|vr|dd}tj|}tj|D]}| drtj tj||rEtj||dd}tj|r|cStd|z)z> Get the path to the directory with Javascript files. jsz.ziprpythonrzCannot find JS directory in %s) rJrMrQrNrSrRr^rlistdirr4isdirFileNotFoundError)rMr`rrjs_paths rrrs# 7<<(8(8(B(BCCT J JD w~~d ~~JJv&&q) gooi((JsOO # #Dx(( #RW]]27<<T;R;R-S-S #',,sD)TBB7>>'**#"NNN zsort_js_files..s:aPQdCSr)r )rJrMrrrsortedinsert)r"r#remaining_js_filesrrr/s @rrrs  A66J887##BG$4$4T$:$:;;A> : % %  # #D ) ) ) )  % %x&6 7 7 7 7 !39S9S9S9STTT<<$ 8 4d;;;; rstringc|ddddddddd d S) Nrr"z\" z\n z\rrr)r)r4s r escape_stringr9sTtV$$ e   u   u   e   rr$racd}d|d}tj|dz|}|r|Stj|dz|}|r-|}||||zStj|dz|}|r-|}||||zStj|dz|}|r-|}||||zS||zS)Nz<%s(?:[\s]+[^>]*|)>z baseheadhtmlbody)r{r|r}r)r$rapatternbase_tagrtags rinject_base_urirBs$G*h***H Ig& 0 0E  Ig& 0 0E 4kkmmsC(N333 Ig& 0 0E 4kkmmsC(N333 Ig& 0 0E 4kkmmsHsN333 g rdll_namec|dkrtddkrdnd}tjtjtjt d|}tj|r|Stjtjtjt dd|d}tj|r|Stjtjtjtj d|}tj|r|S ttd r+tjtj |}n@ttd d r*tjtj |}tj|r|Sn#t$rYnwxYwtd |) NzWebBrowserInterop.dllr64bitzWebBrowserInterop.x64.dllzWebBrowserInterop.x86.dlllibruntimesnativer@rBFz Cannot find )rrJrMrQrNrSrRr^rIrTrHr@rLrOrr*)rCdll_paths rinterop_dll_pathrJs***~~a G++ ( ', w||BGOOBG,<,w||CL(;;HH S(E * * >w||CNH==H 7>>( # # O        5855 6 66s3B I I"!I" )sepr valuesct|}tj|d}|r|g|z}||tj|<dS)z:Append values to an environment variable, separated by sepr[N)rrJenvironrsrQ)r rLrMexistings renviron_appendrQsQ &\\Fz~~c2&&H%f$hhv&&BJsOOOrcss_case_stringc|d}|ddd|ddDz}|S)N-rr[c3>K|]}|VdSr) capitalize)r;words r zcss_to_camel..s,*S*S4??+<+<*S*S*S*S*S*Srry)rrQ)rRwordscamel_case_strings r css_to_camelr[sM  ! !# & &Ea277*S*Sqrr*S*S*S#S#SS rctjtjtjt ddS)NrFzpywebview-android.jar)rJrMrQrNrSrRr:rrandroid_jar_pathr]s9 7<<(8(8(B(BCCULc d ddrheadersdict[str, Any]dict[str, str]c>d|DS)Nc4i|]\}}|t|Sr:)r>)r;kvs rrz%stringify_headers..s$ 2 2 2$!QAs1vv 2 2 2r)r)r^s rstringify_headersres 2 2'--// 2 2 22r)r*r+r,r-)r6r7r,r-)r,r>)rMr>r,r>)r[)r\r>r,r>)rbrcr,rd)rvr>r,rw)rr>rrr,r>) rrrr>rr rr>r,r)rrrr>r,r>)r"r7r,r7)r4r>r,r>)r$r>rar>r,r>)rCr>r,r>)r r>rMr>r,r)rRr>r,r>)r^r_r,r`);r( __future__rrrloggingrJr{rIr urllib.parser collectionsrr http.cookiesrrr threadingrtypingr r uuidr r webview.domr webview.errorsr webview.windowrhexr DEFAULT_HTML getLoggerrrr1r5r=rUrZrarurrrrrrr9rBrJrQr[r]rer:rrrts\#"""""   %%%%%%!!!!!!%%%%%%%%""""""++++++&%%%%%%    ; ' '88888H888,    MMMM::::."""">>>>>====, @ @ @ @KKKK\]@]@]@]@@2"2"2"2"jEEEE0.6%7%7%7%7P03'''''' eeee333333r