tcwebidl2wasmjob.pas 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201
  1. unit tcwebidl2wasmjob;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, webidldefs, webidlscanner, webidltopas, webidltowasmjob, pascodegen;
  6. const
  7. FixedGUID = '{1B6D2766-7DA6-40FA-9B4E-93FFB805B83A}';
  8. type
  9. { TTestWebIDLToPasWasmJob }
  10. TTestWebIDLToPasWasmJob = class(TWebIDLToPasWasmJob)
  11. private
  12. FRealGUID: Boolean;
  13. Public
  14. function ComputeGUID(const Prefix: TIDLString; aList: TIDLDefinitionList): TIDLString; override;
  15. Property RealGUID : Boolean Read FRealGUID Write FRealGUID;
  16. end;
  17. { TCustomTestWebIDL2WasmJob }
  18. TCustomTestWebIDL2WasmJob = Class(TTestCase)
  19. private
  20. FHeaderSrc: TIDLString;
  21. FWebIDLToPas: TWebIDLToPasWasmJob;
  22. procedure OnLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String
  23. );
  24. protected
  25. procedure Setup; override;
  26. procedure TearDown; override;
  27. public
  28. procedure TestWebIDL(const WebIDLSrc, ExpectedPascalSrc: array of string); virtual;
  29. procedure CheckDiff(Msg, Expected, Actual: string); virtual;
  30. property WebIDLToPas: TWebIDLToPasWasmJob read FWebIDLToPas;
  31. property HeaderSrc: TIDLString read FHeaderSrc write FHeaderSrc;
  32. end;
  33. { TTestWebIDL2WasmJob }
  34. TTestWebIDL2WasmJob = Class(TCustomTestWebIDL2WasmJob)
  35. published
  36. procedure TestWJ_Empty;
  37. // typedefs
  38. procedure TestWJ_Typedef_Boolean;
  39. procedure TestWJ_Typedef_Sequence;
  40. procedure TestWJ_Typedef_Aliased;
  41. procedure TestWJ_Typedef_Dictionary;
  42. procedure TestWJ_Typedef_DictionaryWithParent;
  43. // attributes
  44. procedure TestWJ_IntfAttribute_Boolean;
  45. procedure TestWJ_IntfStringifier;
  46. procedure TestWJ_IntfAttribute_ArrayBuffer;
  47. procedure TestWJ_IntfAttribute_ArrayBufferView;
  48. procedure TestWJ_IntfAttribute_ChromeOnly;
  49. procedure TestWJ_CallBackObjectArg;
  50. procedure TestWJ_CallBackEnumArg;
  51. procedure TestWJ_CallBackSequenceArg;
  52. // todo procedure TestWJ_IntfAttribute_Any;
  53. // functions
  54. procedure TestWJ_IntfFunction_Void;
  55. procedure TestWJ_IntfFunction_SetEventHandler;
  56. procedure TestWJ_IntfFunction_Promise;
  57. procedure TestWJ_IntfFunction_ArgAny;
  58. procedure TestWJ_IntfFunction_EnumResult;
  59. procedure TestWJ_IntfFunction_SequenceArg;
  60. procedure TestWJ_IntfFunction_2SequenceArg;
  61. procedure TestWJ_IntfFunction_Constructor;
  62. procedure TestWJ_IntfFunction_ArrayBufferArg;
  63. procedure TestWJ_IntfFunction_ArrayBufferViewArg;
  64. procedure TestWJ_IntfFunction_SequenceResult;
  65. procedure TestWJ_IntfFunction_GlobalSequenceResult;
  66. procedure TestWJ_IntfFunction_ChromeOnly;
  67. procedure TestWJ_IntfFunction_ChromeOnlyNewObject;
  68. procedure TestWJ_IntfFunction_DictionaryResult;
  69. procedure TestWJ_IntfFunction_AliasResult;
  70. procedure TestWJ_IntfFunction_NestedUnionSequence;
  71. procedure TestWJ_intfFunction_UnionOptional;
  72. // Namespace attribute
  73. procedure TestWJ_NamespaceAttribute_Boolean;
  74. // maplike
  75. procedure TestWJ_MaplikeInterface;
  76. end;
  77. function LinesToStr(Args: array of const): TIDLString;
  78. function CheckSrcDiff(Expected, Actual: string; out Msg: string): boolean;
  79. implementation
  80. function LinesToStr(Args: array of const): TIDLString;
  81. var
  82. s,a: TIDLString;
  83. U : UnicodeString;
  84. i: Integer;
  85. begin
  86. s:='';
  87. for i:=Low(Args) to High(Args) do
  88. begin
  89. case Args[i].VType of
  90. vtChar: A:=Args[i].VChar;
  91. vtString: A:=Args[i].VString^;
  92. vtPChar: A:=Args[i].VPChar;
  93. vtWideChar: begin
  94. U:=Args[i].VWideChar;
  95. A:=UTF8Encode(U);
  96. end;
  97. vtPWideChar: begin
  98. U:=Args[i].VPWideChar;
  99. A:=UTF8Encode(U);
  100. end;
  101. vtAnsiString: begin
  102. A:=AnsiString(Args[i].VAnsiString);
  103. end;
  104. vtWidestring: begin
  105. U:=WideString(Args[i].VWideString);
  106. A:=UTF8Encode(U);
  107. end;
  108. vtUnicodeString: begin
  109. U:=UnicodeString(Args[i].VUnicodeString);
  110. A:=UTF8Encode(U);
  111. end;
  112. end;
  113. S:=S+A+LineEnding;
  114. end;
  115. // Writeln('LinesToStr : ',S);
  116. Result:=s;
  117. end;
  118. function CheckSrcDiff(Expected, Actual: string; out Msg: string): boolean;
  119. // search diff, ignore changes in spaces
  120. const
  121. SpaceChars = [#9,#10,#13,' '];
  122. var
  123. ExpectedP, ActualP: PChar;
  124. function FindLineEnd(p: PChar): PChar;
  125. begin
  126. Result:=p;
  127. while not (Result^ in [#0,#10,#13]) do inc(Result);
  128. end;
  129. function FindLineStart(p, MinP: PChar): PChar;
  130. begin
  131. while (p>MinP) and not (p[-1] in [#10,#13]) do dec(p);
  132. Result:=p;
  133. end;
  134. procedure SkipLineEnd(var p: PChar);
  135. begin
  136. if p^ in [#10,#13] then
  137. begin
  138. if (p[1] in [#10,#13]) and (p^<>p[1]) then
  139. inc(p,2)
  140. else
  141. inc(p);
  142. end;
  143. end;
  144. function HasSpecialChar(s: string): boolean;
  145. var
  146. i: Integer;
  147. begin
  148. for i:=1 to length(s) do
  149. if s[i] in [#0..#31,#127..#255] then
  150. exit(true);
  151. Result:=false;
  152. end;
  153. function HashSpecialChars(s: string): string;
  154. var
  155. i: Integer;
  156. begin
  157. Result:='';
  158. for i:=1 to length(s) do
  159. if s[i] in [#0..#31,#127..#255] then
  160. Result:=Result+'#'+hexstr(ord(s[i]),2)
  161. else
  162. Result:=Result+s[i];
  163. end;
  164. procedure DiffFound;
  165. var
  166. ActLineStartP, ActLineEndP, p, StartPos: PChar;
  167. ExpLine, ActLine: String;
  168. i, LineNo, DiffLineNo: Integer;
  169. begin
  170. writeln('Diff found "',Msg,'". Lines:');
  171. // write correct lines
  172. p:=PChar(Expected);
  173. LineNo:=0;
  174. DiffLineNo:=0;
  175. repeat
  176. StartPos:=p;
  177. while not (p^ in [#0,#10,#13]) do inc(p);
  178. ExpLine:=copy(Expected,StartPos-PChar(Expected)+1,p-StartPos);
  179. SkipLineEnd(p);
  180. inc(LineNo);
  181. if (p<=ExpectedP) and (p^<>#0) then
  182. begin
  183. writeln('= ',ExpLine);
  184. end else begin
  185. // diff line
  186. if DiffLineNo=0 then DiffLineNo:=LineNo;
  187. // write actual line
  188. ActLineStartP:=FindLineStart(ActualP,PChar(Actual));
  189. ActLineEndP:=FindLineEnd(ActualP);
  190. ActLine:=copy(Actual,ActLineStartP-PChar(Actual)+1,ActLineEndP-ActLineStartP);
  191. writeln('- ',ActLine);
  192. if HasSpecialChar(ActLine) then
  193. writeln('- ',HashSpecialChars(ActLine));
  194. // write expected line
  195. writeln('+ ',ExpLine);
  196. if HasSpecialChar(ExpLine) then
  197. writeln('- ',HashSpecialChars(ExpLine));
  198. // write empty line with pointer ^
  199. for i:=1 to 2+ExpectedP-StartPos do write(' ');
  200. writeln('^');
  201. Msg:='expected "'+ExpLine+'", but got "'+ActLine+'".';
  202. CheckSrcDiff:=false;
  203. // write up to ten following actual lines to get some context
  204. for i:=1 to 10 do begin
  205. ActLineStartP:=ActLineEndP;
  206. SkipLineEnd(ActLineStartP);
  207. if ActLineStartP^=#0 then break;
  208. ActLineEndP:=FindLineEnd(ActLineStartP);
  209. ActLine:=copy(Actual,ActLineStartP-PChar(Actual)+1,ActLineEndP-ActLineStartP);
  210. writeln('~ ',ActLine);
  211. end;
  212. exit;
  213. end;
  214. until p^=#0;
  215. // internal error:
  216. writeln('DiffFound Actual:-----------------------');
  217. writeln(Actual);
  218. writeln('DiffFound Expected:---------------------');
  219. writeln(Expected);
  220. writeln('DiffFound ------------------------------');
  221. Msg:='diff found, but lines are the same, internal error';
  222. CheckSrcDiff:=false;
  223. end;
  224. var
  225. IsSpaceNeeded: Boolean;
  226. LastChar, Quote: Char;
  227. begin
  228. Result:=true;
  229. Msg:='';
  230. Writeln('Actual :',ACtual);
  231. if Expected='' then Expected:=' ';
  232. if Actual='' then Actual:=' ';
  233. ExpectedP:=PChar(Expected);
  234. ActualP:=PChar(Actual);
  235. repeat
  236. //writeln('TTestModule.CheckDiff Exp="',ExpectedP^,'" Act="',ActualP^,'"');
  237. case ExpectedP^ of
  238. #0:
  239. begin
  240. // check that rest of Actual has only spaces
  241. while ActualP^ in SpaceChars do inc(ActualP);
  242. if ActualP^<>#0 then
  243. begin
  244. DiffFound;
  245. exit;
  246. end;
  247. exit(true);
  248. end;
  249. ' ',#9,#10,#13:
  250. begin
  251. // skip space in Expected
  252. IsSpaceNeeded:=false;
  253. if ExpectedP>PChar(Expected) then
  254. LastChar:=ExpectedP[-1]
  255. else
  256. LastChar:=#0;
  257. while ExpectedP^ in SpaceChars do inc(ExpectedP);
  258. if (LastChar in ['a'..'z','A'..'Z','0'..'9','_','$'])
  259. and (ExpectedP^ in ['a'..'z','A'..'Z','0'..'9','_','$']) then
  260. IsSpaceNeeded:=true;
  261. if IsSpaceNeeded and (not (ActualP^ in SpaceChars)) then
  262. begin
  263. DiffFound;
  264. exit;
  265. end;
  266. while ActualP^ in SpaceChars do inc(ActualP);
  267. end;
  268. '''','"':
  269. begin
  270. while ActualP^ in SpaceChars do inc(ActualP);
  271. if ExpectedP^<>ActualP^ then
  272. begin
  273. DiffFound;
  274. exit;
  275. end;
  276. Quote:=ExpectedP^;
  277. repeat
  278. inc(ExpectedP);
  279. inc(ActualP);
  280. if ExpectedP^<>ActualP^ then
  281. begin
  282. DiffFound;
  283. exit;
  284. end;
  285. if (ExpectedP^ in [#0,#10,#13]) then
  286. break
  287. else if (ExpectedP^=Quote) then
  288. begin
  289. inc(ExpectedP);
  290. inc(ActualP);
  291. break;
  292. end;
  293. until false;
  294. end;
  295. else
  296. while ActualP^ in SpaceChars do inc(ActualP);
  297. if ExpectedP^<>ActualP^ then
  298. begin
  299. DiffFound;
  300. exit;
  301. end;
  302. inc(ExpectedP);
  303. inc(ActualP);
  304. end;
  305. until false;
  306. end;
  307. { TTestWebIDLToPasWasmJob }
  308. function TTestWebIDLToPasWasmJob.ComputeGUID(const Prefix: TIDLString; aList: TIDLDefinitionList): TIDLString;
  309. begin
  310. if RealGUID then
  311. Result:=inherited ComputeGUID(Prefix, aList)
  312. else
  313. Result:=FixedGUID;
  314. end;
  315. { TCustomTestWebIDL2WasmJob }
  316. procedure TCustomTestWebIDL2WasmJob.OnLog(Sender: TObject;
  317. LogType: TCodegenLogType; const Msg: String);
  318. begin
  319. if LogType=cltInfo then ;
  320. if Sender=nil then ;
  321. Status('TCustomTestWebIDL2WasmJob.OnLog '+Msg);
  322. end;
  323. procedure TCustomTestWebIDL2WasmJob.Setup;
  324. begin
  325. inherited Setup;
  326. FWebIDLToPas:=TTestWebIDLToPasWasmJob.Create(nil);
  327. WebIDLToPas.OnLog:=@OnLog;
  328. WebIDLToPas.InputFileName:='test1.webidl';
  329. WebIDLToPas.OutputFileName:='test1.pas';
  330. WebIDLToPas.OutputStream:=TMemoryStream.Create;
  331. HeaderSrc:=LinesToStr([
  332. 'Unit test1;',
  333. '',
  334. '{$MODE ObjFPC}',
  335. '{$H+}',
  336. 'interface',
  337. '',
  338. 'uses SysUtils, Job.JS;',
  339. '']);
  340. end;
  341. procedure TCustomTestWebIDL2WasmJob.TearDown;
  342. begin
  343. WebIDLToPas.InputStream.Free;
  344. WebIDLToPas.InputStream:=nil;
  345. WebIDLToPas.OutputStream.Free;
  346. WebIDLToPas.OutputStream:=nil;
  347. FreeAndNil(FWebIDLToPas);
  348. inherited TearDown;
  349. end;
  350. procedure TCustomTestWebIDL2WasmJob.TestWebIDL(const WebIDLSrc,
  351. ExpectedPascalSrc: array of string);
  352. var
  353. i: Integer;
  354. Line, ExpectedSrc, InputSrc, OutputSrc: String;
  355. begin
  356. {$IFDEF VerboseWebidl2WasmJob}
  357. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL WebIDL:----------------------');
  358. {$ENDIF}
  359. InputSrc:='';
  360. for i:=0 to high(WebIDLSrc) do
  361. begin
  362. Line:=WebIDLSrc[i]+sLineBreak;
  363. InputSrc:=InputSrc+Line;
  364. {$IFDEF VerboseWebidl2WasmJob}
  365. write(Line);
  366. {$ENDIF}
  367. end;
  368. WebIDLToPas.InputStream:=TStringStream.Create(InputSrc);
  369. {$IFDEF VerboseWebidl2WasmJob}
  370. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ExpectedPascal: BEGIN--------');
  371. {$ENDIF}
  372. ExpectedSrc:=HeaderSrc;
  373. for i:=0 to high(ExpectedPascalSrc) do
  374. ExpectedSrc:=ExpectedSrc+ExpectedPascalSrc[i]+sLineBreak;
  375. {$IFDEF VerboseWebidl2WasmJob}
  376. writeln(ExpectedSrc);
  377. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ExpectedPascal END-----------');
  378. {$ENDIF}
  379. WebIDLToPas.Execute;
  380. OutputSrc:=WebIDLToPas.Source.Text;
  381. {$IFDEF VerboseWebidl2WasmJob}
  382. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ActualPascal: BEGIN----------');
  383. writeln(OutputSrc);
  384. writeln('TCustomTestWebIDL2WasmJob.TestWebIDL ActualPascal: END------------');
  385. {$ENDIF}
  386. CheckDiff('Source Differs',ExpectedSrc,OutputSrc);
  387. end;
  388. procedure TCustomTestWebIDL2WasmJob.CheckDiff(Msg, Expected, Actual: string);
  389. // search diff, ignore changes in spaces
  390. var
  391. s: string;
  392. begin
  393. if CheckSrcDiff(Expected,Actual,s) then exit;
  394. Fail(Msg+': '+s);
  395. end;
  396. { TTestWebIDL2WasmJob }
  397. procedure TTestWebIDL2WasmJob.TestWJ_Empty;
  398. begin
  399. TestWebIDL([
  400. ''],
  401. ['Type',
  402. ' // Forward class definitions',
  403. 'implementation',
  404. 'end.',
  405. '']);
  406. end;
  407. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Boolean;
  408. begin
  409. TestWebIDL([
  410. 'typedef boolean PerformanceEntry;',
  411. ''],
  412. ['Type',
  413. ' // Forward class definitions',
  414. ' TPerformanceEntry = Boolean;',
  415. 'implementation',
  416. 'end.',
  417. '']);
  418. end;
  419. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Sequence;
  420. begin
  421. TestWebIDL([
  422. 'typedef boolean PerformanceEntry;',
  423. 'typedef sequence <PerformanceEntry> PerformanceEntryList;',
  424. ''],
  425. ['Type',
  426. ' // Forward class definitions',
  427. ' TPerformanceEntry = Boolean;',
  428. ' TPerformanceEntryListDynArray = IJSArray; // array of PerformanceEntry',
  429. 'implementation',
  430. 'end.',
  431. '']);
  432. end;
  433. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Aliased;
  434. begin
  435. WebIDLToPas.TypeAliases.Add('Float32List=IJSFloat32Array');
  436. TestWebIDL([
  437. ' typedef ([AllowShared] Float32Array or sequence<GLfloat>) Float32List;',
  438. ''],
  439. ['',
  440. 'Type',
  441. ' // Forward class definitions',
  442. 'implementation',
  443. '',
  444. 'end.',
  445. ''
  446. ]);
  447. end;
  448. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_Dictionary;
  449. begin
  450. TestWebIDL([
  451. 'dictionary Attr {',
  452. ' boolean aBoolean;',
  453. '};',
  454. ''],
  455. ['Type',
  456. ' // Forward class definitions',
  457. ' IJSAttr = interface;',
  458. ' TJSAttr = class;',
  459. ' { --------------------------------------------------------------------',
  460. ' TJSAttr',
  461. ' --------------------------------------------------------------------}',
  462. '',
  463. ' TJSAttrRec = record',
  464. ' aBoolean: Boolean;',
  465. ' end;',
  466. '',
  467. ' IJSAttr = interface(IJSObject)',
  468. ' ['''+FixedGUID+''']',
  469. ' function _GetaBoolean: Boolean;',
  470. ' procedure _SetaBoolean(const aValue: Boolean);',
  471. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  472. ' end;',
  473. '',
  474. ' TJSAttr = class(TJSObject,IJSAttr)',
  475. ' Private',
  476. ' function _GetaBoolean: Boolean;',
  477. ' procedure _SetaBoolean(const aValue: Boolean);',
  478. ' Public',
  479. ' class function JSClassName: UnicodeString; override;',
  480. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  481. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  482. ' end;',
  483. '',
  484. 'implementation',
  485. '',
  486. 'function TJSAttr._GetaBoolean: Boolean;',
  487. 'begin',
  488. ' Result:=ReadJSPropertyBoolean(''aBoolean'');',
  489. 'end;',
  490. '',
  491. 'procedure TJSAttr._SetaBoolean(const aValue: Boolean);',
  492. 'begin',
  493. ' WriteJSPropertyBoolean(''aBoolean'',aValue);',
  494. 'end;',
  495. '',
  496. 'class function TJSAttr.JSClassName: UnicodeString;',
  497. 'begin',
  498. ' Result:=''Object'';',
  499. 'end;',
  500. '',
  501. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  502. 'begin',
  503. ' Result:=TJSAttr.JOBCast(Intf);',
  504. 'end;',
  505. '',
  506. 'end.',
  507. '']);
  508. end;
  509. procedure TTestWebIDL2WasmJob.TestWJ_Typedef_DictionaryWithParent;
  510. begin
  511. TestWebIDL([
  512. 'dictionary Attr {',
  513. ' boolean aBoolean;',
  514. '};',
  515. 'dictionary Attr2 : Attr {',
  516. ' long aLong;',
  517. '};',
  518. ''],
  519. ['Type',
  520. ' // Forward class definitions',
  521. ' IJSAttr = interface;',
  522. ' TJSAttr = class;',
  523. ' IJSAttr2 = interface;',
  524. ' TJSAttr2 = class;',
  525. ' { --------------------------------------------------------------------',
  526. ' TJSAttr',
  527. ' --------------------------------------------------------------------}',
  528. '',
  529. ' TJSAttrRec = record',
  530. ' aBoolean: Boolean;',
  531. ' end;',
  532. '',
  533. ' IJSAttr = interface(IJSObject)',
  534. ' ['''+FixedGUID+''']',
  535. ' function _GetaBoolean: Boolean;',
  536. ' procedure _SetaBoolean(const aValue: Boolean);',
  537. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  538. ' end;',
  539. '',
  540. ' TJSAttr = class(TJSObject,IJSAttr)',
  541. ' Private',
  542. ' function _GetaBoolean: Boolean;',
  543. ' procedure _SetaBoolean(const aValue: Boolean);',
  544. ' Public',
  545. ' class function JSClassName: UnicodeString; override;',
  546. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  547. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  548. ' end;',
  549. '',
  550. ' { --------------------------------------------------------------------',
  551. ' TJSAttr2',
  552. ' --------------------------------------------------------------------}',
  553. '',
  554. ' TJSAttr2Rec = record',
  555. ' aLong: LongInt;',
  556. ' aBoolean: Boolean;',
  557. ' end;',
  558. '',
  559. ' IJSAttr2 = interface(IJSAttr)',
  560. ' ['''+FixedGUID+''']',
  561. ' function _GetaLong: LongInt;',
  562. ' procedure _SetaLong(const aValue: LongInt);',
  563. ' property aLong: LongInt read _GetaLong write _SetaLong;',
  564. ' end;',
  565. '',
  566. ' TJSAttr2 = class(TJSAttr,IJSAttr2)',
  567. ' Private',
  568. ' function _GetaLong: LongInt;',
  569. ' procedure _SetaLong(const aValue: LongInt);',
  570. ' Public',
  571. ' class function JSClassName: UnicodeString; override;',
  572. ' class function Cast(const Intf: IJSObject): IJSAttr2;',
  573. ' property aLong: LongInt read _GetaLong write _SetaLong;',
  574. ' end;',
  575. '',
  576. 'implementation',
  577. '',
  578. 'function TJSAttr._GetaBoolean: Boolean;',
  579. 'begin',
  580. ' Result:=ReadJSPropertyBoolean(''aBoolean'');',
  581. 'end;',
  582. '',
  583. 'procedure TJSAttr._SetaBoolean(const aValue: Boolean);',
  584. 'begin',
  585. ' WriteJSPropertyBoolean(''aBoolean'',aValue);',
  586. 'end;',
  587. '',
  588. 'class function TJSAttr.JSClassName: UnicodeString;',
  589. 'begin',
  590. ' Result:=''Object'';',
  591. 'end;',
  592. '',
  593. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  594. 'begin',
  595. ' Result:=TJSAttr.JOBCast(Intf);',
  596. 'end;',
  597. '',
  598. 'function TJSAttr2._GetaLong: LongInt;',
  599. 'begin',
  600. ' Result:=ReadJSPropertyLongInt(''aLong'');',
  601. 'end;',
  602. '',
  603. 'procedure TJSAttr2._SetaLong(const aValue: LongInt);',
  604. 'begin',
  605. ' WriteJSPropertyLongInt(''aLong'',aValue);',
  606. 'end;',
  607. '',
  608. 'class function TJSAttr2.JSClassName: UnicodeString;',
  609. 'begin',
  610. ' Result:=''Object'';',
  611. 'end;',
  612. '',
  613. 'class function TJSAttr2.Cast(const Intf: IJSObject): IJSAttr2;',
  614. 'begin',
  615. ' Result:=TJSAttr2.JOBCast(Intf);',
  616. 'end;',
  617. '',
  618. 'end.',
  619. '']);
  620. end;
  621. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_Boolean;
  622. begin
  623. TestWebIDL([
  624. 'interface Attr {',
  625. ' attribute boolean aBoolean;',
  626. '};',
  627. ''],
  628. ['Type',
  629. ' // Forward class definitions',
  630. ' IJSAttr = interface;',
  631. ' TJSAttr = class;',
  632. ' { --------------------------------------------------------------------',
  633. ' TJSAttr',
  634. ' --------------------------------------------------------------------}',
  635. '',
  636. ' IJSAttr = interface(IJSObject)',
  637. ' ['''+FixedGUID+''']',
  638. ' function _GetaBoolean: Boolean;',
  639. ' procedure _SetaBoolean(const aValue: Boolean);',
  640. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  641. ' end;',
  642. '',
  643. ' TJSAttr = class(TJSObject,IJSAttr)',
  644. ' Private',
  645. ' function _GetaBoolean: Boolean;',
  646. ' procedure _SetaBoolean(const aValue: Boolean);',
  647. ' Public',
  648. ' class function JSClassName: UnicodeString; override;',
  649. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  650. ' property aBoolean: Boolean read _GetaBoolean write _SetaBoolean;',
  651. ' end;',
  652. '',
  653. 'implementation',
  654. '',
  655. 'function TJSAttr._GetaBoolean: Boolean;',
  656. 'begin',
  657. ' Result:=ReadJSPropertyBoolean(''aBoolean'');',
  658. 'end;',
  659. '',
  660. 'procedure TJSAttr._SetaBoolean(const aValue: Boolean);',
  661. 'begin',
  662. ' WriteJSPropertyBoolean(''aBoolean'',aValue);',
  663. 'end;',
  664. '',
  665. 'class function TJSAttr.JSClassName: UnicodeString;',
  666. 'begin',
  667. ' Result:=''Attr'';',
  668. 'end;',
  669. '',
  670. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  671. 'begin',
  672. ' Result:=TJSAttr.JOBCast(Intf);',
  673. 'end;',
  674. '',
  675. 'end.',
  676. '']);
  677. end;
  678. procedure TTestWebIDL2WasmJob.TestWJ_IntfStringifier;
  679. begin
  680. TestWebIDL([
  681. 'interface Attr {',
  682. ' stringifier;',
  683. '};',
  684. ''],
  685. ['Type',
  686. ' // Forward class definitions',
  687. ' IJSAttr = interface;',
  688. ' TJSAttr = class;',
  689. ' { --------------------------------------------------------------------',
  690. ' TJSAttr',
  691. ' --------------------------------------------------------------------}',
  692. '',
  693. ' IJSAttr = interface(IJSObject)',
  694. ' ['''+FixedGUID+''']',
  695. ' end;',
  696. '',
  697. ' TJSAttr = class(TJSObject,IJSAttr)',
  698. ' Private',
  699. ' Public',
  700. ' class function JSClassName: UnicodeString; override;',
  701. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  702. ' end;',
  703. '',
  704. 'implementation',
  705. '',
  706. 'class function TJSAttr.JSClassName: UnicodeString;',
  707. 'begin',
  708. ' Result:=''Attr'';',
  709. 'end;',
  710. '',
  711. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  712. 'begin',
  713. ' Result:=TJSAttr.JOBCast(Intf);',
  714. 'end;',
  715. '',
  716. 'end.',
  717. '']);
  718. end;
  719. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_ArrayBuffer;
  720. begin
  721. TestWebIDL([
  722. 'interface Attr {',
  723. ' [SameObject, Throws] readonly attribute ArrayBuffer signature;',
  724. '};',
  725. ''],
  726. [
  727. 'Type',
  728. ' // Forward class definitions',
  729. ' IJSAttr = interface;',
  730. ' TJSAttr = class;',
  731. ' { --------------------------------------------------------------------',
  732. ' TJSAttr',
  733. ' --------------------------------------------------------------------}',
  734. '',
  735. ' IJSAttr = interface(IJSObject)',
  736. ' ['''+FixedGUID+''']',
  737. ' function _Getsignature: IJSArrayBuffer;',
  738. ' property signature: IJSArrayBuffer read _Getsignature;',
  739. ' end;',
  740. '',
  741. ' TJSAttr = class(TJSObject,IJSAttr)',
  742. ' Private',
  743. ' function _Getsignature: IJSArrayBuffer;',
  744. ' Public',
  745. ' class function JSClassName: UnicodeString; override;',
  746. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  747. ' property signature: IJSArrayBuffer read _Getsignature;',
  748. ' end;',
  749. '',
  750. 'implementation',
  751. '',
  752. 'function TJSAttr._Getsignature: IJSArrayBuffer;',
  753. 'begin',
  754. ' Result:=ReadJSPropertyObject(''signature'',TJSArrayBuffer) as IJSArrayBuffer;',
  755. 'end;',
  756. '',
  757. 'class function TJSAttr.JSClassName: UnicodeString;',
  758. 'begin',
  759. ' Result:=''Attr'';',
  760. 'end;',
  761. '',
  762. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  763. 'begin',
  764. ' Result:=TJSAttr.JOBCast(Intf);',
  765. 'end;',
  766. '',
  767. 'end.',
  768. ''
  769. ]);
  770. end;
  771. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_ArrayBufferView;
  772. begin
  773. TestWebIDL([
  774. 'interface Attr {',
  775. ' [SameObject, Throws] readonly attribute ArrayBufferView signature;',
  776. '};',
  777. ''],
  778. [
  779. 'Type',
  780. ' // Forward class definitions',
  781. ' IJSAttr = interface;',
  782. ' TJSAttr = class;',
  783. ' { --------------------------------------------------------------------',
  784. ' TJSAttr',
  785. ' --------------------------------------------------------------------}',
  786. '',
  787. ' IJSAttr = interface(IJSObject)',
  788. ' ['''+FixedGUID+''']',
  789. ' function _Getsignature: IJSArrayBufferView;',
  790. ' property signature: IJSArrayBufferView read _Getsignature;',
  791. ' end;',
  792. '',
  793. ' TJSAttr = class(TJSObject,IJSAttr)',
  794. ' Private',
  795. ' function _Getsignature: IJSArrayBufferView;',
  796. ' Public',
  797. ' class function JSClassName: UnicodeString; override;',
  798. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  799. ' property signature: IJSArrayBufferView read _Getsignature;',
  800. ' end;',
  801. '',
  802. 'implementation',
  803. '',
  804. 'function TJSAttr._Getsignature: IJSArrayBufferView;',
  805. 'begin',
  806. ' Result:=ReadJSPropertyObject(''signature'',TJSArrayBufferView) as IJSArrayBufferView;',
  807. 'end;',
  808. '',
  809. 'class function TJSAttr.JSClassName: UnicodeString;',
  810. 'begin',
  811. ' Result:=''Attr'';',
  812. 'end;',
  813. '',
  814. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  815. 'begin',
  816. ' Result:=TJSAttr.JOBCast(Intf);',
  817. 'end;',
  818. '',
  819. 'end.',
  820. ''
  821. ]);
  822. end;
  823. procedure TTestWebIDL2WasmJob.TestWJ_IntfAttribute_ChromeOnly;
  824. begin
  825. TestWebIDL([
  826. 'interface Attr {',
  827. ' [ChromeOnly, Throws] readonly attribute long soso;',
  828. '};',
  829. ''],
  830. [
  831. 'Type',
  832. ' // Forward class definitions',
  833. ' IJSAttr = interface;',
  834. ' TJSAttr = class;',
  835. ' { --------------------------------------------------------------------',
  836. ' TJSAttr',
  837. ' --------------------------------------------------------------------}',
  838. '',
  839. ' IJSAttr = interface(IJSObject)',
  840. ' ['''+FixedGUID+''']',
  841. ' end;',
  842. '',
  843. ' TJSAttr = class(TJSObject,IJSAttr)',
  844. ' Private',
  845. ' Public',
  846. ' class function JSClassName: UnicodeString; override;',
  847. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  848. ' end;',
  849. '',
  850. 'implementation',
  851. '',
  852. 'class function TJSAttr.JSClassName: UnicodeString;',
  853. 'begin',
  854. ' Result:=''Attr'';',
  855. 'end;',
  856. '',
  857. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  858. 'begin',
  859. ' Result:=TJSAttr.JOBCast(Intf);',
  860. 'end;',
  861. '',
  862. 'end.',
  863. ''
  864. ]);
  865. end;
  866. procedure TTestWebIDL2WasmJob.TestWJ_CallBackObjectArg;
  867. begin
  868. WebIDLToPas.TypeAliases.Add('AudioWorkletProcessor=IJSObject');
  869. TestWebIDL([
  870. ' callback constructor AudioWorkletProcessorConstructor = AudioWorkletProcessor (object options);'
  871. ],
  872. [
  873. 'Type',
  874. ' // Forward class definitions',
  875. ' TAudioWorkletProcessorConstructor = function (options: IJSObject): IJSObject of object;',
  876. '',
  877. 'implementation',
  878. '',
  879. 'function JOBCallAudioWorkletProcessorConstructor(const aMethod: TMethod; var H: TJOBCallbackHelper): PByte;',
  880. ' var',
  881. ' options: IJSObject;',
  882. 'begin',
  883. ' options:=H.GetObject(TJSObject) as IJSObject;',
  884. ' Result:=H.AllocIntf(TAudioWorkletProcessorConstructor(aMethod)(options));',
  885. 'end;',
  886. '',
  887. 'end.'
  888. ]);
  889. end;
  890. procedure TTestWebIDL2WasmJob.TestWJ_CallBackEnumArg;
  891. begin
  892. TestWebIDL([
  893. 'enum E { ',
  894. ' "allowed", ',
  895. ' "disallowed" ',
  896. '}; ',
  897. 'callback getit = long (E a);'
  898. ],[
  899. 'Type',
  900. '// Forward class definitions',
  901. ' TE = UnicodeString;',
  902. ' Tgetit = function (a: TE): LongInt of object;',
  903. '',
  904. 'implementation',
  905. '',
  906. 'function JOBCallgetit(const aMethod: TMethod; var H: TJOBCallbackHelper): PByte; ',
  907. 'var',
  908. ' a: TE;',
  909. 'begin',
  910. ' a:=H.GetString;',
  911. ' Result:=H.AllocLongInt(Tgetit(aMethod)(a));',
  912. 'end;',
  913. '',
  914. 'end.'
  915. ]);
  916. end;
  917. procedure TTestWebIDL2WasmJob.TestWJ_CallBackSequenceArg;
  918. begin
  919. TestWebIDL([
  920. 'typedef sequence<long> E;',
  921. 'callback getit = long (E a);'
  922. ],[
  923. 'Type',
  924. '// Forward class definitions',
  925. ' TEDynArray = IJSArray; // array of long',
  926. ' Tgetit = function (const a: TEDynArray): LongInt of object;',
  927. '',
  928. 'implementation',
  929. '',
  930. 'function JOBCallgetit(const aMethod: TMethod; var H: TJOBCallbackHelper): PByte; ',
  931. 'var',
  932. ' a: TEDynArray;',
  933. 'begin',
  934. ' a:=H.GetObject(TJSArray) as IJSArray;',
  935. ' Result:=H.AllocLongInt(Tgetit(aMethod)(a));',
  936. 'end;',
  937. '',
  938. 'end.'
  939. ]);
  940. end;
  941. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Void;
  942. begin
  943. TestWebIDL([
  944. 'interface Attr {',
  945. ' void append(Attr node);',
  946. '};',
  947. ''],
  948. ['Type',
  949. ' // Forward class definitions',
  950. ' IJSAttr = interface;',
  951. ' TJSAttr = class;',
  952. ' { --------------------------------------------------------------------',
  953. ' TJSAttr',
  954. ' --------------------------------------------------------------------}',
  955. '',
  956. ' IJSAttr = interface(IJSObject)',
  957. ' ['''+FixedGUID+''']',
  958. ' procedure append(aNode: IJSAttr);',
  959. ' end;',
  960. '',
  961. ' TJSAttr = class(TJSObject,IJSAttr)',
  962. ' Private',
  963. ' Public',
  964. ' procedure append(aNode: IJSAttr); overload;',
  965. ' class function JSClassName: UnicodeString; override;',
  966. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  967. ' end;',
  968. '',
  969. 'implementation',
  970. '',
  971. 'procedure TJSAttr.append(aNode: IJSAttr);',
  972. 'begin',
  973. ' InvokeJSNoResult(''append'',[aNode]);',
  974. 'end;',
  975. '',
  976. 'class function TJSAttr.JSClassName: UnicodeString;',
  977. 'begin',
  978. ' Result:=''Attr'';',
  979. 'end;',
  980. '',
  981. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  982. 'begin',
  983. ' Result:=TJSAttr.JOBCast(Intf);',
  984. 'end;',
  985. '',
  986. 'end.',
  987. '']);
  988. end;
  989. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_SetEventHandler;
  990. begin
  991. TestWebIDL([
  992. '[LegacyTreatNonObjectAsNull]',
  993. 'callback EventHandlerNonNull = any (long event);',
  994. 'typedef EventHandlerNonNull? EventHandler;',
  995. '',
  996. 'interface Attr {',
  997. ' void setEventHandler([TreatNonCallableAsNull] EventHandler handler);',
  998. '};',
  999. ''],
  1000. ['Type',
  1001. ' // Forward class definitions',
  1002. ' IJSAttr = interface;',
  1003. ' TJSAttr = class;',
  1004. ' TEventHandlerNonNull = function (event: LongInt): Variant of object;',
  1005. ' TEventHandler = TEventHandlerNonNull;',
  1006. '',
  1007. ' { --------------------------------------------------------------------',
  1008. ' TJSAttr',
  1009. ' --------------------------------------------------------------------}',
  1010. '',
  1011. ' IJSAttr = interface(IJSObject)',
  1012. ' ['''+FixedGUID+''']',
  1013. ' procedure setEventHandler(const aHandler: TEventHandler);',
  1014. ' end;',
  1015. '',
  1016. ' TJSAttr = class(TJSObject,IJSAttr)',
  1017. ' Private',
  1018. ' Public',
  1019. ' procedure setEventHandler(const aHandler: TEventHandler); overload;',
  1020. ' class function JSClassName: UnicodeString; override;',
  1021. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1022. ' end;',
  1023. '',
  1024. 'implementation',
  1025. '',
  1026. 'function JOBCallEventHandlerNonNull(const aMethod: TMethod; var H: TJOBCallbackHelper): PByte;',
  1027. 'var',
  1028. ' event: LongInt;',
  1029. 'begin',
  1030. ' event:=H.GetLongInt;',
  1031. ' Result:=H.AllocVariant(TEventHandlerNonNull(aMethod)(event));',
  1032. 'end;',
  1033. '',
  1034. 'procedure TJSAttr.setEventHandler(const aHandler: TEventHandler);',
  1035. 'var',
  1036. ' m: TJOB_Method;',
  1037. 'begin',
  1038. ' m:=TJOB_Method.Create(TMethod(aHandler),@JOBCallEventHandlerNonNull);',
  1039. ' try',
  1040. ' InvokeJSNoResult(''setEventHandler'',[m]);',
  1041. ' finally',
  1042. ' m.free;',
  1043. ' end;',
  1044. 'end;',
  1045. '',
  1046. 'class function TJSAttr.JSClassName: UnicodeString;',
  1047. 'begin',
  1048. ' Result:=''Attr'';',
  1049. 'end;',
  1050. '',
  1051. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1052. 'begin',
  1053. ' Result:=TJSAttr.JOBCast(Intf);',
  1054. 'end;',
  1055. '',
  1056. 'end.',
  1057. '']);
  1058. end;
  1059. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Promise;
  1060. begin
  1061. // Promise<void> exitFullscreen();
  1062. TestWebIDL([
  1063. 'interface Attr {',
  1064. ' Promise<void> exitFullscreen();',
  1065. ' Promise<any> addCertException(boolean isTemporary);',
  1066. ' Promise<Attr> fly();',
  1067. '};',
  1068. ''],
  1069. ['Type',
  1070. ' // Forward class definitions',
  1071. ' IJSAttr = interface;',
  1072. ' TJSAttr = class;',
  1073. ' { --------------------------------------------------------------------',
  1074. ' TJSAttr',
  1075. ' --------------------------------------------------------------------}',
  1076. '',
  1077. ' IJSAttr = interface(IJSObject)',
  1078. ' ['''+FixedGUID+''']',
  1079. ' function exitFullscreen: IJSPromise; // Promise<void>',
  1080. ' function addCertException(aIsTemporary: Boolean): IJSPromise; // Promise<any>',
  1081. ' function fly: IJSPromise; // Promise<Attr>',
  1082. ' end;',
  1083. '',
  1084. ' TJSAttr = class(TJSObject,IJSAttr)',
  1085. ' Private',
  1086. ' Public',
  1087. ' function exitFullscreen: IJSPromise; overload; // Promise<void>',
  1088. ' function addCertException(aIsTemporary: Boolean): IJSPromise; overload; // Promise<any>',
  1089. ' function fly: IJSPromise; overload; // Promise<Attr>',
  1090. ' class function JSClassName: UnicodeString; override;',
  1091. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1092. ' end;',
  1093. '',
  1094. 'implementation',
  1095. '',
  1096. 'function TJSAttr.exitFullscreen: IJSPromise; // Promise<void>',
  1097. 'begin',
  1098. ' Result:=InvokeJSObjectResult(''exitFullscreen'',[],TJSPromise) as IJSPromise;',
  1099. 'end;',
  1100. '',
  1101. 'function TJSAttr.addCertException(aIsTemporary: Boolean): IJSPromise; // Promise<any>',
  1102. 'begin',
  1103. ' Result:=InvokeJSObjectResult(''addCertException'',[aIsTemporary],TJSPromise) as IJSPromise;',
  1104. 'end;',
  1105. '',
  1106. 'function TJSAttr.fly: IJSPromise; // Promise<Attr>',
  1107. 'begin',
  1108. ' Result:=InvokeJSObjectResult(''fly'',[],TJSPromise) as IJSPromise;',
  1109. 'end;',
  1110. '',
  1111. 'class function TJSAttr.JSClassName: UnicodeString;',
  1112. 'begin',
  1113. ' Result:=''Attr'';',
  1114. 'end;',
  1115. '',
  1116. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1117. 'begin',
  1118. ' Result:=TJSAttr.JOBCast(Intf);',
  1119. 'end;',
  1120. '',
  1121. 'end.',
  1122. '']);
  1123. end;
  1124. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ArgAny;
  1125. begin
  1126. TestWebIDL([
  1127. 'interface Attr {',
  1128. ' void append(any node);',
  1129. '};',
  1130. ''],
  1131. ['Type',
  1132. ' // Forward class definitions',
  1133. ' IJSAttr = interface;',
  1134. ' TJSAttr = class;',
  1135. ' { --------------------------------------------------------------------',
  1136. ' TJSAttr',
  1137. ' --------------------------------------------------------------------}',
  1138. '',
  1139. ' IJSAttr = interface(IJSObject)',
  1140. ' ['''+FixedGUID+''']',
  1141. ' procedure append(const aNode: Variant);',
  1142. ' end;',
  1143. '',
  1144. ' TJSAttr = class(TJSObject,IJSAttr)',
  1145. ' Private',
  1146. ' Public',
  1147. ' procedure append(const aNode: Variant); overload;',
  1148. ' class function JSClassName: UnicodeString; override;',
  1149. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1150. ' end;',
  1151. '',
  1152. 'implementation',
  1153. '',
  1154. 'procedure TJSAttr.append(const aNode: Variant);',
  1155. 'begin',
  1156. ' InvokeJSNoResult(''append'',[aNode]);',
  1157. 'end;',
  1158. '',
  1159. 'class function TJSAttr.JSClassName: UnicodeString;',
  1160. 'begin',
  1161. ' Result:=''Attr'';',
  1162. 'end;',
  1163. '',
  1164. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1165. 'begin',
  1166. ' Result:=TJSAttr.JOBCast(Intf);',
  1167. 'end;',
  1168. '',
  1169. 'end.',
  1170. '']);
  1171. end;
  1172. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_EnumResult;
  1173. begin
  1174. TestWebIDL([
  1175. 'enum E { ',
  1176. ' "allowed", ',
  1177. ' "disallowed" ',
  1178. '}; ',
  1179. 'interface IE { ',
  1180. ' E get(long a); ',
  1181. '};'
  1182. ],[
  1183. 'Type',
  1184. ' // Forward class definitions',
  1185. ' IJSIE = interface;',
  1186. ' TJSIE = class;',
  1187. ' TE = UnicodeString;',
  1188. ' { --------------------------------------------------------------------',
  1189. ' TJSIE',
  1190. ' --------------------------------------------------------------------}',
  1191. ' IJSIE = interface(IJSObject)',
  1192. ' ['''+FixedGUID+''']',
  1193. ' function get(aA: LongInt) : TE;',
  1194. ' end;',
  1195. '',
  1196. ' TJSIE = class(TJSObject,IJSIE)',
  1197. ' Private',
  1198. ' Public',
  1199. ' function get(aA: LongInt) : TE; overload;',
  1200. ' class function JSClassName: UnicodeString; override;',
  1201. ' class function Cast(const Intf: IJSObject): IJSIE;',
  1202. ' end;',
  1203. '',
  1204. 'implementation',
  1205. '',
  1206. 'function TJSIE.get(aA: LongInt) : TE;',
  1207. 'begin',
  1208. ' Result:=InvokeJSUnicodeStringResult(''get'',[aA]);',
  1209. 'end;',
  1210. '',
  1211. 'class function TJSIE.JSClassName: UnicodeString;',
  1212. 'begin',
  1213. ' Result:=''IE'';',
  1214. 'end;',
  1215. '',
  1216. 'class function TJSIE.Cast(const Intf: IJSObject): IJSIE;',
  1217. 'begin',
  1218. ' Result:=TJSIE.JOBCast(Intf);',
  1219. 'end;',
  1220. '',
  1221. 'end.'
  1222. ]);
  1223. end;
  1224. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_SequenceArg;
  1225. begin
  1226. TestWebIDL([
  1227. 'interface Attr {',
  1228. ' boolean vibrate(sequence<long> pattern);',
  1229. '};',
  1230. ''],
  1231. [
  1232. 'Type',
  1233. '',
  1234. ' // Forward class definitions',
  1235. ' IJSAttr = interface;',
  1236. ' TJSAttr = class;',
  1237. '',
  1238. ' { --------------------------------------------------------------------',
  1239. ' TJSAttr',
  1240. ' --------------------------------------------------------------------}',
  1241. '',
  1242. ' TLongIntDynArray = IJSArray; // array of long',
  1243. '',
  1244. ' IJSAttr = interface(IJSObject)',
  1245. ' ['''+FixedGUID+''']',
  1246. ' function vibrate(const aPattern: TLongIntDynArray): Boolean;',
  1247. ' end;',
  1248. '',
  1249. ' TJSAttr = class(TJSObject,IJSAttr)',
  1250. ' Private',
  1251. ' Public',
  1252. ' function vibrate(const aPattern: TLongIntDynArray): Boolean; overload;',
  1253. ' class function JSClassName: UnicodeString; override;',
  1254. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1255. ' end;',
  1256. '',
  1257. 'implementation',
  1258. '',
  1259. 'function TJSAttr.vibrate(const aPattern: TLongIntDynArray): Boolean;',
  1260. 'begin',
  1261. ' Result:=InvokeJSBooleanResult(''vibrate'',[aPattern]);',
  1262. 'end;',
  1263. '',
  1264. 'class function TJSAttr.JSClassName: UnicodeString;',
  1265. 'begin',
  1266. ' Result:=''Attr'';',
  1267. 'end;',
  1268. '',
  1269. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1270. 'begin',
  1271. ' Result:=TJSAttr.JOBCast(Intf);',
  1272. 'end;',
  1273. '',
  1274. 'end.'
  1275. ]);
  1276. end;
  1277. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_2SequenceArg;
  1278. begin
  1279. TestWebIDL([
  1280. 'interface Attr {',
  1281. ' boolean vibrate(sequence<long> pattern);',
  1282. ' boolean beep(sequence<long> pattern);',
  1283. '};',
  1284. ''],
  1285. [
  1286. 'Type',
  1287. '',
  1288. ' // Forward class definitions',
  1289. ' IJSAttr = interface;',
  1290. ' TJSAttr = class;',
  1291. '',
  1292. ' { --------------------------------------------------------------------',
  1293. ' TJSAttr',
  1294. ' --------------------------------------------------------------------}',
  1295. '',
  1296. ' TLongIntDynArray = IJSArray; // array of long',
  1297. '',
  1298. ' IJSAttr = interface(IJSObject)',
  1299. ' ['''+FixedGUID+''']',
  1300. ' function vibrate(const aPattern: TLongIntDynArray): Boolean;',
  1301. ' function beep(const aPattern: TLongIntDynArray): Boolean;',
  1302. ' end;',
  1303. '',
  1304. ' TJSAttr = class(TJSObject,IJSAttr)',
  1305. ' Private',
  1306. ' Public',
  1307. ' function vibrate(const aPattern: TLongIntDynArray): Boolean; overload;',
  1308. ' function beep(const aPattern: TLongIntDynArray): Boolean; overload;',
  1309. ' class function JSClassName: UnicodeString; override;',
  1310. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1311. ' end;',
  1312. '',
  1313. 'implementation',
  1314. '',
  1315. 'function TJSAttr.vibrate(const aPattern: TLongIntDynArray): Boolean;',
  1316. 'begin',
  1317. ' Result:=InvokeJSBooleanResult(''vibrate'',[aPattern]);',
  1318. 'end;',
  1319. '',
  1320. 'function TJSAttr.beep(const aPattern: TLongIntDynArray): Boolean;',
  1321. 'begin',
  1322. ' Result:=InvokeJSBooleanResult(''beep'',[aPattern]);',
  1323. 'end;',
  1324. '',
  1325. 'class function TJSAttr.JSClassName: UnicodeString;',
  1326. 'begin',
  1327. ' Result:=''Attr'';',
  1328. 'end;',
  1329. '',
  1330. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1331. 'begin',
  1332. ' Result:=TJSAttr.JOBCast(Intf);',
  1333. 'end;',
  1334. '',
  1335. 'end.'
  1336. ]);
  1337. end;
  1338. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_Constructor;
  1339. begin
  1340. TestWebIDL([
  1341. 'interface Attr {',
  1342. ' constructor(long options); ',
  1343. '};'
  1344. ],
  1345. ['Type',
  1346. ' // Forward class definitions',
  1347. ' IJSAttr = interface;',
  1348. ' TJSAttr = class;',
  1349. ' { --------------------------------------------------------------------',
  1350. ' TJSAttr',
  1351. ' --------------------------------------------------------------------}',
  1352. '',
  1353. ' IJSAttr = interface(IJSObject)',
  1354. ' ['''+FixedGUID+''']',
  1355. ' end;',
  1356. '',
  1357. ' TJSAttr = class(TJSObject,IJSAttr)',
  1358. ' Private',
  1359. ' Public',
  1360. ' constructor Create(aOptions: LongInt); overload;',
  1361. ' class function JSClassName: UnicodeString; override;',
  1362. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1363. ' end;',
  1364. '',
  1365. 'implementation',
  1366. '',
  1367. 'constructor TJSAttr.Create(aOptions: LongInt);',
  1368. 'begin',
  1369. ' JOBCreate([aOptions]);',
  1370. 'end;',
  1371. '',
  1372. 'class function TJSAttr.JSClassName: UnicodeString;',
  1373. 'begin',
  1374. ' Result:=''Attr'';',
  1375. 'end;',
  1376. '',
  1377. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1378. 'begin',
  1379. ' Result:=TJSAttr.JOBCast(Intf);',
  1380. 'end;',
  1381. '',
  1382. 'end.',
  1383. '']);
  1384. end;
  1385. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ArrayBufferArg;
  1386. begin
  1387. TestWebIDL([
  1388. 'interface Attr {',
  1389. ' undefined appendBuffer(ArrayBuffer data);',
  1390. '};'
  1391. ],[
  1392. 'Type',
  1393. ' // Forward class definitions',
  1394. ' IJSAttr = interface;',
  1395. ' TJSAttr = class;',
  1396. ' { --------------------------------------------------------------------',
  1397. ' TJSAttr',
  1398. ' --------------------------------------------------------------------}',
  1399. '',
  1400. ' IJSAttr = interface(IJSObject)',
  1401. ' ['''+FixedGUID+''']',
  1402. ' procedure appendBuffer(aData: IJSArrayBuffer);',
  1403. ' end;',
  1404. '',
  1405. ' TJSAttr = class(TJSObject,IJSAttr)',
  1406. ' Private',
  1407. ' Public',
  1408. ' procedure appendBuffer(aData: IJSArrayBuffer); overload;',
  1409. ' class function JSClassName: UnicodeString; override;',
  1410. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1411. ' end;',
  1412. '',
  1413. 'implementation',
  1414. '',
  1415. 'procedure TJSAttr.appendBuffer(aData: IJSArrayBuffer);',
  1416. 'begin',
  1417. ' InvokeJSNoResult(''appendBuffer'',[aData]);',
  1418. 'end;',
  1419. '',
  1420. 'class function TJSAttr.JSClassName: UnicodeString;',
  1421. 'begin',
  1422. ' Result:=''Attr'';',
  1423. 'end;',
  1424. '',
  1425. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1426. 'begin',
  1427. ' Result:=TJSAttr.JOBCast(Intf);',
  1428. 'end;',
  1429. '',
  1430. 'end.',
  1431. '' ]);
  1432. end;
  1433. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ArrayBufferViewArg;
  1434. begin
  1435. TestWebIDL([
  1436. 'interface Attr {',
  1437. ' undefined appendBuffer(ArrayBufferView data);',
  1438. '};'
  1439. ],[
  1440. 'Type',
  1441. ' // Forward class definitions',
  1442. ' IJSAttr = interface;',
  1443. ' TJSAttr = class;',
  1444. ' { --------------------------------------------------------------------',
  1445. ' TJSAttr',
  1446. ' --------------------------------------------------------------------}',
  1447. '',
  1448. ' IJSAttr = interface(IJSObject)',
  1449. ' ['''+FixedGUID+''']',
  1450. ' procedure appendBuffer(aData: IJSArrayBufferView);',
  1451. ' end;',
  1452. '',
  1453. ' TJSAttr = class(TJSObject,IJSAttr)',
  1454. ' Private',
  1455. ' Public',
  1456. ' procedure appendBuffer(aData: IJSArrayBufferView); overload;',
  1457. ' class function JSClassName: UnicodeString; override;',
  1458. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1459. ' end;',
  1460. '',
  1461. 'implementation',
  1462. '',
  1463. 'procedure TJSAttr.appendBuffer(aData: IJSArrayBufferView);',
  1464. 'begin',
  1465. ' InvokeJSNoResult(''appendBuffer'',[aData]);',
  1466. 'end;',
  1467. '',
  1468. 'class function TJSAttr.JSClassName: UnicodeString;',
  1469. 'begin',
  1470. ' Result:=''Attr'';',
  1471. 'end;',
  1472. '',
  1473. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1474. 'begin',
  1475. ' Result:=TJSAttr.JOBCast(Intf);',
  1476. 'end;',
  1477. '',
  1478. 'end.',
  1479. '' ]);
  1480. end;
  1481. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_SequenceResult;
  1482. begin
  1483. TestWebIDL([
  1484. 'interface Attr {',
  1485. ' sequence<long> vibrate();',
  1486. '};',
  1487. ''],
  1488. [
  1489. 'Type',
  1490. '',
  1491. ' // Forward class definitions',
  1492. ' IJSAttr = interface;',
  1493. ' TJSAttr = class;',
  1494. '',
  1495. ' { --------------------------------------------------------------------',
  1496. ' TJSAttr',
  1497. ' --------------------------------------------------------------------}',
  1498. '',
  1499. ' TLongIntDynArray = IJSArray; // array of long',
  1500. '',
  1501. ' IJSAttr = interface(IJSObject)',
  1502. ' ['''+FixedGUID+''']',
  1503. ' function vibrate: TLongIntDynArray;',
  1504. ' end;',
  1505. '',
  1506. ' TJSAttr = class(TJSObject,IJSAttr)',
  1507. ' Private',
  1508. ' Public',
  1509. ' function vibrate: TLongIntDynArray; overload;',
  1510. ' class function JSClassName: UnicodeString; override;',
  1511. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1512. ' end;',
  1513. '',
  1514. 'implementation',
  1515. '',
  1516. 'function TJSAttr.vibrate: TLongIntDynArray;',
  1517. 'begin',
  1518. ' Result:=InvokeJSObjectResult(''vibrate'',[],TJSArray) as TLongIntDynArray;',
  1519. 'end;',
  1520. '',
  1521. 'class function TJSAttr.JSClassName: UnicodeString;',
  1522. 'begin',
  1523. ' Result:=''Attr'';',
  1524. 'end;',
  1525. '',
  1526. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1527. 'begin',
  1528. ' Result:=TJSAttr.JOBCast(Intf);',
  1529. 'end;',
  1530. '',
  1531. 'end.'
  1532. ]);
  1533. end;
  1534. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_GlobalSequenceResult;
  1535. begin
  1536. TestWebIDL([
  1537. 'typedef sequence <long> LongSeq;',
  1538. 'interface Attr {',
  1539. ' LongSeq vibrate();',
  1540. '};',
  1541. ''],
  1542. [
  1543. 'Type',
  1544. '',
  1545. ' // Forward class definitions',
  1546. ' IJSAttr = interface;',
  1547. ' TJSAttr = class;',
  1548. ' TLongSeqDynArray = IJSArray; // array of long',
  1549. '',
  1550. ' { --------------------------------------------------------------------',
  1551. ' TJSAttr',
  1552. ' --------------------------------------------------------------------}',
  1553. '',
  1554. ' IJSAttr = interface(IJSObject)',
  1555. ' ['''+FixedGUID+''']',
  1556. ' function vibrate: TLongSeqDynArray;',
  1557. ' end;',
  1558. '',
  1559. ' TJSAttr = class(TJSObject,IJSAttr)',
  1560. ' Private',
  1561. ' Public',
  1562. ' function vibrate: TLongSeqDynArray; overload;',
  1563. ' class function JSClassName: UnicodeString; override;',
  1564. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1565. ' end;',
  1566. '',
  1567. 'implementation',
  1568. '',
  1569. 'function TJSAttr.vibrate: TLongSeqDynArray;',
  1570. 'begin',
  1571. ' Result:=InvokeJSObjectResult(''vibrate'',[],TJSArray) as TLongSeqDynArray;',
  1572. 'end;',
  1573. '',
  1574. 'class function TJSAttr.JSClassName: UnicodeString;',
  1575. 'begin',
  1576. ' Result:=''Attr'';',
  1577. 'end;',
  1578. '',
  1579. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1580. 'begin',
  1581. ' Result:=TJSAttr.JOBCast(Intf);',
  1582. 'end;',
  1583. '',
  1584. 'end.'
  1585. ]);
  1586. end;
  1587. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ChromeOnly;
  1588. begin
  1589. TestWebIDL([
  1590. 'interface Attr {',
  1591. ' [ChromeOnly, Throws] long soso();',
  1592. '};',
  1593. ''],
  1594. [
  1595. 'Type',
  1596. ' // Forward class definitions',
  1597. ' IJSAttr = interface;',
  1598. ' TJSAttr = class;',
  1599. ' { --------------------------------------------------------------------',
  1600. ' TJSAttr',
  1601. ' --------------------------------------------------------------------}',
  1602. '',
  1603. ' IJSAttr = interface(IJSObject)',
  1604. ' ['''+FixedGUID+''']',
  1605. ' end;',
  1606. '',
  1607. ' TJSAttr = class(TJSObject,IJSAttr)',
  1608. ' Private',
  1609. ' Public',
  1610. ' class function JSClassName: UnicodeString; override;',
  1611. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1612. ' end;',
  1613. '',
  1614. 'implementation',
  1615. '',
  1616. 'class function TJSAttr.JSClassName: UnicodeString;',
  1617. 'begin',
  1618. ' Result:=''Attr'';',
  1619. 'end;',
  1620. '',
  1621. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1622. 'begin',
  1623. ' Result:=TJSAttr.JOBCast(Intf);',
  1624. 'end;',
  1625. '',
  1626. 'end.',
  1627. ''
  1628. ]);
  1629. end;
  1630. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_ChromeOnlyNewObject;
  1631. begin
  1632. TestWebIDL([
  1633. 'interface Attr {',
  1634. ' [ChromeOnly, NewObject] ',
  1635. ' ConsoleInstance createInstance(optional ConsoleInstanceOptions options = {});',
  1636. '};'
  1637. ],
  1638. [
  1639. 'Type',
  1640. ' // Forward class definitions',
  1641. ' IJSAttr = interface;',
  1642. ' TJSAttr = class;',
  1643. ' { --------------------------------------------------------------------',
  1644. ' TJSAttr',
  1645. ' --------------------------------------------------------------------}',
  1646. '',
  1647. ' IJSAttr = interface(IJSObject)',
  1648. ' ['''+FixedGUID+''']',
  1649. ' end;',
  1650. '',
  1651. ' TJSAttr = class(TJSObject,IJSAttr)',
  1652. ' Private',
  1653. ' Public',
  1654. ' class function JSClassName: UnicodeString; override;',
  1655. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1656. ' end;',
  1657. '',
  1658. 'implementation',
  1659. '',
  1660. 'class function TJSAttr.JSClassName: UnicodeString;',
  1661. 'begin',
  1662. ' Result:=''Attr'';',
  1663. 'end;',
  1664. '',
  1665. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1666. 'begin',
  1667. ' Result:=TJSAttr.JOBCast(Intf);',
  1668. 'end;',
  1669. '',
  1670. 'end.',
  1671. ''
  1672. ]);
  1673. end;
  1674. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_DictionaryResult;
  1675. begin
  1676. WebIDLToPas.BaseOptions:=WebIDLToPas.BaseOptions+[coDictionaryAsClass];
  1677. TestWebIDL([
  1678. 'dictionary MyDict { long a = 0; };',
  1679. 'interface Attr {',
  1680. ' MyDict get();',
  1681. '};',
  1682. ''],
  1683. [
  1684. 'Type',
  1685. '',
  1686. ' // Forward class definitions',
  1687. ' IJSAttr = interface;',
  1688. ' TJSAttr = class;',
  1689. ' IJSMyDict = interface;',
  1690. ' TJSMyDict = class;',
  1691. '',
  1692. ' { --------------------------------------------------------------------',
  1693. ' TJSMyDict',
  1694. ' --------------------------------------------------------------------}',
  1695. '',
  1696. ' TJSMyDictRec = record',
  1697. ' a: LongInt;',
  1698. ' end;',
  1699. '',
  1700. ' IJSMyDict = interface(IJSObject)',
  1701. ' ['''+FixedGUID+''']',
  1702. ' function _Geta: LongInt;',
  1703. ' procedure _Seta(const aValue: LongInt);',
  1704. ' property a: LongInt read _Geta write _Seta;',
  1705. ' end;',
  1706. '',
  1707. ' TJSMyDict = class(TJSObject,IJSMyDict)',
  1708. ' Private',
  1709. ' function _Geta: LongInt;',
  1710. ' procedure _Seta(const aValue: LongInt);',
  1711. ' Public',
  1712. ' class function JSClassName: UnicodeString; override;',
  1713. ' class function Cast(const Intf: IJSObject): IJSMyDict;',
  1714. ' property a: LongInt read _Geta write _Seta;',
  1715. ' end;',
  1716. '',
  1717. ' { --------------------------------------------------------------------',
  1718. ' TJSAttr',
  1719. ' --------------------------------------------------------------------}',
  1720. '',
  1721. '',
  1722. ' IJSAttr = interface(IJSObject)',
  1723. ' ['''+FixedGUID+''']',
  1724. ' function get: TJSMyDict;',
  1725. ' end;',
  1726. '',
  1727. ' TJSAttr = class(TJSObject,IJSAttr)',
  1728. ' Private',
  1729. ' Public',
  1730. ' function get: TJSMyDict; overload;',
  1731. ' class function JSClassName: UnicodeString; override;',
  1732. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1733. ' end;',
  1734. '',
  1735. 'implementation',
  1736. '',
  1737. 'function TJSMyDict._Geta: LongInt;',
  1738. 'begin',
  1739. ' Result:=ReadJSPropertyLongInt(''a'');',
  1740. 'end;',
  1741. '',
  1742. 'procedure TJSMyDict._Seta(const aValue: LongInt);',
  1743. 'begin',
  1744. ' WriteJSPropertyLongInt(''a'',aValue);',
  1745. 'end;',
  1746. '',
  1747. 'class function TJSMyDict.JSClassName: UnicodeString;',
  1748. 'begin',
  1749. ' Result:=''Object'';',
  1750. 'end;',
  1751. '',
  1752. 'class function TJSMyDict.Cast(const Intf: IJSObject): IJSMyDict;',
  1753. 'begin',
  1754. ' Result:=TJSMyDict.JOBCast(Intf);',
  1755. 'end;',
  1756. '',
  1757. 'function TJSAttr.get: TJSMyDict;',
  1758. 'begin',
  1759. ' Result:=InvokeJSObjectResult(''get'',[],TJSMyDict) as TJSMyDict;',
  1760. 'end;',
  1761. '',
  1762. 'class function TJSAttr.JSClassName: UnicodeString;',
  1763. 'begin',
  1764. ' Result:=''Attr'';',
  1765. 'end;',
  1766. '',
  1767. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1768. 'begin',
  1769. ' Result:=TJSAttr.JOBCast(Intf);',
  1770. 'end;',
  1771. '',
  1772. 'end.'
  1773. ]);
  1774. end;
  1775. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_AliasResult;
  1776. begin
  1777. WebIDLToPas.TypeAliases.Add('Float32Array=IJSFloat32Array');
  1778. TestWebIDL([
  1779. 'interface Attr {',
  1780. ' Float32Array vibrate();',
  1781. '};',
  1782. ''],
  1783. [
  1784. 'Type',
  1785. '',
  1786. ' // Forward class definitions',
  1787. ' IJSAttr = interface;',
  1788. ' TJSAttr = class;',
  1789. '',
  1790. ' { --------------------------------------------------------------------',
  1791. ' TJSAttr',
  1792. ' --------------------------------------------------------------------}',
  1793. '',
  1794. ' IJSAttr = interface(IJSObject)',
  1795. ' ['''+FixedGUID+''']',
  1796. ' function vibrate: IJSFloat32Array;',
  1797. ' end;',
  1798. '',
  1799. ' TJSAttr = class(TJSObject,IJSAttr)',
  1800. ' Private',
  1801. ' Public',
  1802. ' function vibrate: IJSFloat32Array; overload;',
  1803. ' class function JSClassName: UnicodeString; override;',
  1804. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1805. ' end;',
  1806. '',
  1807. 'implementation',
  1808. '',
  1809. 'function TJSAttr.vibrate: IJSFloat32Array;',
  1810. 'begin',
  1811. ' Result:=InvokeJSObjectResult(''vibrate'',[],TJSArray) as IJSFloat32Array;',
  1812. 'end;',
  1813. '',
  1814. 'class function TJSAttr.JSClassName: UnicodeString;',
  1815. 'begin',
  1816. ' Result:=''Attr'';',
  1817. 'end;',
  1818. '',
  1819. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1820. 'begin',
  1821. ' Result:=TJSAttr.JOBCast(Intf);',
  1822. 'end;',
  1823. '',
  1824. 'end.'
  1825. ]);
  1826. end;
  1827. procedure TTestWebIDL2WasmJob.TestWJ_IntfFunction_NestedUnionSequence;
  1828. begin
  1829. TestWebIDL([
  1830. 'interface Attr {',
  1831. ' long roundRect((double or sequence<(double or long)>) radii);',
  1832. '};',
  1833. ''],
  1834. [
  1835. 'Type',
  1836. '',
  1837. ' // Forward class definitions',
  1838. ' IJSAttr = interface;',
  1839. ' TJSAttr = class;',
  1840. '',
  1841. ' { --------------------------------------------------------------------',
  1842. ' TJSAttr',
  1843. ' --------------------------------------------------------------------}',
  1844. '',
  1845. ' // Union of double, sequence',
  1846. ' TAttr_roundRect_radii_Type = Variant;',
  1847. ' TunionDynArray = IJSArray; // array of union',
  1848. ' IJSAttr = interface(IJSObject)',
  1849. ' ['''+FixedGUID+''']',
  1850. ' function roundRect(aRadii: Double): LongInt;',
  1851. ' function roundRect(const aRadii: TunionDynArray): LongInt;',
  1852. ' end;',
  1853. '',
  1854. ' TJSAttr = class(TJSObject,IJSAttr)',
  1855. ' Private',
  1856. ' Public',
  1857. ' function roundRect(aRadii: Double): LongInt; overload;',
  1858. ' function roundRect(const aRadii: TunionDynArray): LongInt; overload;',
  1859. ' class function JSClassName: UnicodeString; override;',
  1860. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1861. ' end;',
  1862. '',
  1863. 'implementation',
  1864. '',
  1865. 'function TJSAttr.roundRect(aRadii: Double): LongInt;',
  1866. 'begin',
  1867. ' Result:=InvokeJSLongIntResult(''roundRect'',[aRadii]);',
  1868. 'end;',
  1869. '',
  1870. 'function TJSAttr.roundRect(const aRadii: TunionDynArray): LongInt;',
  1871. 'begin',
  1872. ' Result:=InvokeJSLongIntResult(''roundRect'',[aRadii]);',
  1873. 'end;',
  1874. '',
  1875. 'class function TJSAttr.JSClassName: UnicodeString;',
  1876. 'begin',
  1877. ' Result:=''Attr'';',
  1878. 'end;',
  1879. '',
  1880. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1881. 'begin',
  1882. ' Result:=TJSAttr.JOBCast(Intf);',
  1883. 'end;',
  1884. '',
  1885. 'end.'
  1886. ]);
  1887. end;
  1888. procedure TTestWebIDL2WasmJob.TestWJ_intfFunction_UnionOptional;
  1889. begin
  1890. TestwebIDL(
  1891. ['interface Attr {',
  1892. ' void roundRect((DOMString or sequence<DOMString>) a, optional long b);',
  1893. '};'
  1894. ],[
  1895. 'Type',
  1896. '',
  1897. ' // Forward class definitions',
  1898. ' IJSAttr = interface;',
  1899. ' TJSAttr = class;',
  1900. '',
  1901. ' { --------------------------------------------------------------------',
  1902. ' TJSAttr',
  1903. ' --------------------------------------------------------------------}',
  1904. ' // Union of DOMString, sequence',
  1905. ' TAttr_roundRect_a_Type = Variant;',
  1906. ' TUnicodeStringDynArray = IJSArray; // array of DOMString',
  1907. ' IJSAttr = interface(IJSObject)',
  1908. ' ['''+FixedGUID+''']',
  1909. ' procedure roundRect(const aA: UnicodeString; aB: LongInt);',
  1910. ' procedure roundRect(const aA: TUnicodeStringDynArray; aB: LongInt);',
  1911. ' procedure roundRect(const aA: TUnicodeStringDynArray);',
  1912. ' procedure roundRect(const aA: UnicodeString);',
  1913. ' end;',
  1914. '',
  1915. ' TJSAttr = class(TJSObject,IJSAttr)',
  1916. ' Private',
  1917. ' Public',
  1918. ' procedure roundRect(const aA: UnicodeString; aB: LongInt); overload;',
  1919. ' procedure roundRect(const aA: TUnicodeStringDynArray; aB: LongInt); overload;',
  1920. ' procedure roundRect(const aA: TUnicodeStringDynArray); overload;',
  1921. ' procedure roundRect(const aA: UnicodeString); overload;',
  1922. ' class function JSClassName: UnicodeString; override;',
  1923. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1924. ' end;',
  1925. '',
  1926. 'implementation',
  1927. '',
  1928. 'procedure TJSAttr.roundRect(const aA: UnicodeString; aB: LongInt);',
  1929. 'begin',
  1930. ' InvokeJSNoResult(''roundRect'',[aA,aB]);',
  1931. 'end;',
  1932. '',
  1933. 'procedure TJSAttr.roundRect(const aA: TUnicodeStringDynArray; aB: LongInt);',
  1934. 'begin',
  1935. ' InvokeJSNoResult(''roundRect'',[aA,aB]);',
  1936. 'end;',
  1937. '',
  1938. 'procedure TJSAttr.roundRect(const aA: TUnicodeStringDynArray);',
  1939. 'begin',
  1940. ' InvokeJSNoResult(''roundRect'',[aA]);',
  1941. 'end;',
  1942. '',
  1943. 'procedure TJSAttr.roundRect(const aA: UnicodeString);',
  1944. 'begin',
  1945. ' InvokeJSNoResult(''roundRect'',[aA]);',
  1946. 'end;',
  1947. '',
  1948. 'class function TJSAttr.JSClassName: UnicodeString;',
  1949. 'begin',
  1950. ' Result:=''Attr'';',
  1951. 'end;',
  1952. '',
  1953. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  1954. 'begin',
  1955. ' Result:=TJSAttr.JOBCast(Intf);',
  1956. 'end;',
  1957. '',
  1958. 'end.'
  1959. ]);
  1960. end;
  1961. procedure TTestWebIDL2WasmJob.TestWJ_NamespaceAttribute_Boolean;
  1962. begin
  1963. TestWebIDL([
  1964. 'namespace Attr {',
  1965. ' readonly attribute boolean aBoolean;',
  1966. '};',
  1967. ''],
  1968. ['Type',
  1969. ' // Forward class definitions',
  1970. ' IJSAttr = interface;',
  1971. ' TJSAttr = class;',
  1972. ' { --------------------------------------------------------------------',
  1973. ' TJSAttr',
  1974. ' --------------------------------------------------------------------}',
  1975. '',
  1976. ' IJSAttr = interface(IJSObject)',
  1977. ' ['''+FixedGUID+''']',
  1978. ' function _GetaBoolean: Boolean;',
  1979. ' property aBoolean: Boolean read _GetaBoolean;',
  1980. ' end;',
  1981. '',
  1982. ' TJSAttr = class(TJSObject,IJSAttr)',
  1983. ' Private',
  1984. ' function _GetaBoolean: Boolean;',
  1985. ' Public',
  1986. ' class function JSClassName: UnicodeString; override;',
  1987. ' class function Cast(const Intf: IJSObject): IJSAttr;',
  1988. ' property aBoolean: Boolean read _GetaBoolean;',
  1989. ' end;',
  1990. '',
  1991. 'var ',
  1992. ' Attr : IJSAttr;',
  1993. '',
  1994. 'implementation',
  1995. '',
  1996. 'function TJSAttr._GetaBoolean: Boolean;',
  1997. 'begin',
  1998. ' Result:=ReadJSPropertyBoolean(''aBoolean'');',
  1999. 'end;',
  2000. '',
  2001. 'class function TJSAttr.JSClassName: UnicodeString;',
  2002. 'begin',
  2003. ' Result:=''Attr'';',
  2004. 'end;',
  2005. '',
  2006. 'class function TJSAttr.Cast(const Intf: IJSObject): IJSAttr;',
  2007. 'begin',
  2008. ' Result:=TJSAttr.JOBCast(Intf);',
  2009. 'end;',
  2010. '',
  2011. 'initialization',
  2012. ' Attr:=TJSAttr.JOBCreateGlobal(''Attr'');',
  2013. '',
  2014. 'finalization',
  2015. ' Attr:=Nil;',
  2016. '',
  2017. 'end.',
  2018. '']);
  2019. end;
  2020. procedure TTestWebIDL2WasmJob.TestWJ_MaplikeInterface;
  2021. begin
  2022. TestWebIDL([
  2023. ' interface PM {',
  2024. ' readonly maplike<DOMString, boolean>;',
  2025. ' };'
  2026. ],[
  2027. 'Type',
  2028. ' // Forward class definitions',
  2029. ' IJSPM = interface;',
  2030. ' TJSPM = class;',
  2031. ' { --------------------------------------------------------------------',
  2032. ' TJSPM',
  2033. ' --------------------------------------------------------------------}',
  2034. '',
  2035. ' IJSPM = interface(IJSObject)',
  2036. ' ['''+FixedGUID+''']',
  2037. ' function _Getsize: LongInt;',
  2038. ' function get(key: UnicodeString) : Boolean;',
  2039. ' function has(key: UnicodeString) : Boolean;',
  2040. ' function entries : IJSIterator;',
  2041. ' function keys : IJSIterator;',
  2042. ' function values : IJSIterator;',
  2043. ' property size : LongInt read _Getsize;',
  2044. ' end;',
  2045. '',
  2046. ' TJSPM = class(TJSObject,IJSPM)',
  2047. ' Private',
  2048. ' function _Getsize: LongInt;',
  2049. ' Public',
  2050. ' function get(key: UnicodeString) : Boolean;',
  2051. ' function has(key: UnicodeString) : Boolean;',
  2052. ' function entries : IJSIterator;',
  2053. ' function keys : IJSIterator;',
  2054. ' function values : IJSIterator;',
  2055. ' class function JSClassName: UnicodeString; override;',
  2056. ' class function Cast(const Intf: IJSObject): IJSPM;',
  2057. ' property size : LongInt read _Getsize;',
  2058. ' end;',
  2059. '',
  2060. 'implementation',
  2061. '',
  2062. 'function TJSPM._Getsize: LongInt;',
  2063. 'begin',
  2064. ' Result:=ReadJSPropertyLongInt(''size'');',
  2065. 'end;',
  2066. '',
  2067. 'function TJSPM.get(key: UnicodeString) : Boolean;',
  2068. 'begin',
  2069. ' Result:=InvokeJSBooleanResult(''get'',[key]);',
  2070. 'end;',
  2071. '',
  2072. 'function TJSPM.has(key: UnicodeString) : Boolean;',
  2073. 'begin',
  2074. ' Result:=InvokeJSBooleanResult(''has'',[key]);',
  2075. 'end;',
  2076. '',
  2077. 'function TJSPM.entries : IJSIterator;',
  2078. 'begin',
  2079. ' Result:=InvokeJSObjectResult(''entries'',[],TJSIterator) as IJSIterator;',
  2080. 'end;',
  2081. '',
  2082. 'function TJSPM.keys : IJSIterator;',
  2083. 'begin',
  2084. ' Result:=InvokeJSObjectResult(''keys'',[],TJSIterator) as IJSIterator;',
  2085. 'end;',
  2086. '',
  2087. 'function TJSPM.values : IJSIterator;',
  2088. 'begin',
  2089. ' Result:=InvokeJSObjectResult(''values'',[],TJSIterator) as IJSIterator;',
  2090. 'end;',
  2091. '',
  2092. 'class function TJSPM.JSClassName: UnicodeString;',
  2093. 'begin',
  2094. ' Result:=''PM'';',
  2095. 'end;',
  2096. '',
  2097. 'class function TJSPM.Cast(const Intf: IJSObject): IJSPM;',
  2098. 'begin',
  2099. ' Result:=TJSPM.JOBCast(Intf);',
  2100. 'end;',
  2101. '',
  2102. 'end.',
  2103. ''
  2104. ]);
  2105. end;
  2106. initialization
  2107. RegisterTests([TTestWebIDL2Wasmjob]);
  2108. end.