diff --git a/app/assets/preferences/url-shortener-list.json b/app/assets/preferences/url-shortener-list.json new file mode 100644 index 00000000..e5b603f4 --- /dev/null +++ b/app/assets/preferences/url-shortener-list.json @@ -0,0 +1,247 @@ +{ + "description": "Event contains one or more entries of known Shorteners domains", + "list": [ + "1url.com", + "2h.ae", + "2ly.link", + "2no.co", + "2uuu.me", + "3c5.com", + "42url.com", + "4x.si", + "7x.qa", + "9lick.me", + "abre.ai", + "adcraft.co", + "adcrun.ch", + "adf.ly", + "adflav.com", + "aiy.ooo", + "aka.gr", + "amzn.to", + "artist.link", + "b2n.ir", + "bc.vc", + "bee4.biz", + "belea.link", + "bit.do", + "bit.ly", + "bitly.com", + "bitly.com.vn", + "bitly.lc", + "bitly.ws", + "bom.so", + "buff.ly", + "buzurl.com", + "bx.ms", + "cektkp.com", + "ci.ci", + "clc.li", + "clck.ru", + "cml.lol", + "coki.me", + "cszone.hu", + "cur.lv", + "cut.by", + "cutt.ly", + "cutt.us", + "cuty.io", + "d.to", + "db.tt", + "dft.ba", + "dik.si", + "dub.co", + "dub.sh", + "dwz.mk", + "e.vg", + "encr.pw", + "encurtador.dev", + "etd.bz", + "filoops.info", + "flowto.it", + "fun.ly", + "fzy.co", + "gg-l.xyz", + "go.ly", + "gog.li", + "golinks.co", + "goo.by", + "goo.gd", + "goo.gl", + "goo.su", + "han.gl", + "hit.my", + "hyp.ae", + "hyperurl.co", + "i3l.ir", + "ic9.in", + "id.tl", + "idm.in", + "iii.im", + "iiil.io", + "ilang.in", + "inlnk.co", + "insprl.com", + "iplogger.com", + "iplogger.org", + "is.gd", + "ito.mx", + "ity.im", + "iurl.vip", + "j.mp", + "jii.li", + "komin.fo", + "kortlink.dk", + "kutt.it", + "kutti.co", + "l.ead.me", + "lc.cx", + "link.zip.net", + "linksshortcut.com", + "linkto.im", + "litby.us", + "ln.run", + "lnk.co", + "lnk.direct", + "lnk.ink", + "lnk.pw", + "lnkd.in", + "lnkfi.re", + "long.af", + "longurl.in", + "maxiurl.com", + "mcaf.ee", + "me2.do", + "merky.de", + "mjt.lu", + "mtr.bio", + "my5353.com", + "mylinks.ai", + "myqrcode.mobi", + "n9.cl", + "nanourly.in", + "neya.io", + "nov.io", + "o2o.to", + "odesli.co", + "onelink.to", + "onx.la", + "ouvaton.link", + "ow.ly", + "p6l.org", + "picz.us", + "po.st", + "postly.link", + "ppt.cc", + "prettylinkpro.com", + "q-r.to", + "q.gs", + "qr-codes.io", + "qr.ae", + "qr.net", + "qrco.de", + "qrcodedynamic.com", + "qrcodes.pro", + "qrkit.co", + "rb.gy", + "rebrand.ly", + "rebrandly.com", + "rebrandly.info", + "relink.is", + "reurl.cc", + "ricardo.news", + "s.devh.in", + "s.ee", + "s.id", + "s.rlp.de", + "s3r.io", + "s59.site", + "scanned.page", + "scrnch.me", + "shly.link", + "shorten.ee", + "shorten.is", + "shorten.tv", + "shorter.me", + "shortquik.com", + "shorturl.ae", + "shorturl.asia", + "shorturl.at", + "shrtcnl.com", + "sht.ac", + "sk.gy", + "sl8.in", + "smarturl.it", + "smurl.fr", + "sn.rs", + "snip.ly", + "song.link", + "spoo.me", + "sprl.in", + "srink.co", + "su.pr", + "surl.li", + "t.co", + "t.ly", + "temporary-url.com", + "tg.pe", + "tiny.cc", + "tinyarrows.com", + "tinyurl.com", + "tinyurl.mobi", + "tota2.com", + "tr.ee", + "tr.im", + "trimz.me", + "tt.vg", + "tweez.me", + "twitthis.com", + "twixar.com", + "twixar.me", + "tyny.to", + "u.bb", + "u.to", + "urled.cc", + "urled.pro", + "urless.com", + "urlr.me", + "urlshort.dev", + "urltin.com", + "urlz.fr", + "ux9.de", + "v.gd", + "v.ht", + "vtaurl.com", + "vzturl.com", + "webz.cc", + "wp.me", + "x.co", + "x.gd", + "xlinkz.info", + "xshort.co", + "xso.to", + "xtu.me", + "xy2.eu", + "yirra.net", + "ykm.de", + "yourls.org", + "youtu.be", + "yu2.it", + "yu3.io", + "zpag.es", + "zpr.io", + "zurl.to", + "zws.im", + "zzb.bz" + ], + "matching_attributes": [ + "domain", + "hostname", + "domain|ip", + "url", + "uri" + ], + "name": "List of known URL Shorteners domains", + "type": "hostname", + "version": 26 +} diff --git a/app/assets/preferences/url_cleaner_data.minify.json b/app/assets/preferences/url_cleaner_data.minify.json new file mode 100644 index 00000000..34d26594 --- /dev/null +++ b/app/assets/preferences/url_cleaner_data.minify.json @@ -0,0 +1 @@ +{"providers":{"amazon":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon(?:\\.[a-z]{2,}){1,}","rules":["p[fd]_rd_[a-z]*","qid","srs?","__mk_[a-z]{1,3}_[a-z]{1,3}","spIA","ms3_c","[a-z%0-9]*ie","refRID","colii?d","[^a-z%0-9]adId","qualifier","_encoding","smid","field-lbr_brands_browse-bin","ref_?","th","sprefix","crid","keywords","cv_ct_[a-z]+","linkCode","creativeASIN","ascsubtag","aaxitk","hsa_cr_id","sb-ci-[a-z]+","rnid","dchild","camp","creative","content-id","dib","dib_tag","social_share","starsLeft","skipTwisterOG"],"rawRules":["\\/ref=[^/?]*"],"referralMarketing":["tag","ascsubtag"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon(?:\\.[a-z]{2,}){1,}\\/gp\\/.*?(?:redirector.html|cart\\/ajax-update.html|video\\/api\\/)","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon(?:\\.[a-z]{2,}){1,}\\/(?:hz\\/reviews-render\\/ajax\\/|message-us\\?|s\\?)"]},"msn":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?msn\\.com","rules":["cvid","ocid"]},"amazon search":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon(?:\\.[a-z]{2,}){1,}\\/s\\?","rules":["p[fd]_rd_[a-z]*","qid","srs?","__mk_[a-z]{1,3}_[a-z]{1,3}","spIA","ms3_c","[a-z%0-9]*ie","refRID","colii?d","[^a-z%0-9]adId","qualifier","_encoding","smid","field-lbr_brands_browse-bin","ref_?","th","sprefix","crid","cv_ct_[a-z]+","linkCode","creativeASIN","ascsubtag","aaxitk","hsa_cr_id","sb-ci-[a-z]+","rnid","dchild","camp","creative"],"rawRules":["\\/ref=[^/?]*"],"referralMarketing":["tag"]},"fls-na.amazon":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?fls-na\\.amazon(?:\\.[a-z]{2,}){1,}"},"google":{"forceRedirection":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}","rules":["ved","bi[a-z]*","gfe_[a-z]*","ei","source","gs_[a-z]*","site","oq","esrc","uact","cd","cad","gws_[a-z]*","atyp","vet","_u","je","dcr","ie","sei","sa","dpr","btn[a-z]*","usg","cd","cad","uact","aqs","sourceid","sxsrf","rlz","i-would-rather-use-firefox","pcampaignid","sca_(?:esv|upv)","iflsig","fbs","ictx","cshid"],"referralMarketing":["referrer"],"exceptions":["^https?:\\/\\/mail\\.google\\.com\\/mail\\/u\\/","^https?:\\/\\/accounts\\.google\\.com\\/o\\/oauth2\\/","^https?:\\/\\/accounts\\.google\\.com\\/signin\\/oauth\\/","^https?:\\/\\/(?:docs|accounts)\\.google(?:\\.[a-z]{2,}){1,}","^https?:\\/\\/([a-z0-9-\\.])*(chat|drive)\\.google\\.com\\/videoplayback","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}(?:\\/upload)?\\/drive\\/","^https?:\\/\\/news\\.google\\.com.*\\?hl=.","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/s\\?tbm=map.*?gs_[a-z]*=.","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/(?:complete\\/search|setprefs|searchbyimage)","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/(?:appsactivity|aclk\\?)","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/safe[-]?browsing\\/([^&]+)"],"redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/url\\?.*?(?:url|q)=(https?[^&]+)","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/.*?adurl=([^&]+)","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?google(?:\\.[a-z]{2,}){1,}\\/amp\\/s\\/([^&]+)"]},"googlesyndication":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?googlesyndication\\.com"},"doubleclick":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?doubleclick(?:\\.[a-z]{2,}){1,}","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?doubleclick(?:\\.[a-z]{2,}){1,}\\/.*?tag_for_child_directed_treatment=;%3F([^&]*)"]},"googleadservices":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?googleadservices\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?googleadservices\\.com\\/.*?adurl=([^&]*)"]},"globalRules":{"urlPattern":".*","rules":["(?:%3F)?utm(?:_[a-z_]*)?","(?:%3F)?mtm(?:_[a-z_]*)?","(?:%3F)?ga_[a-z_]+","(?:%3F)?yclid","(?:%3F)?_openstat","(?:%3F)?fb_action_(?:types|ids)","(?:%3F)?fb_(?:source|ref)","(?:%3F)?fbclid","(?:%3F)?action_(?:object|type|ref)_map","(?:%3F)?gs_l","(?:%3F)?mkt_tok","(?:%3F)?hmb_(?:campaign|medium|source)","(?:%3F)?gclid","(?:%3F)?srsltid","(?:%3F)?otm_[a-z_]*","(?:%3F)?cmpid","(?:%3F)?os_ehash","(?:%3F)?_ga","(?:%3F)?_gl","(?:%3F)?__twitter_impression","(?:%3F)?wt_?z?mc","(?:%3F)?wtrid","(?:%3F)?[a-z]?mc","(?:%3F)?dclid","Echobox","(?:%3F)?spm","(?:%3F)?vn(?:_[a-z]*)+","(?:%3F)?tracking_source","(?:%3F)?ceneo_spo","(?:%3F)?itm_(?:campaign|medium|source)","(?:%3F)?__hsfp","(?:%3F)?__hssc","(?:%3F)?__hstc","(?:%3F)?_hsenc","(?:%3F)?__s","(?:%3F)?hsCtaTracking","(?:%3F)?mc_(?:eid|cid|tc)","(?:%3F)?ml_subscriber","(?:%3F)?ml_subscriber_hash","(?:%3F)?msclkid","(?:%3F)?oly_anon_id","(?:%3F)?oly_enc_id","(?:%3F)?rb_clickid","(?:%3F)?s_cid","(?:%3F)?vero_conv","(?:%3F)?vero_id","(?:%3F)?wickedid","(?:%3F)?twclid"],"referralMarketing":["(?:%3F)?ref_?","(?:%3F)?referrer"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?matrix\\.org\\/_matrix\\/","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?(?:cloudflare\\.com|prismic\\.io|tangerine\\.ca|gitlab\\.com)","^https?:\\/\\/myaccount.google(?:\\.[a-z]{2,}){1,}","^https?:\\/\\/accounts.google(?:\\.[a-z]{2,}){1,}","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?gcsip\\.(?:com|nl)[^?]*\\?.*?&?ref_?=.","^https?:\\/\\/[^/]+/[^/]+/[^/]+\\/-\\/refs\\/switch[^?]*\\?.*?&?ref_?=.","^https?:\\/\\/bugtracker\\.[^/]*\\/[^?]+\\?.*?&?ref_?=[^/?&]*","^https?:\\/\\/comment-cdn\\.9gag\\.com\\/.*?comment-list.json\\?","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?battle\\.net\\/login","^https?:\\/\\/blizzard\\.com\\/oauth2","^https?:\\/\\/kreditkarten-banking\\.lbb\\.de","^https?:\\/\\/www\\.tinkoff\\.ru","^https?:\\/\\/www\\.cyberport\\.de\\/adscript\\.php","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tweakers\\.net\\/ext\\/lt\\.dsp\\?.*?(?:%3F)?&?ref_?=.","^https?:\\/\\/git(lab)?\\.[^/]*\\/[^?]+\\?.*?&?ref_?=[^/?&]*","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon(?:\\.[a-z]{2,}){1,}\\/message-us\\?","^https?:\\/\\/authorization\\.td\\.com","^https?:\\/\\/support\\.steampowered\\.com","^https?:\\/\\/privacy\\.vakmedianet\\.nl\\/.*?ref=","^https?:\\/\\/sso\\.serverplan\\.com\\/manage2fa\\/check\\?ref=","^https?:\\/\\/login\\.meijer\\.com\\/.*?\\?ref=","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/(?:login_alerts|ajax|should_add_browser)/","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/groups\\/member_bio\\/bio_dialog\\/","^https?:\\/\\/api\\.taiga\\.io","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?gog\\.com\\/click\\.html","^https?:\\/\\/login\\.progressive\\.com","^https?:\\/\\/www\\.sephora\\.com\\/api\\/","^https?:\\/\\/www\\.contestgirl\\.com","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?agenciatributaria\\.gob\\.es","^https?:\\/\\/login\\.ingbank\\.pl","^wss?:\\/\\/(?:[a-z0-9-]+\\.)*?zoom\\.us","^https?:\\/\\/api\\.bilibili\\.com","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?onet\\.pl\\/[^?]*\\?.*?utm_campaign=.","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?stripe\\.com\\/[^?]+.*?&?referrer=[^/?&]*","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?lichess\\.org\\/login.*?&?referrer=.*?","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?microsoft\\.com\\/.*?research\\/redirect","^https?:\\/\\/like.co\\/api\\/like\\/likebutton\\/[^?]+.*?&?referrer=[^/?&]*","^https?:\\/\\/button.like.co\\/in\\/.*?&?referrer=[^/?&]*","^https?:\\/\\/www\\.mma\\.go\\.kr","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?github\\.com","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?billiger\\.de\\/.*?mc=","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?youtrack\\.cloud","^https?:\\/\\/cu\\.bankid\\.com","^https?:\\/\\/login\\.aliexpress\\.us","^https?:\\/\\/ieeexplore\\.ieee\\.org","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?sendgb\\.com\\/upload\\/?.*?utm_source=","^https?:\\/\\/firebaseappdistribution\\.googleapis\\.com\\/app-binary-downloads\\/projects\\/?.*?utm_source=","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?irs\\.gov"]},"adtech":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?adtech(?:\\.[a-z]{2,}){1,}"},"bf-ad":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bf-ad(?:\\.[a-z]{2,}){1,}"},"amazon-adsystem":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon-adsystem(?:\\.[a-z]{2,}){1,}","exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon-adsystem(?:\\.[a-z]{2,}){1,}\\/v3\\/oor\\?"],"redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?amazon-adsystem(?:\\.[a-z]{2,}){1,}\\/x\\/c\\/.+?\\/([^&]+)"]},"adsensecustomsearchads":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?adsensecustomsearchads(?:\\.[a-z]{2,}){1,}"},"youtube":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?(youtube\\.com|youtu\\.be)","rules":["feature","gclid","kw","si","pp"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?youtube\\.com\\/signin\\?.*?"],"redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?youtube\\.com\\/redirect?.*?q=([^&]*)"]},"youtube_pagead":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?youtube\\.com\\/pagead"},"youtube_apiads":{"completeProvider":true,"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?youtube\\.com\\/api\\/stats\\/ads"},"facebook":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com","rules":["hc_[a-z_%\\[\\]0-9]*","[a-z]*ref[a-z]*","__tn__","eid","__(?:xts|cft)__(?:\\[|%5B)\\d(?:\\]|%5D)","comment_tracking","dti","app","video_source","ftentidentifier","pageid","padding","ls_ref","action_history","tracking","referral_code","referral_story_type","eav","sfnsn","idorvanity","wtsid","rdc","rdr","paipv","_nc_x","_rdr","mibextid"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/.*?(plugins|ajax)\\/","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/dialog\\/(?:share|send)","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/groups\\/member_bio\\/bio_dialog\\/","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/photo\\.php\\?","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/privacy\\/specific_audience_selector_dialog\\/","^https?:\\/\\/(?:[a-z0-9-]+\\.)*?facebook\\.com\\/photo\\/download\\/"],"redirections":["^https?:\\/\\/l[a-z]?\\.facebook\\.com/l\\.php\\?.*?u=(https?%3A%2F%2F[^&]*)"]},"twitter":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?twitter.com","rules":["(?:ref_?)?src","s","cn","ref_url","t"],"exceptions":["^https?:\\/\\/twitter.com\\/i\\/redirect"]},"x":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?x.com","rules":["(?:ref_?)?src","s","cn","ref_url","t"],"exceptions":["^https?:\\/\\/x.com\\/i\\/redirect"]},"reddit":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?reddit.com","rules":["%24deep_link","\\$deep_link","correlation_id","ref_campaign","ref_source","%243p","rdt","\\$3p","%24original_url","\\$original_url","_branch_match_id","share_id"],"redirections":["^https?:\\/\\/out\\.reddit\\.com\\/.*?url=([^&]*)","^https?:\\/\\/click\\.redditmail\\.com\\/.*?url=([^&]*)"]},"netflix":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?netflix.com","rules":["trackId","tctx","jb[a-z]*?"]},"techcrunch":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?techcrunch\\.com","rules":["ncid","sr","sr_share","guccounter","guce_referrer","guce_referrer_sig"]},"bing":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bing(?:\\.[a-z]{2,}){1,}","rules":["cvid","sk","sp","sc","qs","qp"],"referralMarketing":["form"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bing(?:\\.[a-z]{2,}){1,}\\/WS\\/redirect\\/"]},"tweakers":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tweakers\\.net","rules":["nb","u"]},"twitch":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?twitch\\.com","rules":["tt_medium","tt_content"]},"vivaldi":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?vivaldi\\.com","rules":["pk_campaign","pk_kwd"]},"indeed":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?indeed\\.com","rules":["from","alid","[a-z]*tk"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?indeed\\.com\\/rc\\/clk"]},"hhdotru":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?hh\\.ru","rules":["vss","t","swnt","grpos","ptl","stl","exp","plim"]},"ebay":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?ebay(?:\\.[a-z]{2,}){1,}","rules":["_trkparms","_trksid","_from","hash"],"redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?rover\\.ebay(?:\\.[a-z]{2,}){1,}\\/rover.*mpre=([^&]*)"]},"cnet":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?cnet\\.com","rules":["ftag"]},"imdb.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?imdb\\.com","rules":["ref_","pf_rd_[a-z]*"]},"govdelivery.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?govdelivery\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?links\\.govdelivery\\.com.*\\/track\\?.*(https?:\\/\\/.*)"]},"walmart.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?walmart\\.com","rules":["u1","ath[a-z]*"]},"net-parade.it":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?net\\-parade\\.it","rules":["pl"]},"prvnizpravy.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?prvnizpravy\\.cz","rules":["xid"]},"youku.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?youku\\.com","rules":["tpa"]},"nytimes.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?nytimes\\.com","rules":["smid"]},"tchibo.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tchibo\\.de","rules":["wbdcd"]},"steampowered":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?steampowered\\.com","rules":["snr"]},"steamcommunity":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?steamcommunity\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?steamcommunity\\.com\\/linkfilter\\/\\?url=([^&]*)"]},"mozaws.net":{"urlPattern":"https?:\\/\\/outgoing\\.prod\\.mozaws\\.net\\/","redirections":["https?:\\/\\/[^/]+\\/v1\\/[0-9a-f]{64}\\/(.*)"]},"shutterstock.com":{"urlPattern":"https?:\\/\\/([a-z0-9-.]*\\.)shutterstock\\.com","rules":["src"]},"mozilla.org":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mozilla\\.org","rules":["src","platform","redirect_source"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mozilla.org\\/api"]},"readdc.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?readdc\\.com","rules":["ref"]},"dailycodingproblem.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?dailycodingproblem\\.com","rules":["email"]},"github.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?github\\.com","rules":["email_token","email_source"]},"deviantart.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?deviantart\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?deviantart\\.com\\/.*?\\/outgoing\\?(.*)"]},"site2.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?site2\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?site2\\.com.*?\\?.*=(.*)"]},"site.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?site\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?site\\.com.*?\\?to=([^&]*)"]},"site3.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?site3\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?site3\\.com.*?\\?r=([^&]*)"]},"aliexpress":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?aliexpress(?:\\.[a-z]{2,}){1,}","rules":["ws_ab_test","btsid","algo_expid","algo_pvid","gps-id","scm[_a-z-]*","cv","af","mall_affr","sk","dp","terminal_id","aff_request_id"]},"mozillazine.org":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mozillazine\\.org","rules":["sid"]},"9gag.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?9gag\\.com","rules":["ref"],"exceptions":["^https?:\\/\\/comment-cdn\\.9gag\\.com\\/.*?comment-list.json\\?"]},"linksynergy.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?linksynergy\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?linksynergy\\.com\\/.*?murl=([^&]*)"]},"giphy.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?giphy\\.com","rules":["ref"]},"gate.sc":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?gate\\.sc","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?gate\\.sc\\/.*?url=([^&]*)"]},"vk.com":{"urlPattern":"^https?:\\/\\/vk\\.com","redirections":["^https?:\\/\\/vk\\.com\\/away\\.php\\?to=([^&]*)"]},"woot.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?woot\\.com","rules":["ref_?"]},"vitamix.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?vitamix\\.com","rules":["_requestid","cid","dl","di","sd","bi"]},"curseforge.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?curseforge\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?curseforge\\.com\\/linkout\\?remoteUrl=([^&]*)"]},"messenger.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?messenger\\.com","redirections":["^https?:\\/\\/l\\.messenger\\.com\\/l\\.php\\?u=([^&]*)"]},"nypost.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?nypost\\.com","rules":["__twitter_impression"]},"ozon.ru":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?ozon\\.ru","rules":["partner"]},"norml.org":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?norml\\.org","rules":["link_id","can_id","source","email_referrer","email_subject"]},"LinkedIn":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?linkedin\\.com","rules":["refId","trk","li[a-z]{2}","trackingId"]},"LinkedIn Learning":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?linkedin\\.com\\/learning","rules":["u"]},"smartredirect.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?smartredirect\\.de","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?smartredirect\\.de.*?url=([^&]*)"]},"SPIEGEL ONLINE":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?spiegel\\.de","rules":["b"]},"rutracker.org":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?rutracker\\.org","redirections":[".*url=([^&]*)"]},"instagram":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?instagram\\.com","rules":["igshid","igsh"],"redirections":[".*u=([^&]*)"]},"imgsrc.ru":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?imgsrc\\.ru","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?dlp\\.imgsrc\\.ru\\/go\\/\\d+\\/\\d+\\/\\d+\\/([^&]*)"]},"boredpanda.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?boredpanda\\.com","rules":["h"]},"awstrack.me":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?awstrack\\.me","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?awstrack\\.me\\/.*\\/(https?.*?)\\/"]},"exactag.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?exactag\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?exactag\\.com.*url=([^&]*)"]},"bahn.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bahn\\.de","rules":["dbkanal_[0-9]{3}"]},"disq.us":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?disq\\.us","rules":["cuid"],"redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?disq\\.us\\/.*?url=([^&]*)%3A"]},"anonym.to":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?anonym\\.to","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?anonym\\.to.*\\?([^&]*)"]},"moosejaw.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?moosejaw\\.com","rules":["cm_lm","cm_mmc","webUserId","spMailingID","spUserID","spJobID","spReportId"]},"80000hours.org":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?80000hours\\.org","rules":["int_campaign"]},"spotify.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?spotify\\.com","rules":["si"]},"yandex":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?(?:yandex(?:\\.[a-z]{2,}){1,}|ya\\.ru)","rules":["lr","redircnt"]},"healio.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?healio\\.com","rules":["ecp","m_bt"]},"zoho.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?zoho\\.com","rules":["iref"]},"snapchat.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?snapchat\\.com","rules":["sc_referrer","sc_ua"]},"medium.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?medium\\.com","rules":["source"]},"swp.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?swp\\.de","rules":["source"]},"wps.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?wps\\.com","rules":["from"]},"accounts.firefox.com":{"urlPattern":"^https?:\\/\\/(?:accounts\\.)?firefox\\.com","rules":["entrypoint","form_type"]},"support.mozilla.org":{"urlPattern":"^https?:\\/\\/(?:support\\.)?mozilla\\.org","rules":["as"]},"ClearURLsTest":{"urlPattern":"^https?:\\/\\/kevinroebert\\.gitlab\\.io\\/ClearUrls\\/void\\/index\\.html","rules":["test"],"redirections":["^https?:\\/\\/kevinroebert\\.gitlab\\.io\\/ClearUrls\\/void\\/index\\.html\\?url=([^&]*)"]},"ClearURLsTestBlock":{"completeProvider":true,"urlPattern":"^https?:\\/\\/kevinroebert\\.gitlab\\.io\\/ClearUrls\\/void\\/block\\.svg"},"ClearURLsTest2":{"urlPattern":"^https?:\\/\\/test\\.clearurls\\.xyz\\/void\\/index\\.html","rules":["test"],"redirections":["^https?:\\/\\/test\\.clearurls\\.xyz\\/void\\/index\\.html\\?url=([^&]*)"]},"ClearURLsTestBlock2":{"completeProvider":true,"urlPattern":"^https?:\\/\\/test\\.clearurls\\.xyz\\/void\\/block\\.svg"},"diepresse.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?diepresse\\.com","rules":["from","xtor","xt_at"]},"newsletter.lidl.com":{"urlPattern":"^https?:\\/\\/newsletter\\.lidl(?:\\.[a-z]{2,}){1,}","rules":["x"]},"allegro.pl":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?allegro\\.pl","rules":["reco_id","sid"]},"backcountry.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?backcountry\\.com","rules":["CMP_SKU","MER","mr:trackingCode","mr:device","mr:adType","iv_","CMP_ID","k_clickid","rmatt","INT_ID","ti","fl"],"referralMarketing":["mr:referralID"]},"meetup.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?meetup\\.com","rules":["rv","_xtd"]},"apple.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?apple\\.com","rules":["app","ign-itsc[a-z]+"]},"alabout.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?alabout\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?alabout\\.com.*url=([^&]*)"]},"newyorker.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?newyorker\\.com","rules":["source","bxid","cndid","esrc","mbid"]},"gog.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?gog\\.com","rules":["track_click","link_id"]},"tradedoubler.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tradedoubler\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tradedoubler\\.com.*(?:url|_td_deeplink)=([^&]*)"]},"theguardian.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?theguardian\\.com","rules":["CMP"]},"srvtrck.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?srvtrck\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?srvtrck\\.com.*url=([^&]*)"]},"mysku.ru":{"urlPattern":"^https?:\\/\\/mysku\\.ru","redirections":["^https?:\\/\\/mysku\\.ru.*r=([^&]*)"]},"admitad.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?admitad\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?admitad\\.com.*ulp=([^&]*)"]},"taobao.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?taobao\\.com","rules":["price","sourceType","suid","ut_sk","un","share_crt_v","sp_tk","cpp","shareurl","short_name","app","scm[_a-z-]*","pvid","algo_expid","algo_pvid","ns","abbucket","ali_refid","ali_trackid","acm","utparam","pos","abtest","trackInfo","utkn","scene","mytmenu","turing_bucket","lygClk","impid","bftTag","bftRwd","spm","_u"]},"tmall.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tmall\\.com","rules":["price","sourceType","suid","ut_sk","un","share_crt_v","sp_tk","cpp","shareurl","short_name","app","scm[_a-z-]*","pvid","algo_expid","algo_pvid","ns","abbucket","ali_refid","ali_trackid","acm","utparam","pos","abtest","trackInfo","user_number_id","utkn","scene","mytmenu","turing_bucket","lygClk","impid","bftTag","bftRwd","activity_id"]},"tb.cn":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tb\\.cn","rules":["sm"]},"bilibili.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bilibili\\.com","rules":["callback","spm_id_from","from_source","from","seid","mid","share_source","msource","refer_from","share_from","share_medium","share_source","share_plat","share_tag","share_session_id","timestamp","unique_k","vd_source","plat_id","buvid","is_story_h5","up_id"],"exceptions":["^https?:\\/\\/api\\.bilibili\\.com","^https?:\\/\\/space\\.bilibili\\.com"]},"space.bilibili.com":{"urlPattern":"^https?:\\/\\/space\\.bilibili\\.com","rules":["spm_id_from"]},"m.bilibili.com":{"urlPattern":"^https?:\\/\\/m\\.bilibili\\.com","rules":["bbid","ts"]},"live.bilibili.com":{"urlPattern":"^https?:\\/\\/live\\.bilibili\\.com","rules":["visit_id","session_id","broadcast_type","is_room_feed"]},"marketscreener.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?marketscreener\\.com","rules":["type_recherche","mots","noredirect","RewriteLast","lien","aComposeInputSearch","type_recherche_forum","add_mots","countview"],"exceptions":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?marketscreener\\.com\\/search\\/\\?"]},"marketscreener.com search":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?marketscreener\\.com\\/search\\/\\?","rules":["type_recherche","noredirect","RewriteLast","lien","aComposeInputSearch","type_recherche_forum","countview"]},"bestbuy.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bestbuy\\.com","rules":["irclickid","irgwc","loc","acampID","mpid","intl"]},"digidip.net":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?digidip\\.net","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?digidip\\.net.*url=([^&]*)"]},"tiktok.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tiktok\\.com","rules":["u_code","preview_pb","_d","_t","_r","timestamp","user_id","share_app_name","share_iid","source"]},"xiaohongshu.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?xiaohongshu\\.com","rules":["xhsshare","author_share","type","xsec_source","share_from_user_hidden","app_version","ignoreEngage","app_platform","apptime","appuid","shareRedId","share_id","exSource","verifyUuid","verifyType","verifyBiz"],"exceptions":["^https?:\\/\\/edith\\.xiaohongshu\\.com\\/api\\/sns\\/web\\/v1\\/user\\/hover_card"]},"autoplus.fr":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?autoplus\\.fr","rules":["idprob","hash","sending_id","site_id","dr_tracker"]},"bigfishgames.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bigfishgames\\.com","rules":["pc","npc","npv[0-9]+","npi"],"rawRules":["\\?pc$"]},"dpbolvw.net":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?dpbolvw\\.net","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?dpbolvw\\.net.*url=([^&]*)"]},"humblebundle.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?humblebundle\\.com","referralMarketing":["partner"]},"cafepedagogique.net":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?cafepedagogique\\.net","rules":["actId","actCampaignType","actSource"]},"bloculus.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bloculus\\.com","rules":["tl_[a-z_]+"]},"mailpanion.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mailpanion\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mailpanion\\.com.*destination=([^&]*)"]},"signtr.website":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?signtr\\.website","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?signtr\\.website.*redirect=([^&]*)"]},"mailtrack.io":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mailtrack\\.io","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mailtrack\\.io.*url=([^&]*)"]},"zillow.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?zillow\\.com","rules":["rtoken"]},"realtor.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?realtor\\.com","rules":["ex","identityID","MID","RID"]},"redfin.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?redfin\\.com","rules":["riftinfo"]},"epicgames.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?epicgames\\.com","rules":["epic_affiliate","epic_gameId"]},"onet.pl":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?onet\\.pl","rules":["srcc","utm_v","utm_medium","utm_source"]},"allrecipes.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?allrecipes\\.com","rules":["internalSource","referringId","referringContentType","clickId"]},"europe1.fr":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?europe1\\.fr","rules":["xtor"]},"effiliation.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?effiliation\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?effiliation\\.com.*url=([^&]*)"]},"argos.co.uk":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?argos\\.co\\.uk","rules":["istCompanyId","istFeedId","istItemId","istBid","clickOrigin"]},"hlserve.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?hlserve\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?hlserve\\.com.*dest=([^&]*)"]},"thunderbird.net":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?thunderbird\\.net","rules":["src"]},"cnbc.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?cnbc\\.com","rules":["__source"]},"roblox.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?roblox\\.com","rules":["refPageId"]},"cell.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?cell\\.com","rules":["_returnURL"]},"academic.oup.com":{"urlPattern":"^https?:\\/\\/academic\\.oup\\.com","rules":["redirectedFrom"]},"flexlinkspro.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?flexlinkspro\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?flexlinkspro\\.com.*url=([^&]*)"]},"agata88.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?agata88\\.com","rules":["source"]},"hs.fi":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?hs\\.fi","rules":["share"]},"yle.fi":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?yle\\.fi","rules":["origin"]},"ccbill.com":{"urlPattern":"^https?:\\/\\/refer\\.ccbill\\.com","redirections":["^https?:\\/\\/refer\\.ccbill\\.com.*HTML=([^&]*)"]},"flipkart":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?flipkart\\.com","rules":["otracker.?","ssid","[cilp]id","marketplace","store","srno","store","ppn","ppt","fm","collection-tab-name","sattr\\[\\]","p\\[\\]","st","qH","hpid","ctx","nnc"]},"idealo.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?idealo\\.de","rules":["sid","src","siteId","lcb","leadOutUrl","offerListId","osId","cancelUrl","disc"]},"idealo-partner.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?idealo-partner\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?idealo-partner\\.com.*trg=([^&]*)"]},"teletrader.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?teletrader\\.com","rules":["internal"]},"webgains.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?webgains\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?webgains\\.com.*wgtarget=([^&]*)"]},"deeplearning.ai":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?deeplearning\\.ai","rules":["ecid","_hsmi","_hsenc"]},"getpocket.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?getpocket\\.com","redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?getpocket\\.com.*url=([^&]*)"]},"gamespot.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?gamespot\\.com","rules":["PostType","ServiceType","ftag","UniqueID","TheTime"]},"tokopedia.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tokopedia\\.com","rules":["src","trkid","whid"],"redirections":["^https?:\\/\\/(?:[a-z0-9-]+\\.)*?tokopedia\\.com\\/promo.*r=([^&]*)"]},"wkorea.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?wkorea\\.com","rules":["ddw","ds_ch"]},"eonline.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?eonline\\.com","rules":["source","medium","content"]},"reuters.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?reuters\\.com","rules":["taid"]},"app.adjust.com":{"urlPattern":"^https?:\\/\\/app\\.adjust\\.com","redirections":["^https?:\\/\\/app\\.adjust\\.com.*redirect=([^&]*)"]},"change.org":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?change\\.org","rules":["source_location","psf_variant","share_intent"]},"ceneo.pl":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?ceneo\\.pl","rules":["tag"]},"wired.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?wired\\.com","rules":["intcid"]},"alibaba cloud arms":{"urlPattern":"^https?:\\/\\/arms-retcode\\.aliyuncs\\.com","rules":["pid","uid","tag","release","environment","sample","behavior","enableSPA","enableLinkTrace","page","begin","c2","c3","success","code","msg","api","traceId","pv_id","flag","sr","vp","ct","_v","sampling","dl","post_res"]},"nikkei":{"urlPattern":"^https?://(?:[a-z0-9-]+\\.)*?nikkei\\.co(?:m|\\.jp)","rules":["adid","i_cid","n_cid","waad"]},"weibo":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?weibo\\.(cn|com)","rules":["weibo_id","dt_dapp"]},"fiverr.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?fiverr\\.com","rules":["context_referrer","source","ref_ctx_id","funnel"]},"etsy.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?etsy\\.com","rules":["click_key","click_sum","organic_search_click"]},"magento.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?magento\\.com","rules":["itm_campaign","itm_medium","itm_source","itm_term"]},"novinky.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?novinky\\.cz","rules":["dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id","source","seq_no"]},"aktualne.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?aktualne\\.cz","rules":["dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id"]},"seznamzpravy.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?seznamzpravy\\.cz","rules":["dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id","source","seq_no"]},"billiger.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?billiger\\.de","rules":["log","p"]},"respekt.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?respekt\\.cz","rules":["sznclid","dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id"]},"faei.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?faei\\.cz","rules":["sznclid","dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id"]},"iprima.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?iprima\\.cz","rules":["sznclid","dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id"]},"nova.cz":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?nova\\.cz","rules":["sznclid","dop_ab_variant","dop_source_zone_name","dop_req_id","dop_id"]},"duckduckgo":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?duckduckgo\\.com","redirections":["^https?:\\/\\/duckduckgo\\.com\\/l\\/.*?uddg=([^&]+)"]},"mercadolibre":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mercadoli[bv]re\\.com","rules":["DEAL_ID","L","S","T","V","pdp_filters","position","search_layout","tracking_id","type","c_[_a-zA-Z]+","me\\.[_a-zA-Z]+","reco_[_a-zA-Z]+","ad_click_id"]},"quizlet":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?quizlet\\.com","rules":["funnelUUID"]},"bbc":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?bbc\\.com","rules":["xtor","at_[a-z_]+"]},"airbnb":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?airbnb\\.(com|ae|ca|co\\.in|co\\.nz|co\\.uk|co\\.za|com\\.au|com\\.mt|com\\.sg|de|gy|ie)","rules":["federated_search_id","search_type","source","source_impression_id"]},"partner-ads.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?partner-ads\\.com","redirections":["^https?:\\/\\/.*?partner-ads\\.com\\/.*?htmlurl=([^&]+)"]},"kahoot.it":{"urlPattern":"^https?://(?:[a-z0-9-]+\\.)*?kahoot\\.it","rules":["refer_method"]},"href.li":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?href\\.li","redirections":["^https?:\\/\\/href\\.li\\/\\?(http.+)"]},"adform.net":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?adform\\.net","redirections":["^https?:\\/\\/track\\.adform\\.net\\/C\\/.*?ckurl=([^&]+)"]},"artefact.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?artefact\\.com","redirections":["^https?:\\/\\/.*?artefact\\.com\\/trck\\/.*?deeplinkurl=([^&]+)"]},"awin1.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?awin1\\.com","redirections":["^https?:\\/\\/.*?awin1\\.com\\/.*?ued=([^&]+)"]},"telekom.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?telekom\\.de","redirections":["^https?:\\/\\/aaa\\.telekom\\.de\\/trck\\/.*?deeplinkurl=([^&]+)"]},"cc.loginfra.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?loginfra\\.com","redirections":["^https?:\\/\\/cc\\.loginfra\\.com\\/.*?u=([^&]+)"]},"t.umblr.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?umblr\\.com","redirections":["^https?:\\/\\/t\\.umblr\\.com\\/redirect\\?z=([^&]+)"]},"goodreads.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?goodreads\\.com","rules":["from_search","from_srp","qid","rank","ac"]},"sohu":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?sohu\\.com","rules":["pvid","scm"]},"shopee":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?shopee\\.(com|co\\.th|tw)","rules":["publish_id","sp_atk","xptdk"]},"lazada":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?lazada\\.(com|co\\.th|co\\.id|com\\.my|com\\.ph|sg|vn)","rules":["clickTrackInfo","abid","pvid","ad_src","spm","src","from","scm","pa","pid_pvid","did","mp","cid","impsrc","pos"]},"pantip.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?pantip\\.com","rawRules":["#lead.*"]},"skimresources.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?skimresources\\.com","redirections":["^https?:\\/\\/go\\.skimresources\\.com\\/.*?url=([^&]+)"]},"office-partner.de":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?office-partner\\.de","rules":["sPartner","campaign"]},"mozgcp.net":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?mozgcp\\.net","redirections":["^https?:\\/\\/prod\\.outgoing\\.prod\\.webservices\\.mozgcp\\.net\\/v1\\/.+?\\/([^&]+)"]},"thetimes.co.uk":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?thetimes\\.co\\.uk","rules":["shareToken"]},"metro.co.uk":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?metro\\.co\\.uk","rules":["ito"]},"forbes.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?forbes\\.com","rules":["sh"]},"viglink.com":{"urlPattern":"^https?:\\/\\/(?:[a-z0-9-]+\\.)*?viglink\\.com","redirections":["^https?:\\/\\/redirect\\.viglink\\.com\\/.*?u=([^&]+)"]}}} \ No newline at end of file diff --git a/app/lib/core/providers/format.dart b/app/lib/core/providers/format.dart index 444140c2..4a098086 100644 --- a/app/lib/core/providers/format.dart +++ b/app/lib/core/providers/format.dart @@ -31,6 +31,10 @@ class Format extends _$Format { return pattern.format(date); } + String shortDate(DateTime date) { + return DateFormat('yyyy-MM-dd').format(date); + } + @override Future build() async { await initializeDateFormatting(); diff --git a/app/lib/core/providers/format.g.dart b/app/lib/core/providers/format.g.dart index c9fab025..0735dea7 100644 --- a/app/lib/core/providers/format.g.dart +++ b/app/lib/core/providers/format.g.dart @@ -32,7 +32,7 @@ final class FormatProvider extends $AsyncNotifierProvider { Format create() => Format(); } -String _$formatHash() => r'f132aabb20bf4df77d771d6c866bc413c00bd9ff'; +String _$formatHash() => r'695b94cc4b25596e4ef953d08ba954424a5ec33e'; abstract class _$Format extends $AsyncNotifier { FutureOr build(); diff --git a/app/lib/core/routing/routes.dart b/app/lib/core/routing/routes.dart index 11299079..42a6bfd0 100644 --- a/app/lib/core/routing/routes.dart +++ b/app/lib/core/routing/routes.dart @@ -39,13 +39,15 @@ import 'package:weblibre/features/geckoview/features/bookmarks/domain/entities/b import 'package:weblibre/features/geckoview/features/bookmarks/presentation/screens/bookmark_entry_edit.dart'; import 'package:weblibre/features/geckoview/features/bookmarks/presentation/screens/bookmark_folder_edit.dart'; import 'package:weblibre/features/geckoview/features/bookmarks/presentation/screens/bookmark_list.dart'; -import 'package:weblibre/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/screens/browser.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/screens/tab_view.dart'; import 'package:weblibre/features/geckoview/features/contextmenu/extensions/hit_result.dart'; import 'package:weblibre/features/geckoview/features/contextmenu/presentation/context_menu_dialog.dart'; import 'package:weblibre/features/geckoview/features/history/presentation/screens/history.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/dialogs/open_shared_content.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/screens/unshortener_settings.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/screens/url_cleaner_settings.dart'; import 'package:weblibre/features/geckoview/features/search/presentation/screens/search.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; import 'package:weblibre/features/geckoview/features/tabs/presentation/screens/container_draft_suggestions.dart'; diff --git a/app/lib/core/routing/routes.g.dart b/app/lib/core/routing/routes.g.dart index 71d9f0d7..b17c66c4 100644 --- a/app/lib/core/routing/routes.g.dart +++ b/app/lib/core/routing/routes.g.dart @@ -1460,6 +1460,16 @@ RouteBase get $settingsRoute => GoRouteData.$route( name: 'SyncSettingsRoute', factory: $SyncSettingsRoute._fromState, ), + GoRouteData.$route( + path: 'url_cleaner', + name: 'UrlCleanerSettingsRoute', + factory: $UrlCleanerSettingsRoute._fromState, + ), + GoRouteData.$route( + path: 'unshortener', + name: 'UnshortenerSettingsRoute', + factory: $UnshortenerSettingsRoute._fromState, + ), ], ); @@ -1845,6 +1855,48 @@ mixin $SyncSettingsRoute on GoRouteData { void replace(BuildContext context) => context.replace(location); } +mixin $UrlCleanerSettingsRoute on GoRouteData { + static UrlCleanerSettingsRoute _fromState(GoRouterState state) => + UrlCleanerSettingsRoute(); + + @override + String get location => GoRouteData.$location('/settings/url_cleaner'); + + @override + void go(BuildContext context) => context.go(location); + + @override + Future push(BuildContext context) => context.push(location); + + @override + void pushReplacement(BuildContext context) => + context.pushReplacement(location); + + @override + void replace(BuildContext context) => context.replace(location); +} + +mixin $UnshortenerSettingsRoute on GoRouteData { + static UnshortenerSettingsRoute _fromState(GoRouterState state) => + UnshortenerSettingsRoute(); + + @override + String get location => GoRouteData.$location('/settings/unshortener'); + + @override + void go(BuildContext context) => context.go(location); + + @override + Future push(BuildContext context) => context.push(location); + + @override + void pushReplacement(BuildContext context) => + context.pushReplacement(location); + + @override + void replace(BuildContext context) => context.replace(location); +} + RouteBase get $torProxyRoute => GoRouteData.$route( path: '/tor', name: 'TorProxyRoute', diff --git a/app/lib/core/routing/routes.settings.dart b/app/lib/core/routing/routes.settings.dart index d335ffa4..80b4e605 100644 --- a/app/lib/core/routing/routes.settings.dart +++ b/app/lib/core/routing/routes.settings.dart @@ -81,6 +81,14 @@ part of 'routes.dart'; ), TypedGoRoute(name: 'ErrorLogsRoute', path: 'error_logs'), TypedGoRoute(name: 'SyncSettingsRoute', path: 'sync'), + TypedGoRoute( + name: 'UrlCleanerSettingsRoute', + path: 'url_cleaner', + ), + TypedGoRoute( + name: 'UnshortenerSettingsRoute', + path: 'unshortener', + ), ], ) class SettingsRoute extends GoRouteData with $SettingsRoute { @@ -222,3 +230,19 @@ class SyncSettingsRoute extends GoRouteData with $SyncSettingsRoute { return const SyncSettingsScreen(); } } + +class UrlCleanerSettingsRoute extends GoRouteData + with $UrlCleanerSettingsRoute { + @override + Widget build(BuildContext context, GoRouterState state) { + return const UrlCleanerSettingsScreen(); + } +} + +class UnshortenerSettingsRoute extends GoRouteData + with $UnshortenerSettingsRoute { + @override + Widget build(BuildContext context, GoRouterState state) { + return const UnshortenerSettingsScreen(); + } +} diff --git a/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart b/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart deleted file mode 100644 index 015389d1..00000000 --- a/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2024-2026 Fabian Freund. - * - * This file is part of WebLibre - * (see https://weblibre.eu). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -import 'package:drift/drift.dart' hide Column; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; -import 'package:flutter_mozilla_components/flutter_mozilla_components.dart' - show GeckoBrowserService; -import 'package:go_router/go_router.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:weblibre/core/design/app_colors.dart'; -import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; -import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; -import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart'; -import 'package:weblibre/utils/form_validators.dart'; - -class OpenSharedContent extends HookConsumerWidget { - final Uri sharedUrl; - - const OpenSharedContent({super.key, required this.sharedUrl}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final formKey = useMemoized(() => GlobalKey()); - final textController = useTextEditingController(text: sharedUrl.toString()); - final appColors = AppColors.of(context); - - final selectedContainer = useState(null); - - Future openTab(bool isPrivate) async { - if (formKey.currentState?.validate() == true) { - await ref - .read(tabRepositoryProvider.notifier) - .addTab( - url: Uri.parse(textController.text), - private: isPrivate, - container: Value(selectedContainer.value), - launchedFromIntent: true, - selectTab: true, - ); - - if (context.mounted) { - context.pop(true); - } - } - } - - Future openCustomTab(bool isPrivate) async { - if (formKey.currentState?.validate() == true) { - await GeckoBrowserService().openInCustomTab( - url: Uri.parse(textController.text), - private: isPrivate, - contextId: selectedContainer.value?.id, - ); - - if (context.mounted) { - context.pop(true); - } - } - } - - return SafeArea( - child: Form( - key: formKey, - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text('Open link', style: Theme.of(context).textTheme.titleLarge), - const SizedBox(height: 16), - ContainerChips( - displayMenu: false, - selectedContainer: selectedContainer.value, - onSelected: (container) { - selectedContainer.value = container; - }, - onDeleted: (container) { - selectedContainer.value = null; - }, - ), - TextFormField( - controller: textController, - keyboardType: TextInputType.url, - minLines: 1, - maxLines: 10, - validator: (value) { - return validateUrl(value, eagerParsing: false); - }, - ), - const SizedBox(height: 8), - _OpenActionTile( - title: 'Open in new tab', - subtitle: 'Add to your browser tabs', - icon: MdiIcons.tab, - privateColor: appColors.privateTabPurple, - onTap: () => openTab(false), - onPrivateTap: () => openTab(true), - ), - _OpenActionTile( - title: 'Open in custom tab', - subtitle: 'Open in a separate window', - icon: MdiIcons.applicationOutline, - privateColor: appColors.privateTabPurple, - onTap: () => openCustomTab(false), - onPrivateTap: () => openCustomTab(true), - ), - ], - ), - ), - ), - ); - } -} - -class _OpenActionTile extends StatelessWidget { - final String title; - final String? subtitle; - final IconData icon; - final Color privateColor; - final VoidCallback onTap; - final VoidCallback onPrivateTap; - - const _OpenActionTile({ - required this.title, - this.subtitle, - required this.icon, - required this.privateColor, - required this.onTap, - required this.onPrivateTap, - }); - - @override - Widget build(BuildContext context) { - return ListTile( - title: Text(title), - subtitle: subtitle != null ? Text(subtitle!) : null, - leading: Icon(icon), - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(height: 24, child: VerticalDivider(width: 16)), - IconButton( - icon: Icon(MdiIcons.dominoMask, color: privateColor, size: 24), - tooltip: 'Private', - onPressed: onPrivateTap, - ), - ], - ), - onTap: onTap, - ); - } -} diff --git a/app/lib/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.dart b/app/lib/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.dart new file mode 100644 index 00000000..1fee9c4a --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.dart @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:fast_equatable/fast_equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/unshorten_result.dart'; + +part 'unshorten_response_data.g.dart'; + +@JsonSerializable() +class UnshortenResponseData with FastEquatable { + @JsonKey(defaultValue: false) + final bool success; + final String? error; + + @JsonKey(name: 'unshortened_url') + final String? unshortenedUrl; + + @JsonKey(name: 'resolved_url') + final String? resolvedUrl; + + @JsonKey(name: 'remaining_calls', fromJson: _toInt) + final int? remainingCalls; + + @JsonKey(name: 'usage_count', fromJson: _toInt) + final int? usageCount; + + UnshortenResponseData({ + required this.success, + this.error, + this.unshortenedUrl, + this.resolvedUrl, + this.remainingCalls, + this.usageCount, + }); + + String? get finalUrl => unshortenedUrl ?? resolvedUrl; + + factory UnshortenResponseData.fromJson(Map json) => + _$UnshortenResponseDataFromJson(json); + + Map toJson() => _$UnshortenResponseDataToJson(this); + + factory UnshortenResponseData.fromAuthenticatedJson( + Map json, + ) { + final data = UnshortenResponseData.fromJson(json); + final error = data.error; + if (error != null && error.isNotEmpty) { + return UnshortenResponseData(success: false, error: error); + } + + return UnshortenResponseData( + success: true, + unshortenedUrl: data.unshortenedUrl, + resolvedUrl: data.resolvedUrl, + remainingCalls: data.remainingCalls, + usageCount: data.usageCount, + ); + } + + factory UnshortenResponseData.fromUnauthenticatedJson( + Map json, + ) { + final data = UnshortenResponseData.fromJson(json); + final success = data.success; + if (!success) { + return UnshortenResponseData( + success: false, + error: data.error ?? 'Unknown error', + remainingCalls: data.remainingCalls, + usageCount: data.usageCount, + ); + } + + return UnshortenResponseData( + success: true, + unshortenedUrl: data.unshortenedUrl, + resolvedUrl: data.resolvedUrl, + remainingCalls: data.remainingCalls, + usageCount: data.usageCount, + ); + } + + UnshortenResult toDomain() { + return UnshortenResult( + success: success, + error: error, + finalUrl: finalUrl, + remainingCalls: remainingCalls, + usageCount: usageCount, + ); + } + + @override + List get hashParameters => [ + success, + error, + unshortenedUrl, + resolvedUrl, + remainingCalls, + usageCount, + ]; +} + +int? _toInt(Object? value) { + return switch (value) { + final int value => value, + final num value => value.toInt(), + _ => null, + }; +} diff --git a/app/lib/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.g.dart b/app/lib/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.g.dart new file mode 100644 index 00000000..85899420 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'unshorten_response_data.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +UnshortenResponseData _$UnshortenResponseDataFromJson( + Map json, +) => UnshortenResponseData( + success: json['success'] as bool? ?? false, + error: json['error'] as String?, + unshortenedUrl: json['unshortened_url'] as String?, + resolvedUrl: json['resolved_url'] as String?, + remainingCalls: _toInt(json['remaining_calls']), + usageCount: _toInt(json['usage_count']), +); + +Map _$UnshortenResponseDataToJson( + UnshortenResponseData instance, +) => { + 'success': instance.success, + 'error': instance.error, + 'unshortened_url': instance.unshortenedUrl, + 'resolved_url': instance.resolvedUrl, + 'remaining_calls': instance.remainingCalls, + 'usage_count': instance.usageCount, +}; diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/entities/unshorten_result.dart b/app/lib/features/geckoview/features/open_link_tools/domain/entities/unshorten_result.dart new file mode 100644 index 00000000..4bee1bfb --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/entities/unshorten_result.dart @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:fast_equatable/fast_equatable.dart'; + +class UnshortenResult with FastEquatable { + final bool success; + final String? error; + final String? finalUrl; + final int? remainingCalls; + final int? usageCount; + + UnshortenResult({ + required this.success, + this.error, + this.finalUrl, + this.remainingCalls, + this.usageCount, + }); + + @override + List get hashParameters => [ + success, + error, + finalUrl, + remainingCalls, + usageCount, + ]; +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart b/app/lib/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart new file mode 100644 index 00000000..56cd1570 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:fast_equatable/fast_equatable.dart'; + +enum UrlCleanerMatchType { rawRule, queryRule, referralRule } + +class RemovedParam with FastEquatable { + final String provider; + final String param; + final String match; + final UrlCleanerMatchType type; + + RemovedParam({ + required this.provider, + required this.param, + required this.match, + required this.type, + }); + + @override + List get hashParameters => [provider, param, match, type]; +} + +class UrlCleanerResult with FastEquatable { + final String cleanedUrl; + final bool changed; + final bool blocked; + final List removedParams; + final List matchedProviders; + final String? redirectedFrom; + + UrlCleanerResult({ + required this.cleanedUrl, + required this.changed, + required this.blocked, + required this.removedParams, + required this.matchedProviders, + this.redirectedFrom, + }); + + @override + List get hashParameters => [ + cleanedUrl, + changed, + blocked, + removedParams, + matchedProviders, + redirectedFrom, + ]; +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.dart new file mode 100644 index 00000000..d562bcf8 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.dart @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart' as path_provider; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'url_cleaner_catalog_file.g.dart'; + +@Riverpod(keepAlive: true) +class UrlCleanerCatalogFileService extends _$UrlCleanerCatalogFileService { + late final _catalogFileFuture = path_provider + .getApplicationSupportDirectory() + .then((dir) => File(p.join(dir.path, 'url_cleaner_data.minify.json'))); + + Future lastUpdate() async { + final catalogFile = await _catalogFileFuture; + if (!await catalogFile.exists()) { + return null; + } + + return catalogFile.lastModified(); + } + + Future writeCatalog(String catalogJson) async { + final catalogFile = await _catalogFileFuture; + await catalogFile.writeAsString(catalogJson, flush: true); + } + + Future readCatalog() async { + final catalogFile = await _catalogFileFuture; + if (!await catalogFile.exists()) { + return null; + } + + return catalogFile.readAsString(); + } + + Future deleteCatalog() async { + final catalogFile = await _catalogFileFuture; + if (await catalogFile.exists()) { + await catalogFile.delete(); + } + } + + @override + void build() {} +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.g.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.g.dart new file mode 100644 index 00000000..cb91cc31 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.g.dart @@ -0,0 +1,64 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'url_cleaner_catalog_file.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(UrlCleanerCatalogFileService) +final urlCleanerCatalogFileServiceProvider = + UrlCleanerCatalogFileServiceProvider._(); + +final class UrlCleanerCatalogFileServiceProvider + extends $NotifierProvider { + UrlCleanerCatalogFileServiceProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'urlCleanerCatalogFileServiceProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$urlCleanerCatalogFileServiceHash(); + + @$internal + @override + UrlCleanerCatalogFileService create() => UrlCleanerCatalogFileService(); + + /// {@macro riverpod.override_with_value} + Override overrideWithValue(void value) { + return $ProviderOverride( + origin: this, + providerOverride: $SyncValueProvider(value), + ); + } +} + +String _$urlCleanerCatalogFileServiceHash() => + r'ea4d0d775e087704cc219dbf6d30ac34510b0b22'; + +abstract class _$UrlCleanerCatalogFileService extends $Notifier { + void build(); + @$mustCallSuper + @override + void runBuild() { + final ref = this.ref as $Ref; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier, + void, + Object?, + Object? + >; + element.handleCreate(ref, build); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.dart new file mode 100644 index 00000000..4d9d1263 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.dart @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:async'; +import 'dart:convert'; + +import 'package:crypto/crypto.dart'; +import 'package:flutter/services.dart'; +import 'package:http/http.dart' as http; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/core/logger.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_file.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.dart'; +import 'package:weblibre/features/user/data/models/general_settings.dart'; +import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; + +part 'url_cleaner_catalog_service.g.dart'; + +@Riverpod(keepAlive: true) +class UrlCleanerCatalogService extends _$UrlCleanerCatalogService { + Future> _loadCatalog() async { + final fileService = ref.read(urlCleanerCatalogFileServiceProvider.notifier); + final storedCatalog = await fileService.readCatalog(); + + if (storedCatalog != null && storedCatalog.isNotEmpty) { + return _parseRules(storedCatalog); + } + + final bundledCatalog = await rootBundle.loadString( + 'assets/preferences/url_cleaner_data.minify.json', + ); + try { + await fileService.writeCatalog(bundledCatalog); + } catch (_) { + // Continue using bundled rules if local persistence is unavailable. + } + + return _parseRules(bundledCatalog); + } + + List _parseRules(String rawJson) { + final catalog = jsonDecode(rawJson) as Map; + final providers = catalog['providers'] as Map?; + if (providers == null) return []; + + final rules = []; + for (final entry in providers.entries) { + rules.add( + UrlCleanerRule.fromCatalogEntry( + entry.key, + entry.value as Map, + ), + ); + } + + return rules; + } + + Future updateCatalog({bool lastUpdateWasAuto = false}) async { + final settings = ref.read(generalSettingsWithDefaultsProvider); + final catalogUrl = settings.urlCleanerCatalogUrl; + final hashUrl = settings.urlCleanerHashUrl; + + // Fetch catalog and hash in parallel since they are independent. + final catalogFuture = http + .get(Uri.parse(catalogUrl)) + .timeout(const Duration(seconds: 30)); + final hashFuture = hashUrl.isNotEmpty + ? http.get(Uri.parse(hashUrl)).timeout(const Duration(seconds: 15)) + : null; + + final results = await Future.wait([ + catalogFuture, + if (hashFuture != null) hashFuture, + ]); + + final response = results[0]; + if (response.statusCode != 200) { + throw Exception('Failed to fetch catalog: ${response.statusCode}'); + } + + final body = response.body; + + // Verify hash if hashUrl is provided + if (hashFuture != null) { + final hashResponse = results[1]; + if (hashResponse.statusCode != 200) { + throw Exception( + 'Failed to fetch catalog hash: ${hashResponse.statusCode}', + ); + } + + final expectedHash = hashResponse.body.trim(); + final actualHash = sha256.convert(utf8.encode(body)).toString(); + if (actualHash != expectedHash) { + throw Exception('Catalog hash mismatch'); + } + } + + // Validate JSON parses correctly + final newRules = _parseRules(body); + if (newRules.isEmpty) { + throw Exception('Catalog contains no providers'); + } + + await ref + .read(urlCleanerCatalogFileServiceProvider.notifier) + .writeCatalog(body); + + final now = DateTime.now().millisecondsSinceEpoch; + + await ref + .read(generalSettingsRepositoryProvider.notifier) + .updateSettings( + (current) => current.copyWith( + urlCleanerLastCheckEpochMs: now, + urlCleanerLastUpdateWasAuto: lastUpdateWasAuto, + ), + ); + + // Reload rules from updated catalog + ref.invalidateSelf(); + } + + Future lastUpdate() { + return ref.read(urlCleanerCatalogFileServiceProvider.notifier).lastUpdate(); + } + + Future restoreBundledCatalog() async { + await ref + .read(urlCleanerCatalogFileServiceProvider.notifier) + .deleteCatalog(); + + ref.invalidateSelf(); + } + + Future updateIfNecessary() async { + final autoUpdate = ref + .read(generalSettingsWithDefaultsProvider) + .urlCleanerAutoUpdate; + + if (!autoUpdate) return false; + + final lastUpdate = await this.lastUpdate(); + final sevenDaysAgo = DateTime.now().subtract(const Duration(days: 7)); + + if (lastUpdate != null && lastUpdate.isAfter(sevenDaysAgo)) return false; + + await updateCatalog(lastUpdateWasAuto: true); + + return true; + } + + Future _runAutoUpdateIfNecessary() async { + try { + await updateIfNecessary(); + } catch (e, s) { + logger.w( + 'Failed auto-updating URL cleaner catalog', + error: e, + stackTrace: s, + ); + } + } + + @override + Future> build() async { + final rules = await _loadCatalog(); + + // Run auto-update checks in the background so the UI gets local rules fast. + unawaited(_runAutoUpdateIfNecessary()); + + return rules; + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.g.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.g.dart new file mode 100644 index 00000000..1ebae60a --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.g.dart @@ -0,0 +1,62 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'url_cleaner_catalog_service.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(UrlCleanerCatalogService) +final urlCleanerCatalogServiceProvider = UrlCleanerCatalogServiceProvider._(); + +final class UrlCleanerCatalogServiceProvider + extends + $AsyncNotifierProvider> { + UrlCleanerCatalogServiceProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'urlCleanerCatalogServiceProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$urlCleanerCatalogServiceHash(); + + @$internal + @override + UrlCleanerCatalogService create() => UrlCleanerCatalogService(); +} + +String _$urlCleanerCatalogServiceHash() => + r'5ee38420014da6f250a3dc25d85d4f1116a4f1c3'; + +abstract class _$UrlCleanerCatalogService + extends $AsyncNotifier> { + FutureOr> build(); + @$mustCallSuper + @override + void runBuild() { + final ref = + this.ref + as $Ref>, List>; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier< + AsyncValue>, + List + >, + AsyncValue>, + Object?, + Object? + >; + element.handleCreate(ref, build); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.dart new file mode 100644 index 00000000..68d5af7e --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.dart @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:fast_equatable/fast_equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'url_cleaner_rule.g.dart'; + +@JsonSerializable() +class UrlCleanerRule with FastEquatable { + final String name; + final UrlCleanerRuleData data; + + UrlCleanerRule({required this.name, required this.data}); + + factory UrlCleanerRule.fromCatalogEntry( + String name, + Map data, + ) { + return UrlCleanerRule(name: name, data: UrlCleanerRuleData.fromJson(data)); + } + + factory UrlCleanerRule.fromJson(Map json) => + _$UrlCleanerRuleFromJson(json); + + Map toJson() => _$UrlCleanerRuleToJson(this); + + @override + List get hashParameters => [name, data]; +} + +@JsonSerializable() +class UrlCleanerRuleData with FastEquatable { + final String? urlPattern; + final bool completeProvider; + final bool forceRedirection; + @JsonKey(fromJson: _stringListFromJson) + final List exceptions; + @JsonKey(fromJson: _stringListFromJson) + final List redirections; + @JsonKey(fromJson: _stringListFromJson) + final List rawRules; + @JsonKey(fromJson: _stringListFromJson) + final List rules; + @JsonKey(fromJson: _stringListFromJson) + final List referralMarketing; + + static List _stringListFromJson(dynamic value) { + if (value is! List) return const []; + return value.whereType().toList(growable: false); + } + + // Lazily compiled regexes — derived from the source strings above, + // not identity-bearing state, so intentionally excluded from hashParameters. + // ignore: fast_equatable_lint/missing_field_in_equatable_props + @JsonKey(includeFromJson: false, includeToJson: false) + late final RegExp? compiledUrlPattern = _tryCompile(urlPattern); + // ignore: fast_equatable_lint/missing_field_in_equatable_props + @JsonKey(includeFromJson: false, includeToJson: false) + late final List compiledExceptions = exceptions + .map((e) => _tryCompile(e)) + .whereType() + .toList(); + // ignore: fast_equatable_lint/missing_field_in_equatable_props + @JsonKey(includeFromJson: false, includeToJson: false) + late final List compiledRedirections = redirections + .map((e) => _tryCompile(e)) + .whereType() + .toList(); + // ignore: fast_equatable_lint/missing_field_in_equatable_props + @JsonKey(includeFromJson: false, includeToJson: false) + late final List compiledRawRules = rawRules + .map((e) => _tryCompile(e)) + .toList(); + // ignore: fast_equatable_lint/missing_field_in_equatable_props + @JsonKey(includeFromJson: false, includeToJson: false) + late final List compiledRules = rules + .map((e) => _tryCompile(e)) + .toList(); + // ignore: fast_equatable_lint/missing_field_in_equatable_props + @JsonKey(includeFromJson: false, includeToJson: false) + late final List compiledReferralMarketing = referralMarketing + .map((e) => _tryCompile(e)) + .toList(); + + static RegExp? _tryCompile(String? pattern) { + if (pattern == null || pattern.isEmpty) return null; + try { + return RegExp(pattern, caseSensitive: false); + } on FormatException { + return null; + } + } + + UrlCleanerRuleData({ + this.urlPattern, + this.completeProvider = false, + this.forceRedirection = false, + this.exceptions = const [], + this.redirections = const [], + this.rawRules = const [], + this.rules = const [], + this.referralMarketing = const [], + }); + + factory UrlCleanerRuleData.fromJson(Map json) => + _$UrlCleanerRuleDataFromJson(json); + + Map toJson() => _$UrlCleanerRuleDataToJson(this); + + @override + List get hashParameters => [ + urlPattern, + completeProvider, + forceRedirection, + exceptions, + redirections, + rawRules, + rules, + referralMarketing, + ]; +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.g.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.g.dart new file mode 100644 index 00000000..b0c9afbb --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.g.dart @@ -0,0 +1,50 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'url_cleaner_rule.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +UrlCleanerRule _$UrlCleanerRuleFromJson(Map json) => + UrlCleanerRule( + name: json['name'] as String, + data: UrlCleanerRuleData.fromJson(json['data'] as Map), + ); + +Map _$UrlCleanerRuleToJson(UrlCleanerRule instance) => + {'name': instance.name, 'data': instance.data.toJson()}; + +UrlCleanerRuleData _$UrlCleanerRuleDataFromJson(Map json) => + UrlCleanerRuleData( + urlPattern: json['urlPattern'] as String?, + completeProvider: json['completeProvider'] as bool? ?? false, + forceRedirection: json['forceRedirection'] as bool? ?? false, + exceptions: json['exceptions'] == null + ? const [] + : UrlCleanerRuleData._stringListFromJson(json['exceptions']), + redirections: json['redirections'] == null + ? const [] + : UrlCleanerRuleData._stringListFromJson(json['redirections']), + rawRules: json['rawRules'] == null + ? const [] + : UrlCleanerRuleData._stringListFromJson(json['rawRules']), + rules: json['rules'] == null + ? const [] + : UrlCleanerRuleData._stringListFromJson(json['rules']), + referralMarketing: json['referralMarketing'] == null + ? const [] + : UrlCleanerRuleData._stringListFromJson(json['referralMarketing']), + ); + +Map _$UrlCleanerRuleDataToJson(UrlCleanerRuleData instance) => + { + 'urlPattern': instance.urlPattern, + 'completeProvider': instance.completeProvider, + 'forceRedirection': instance.forceRedirection, + 'exceptions': instance.exceptions, + 'redirections': instance.redirections, + 'rawRules': instance.rawRules, + 'rules': instance.rules, + 'referralMarketing': instance.referralMarketing, + }; diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service.dart new file mode 100644 index 00000000..8def0d40 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service.dart @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.dart'; + +UrlCleanerResult cleanUrl( + String url, + List rules, { + bool allowReferral = false, +}) { + var currentUrl = url; + var blocked = false; + final removedParams = []; + final matchedProviders = []; + final uniqueMatchedProviders = {}; + String? redirectedFrom; + var redirectionCount = 0; + final maxRedirections = rules.length * 4; + + for (var ruleIndex = 0; ruleIndex < rules.length; ruleIndex++) { + final rule = rules[ruleIndex]; + final name = rule.name; + final data = rule.data; + final patternRegex = data.compiledUrlPattern; + if (patternRegex == null) continue; + if (!patternRegex.hasMatch(currentUrl)) continue; + + if (uniqueMatchedProviders.add(name)) { + matchedProviders.add(name); + } + + // 1. Check completeProvider + if (data.completeProvider) { + blocked = true; + continue; + } + + // 2. Check exceptions + var exceptionMatched = false; + for (final exceptionRegex in data.compiledExceptions) { + if (exceptionRegex.hasMatch(currentUrl)) { + exceptionMatched = true; + break; + } + } + if (exceptionMatched) continue; + + // 3. Apply redirections + var redirected = false; + var redirectionMatched = false; + for (final redirectRegex in data.compiledRedirections) { + final match = redirectRegex.firstMatch(currentUrl); + if (match != null && match.groupCount >= 1) { + redirectionMatched = true; + final extracted = Uri.decodeComponent(match.group(1)!); + if (extracted != currentUrl && _hasSafeScheme(extracted)) { + redirectedFrom ??= currentUrl; + currentUrl = extracted; + redirected = true; + } + break; + } + } + if (redirected) { + redirectionCount++; + if (redirectionCount <= maxRedirections) { + // Restart provider scan so earlier providers also apply on redirected URL. + ruleIndex = -1; + } + continue; + } + if (redirectionMatched) continue; + + // 4. Apply rawRules + for (var i = 0; i < data.compiledRawRules.length; i++) { + final rawRegex = data.compiledRawRules[i]; + if (rawRegex == null) continue; + final rawRule = data.rawRules[i]; + final matches = rawRegex + .allMatches(currentUrl) + .map((m) => m.group(0)) + .whereType() + .where((match) => match.isNotEmpty) + .toList(); + if (matches.isNotEmpty) { + currentUrl = currentUrl.replaceAll(rawRegex, ''); + for (final match in matches) { + removedParams.add( + RemovedParam( + provider: name, + param: rawRule, + match: match, + type: UrlCleanerMatchType.rawRule, + ), + ); + } + } + } + + // 5. Apply rules (query parameter removal) + for (var i = 0; i < data.compiledRules.length; i++) { + final compiledRule = data.compiledRules[i]; + if (compiledRule == null) continue; + final paramRule = data.rules[i]; + final removalResult = _removeQueryParamWithRegex( + currentUrl, + compiledRule, + ); + currentUrl = removalResult.url; + for (final match in removalResult.matches) { + removedParams.add( + RemovedParam( + provider: name, + param: paramRule, + match: match, + type: UrlCleanerMatchType.queryRule, + ), + ); + } + } + + // 6. Apply referralMarketing (if !allowReferral) + for (var i = 0; i < data.compiledReferralMarketing.length; i++) { + final compiledRule = data.compiledReferralMarketing[i]; + if (compiledRule == null) continue; + final referralRule = data.referralMarketing[i]; + if (!allowReferral) { + final removalResult = _removeQueryParamWithRegex( + currentUrl, + compiledRule, + ); + currentUrl = removalResult.url; + for (final match in removalResult.matches) { + removedParams.add( + RemovedParam( + provider: name, + param: referralRule, + match: match, + type: UrlCleanerMatchType.referralRule, + ), + ); + } + } else { + final referralMatches = _findQueryParamMatchesWithRegex( + currentUrl, + compiledRule, + ); + for (final match in referralMatches) { + removedParams.add( + RemovedParam( + provider: name, + param: referralRule, + match: match, + type: UrlCleanerMatchType.referralRule, + ), + ); + } + } + } + } + + currentUrl = _normalizeUrl(currentUrl); + + return UrlCleanerResult( + cleanedUrl: currentUrl, + changed: currentUrl != url, + blocked: blocked, + removedParams: removedParams, + matchedProviders: matchedProviders, + redirectedFrom: redirectedFrom, + ); +} + +String removeUrlCleanerMatch(String url, RemovedParam removedParam) { + if (removedParam.match.isEmpty) return url; + + switch (removedParam.type) { + case UrlCleanerMatchType.rawRule: + return _normalizeUrl(url.replaceFirst(removedParam.match, '')); + case UrlCleanerMatchType.queryRule: + case UrlCleanerMatchType.referralRule: + final escapedMatch = RegExp.escape(removedParam.match); + final regex = RegExp( + '([?&#])$escapedMatch(?=(&|#|\$))', + caseSensitive: false, + ); + final match = regex.firstMatch(url); + if (match == null) return url; + final result = url.replaceRange(match.start, match.end, match.group(1)!); + return _normalizeUrl(result); + } +} + +_QueryParamRemovalResult _removeQueryParamWithRegex( + String url, + RegExp paramRegex, +) { + final regex = RegExp( + '([?&#])(${paramRegex.pattern})=([^&#]*)', + caseSensitive: false, + ); + var result = url; + final matches = []; + + while (true) { + final match = regex.firstMatch(result); + if (match == null) break; + matches.add('${match.group(2)}=${match.group(3)}'); + result = result.replaceRange(match.start, match.end, match.group(1)!); + } + + return _QueryParamRemovalResult(url: result, matches: matches); +} + +List _findQueryParamMatchesWithRegex(String url, RegExp paramRegex) { + final regex = RegExp( + '([?&#])(${paramRegex.pattern})=([^&#]*)', + caseSensitive: false, + ); + return regex + .allMatches(url) + .map((match) => '${match.group(2)}=${match.group(3)}') + .toList(); +} + +bool _hasSafeScheme(String url) { + final parsed = Uri.tryParse(url); + if (parsed == null || !parsed.hasScheme) return true; // schemeless is ok + final scheme = parsed.scheme.toLowerCase(); + return scheme == 'http' || scheme == 'https'; +} + +// Pre-compiled regexes for URL normalization — avoids recompiling on every call. +final _questionAmpersand = RegExp(r'\?&+'); +final _trailingQuestion = RegExp(r'\?$'); +final _doubleAmpersand = RegExp('&&+'); +final _trailingAmpersand = RegExp(r'&$'); +final _hashAmpersand = RegExp('#&+'); +final _trailingHash = RegExp(r'#$'); + +String _normalizeUrl(String url) { + var normalized = url + .replaceAll(_questionAmpersand, '?') + .replaceAll('?#', '#') + .replaceAll(_trailingQuestion, '') + .replaceAll(_doubleAmpersand, '&') + .replaceAll('&#', '#') + .replaceAll(_trailingAmpersand, '') + .replaceAll(_hashAmpersand, '#') + .replaceAll(_trailingHash, ''); + + // Only prepend https:// for genuinely schemeless URLs. + final parsed = Uri.tryParse(normalized); + if (parsed == null || !parsed.hasScheme) { + normalized = 'https://$normalized'; + } + + return normalized; +} + +class _QueryParamRemovalResult { + final String url; + final List matches; + + const _QueryParamRemovalResult({required this.url, required this.matches}); +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.dart new file mode 100644 index 00000000..e8b53dd6 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.dart @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:convert'; + +import 'package:flutter/services.dart'; +import 'package:http/http.dart' as http; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/data/models/unshorten_response_data.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/unshorten_result.dart'; + +part 'url_unshortener_service.g.dart'; + +const _shortenerListAssetPath = 'assets/preferences/url-shortener-list.json'; + +@Riverpod(keepAlive: true) +class UrlUnshortenerService extends _$UrlUnshortenerService { + Future> loadSupportedShortenerHosts({ + AssetBundle? bundle, + String assetPath = _shortenerListAssetPath, + }) async { + try { + final content = await (bundle ?? rootBundle).loadString(assetPath); + return parseSupportedShortenerHosts(content); + } catch (_) { + return {}; + } + } + + Set parseSupportedShortenerHosts(String rawJson) { + try { + final decoded = jsonDecode(rawJson); + if (decoded is! Map) return {}; + + final list = decoded['list']; + if (list is! List) return {}; + + return list + .whereType() + .map(_normalizeHost) + .where((host) => host.isNotEmpty) + .toSet(); + } catch (_) { + return {}; + } + } + + bool isSupportedShortenerUrl(String url, Set supportedHosts) { + if (supportedHosts.isEmpty) return false; + + final parsed = Uri.tryParse(url); + final host = parsed != null && parsed.host.isNotEmpty + ? parsed.host + : Uri.tryParse('https://$url')?.host; + + return isSupportedShortenerHost(host, supportedHosts); + } + + bool isSupportedShortenerHost(String? host, Set supportedHosts) { + if (supportedHosts.isEmpty) return false; + + var candidate = _normalizeHost(host ?? ''); + if (candidate.isEmpty) return false; + + while (true) { + if (supportedHosts.contains(candidate)) return true; + + final dotIndex = candidate.indexOf('.'); + if (dotIndex == -1) return false; + + candidate = candidate.substring(dotIndex + 1); + } + } + + Future unshortenUrl( + String url, { + String token = '', + http.Client? client, + }) async { + final encodedUrl = Uri.encodeComponent(url); + final httpClient = client ?? http.Client(); + + final http.Response response; + final bool authenticated = token.isNotEmpty; + + try { + if (authenticated) { + response = await httpClient + .get( + Uri.parse( + 'https://unshorten.me/api/v2/unshorten?url=$encodedUrl', + ), + headers: {'Authorization': 'Token $token'}, + ) + .timeout(const Duration(seconds: 15)); + } else { + response = await httpClient + .get(Uri.parse('https://unshorten.me/json/$encodedUrl')) + .timeout(const Duration(seconds: 15)); + } + } finally { + if (client == null) httpClient.close(); + } + + if (response.statusCode != 200) { + return UnshortenResult( + success: false, + error: 'HTTP ${response.statusCode}', + ); + } + + final json = jsonDecode(response.body) as Map; + + final responseData = authenticated + ? UnshortenResponseData.fromAuthenticatedJson(json) + : UnshortenResponseData.fromUnauthenticatedJson(json); + + final result = responseData.toDomain(); + + // Reject non-HTTP(S) URLs from the API to prevent scheme-based attacks. + if (result.success && result.finalUrl != null) { + final parsed = Uri.tryParse(result.finalUrl!); + if (parsed != null && parsed.hasScheme) { + final scheme = parsed.scheme.toLowerCase(); + if (scheme != 'http' && scheme != 'https') { + return UnshortenResult( + success: false, + error: 'Unsupported URL scheme: $scheme', + ); + } + } + } + + return result; + } + + @override + Future> build() { + return loadSupportedShortenerHosts(); + } +} + +final _leadingWildcard = RegExp(r'^\*\.'); +final _leadingDot = RegExp(r'^\.'); +final _trailingDot = RegExp(r'\.$'); + +String _normalizeHost(String host) { + var normalized = host.trim().toLowerCase(); + if (normalized.isEmpty) return ''; + + final isUrlLike = + normalized.contains('://') || + normalized.contains('/') || + normalized.contains('?') || + normalized.contains('#'); + if (isUrlLike) { + final parsed = normalized.contains('://') + ? Uri.tryParse(normalized) + : Uri.tryParse('https://$normalized'); + final parsedHost = parsed?.host ?? ''; + normalized = parsedHost.isNotEmpty ? parsedHost : normalized; + } + + normalized = normalized.replaceFirst(_leadingWildcard, ''); + normalized = normalized.replaceFirst(_leadingDot, ''); + normalized = normalized.replaceFirst(_trailingDot, ''); + return normalized; +} diff --git a/app/lib/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.g.dart b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.g.dart new file mode 100644 index 00000000..8a0cf19e --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.g.dart @@ -0,0 +1,55 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'url_unshortener_service.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(UrlUnshortenerService) +final urlUnshortenerServiceProvider = UrlUnshortenerServiceProvider._(); + +final class UrlUnshortenerServiceProvider + extends $AsyncNotifierProvider> { + UrlUnshortenerServiceProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'urlUnshortenerServiceProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$urlUnshortenerServiceHash(); + + @$internal + @override + UrlUnshortenerService create() => UrlUnshortenerService(); +} + +String _$urlUnshortenerServiceHash() => + r'627fd3cc6f6c2251f8f582fcff27cb5a7e2c7813'; + +abstract class _$UrlUnshortenerService extends $AsyncNotifier> { + FutureOr> build(); + @$mustCallSuper + @override + void runBuild() { + final ref = this.ref as $Ref>, Set>; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier>, Set>, + AsyncValue>, + Object?, + Object? + >; + element.handleCreate(ref, build); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.dart new file mode 100644 index 00000000..e9253525 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.dart @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/unshorten_result.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.dart'; + +part 'open_shared_content_unshorten_controller.g.dart'; + +@Riverpod() +class OpenSharedContentUnshortenController + extends _$OpenSharedContentUnshortenController { + @override + AsyncValue? build() { + return null; + } + + Future unshorten({ + required String url, + required String token, + }) async { + state = const AsyncLoading(); + + try { + final result = await ref + .read(urlUnshortenerServiceProvider.notifier) + .unshortenUrl(url, token: token); + + state = AsyncData(result); + return result; + } catch (e, s) { + state = AsyncError(e, s); + return null; + } + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.g.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.g.dart new file mode 100644 index 00000000..b8212b6b --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.g.dart @@ -0,0 +1,76 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'open_shared_content_unshorten_controller.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(OpenSharedContentUnshortenController) +final openSharedContentUnshortenControllerProvider = + OpenSharedContentUnshortenControllerProvider._(); + +final class OpenSharedContentUnshortenControllerProvider + extends + $NotifierProvider< + OpenSharedContentUnshortenController, + AsyncValue? + > { + OpenSharedContentUnshortenControllerProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'openSharedContentUnshortenControllerProvider', + isAutoDispose: true, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => + _$openSharedContentUnshortenControllerHash(); + + @$internal + @override + OpenSharedContentUnshortenController create() => + OpenSharedContentUnshortenController(); + + /// {@macro riverpod.override_with_value} + Override overrideWithValue(AsyncValue? value) { + return $ProviderOverride( + origin: this, + providerOverride: $SyncValueProvider?>(value), + ); + } +} + +String _$openSharedContentUnshortenControllerHash() => + r'f94bb6f343a8fdb1f122128225f2752fadb259c2'; + +abstract class _$OpenSharedContentUnshortenController + extends $Notifier?> { + AsyncValue? build(); + @$mustCallSuper + @override + void runBuild() { + final ref = + this.ref + as $Ref?, AsyncValue?>; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier< + AsyncValue?, + AsyncValue? + >, + AsyncValue?, + Object?, + Object? + >; + element.handleCreate(ref, build); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/open_shared_content.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/open_shared_content.dart new file mode 100644 index 00000000..19a61f64 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/open_shared_content.dart @@ -0,0 +1,588 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:async'; + +import 'package:drift/drift.dart' hide Column; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; +import 'package:flutter_mozilla_components/flutter_mozilla_components.dart' + show GeckoAppLinksService, GeckoBrowserService; +import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:weblibre/core/design/app_colors.dart'; +import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/controllers/open_shared_content_unshorten_controller.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/dialogs/tracking_details_dialog.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/widgets/attribution_link.dart'; +import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; +import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart'; +import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; +import 'package:weblibre/presentation/hooks/cached_future.dart'; +import 'package:weblibre/presentation/hooks/debouncer.dart'; +import 'package:weblibre/utils/form_validators.dart'; +import 'package:weblibre/utils/ui_helper.dart'; + +class OpenSharedContent extends HookConsumerWidget { + final Uri sharedUrl; + + static final _appLinksService = GeckoAppLinksService(); + + const OpenSharedContent({super.key, required this.sharedUrl}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final formKey = useMemoized(() => GlobalKey()); + final textController = useTextEditingController(text: sharedUrl.toString()); + final appColors = AppColors.of(context); + + final selectedContainer = useState(null); + + final settings = ref.watch(generalSettingsWithDefaultsProvider); + final catalogAsync = ref.watch(urlCleanerCatalogServiceProvider); + final supportedShortenerHosts = ref.watch(urlUnshortenerServiceProvider); + + final currentUrl = useValueListenable(textController).text; + + // Debounce the URL to avoid running expensive operations on every keystroke. + final debouncedUrl = useState(currentUrl); + final debouncer = useDebouncer(const Duration(milliseconds: 300)); + useEffect( + () { + debouncer.eventOccured(() => debouncedUrl.value = currentUrl); + return null; + }, + [currentUrl], + ); + + final parsedDebouncedUrl = Uri.tryParse(debouncedUrl.value); + final hasExternalApp = useCachedFuture( + // ignore: discarded_futures useFuture + () => parsedDebouncedUrl != null + ? _appLinksService.hasExternalApp(parsedDebouncedUrl) + : Future.value(false), + [parsedDebouncedUrl], + ); + + final shouldShowUnshortenerTile = + settings.unshortenerEnabled && + ref + .read(urlUnshortenerServiceProvider.notifier) + .isSupportedShortenerUrl( + debouncedUrl.value, + supportedShortenerHosts.value ?? const {}, + ); + + // URL cleaner state + final cleanerResult = useState(null); + final cleanerApplied = useState(false); + + final unshortenState = ref.watch( + openSharedContentUnshortenControllerProvider, + ); + + void runCleaner({bool allowAutoApply = false}) { + final settings = ref.read(generalSettingsWithDefaultsProvider); + + if (!settings.urlCleanerEnabled) return; + + final rules = catalogAsync.value; + if (rules == null) return; + + final result = cleanUrl( + currentUrl, + rules, + allowReferral: settings.urlCleanerAllowReferralMarketing, + ); + cleanerResult.value = result; + + // Only reset applied state when new tracking params are found, + // preserving the "cleaned" indicator when the URL is already clean. + if (result.removedParams.isNotEmpty) { + cleanerApplied.value = false; + } + + if (allowAutoApply && result.changed) { + textController.text = result.cleanedUrl; + cleanerApplied.value = true; + } + } + + // Run URL cleaner on build when enabled and catalog is loaded. + // Uses debouncedUrl to avoid running regex matching on every keystroke. + useEffect( + () { + runCleaner(allowAutoApply: settings.urlCleanerAutoApply); + return null; + }, + [ + debouncedUrl.value, + catalogAsync.value, + settings.urlCleanerEnabled, + settings.urlCleanerAllowReferralMarketing, + settings.urlCleanerAutoApply, + ], + ); + + void applyCleanUrl() { + final result = cleanerResult.value; + if (result != null && result.changed) { + textController.text = result.cleanedUrl; + cleanerApplied.value = true; + showInfoMessage(context, 'URL cleaned'); + } + } + + void applySelectedTrackingRemovals(String previewUrl) { + if (previewUrl == textController.text) return; + + textController.text = previewUrl; + cleanerApplied.value = true; + + showInfoMessage(context, 'URL preview applied'); + } + + Future openTab(bool isPrivate) async { + if (formKey.currentState?.validate() == true) { + await ref + .read(tabRepositoryProvider.notifier) + .addTab( + url: Uri.parse(textController.text), + private: isPrivate, + container: Value(selectedContainer.value), + launchedFromIntent: true, + selectTab: true, + ); + + if (context.mounted) { + context.pop(true); + } + } + } + + Future openCustomTab(bool isPrivate) async { + if (formKey.currentState?.validate() == true) { + await GeckoBrowserService().openInCustomTab( + url: Uri.parse(textController.text), + private: isPrivate, + contextId: selectedContainer.value?.id, + ); + + if (context.mounted) { + context.pop(true); + } + } + } + + Future openInApp() async { + if (formKey.currentState?.validate() == true) { + final uri = Uri.tryParse(textController.text); + if (uri == null) return; + + final success = await _appLinksService.openAppLink(uri); + + if (success && context.mounted) { + context.pop(true); + } else if (!success && context.mounted) { + showErrorMessage(context, 'Could not open in app'); + } + } + } + + return SafeArea( + child: Form( + key: formKey, + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text('Open link', style: Theme.of(context).textTheme.titleLarge), + const SizedBox(height: 16), + ContainerChips( + displayMenu: false, + selectedContainer: selectedContainer.value, + onSelected: (container) { + selectedContainer.value = container; + }, + onDeleted: (container) { + selectedContainer.value = null; + }, + ), + TextFormField( + controller: textController, + keyboardType: TextInputType.url, + minLines: 1, + maxLines: 10, + validator: (value) { + return validateUrl(value, eagerParsing: false); + }, + ), + const SizedBox(height: 8), + // URL Cleaner tile + if (settings.urlCleanerEnabled && + cleanerResult.value != null) ...[ + if (cleanerResult.value!.blocked) + ListTile( + leading: Icon( + MdiIcons.alertCircle, + color: Theme.of(context).colorScheme.error, + ), + title: const Text('URL blocked by ClearURLs'), + dense: true, + ) + else if (cleanerResult.value!.removedParams.isNotEmpty) + _UrlCleanerTile( + result: cleanerResult.value!, + currentUrl: currentUrl, + allowReferralMarketing: + settings.urlCleanerAllowReferralMarketing, + onClean: cleanerResult.value!.changed + ? applyCleanUrl + : null, + onApplySelectedRemovals: applySelectedTrackingRemovals, + ) + else if (cleanerApplied.value) + _UrlCleanerTile( + result: cleanerResult.value!, + currentUrl: currentUrl, + allowReferralMarketing: + settings.urlCleanerAllowReferralMarketing, + applied: true, + ), + ], + // Unshortener UI + if (shouldShowUnshortenerTile) ...[ + if (unshortenState != null) + unshortenState.when( + loading: () => const Padding( + padding: EdgeInsets.symmetric(vertical: 4), + child: LinearProgressIndicator(), + ), + error: (error, _) => Padding( + padding: const EdgeInsets.only(bottom: 4), + child: Text( + 'Unshorten failed: $error', + style: TextStyle( + color: Theme.of(context).colorScheme.error, + fontSize: 12, + ), + ), + ), + data: (result) { + if (!result.success) { + return Padding( + padding: const EdgeInsets.only(bottom: 4), + child: Text( + 'Unshorten failed: ${result.error}', + style: TextStyle( + color: Theme.of(context).colorScheme.error, + fontSize: 12, + ), + ), + ); + } + final remaining = result.remainingCalls; + final limit = result.usageCount; + if (remaining != null && + limit != null && + limit > 0 && + remaining < limit ~/ 2) { + return Padding( + padding: const EdgeInsets.only(bottom: 4), + child: Text( + 'Remaining calls: $remaining/$limit', + style: Theme.of(context).textTheme.bodySmall, + ), + ); + } + return const SizedBox.shrink(); + }, + ), + _OpenActionTile( + title: 'Unshorten', + subtitle: 'Resolve shortened URL', + icon: MdiIcons.linkVariant, + showTrailingDivider: false, + trailing: IconButton( + icon: const Icon(Icons.info_outline), + tooltip: 'Unshortener info', + onPressed: () { + unawaited(_showUnshortenerInfoDialog(context)); + }, + ), + onTap: () async { + final result = await ref + .read( + openSharedContentUnshortenControllerProvider.notifier, + ) + .unshorten( + url: textController.text, + token: settings.unshortenerToken, + ); + if (!context.mounted) return; + if (result?.success == true && result?.finalUrl != null) { + textController.text = result!.finalUrl!; + } + }, + ), + ], + if (hasExternalApp.data == true) + _OpenActionTile( + title: 'Open in App', + subtitle: 'Open in an installed app', + icon: Icons.open_in_new, + onTap: openInApp, + ), + _OpenActionTile( + title: 'Open in new tab', + subtitle: 'Add to your browser tabs', + icon: MdiIcons.tab, + trailing: IconButton( + icon: Icon( + MdiIcons.dominoMask, + color: appColors.privateTabPurple, + size: 24, + ), + tooltip: 'Private', + onPressed: () => openTab(true), + ), + onTap: () => openTab(false), + ), + _OpenActionTile( + title: 'Open in custom tab', + subtitle: 'Open in a separate window', + icon: MdiIcons.applicationOutline, + trailing: IconButton( + icon: Icon( + MdiIcons.dominoMask, + color: appColors.privateTabPurple, + size: 24, + ), + tooltip: 'Private', + onPressed: () => openCustomTab(true), + ), + onTap: () => openCustomTab(false), + ), + ], + ), + ), + ), + ); + } +} + +Future _showUnshortenerInfoDialog(BuildContext context) { + final textColor = Theme.of(context).textTheme.bodyMedium?.color; + final linkStyle = TextStyle( + color: Theme.of(context).colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: Theme.of(context).colorScheme.primary, + ); + + return showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Unshortener Attribution'), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + style: Theme.of( + context, + ).textTheme.bodyMedium?.copyWith(color: textColor), + children: [ + const TextSpan( + text: 'This module will unshort links by sending them to ', + ), + WidgetSpan( + alignment: PlaceholderAlignment.baseline, + baseline: TextBaseline.alphabetic, + child: AttributionLink( + label: 'https://unshorten.me/', + url: 'https://unshorten.me/', + style: linkStyle, + ), + ), + const TextSpan( + text: + ', which evaluates them on their servers and saves the redirection for future requests. ' + 'Avoid unshortening links with private or sensitive data.', + ), + ], + ), + ), + const SizedBox(height: 12), + const Text( + 'The free API is rate limited to 10 requests per hour for new checks.', + style: TextStyle(fontWeight: FontWeight.w600), + ), + const SizedBox(height: 12), + RichText( + text: TextSpan( + style: Theme.of( + context, + ).textTheme.bodyMedium?.copyWith(color: textColor), + children: [ + const TextSpan(text: 'Privacy policy: '), + WidgetSpan( + alignment: PlaceholderAlignment.baseline, + baseline: TextBaseline.alphabetic, + child: AttributionLink( + label: 'https://unshorten.me/privacy-policy', + url: 'https://unshorten.me/privacy-policy', + style: linkStyle, + ), + ), + ], + ), + ), + ], + ), + ), + actions: [ + TextButton( + onPressed: Navigator.of(context).pop, + child: const Text('Close'), + ), + ], + ), + ); +} + +class _UrlCleanerTile extends StatelessWidget { + final UrlCleanerResult result; + final String currentUrl; + final bool allowReferralMarketing; + final VoidCallback? onClean; + final ValueChanged? onApplySelectedRemovals; + final bool applied; + + const _UrlCleanerTile({ + required this.result, + required this.currentUrl, + required this.allowReferralMarketing, + this.onClean, + this.onApplySelectedRemovals, + this.applied = false, + }); + + @override + Widget build(BuildContext context) { + final paramCount = result.removedParams.length; + final hasParams = paramCount > 0; + + final String subtitle; + if (!hasParams) { + subtitle = 'Tracking parameters removed'; + } else if (paramCount == 1) { + subtitle = '1 tracking parameter found'; + } else { + subtitle = '$paramCount tracking parameters found'; + } + + return ListTile( + leading: Icon( + applied ? MdiIcons.checkCircle : MdiIcons.broom, + color: applied + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.error, + ), + title: Text(applied ? 'URL cleaned' : 'Tracking detected'), + subtitle: Text(subtitle), + trailing: applied || !hasParams + ? null + : Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 24, child: VerticalDivider(width: 16)), + + IconButton( + icon: const Icon(MdiIcons.linkVariantRemove), + tooltip: 'Clean URL', + onPressed: onClean, + ), + ], + ), + dense: true, + onTap: hasParams + ? () { + unawaited( + showDialog( + context: context, + builder: (context) => TrackingDetailsDialog( + currentUrl: currentUrl, + result: result, + allowReferralMarketing: allowReferralMarketing, + onApplySelectedRemovals: onApplySelectedRemovals, + ), + ), + ); + } + : null, + ); + } +} + +class _OpenActionTile extends StatelessWidget { + final String title; + final String? subtitle; + final IconData icon; + final Widget? trailing; + final bool showTrailingDivider; + final VoidCallback onTap; + + const _OpenActionTile({ + required this.title, + this.subtitle, + required this.icon, + this.trailing, + this.showTrailingDivider = true, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(title), + subtitle: subtitle != null ? Text(subtitle!) : null, + leading: Icon(icon), + trailing: trailing == null + ? null + : Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (showTrailingDivider) + const SizedBox(height: 24, child: VerticalDivider(width: 16)), + trailing!, + ], + ), + onTap: onTap, + ); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/tracking_details_dialog.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/tracking_details_dialog.dart new file mode 100644 index 00000000..0017b4b4 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/tracking_details_dialog.dart @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:flutter/material.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service.dart'; + +class TrackingDetailsDialog extends StatefulWidget { + final String currentUrl; + final UrlCleanerResult result; + final bool allowReferralMarketing; + final ValueChanged? onApplySelectedRemovals; + + const TrackingDetailsDialog({ + super.key, + required this.currentUrl, + required this.result, + required this.allowReferralMarketing, + this.onApplySelectedRemovals, + }); + + @override + State createState() => _TrackingDetailsDialogState(); +} + +class _TrackingDetailsDialogState extends State { + late final List _items; + late final List _selected; + + @override + void initState() { + super.initState(); + _items = widget.result.removedParams; + _selected = _items.map(_isInitiallySelected).toList(); + } + + bool _isInitiallySelected(RemovedParam item) { + if (!widget.allowReferralMarketing) return true; + return item.type != UrlCleanerMatchType.referralRule; + } + + String get _previewUrl { + var url = widget.currentUrl; + for (var i = 0; i < _items.length; i++) { + if (_selected[i]) { + url = removeUrlCleanerMatch(url, _items[i]); + } + } + return url; + } + + ({String key, String? value}) _splitMatch(String match) { + final separatorIndex = match.indexOf('='); + if (separatorIndex <= 0 || separatorIndex >= match.length - 1) { + return (key: match, value: null); + } + return ( + key: match.substring(0, separatorIndex), + value: match.substring(separatorIndex + 1), + ); + } + + @override + Widget build(BuildContext context) { + final canApply = widget.onApplySelectedRemovals != null; + final selectedCount = _selected.where((isSelected) => isSelected).length; + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + final subtitleColor = textTheme.bodySmall?.color; + + return Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Remove Tracking Parameters', style: textTheme.titleLarge), + const SizedBox(height: 8), + Text( + 'Select parameters to strip from this URL.', + style: textTheme.bodyMedium?.copyWith(color: subtitleColor), + ), + const SizedBox(height: 16), + ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 220), + child: ListView.separated( + shrinkWrap: true, + itemCount: _items.length, + separatorBuilder: (context, index) => + Divider(height: 1, color: colorScheme.outlineVariant), + itemBuilder: (context, index) { + final item = _items[index]; + final display = _splitMatch(item.match); + + return CheckboxListTile( + contentPadding: EdgeInsets.zero, + controlAffinity: ListTileControlAffinity.leading, + activeColor: colorScheme.primary, + checkColor: colorScheme.onPrimary, + title: Padding( + padding: const EdgeInsets.only(top: 8, bottom: 4), + child: Row( + children: [ + Expanded( + child: Text( + display.key, + style: textTheme.bodyMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ), + if (item.type == UrlCleanerMatchType.referralRule) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 3, + ), + decoration: BoxDecoration( + color: colorScheme.tertiaryContainer, + borderRadius: BorderRadius.circular(999), + ), + child: Text( + 'Referral marketing', + style: TextStyle( + color: colorScheme.onTertiaryContainer, + fontSize: 11, + ), + ), + ), + ], + ), + ), + subtitle: display.value == null + ? null + : Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Text( + display.value!, + style: textTheme.bodySmall?.copyWith( + fontFamily: 'monospace', + ), + ), + ), + value: _selected[index], + onChanged: canApply + ? (checked) { + setState(() { + _selected[index] = checked ?? false; + }); + } + : null, + ); + }, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Text( + '$selectedCount of ${_items.length} selected for removal', + style: textTheme.bodySmall?.copyWith( + fontStyle: FontStyle.italic, + ), + ), + ), + Text( + 'Cleaned URL:', + style: textTheme.bodyMedium?.copyWith( + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 8), + Container( + width: double.infinity, + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: colorScheme.surfaceContainerHighest, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: colorScheme.outlineVariant), + ), + child: SelectableText( + _previewUrl, + style: textTheme.bodySmall?.copyWith( + fontFamily: 'monospace', + height: 1.4, + ), + ), + ), + const SizedBox(height: 24), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(canApply ? 'Cancel' : 'Close'), + ), + if (canApply) ...[ + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + widget.onApplySelectedRemovals!(_previewUrl); + Navigator.pop(context); + }, + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.primary, + foregroundColor: colorScheme.onPrimary, + ), + child: const Text('Apply Changes'), + ), + ], + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/url_cleaner_restore_defaults_dialog.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/url_cleaner_restore_defaults_dialog.dart new file mode 100644 index 00000000..7c36192d --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/dialogs/url_cleaner_restore_defaults_dialog.dart @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:flutter/material.dart'; + +Future showUrlCleanerRestoreDefaultsDialog(BuildContext context) { + return showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Restore defaults?'), + content: const Text( + 'This will reset URL cleaner settings and remove the locally stored catalog.', + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, false), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => Navigator.pop(context, true), + child: const Text('Restore'), + ), + ], + ), + ); +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/screens/unshortener_settings.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/screens/unshortener_settings.dart new file mode 100644 index 00000000..6d2d9a44 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/screens/unshortener_settings.dart @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:async'; + +import 'package:fading_scroll/fading_scroll.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/utils/open_in_custom_tab.dart'; +import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; +import 'package:weblibre/features/settings/presentation/widgets/sections.dart'; +import 'package:weblibre/features/user/data/models/general_settings.dart'; +import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; + +class UnshortenerSettingsScreen extends StatelessWidget { + const UnshortenerSettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Unshortener')), + body: SafeArea( + child: FadingScroll( + fadingSize: 25, + builder: (context, controller) { + return ListView( + controller: controller, + padding: const EdgeInsets.symmetric(horizontal: 12.0), + children: const [ + SettingSection(name: 'Unshortener'), + _UnshortenerDescriptionTile(), + SettingSection(name: 'Behavior'), + _UnshortenerEnabledTile(), + _UnshortenerTokenField(), + SettingSection(name: 'Attribution'), + _UnshortenerAttributionTile(), + ], + ); + }, + ), + ), + ); + } +} + +class _UnshortenerEnabledTile extends HookConsumerWidget { + const _UnshortenerEnabledTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final enabled = ref.watch( + generalSettingsWithDefaultsProvider.select((s) => s.unshortenerEnabled), + ); + + return SwitchListTile.adaptive( + title: const Text('Enable Unshortener'), + subtitle: const Text('Resolve shortened URLs to their destination'), + secondary: const Icon(MdiIcons.linkVariant), + value: enabled, + onChanged: (value) async { + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save((current) => current.copyWith(unshortenerEnabled: value)); + }, + ); + } +} + +class _UnshortenerDescriptionTile extends StatelessWidget { + const _UnshortenerDescriptionTile(); + + @override + Widget build(BuildContext context) { + return const ListTile( + leading: Icon(MdiIcons.linkVariant), + title: Text('Description'), + subtitle: Text( + 'This module will unshort links by sending them to unshorten.me, ' + 'which evaluates them on their servers and saves the redirection for future requests. ' + 'Avoid unshortening links with private or sensitive data.', + ), + ); + } +} + +class _UnshortenerAttributionTile extends StatelessWidget { + const _UnshortenerAttributionTile(); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: const Icon(MdiIcons.informationOutline), + title: Padding( + padding: const EdgeInsets.only(top: 8), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'The free API is rate limited to 10 requests per hour for new checks.', + style: Theme.of(context).textTheme.bodySmall, + ), + const SizedBox(height: 12), + const _AttributionLinkRow( + label: 'Service', + url: 'https://unshorten.me/', + ), + const SizedBox(height: 8), + const _AttributionLinkRow( + label: 'Privacy policy', + url: 'https://unshorten.me/privacy-policy', + ), + ], + ), + ), + ); + } +} + +class _UnshortenerTokenField extends HookConsumerWidget { + const _UnshortenerTokenField(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final token = ref.watch( + generalSettingsWithDefaultsProvider.select((s) => s.unshortenerToken), + ); + final controller = useTextEditingController(text: token); + final focusNode = useFocusNode(); + + Future saveToken() async { + final value = controller.text; + if (value == token) return; + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save((current) => current.copyWith(unshortenerToken: value)); + } + + useOnListenableChange(focusNode, () { + if (!focusNode.hasFocus) unawaited(saveToken()); + }); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: TextField( + controller: controller, + focusNode: focusNode, + decoration: const InputDecoration( + labelText: 'API Token', + hintText: 'Optional token for higher limits', + floatingLabelBehavior: FloatingLabelBehavior.always, + ), + obscureText: true, + onSubmitted: (_) => saveToken(), + ), + ); + } +} + +class _AttributionLinkRow extends StatelessWidget { + final String label; + final String url; + + const _AttributionLinkRow({required this.label, required this.url}); + + @override + Widget build(BuildContext context) { + final linkStyle = Theme.of(context).textTheme.bodyMedium?.copyWith( + color: Theme.of(context).colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: Theme.of(context).colorScheme.primary, + ); + + return InkWell( + borderRadius: BorderRadius.circular(6), + onTap: () { + unawaited(openInPrivateCustomTab(context, url)); + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 96, + child: Text(label, style: Theme.of(context).textTheme.bodySmall), + ), + Expanded(child: Text(url, style: linkStyle)), + const SizedBox(width: 8), + Icon( + Icons.open_in_new, + size: 16, + color: Theme.of(context).colorScheme.primary, + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/screens/url_cleaner_settings.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/screens/url_cleaner_settings.dart new file mode 100644 index 00000000..064e780c --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/screens/url_cleaner_settings.dart @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:fading_scroll/fading_scroll.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:weblibre/core/providers/format.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_catalog_service.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/dialogs/url_cleaner_restore_defaults_dialog.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/widgets/attribution_link.dart'; +import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; +import 'package:weblibre/features/settings/presentation/widgets/sections.dart'; +import 'package:weblibre/features/user/data/models/general_settings.dart'; +import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; +import 'package:weblibre/utils/ui_helper.dart'; + +class UrlCleanerSettingsScreen extends StatelessWidget { + const UrlCleanerSettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('URL Cleaner')), + body: SafeArea( + child: FadingScroll( + fadingSize: 25, + builder: (context, controller) { + return ListView( + controller: controller, + padding: const EdgeInsets.symmetric(horizontal: 12.0), + children: const [ + SettingSection(name: 'URL Cleaner'), + _UrlCleanerDescriptionTile(), + SettingSection(name: 'Behavior'), + _UrlCleanerEnabledTile(), + _UrlCleanerAutoApplyTile(), + _UrlCleanerAllowReferralTile(), + SettingSection(name: 'Catalog'), + _UrlCleanerAutoUpdateTile(), + _UrlCleanerUpdateButton(), + _UrlCleanerRestoreDefaultsButton(), + SettingSection(name: 'Attribution'), + _UrlCleanerAttributionTile(), + ], + ); + }, + ), + ), + ); + } +} + +class _UrlCleanerDescriptionTile extends StatelessWidget { + const _UrlCleanerDescriptionTile(); + + @override + Widget build(BuildContext context) { + return const ListTile( + title: Text('Description'), + subtitle: Text( + 'This module removes tracking, referrer and other useless parameters from the URL. ' + 'It also allows for common offline URL redirections.', + ), + leading: Icon(MdiIcons.broom), + ); + } +} + +class _UrlCleanerEnabledTile extends HookConsumerWidget { + const _UrlCleanerEnabledTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final enabled = ref.watch( + generalSettingsWithDefaultsProvider.select((s) => s.urlCleanerEnabled), + ); + + return SwitchListTile.adaptive( + title: const Text('Enable URL Cleaner'), + subtitle: const Text('Remove tracking parameters from URLs'), + secondary: const Icon(MdiIcons.broom), + value: enabled, + onChanged: (value) async { + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save((current) => current.copyWith(urlCleanerEnabled: value)); + }, + ); + } +} + +class _UrlCleanerAutoApplyTile extends HookConsumerWidget { + const _UrlCleanerAutoApplyTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final autoApply = ref.watch( + generalSettingsWithDefaultsProvider.select((s) => s.urlCleanerAutoApply), + ); + + return SwitchListTile.adaptive( + title: const Text('Auto-apply'), + subtitle: const Text('Automatically replace URL with cleaned version'), + secondary: const Icon(MdiIcons.autoFix), + value: autoApply, + onChanged: (value) async { + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save((current) => current.copyWith(urlCleanerAutoApply: value)); + }, + ); + } +} + +class _UrlCleanerAllowReferralTile extends HookConsumerWidget { + const _UrlCleanerAllowReferralTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final allowReferral = ref.watch( + generalSettingsWithDefaultsProvider.select( + (s) => s.urlCleanerAllowReferralMarketing, + ), + ); + + return SwitchListTile.adaptive( + title: const Text('Allow referral marketing'), + subtitle: const Text('Keep referral and affiliate tracking parameters'), + secondary: const Icon(MdiIcons.cashMultiple), + value: allowReferral, + onChanged: (value) async { + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save( + (current) => + current.copyWith(urlCleanerAllowReferralMarketing: value), + ); + }, + ); + } +} + +class _UrlCleanerAutoUpdateTile extends HookConsumerWidget { + const _UrlCleanerAutoUpdateTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final autoUpdate = ref.watch( + generalSettingsWithDefaultsProvider.select((s) => s.urlCleanerAutoUpdate), + ); + + return SwitchListTile.adaptive( + title: const Text('Auto-update catalog'), + subtitle: const Text('Check for rule updates weekly'), + secondary: const Icon(MdiIcons.update), + value: autoUpdate, + onChanged: (value) async { + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save((current) => current.copyWith(urlCleanerAutoUpdate: value)); + }, + ); + } +} + +class _UrlCleanerUpdateButton extends HookConsumerWidget { + const _UrlCleanerUpdateButton(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isUpdating = useState(false); + final lastCheckEpochMs = ref.watch( + generalSettingsWithDefaultsProvider.select( + (s) => s.urlCleanerLastCheckEpochMs, + ), + ); + final lastUpdateWasAuto = ref.watch( + generalSettingsWithDefaultsProvider.select( + (s) => s.urlCleanerLastUpdateWasAuto, + ), + ); + final lastUpdateAsync = useFuture( + useMemoized( + () => ref.read(urlCleanerCatalogServiceProvider.notifier).lastUpdate(), + [lastCheckEpochMs], + ), + ); + final lastUpdate = lastUpdateAsync.data; + + final lastCheck = lastCheckEpochMs != null + ? DateTime.fromMillisecondsSinceEpoch(lastCheckEpochMs) + : null; + + final subtitle = StringBuffer( + lastUpdate == null + ? 'Last update: not available' + : 'Last update: ${ref.read(formatProvider.notifier).shortDate(lastUpdate)}', + ); + if (lastCheck != null) { + subtitle.write( + '\nLast check: ${ref.read(formatProvider.notifier).shortDate(lastCheck)}', + ); + } + if (lastUpdateWasAuto) { + subtitle.write(' (auto)'); + } + + return ListTile( + title: const Text('Update catalog'), + subtitle: Text(subtitle.toString()), + leading: const Icon(MdiIcons.cloudDownload), + trailing: isUpdating.value + ? const SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : null, + onTap: isUpdating.value + ? null + : () async { + isUpdating.value = true; + try { + await ref + .read(urlCleanerCatalogServiceProvider.notifier) + .updateCatalog(); + if (context.mounted) { + showInfoMessage(context, 'Catalog updated'); + } + } catch (e) { + if (context.mounted) { + showErrorMessage(context, 'Update failed: $e'); + } + } finally { + isUpdating.value = false; + } + }, + ); + } +} + +class _UrlCleanerRestoreDefaultsButton extends HookConsumerWidget { + const _UrlCleanerRestoreDefaultsButton(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return ListTile( + title: const Text('Restore defaults'), + subtitle: const Text('Reset to bundled catalog and default settings'), + leading: const Icon(MdiIcons.restore), + onTap: () async { + final confirmed = await showUrlCleanerRestoreDefaultsDialog(context); + + if (confirmed == true) { + final defaultSettings = GeneralSettings.withDefaults(); + + await ref + .read(urlCleanerCatalogServiceProvider.notifier) + .restoreBundledCatalog(); + + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save( + (current) => current.copyWith( + urlCleanerEnabled: defaultSettings.urlCleanerEnabled, + urlCleanerAutoApply: defaultSettings.urlCleanerAutoApply, + urlCleanerAllowReferralMarketing: + defaultSettings.urlCleanerAllowReferralMarketing, + urlCleanerCatalogUrl: defaultSettings.urlCleanerCatalogUrl, + urlCleanerHashUrl: defaultSettings.urlCleanerHashUrl, + urlCleanerAutoUpdate: defaultSettings.urlCleanerAutoUpdate, + urlCleanerLastCheckEpochMs: + defaultSettings.urlCleanerLastCheckEpochMs, + urlCleanerLastUpdateWasAuto: + defaultSettings.urlCleanerLastUpdateWasAuto, + ), + ); + } + }, + ); + } +} + +class _UrlCleanerAttributionTile extends StatelessWidget { + const _UrlCleanerAttributionTile(); + + @override + Widget build(BuildContext context) { + final textColor = Theme.of(context).textTheme.bodyMedium?.color; + final linkStyle = TextStyle( + color: Theme.of(context).colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: Theme.of(context).colorScheme.primary, + ); + + return ListTile( + title: RichText( + text: TextSpan( + style: Theme.of( + context, + ).textTheme.bodyMedium?.copyWith(color: textColor), + children: [ + const TextSpan(text: 'This module is based on the ClearURL rules:'), + WidgetSpan( + alignment: PlaceholderAlignment.baseline, + baseline: TextBaseline.alphabetic, + child: AttributionLink( + label: 'https://docs.clearurls.xyz/latest/specs/rules/', + url: 'https://docs.clearurls.xyz/latest/specs/rules/', + style: linkStyle, + ), + ), + ], + ), + ), + leading: const Icon(MdiIcons.informationOutline), + dense: false, + ); + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/utils/open_in_custom_tab.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/utils/open_in_custom_tab.dart new file mode 100644 index 00000000..cc329e44 --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/utils/open_in_custom_tab.dart @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:flutter/material.dart'; +import 'package:flutter_mozilla_components/flutter_mozilla_components.dart' + show GeckoBrowserService; +import 'package:weblibre/utils/ui_helper.dart'; + +Future openInPrivateCustomTab(BuildContext context, String url) async { + try { + await GeckoBrowserService().openInCustomTab( + url: Uri.parse(url), + private: true, + ); + } catch (e) { + if (context.mounted) { + showErrorMessage(context, 'Could not open link: $url'); + } + } +} diff --git a/app/lib/features/geckoview/features/open_link_tools/presentation/widgets/attribution_link.dart b/app/lib/features/geckoview/features/open_link_tools/presentation/widgets/attribution_link.dart new file mode 100644 index 00000000..3e31a30d --- /dev/null +++ b/app/lib/features/geckoview/features/open_link_tools/presentation/widgets/attribution_link.dart @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/presentation/utils/open_in_custom_tab.dart'; + +class AttributionLink extends StatelessWidget { + final String label; + final String url; + final TextStyle style; + + const AttributionLink({ + super.key, + required this.label, + required this.url, + required this.style, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + unawaited(openInPrivateCustomTab(context, url)); + }, + child: Text(label, style: style), + ); + } +} diff --git a/app/lib/features/settings/presentation/screens/privacy_security_settings.dart b/app/lib/features/settings/presentation/screens/privacy_security_settings.dart index b455b3c4..4fb5ce26 100644 --- a/app/lib/features/settings/presentation/screens/privacy_security_settings.dart +++ b/app/lib/features/settings/presentation/screens/privacy_security_settings.dart @@ -21,7 +21,6 @@ import 'package:fading_scroll/fading_scroll.dart'; import 'package:flutter/material.dart'; import 'package:flutter_material_design_icons/flutter_material_design_icons.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; -import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nullability/nullability.dart'; import 'package:weblibre/core/routing/routes.dart'; @@ -50,6 +49,7 @@ class PrivacySecuritySettingsScreen extends StatelessWidget { children: const [ _PrivacyModesSection(), _TrackingProtectionSection(), + _OpenLinkModulesSection(), _ConnectionSecuritySection(), _DataManagementSection(), _AdvancedSection(), @@ -104,7 +104,9 @@ class _TrackingProtectionExceptionsTile extends StatelessWidget { title: const Text('Tracking Protection Exceptions'), subtitle: const Text('Sites where tracking protection is disabled'), trailing: const Icon(Icons.chevron_right), - onTap: () => context.push('/settings/tracking_protection_exceptions'), + onTap: () async { + await TrackingProtectionExceptionsRoute().push(context); + }, ); } } @@ -124,6 +126,55 @@ class _ConnectionSecuritySection extends StatelessWidget { } } +class _OpenLinkModulesSection extends StatelessWidget { + const _OpenLinkModulesSection(); + + @override + Widget build(BuildContext context) { + return const Column( + children: [ + SettingSection(name: 'Open Link Modules'), + _UrlCleanerSettingsTile(), + _UnshortenerSettingsTile(), + ], + ); + } +} + +class _UrlCleanerSettingsTile extends StatelessWidget { + const _UrlCleanerSettingsTile(); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: const Icon(MdiIcons.broom), + title: const Text('URL Cleaner'), + subtitle: const Text('Tracking removal rules and catalog updates'), + trailing: const Icon(Icons.chevron_right), + onTap: () async { + await UrlCleanerSettingsRoute().push(context); + }, + ); + } +} + +class _UnshortenerSettingsTile extends StatelessWidget { + const _UnshortenerSettingsTile(); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: const Icon(MdiIcons.linkVariant), + title: const Text('Unshortener'), + subtitle: const Text('Short link resolver and API token'), + trailing: const Icon(Icons.chevron_right), + onTap: () async { + await UnshortenerSettingsRoute().push(context); + }, + ); + } +} + class _DataManagementSection extends StatelessWidget { const _DataManagementSection(); diff --git a/app/lib/features/user/data/models/general_settings.dart b/app/lib/features/user/data/models/general_settings.dart index 8830c53b..a2e32ee3 100644 --- a/app/lib/features/user/data/models/general_settings.dart +++ b/app/lib/features/user/data/models/general_settings.dart @@ -91,6 +91,16 @@ class GeneralSettings with FastEquatable { final bool drawerGestureEnabled; final String syncServerOverride; final String syncTokenServerOverride; + final bool urlCleanerEnabled; + final bool urlCleanerAutoApply; + final bool urlCleanerAllowReferralMarketing; + final String urlCleanerCatalogUrl; + final String urlCleanerHashUrl; + final bool urlCleanerAutoUpdate; + final int? urlCleanerLastCheckEpochMs; + final bool urlCleanerLastUpdateWasAuto; + final bool unshortenerEnabled; + final String unshortenerToken; GeneralSettings({ required this.themeMode, @@ -124,6 +134,16 @@ class GeneralSettings with FastEquatable { required this.drawerGestureEnabled, required this.syncServerOverride, required this.syncTokenServerOverride, + required this.urlCleanerEnabled, + required this.urlCleanerAutoApply, + required this.urlCleanerAllowReferralMarketing, + required this.urlCleanerCatalogUrl, + required this.urlCleanerHashUrl, + required this.urlCleanerAutoUpdate, + required this.urlCleanerLastCheckEpochMs, + required this.urlCleanerLastUpdateWasAuto, + required this.unshortenerEnabled, + required this.unshortenerToken, }); GeneralSettings.withDefaults({ @@ -158,6 +178,16 @@ class GeneralSettings with FastEquatable { bool? drawerGestureEnabled, String? syncServerOverride, String? syncTokenServerOverride, + bool? urlCleanerEnabled, + bool? urlCleanerAutoApply, + bool? urlCleanerAllowReferralMarketing, + String? urlCleanerCatalogUrl, + String? urlCleanerHashUrl, + bool? urlCleanerAutoUpdate, + this.urlCleanerLastCheckEpochMs, + bool? urlCleanerLastUpdateWasAuto, + bool? unshortenerEnabled, + String? unshortenerToken, }) : themeMode = themeMode ?? ThemeMode.dark, enableReadability = enableReadability ?? true, enforceReadability = enforceReadability ?? false, @@ -192,7 +222,21 @@ class GeneralSettings with FastEquatable { quickTabSwitcherShowTitles = quickTabSwitcherShowTitles ?? true, drawerGestureEnabled = drawerGestureEnabled ?? false, syncServerOverride = syncServerOverride ?? '', - syncTokenServerOverride = syncTokenServerOverride ?? ''; + syncTokenServerOverride = syncTokenServerOverride ?? '', + urlCleanerEnabled = urlCleanerEnabled ?? true, + urlCleanerAutoApply = urlCleanerAutoApply ?? false, + urlCleanerAllowReferralMarketing = + urlCleanerAllowReferralMarketing ?? false, + urlCleanerCatalogUrl = + urlCleanerCatalogUrl ?? + 'https://rules2.clearurls.xyz/data.minify.json', + urlCleanerHashUrl = + urlCleanerHashUrl ?? + 'https://rules2.clearurls.xyz/rules.minify.hash', + urlCleanerAutoUpdate = urlCleanerAutoUpdate ?? false, + urlCleanerLastUpdateWasAuto = urlCleanerLastUpdateWasAuto ?? false, + unshortenerEnabled = unshortenerEnabled ?? false, + unshortenerToken = unshortenerToken ?? ''; factory GeneralSettings.fromJson(Map json) => _$GeneralSettingsFromJson(json); @@ -232,5 +276,15 @@ class GeneralSettings with FastEquatable { drawerGestureEnabled, syncServerOverride, syncTokenServerOverride, + urlCleanerEnabled, + urlCleanerAutoApply, + urlCleanerAllowReferralMarketing, + urlCleanerCatalogUrl, + urlCleanerHashUrl, + urlCleanerAutoUpdate, + urlCleanerLastCheckEpochMs, + urlCleanerLastUpdateWasAuto, + unshortenerEnabled, + unshortenerToken, ]; } diff --git a/app/lib/features/user/data/models/general_settings.g.dart b/app/lib/features/user/data/models/general_settings.g.dart index 232ed371..095d50a8 100644 --- a/app/lib/features/user/data/models/general_settings.g.dart +++ b/app/lib/features/user/data/models/general_settings.g.dart @@ -81,6 +81,28 @@ abstract class _$GeneralSettingsCWProxy { GeneralSettings syncTokenServerOverride(String syncTokenServerOverride); + GeneralSettings urlCleanerEnabled(bool urlCleanerEnabled); + + GeneralSettings urlCleanerAutoApply(bool urlCleanerAutoApply); + + GeneralSettings urlCleanerAllowReferralMarketing( + bool urlCleanerAllowReferralMarketing, + ); + + GeneralSettings urlCleanerCatalogUrl(String urlCleanerCatalogUrl); + + GeneralSettings urlCleanerHashUrl(String urlCleanerHashUrl); + + GeneralSettings urlCleanerAutoUpdate(bool urlCleanerAutoUpdate); + + GeneralSettings urlCleanerLastCheckEpochMs(int? urlCleanerLastCheckEpochMs); + + GeneralSettings urlCleanerLastUpdateWasAuto(bool urlCleanerLastUpdateWasAuto); + + GeneralSettings unshortenerEnabled(bool unshortenerEnabled); + + GeneralSettings unshortenerToken(String unshortenerToken); + /// Creates a new instance with the provided field values. /// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `GeneralSettings(...).copyWith.fieldName(value)`. /// @@ -120,6 +142,16 @@ abstract class _$GeneralSettingsCWProxy { bool drawerGestureEnabled, String syncServerOverride, String syncTokenServerOverride, + bool urlCleanerEnabled, + bool urlCleanerAutoApply, + bool urlCleanerAllowReferralMarketing, + String urlCleanerCatalogUrl, + String urlCleanerHashUrl, + bool urlCleanerAutoUpdate, + int? urlCleanerLastCheckEpochMs, + bool urlCleanerLastUpdateWasAuto, + bool unshortenerEnabled, + String unshortenerToken, }); } @@ -259,6 +291,48 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { GeneralSettings syncTokenServerOverride(String syncTokenServerOverride) => call(syncTokenServerOverride: syncTokenServerOverride); + @override + GeneralSettings urlCleanerEnabled(bool urlCleanerEnabled) => + call(urlCleanerEnabled: urlCleanerEnabled); + + @override + GeneralSettings urlCleanerAutoApply(bool urlCleanerAutoApply) => + call(urlCleanerAutoApply: urlCleanerAutoApply); + + @override + GeneralSettings urlCleanerAllowReferralMarketing( + bool urlCleanerAllowReferralMarketing, + ) => call(urlCleanerAllowReferralMarketing: urlCleanerAllowReferralMarketing); + + @override + GeneralSettings urlCleanerCatalogUrl(String urlCleanerCatalogUrl) => + call(urlCleanerCatalogUrl: urlCleanerCatalogUrl); + + @override + GeneralSettings urlCleanerHashUrl(String urlCleanerHashUrl) => + call(urlCleanerHashUrl: urlCleanerHashUrl); + + @override + GeneralSettings urlCleanerAutoUpdate(bool urlCleanerAutoUpdate) => + call(urlCleanerAutoUpdate: urlCleanerAutoUpdate); + + @override + GeneralSettings urlCleanerLastCheckEpochMs(int? urlCleanerLastCheckEpochMs) => + call(urlCleanerLastCheckEpochMs: urlCleanerLastCheckEpochMs); + + @override + GeneralSettings urlCleanerLastUpdateWasAuto( + bool urlCleanerLastUpdateWasAuto, + ) => call(urlCleanerLastUpdateWasAuto: urlCleanerLastUpdateWasAuto); + + @override + GeneralSettings unshortenerEnabled(bool unshortenerEnabled) => + call(unshortenerEnabled: unshortenerEnabled); + + @override + GeneralSettings unshortenerToken(String unshortenerToken) => + call(unshortenerToken: unshortenerToken); + @override /// Creates a new instance with the provided field values. /// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `GeneralSettings(...).copyWith.fieldName(value)`. @@ -299,6 +373,16 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { Object? drawerGestureEnabled = const $CopyWithPlaceholder(), Object? syncServerOverride = const $CopyWithPlaceholder(), Object? syncTokenServerOverride = const $CopyWithPlaceholder(), + Object? urlCleanerEnabled = const $CopyWithPlaceholder(), + Object? urlCleanerAutoApply = const $CopyWithPlaceholder(), + Object? urlCleanerAllowReferralMarketing = const $CopyWithPlaceholder(), + Object? urlCleanerCatalogUrl = const $CopyWithPlaceholder(), + Object? urlCleanerHashUrl = const $CopyWithPlaceholder(), + Object? urlCleanerAutoUpdate = const $CopyWithPlaceholder(), + Object? urlCleanerLastCheckEpochMs = const $CopyWithPlaceholder(), + Object? urlCleanerLastUpdateWasAuto = const $CopyWithPlaceholder(), + Object? unshortenerEnabled = const $CopyWithPlaceholder(), + Object? unshortenerToken = const $CopyWithPlaceholder(), }) { return GeneralSettings( themeMode: themeMode == const $CopyWithPlaceholder() || themeMode == null @@ -483,6 +567,65 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { ? _value.syncTokenServerOverride // ignore: cast_nullable_to_non_nullable : syncTokenServerOverride as String, + urlCleanerEnabled: + urlCleanerEnabled == const $CopyWithPlaceholder() || + urlCleanerEnabled == null + ? _value.urlCleanerEnabled + // ignore: cast_nullable_to_non_nullable + : urlCleanerEnabled as bool, + urlCleanerAutoApply: + urlCleanerAutoApply == const $CopyWithPlaceholder() || + urlCleanerAutoApply == null + ? _value.urlCleanerAutoApply + // ignore: cast_nullable_to_non_nullable + : urlCleanerAutoApply as bool, + urlCleanerAllowReferralMarketing: + urlCleanerAllowReferralMarketing == const $CopyWithPlaceholder() || + urlCleanerAllowReferralMarketing == null + ? _value.urlCleanerAllowReferralMarketing + // ignore: cast_nullable_to_non_nullable + : urlCleanerAllowReferralMarketing as bool, + urlCleanerCatalogUrl: + urlCleanerCatalogUrl == const $CopyWithPlaceholder() || + urlCleanerCatalogUrl == null + ? _value.urlCleanerCatalogUrl + // ignore: cast_nullable_to_non_nullable + : urlCleanerCatalogUrl as String, + urlCleanerHashUrl: + urlCleanerHashUrl == const $CopyWithPlaceholder() || + urlCleanerHashUrl == null + ? _value.urlCleanerHashUrl + // ignore: cast_nullable_to_non_nullable + : urlCleanerHashUrl as String, + urlCleanerAutoUpdate: + urlCleanerAutoUpdate == const $CopyWithPlaceholder() || + urlCleanerAutoUpdate == null + ? _value.urlCleanerAutoUpdate + // ignore: cast_nullable_to_non_nullable + : urlCleanerAutoUpdate as bool, + urlCleanerLastCheckEpochMs: + urlCleanerLastCheckEpochMs == const $CopyWithPlaceholder() + ? _value.urlCleanerLastCheckEpochMs + // ignore: cast_nullable_to_non_nullable + : urlCleanerLastCheckEpochMs as int?, + urlCleanerLastUpdateWasAuto: + urlCleanerLastUpdateWasAuto == const $CopyWithPlaceholder() || + urlCleanerLastUpdateWasAuto == null + ? _value.urlCleanerLastUpdateWasAuto + // ignore: cast_nullable_to_non_nullable + : urlCleanerLastUpdateWasAuto as bool, + unshortenerEnabled: + unshortenerEnabled == const $CopyWithPlaceholder() || + unshortenerEnabled == null + ? _value.unshortenerEnabled + // ignore: cast_nullable_to_non_nullable + : unshortenerEnabled as bool, + unshortenerToken: + unshortenerToken == const $CopyWithPlaceholder() || + unshortenerToken == null + ? _value.unshortenerToken + // ignore: cast_nullable_to_non_nullable + : unshortenerToken as String, ); } } @@ -564,6 +707,18 @@ GeneralSettings _$GeneralSettingsFromJson( drawerGestureEnabled: json['drawerGestureEnabled'] as bool?, syncServerOverride: json['syncServerOverride'] as String?, syncTokenServerOverride: json['syncTokenServerOverride'] as String?, + urlCleanerEnabled: json['urlCleanerEnabled'] as bool?, + urlCleanerAutoApply: json['urlCleanerAutoApply'] as bool?, + urlCleanerAllowReferralMarketing: + json['urlCleanerAllowReferralMarketing'] as bool?, + urlCleanerCatalogUrl: json['urlCleanerCatalogUrl'] as String?, + urlCleanerHashUrl: json['urlCleanerHashUrl'] as String?, + urlCleanerAutoUpdate: json['urlCleanerAutoUpdate'] as bool?, + urlCleanerLastCheckEpochMs: (json['urlCleanerLastCheckEpochMs'] as num?) + ?.toInt(), + urlCleanerLastUpdateWasAuto: json['urlCleanerLastUpdateWasAuto'] as bool?, + unshortenerEnabled: json['unshortenerEnabled'] as bool?, + unshortenerToken: json['unshortenerToken'] as String?, ); Map _$GeneralSettingsToJson( @@ -609,6 +764,16 @@ Map _$GeneralSettingsToJson( 'drawerGestureEnabled': instance.drawerGestureEnabled, 'syncServerOverride': instance.syncServerOverride, 'syncTokenServerOverride': instance.syncTokenServerOverride, + 'urlCleanerEnabled': instance.urlCleanerEnabled, + 'urlCleanerAutoApply': instance.urlCleanerAutoApply, + 'urlCleanerAllowReferralMarketing': instance.urlCleanerAllowReferralMarketing, + 'urlCleanerCatalogUrl': instance.urlCleanerCatalogUrl, + 'urlCleanerHashUrl': instance.urlCleanerHashUrl, + 'urlCleanerAutoUpdate': instance.urlCleanerAutoUpdate, + 'urlCleanerLastCheckEpochMs': instance.urlCleanerLastCheckEpochMs, + 'urlCleanerLastUpdateWasAuto': instance.urlCleanerLastUpdateWasAuto, + 'unshortenerEnabled': instance.unshortenerEnabled, + 'unshortenerToken': instance.unshortenerToken, }; const _$ThemeModeEnumMap = { diff --git a/app/lib/features/user/domain/repositories/general_settings.dart b/app/lib/features/user/domain/repositories/general_settings.dart index c3804469..3be83f14 100644 --- a/app/lib/features/user/domain/repositories/general_settings.dart +++ b/app/lib/features/user/domain/repositories/general_settings.dart @@ -163,6 +163,43 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository { DriftSqlType.string, db.typeMapping, ), + 'urlCleanerEnabled': settings['urlCleanerEnabled']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), + 'urlCleanerAutoApply': settings['urlCleanerAutoApply']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), + 'urlCleanerAllowReferralMarketing': + settings['urlCleanerAllowReferralMarketing']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), + 'urlCleanerCatalogUrl': settings['urlCleanerCatalogUrl']?.readAs( + DriftSqlType.string, + db.typeMapping, + ), + 'urlCleanerHashUrl': settings['urlCleanerHashUrl']?.readAs( + DriftSqlType.string, + db.typeMapping, + ), + 'urlCleanerAutoUpdate': settings['urlCleanerAutoUpdate']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), + 'urlCleanerLastCheckEpochMs': settings['urlCleanerLastCheckEpochMs'] + ?.readAs(DriftSqlType.int, db.typeMapping), + 'urlCleanerLastUpdateWasAuto': settings['urlCleanerLastUpdateWasAuto'] + ?.readAs(DriftSqlType.bool, db.typeMapping), + 'unshortenerEnabled': settings['unshortenerEnabled']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), + 'unshortenerToken': settings['unshortenerToken']?.readAs( + DriftSqlType.string, + db.typeMapping, + ), }); } diff --git a/app/lib/features/user/domain/repositories/general_settings.g.dart b/app/lib/features/user/domain/repositories/general_settings.g.dart index 0b47d2f1..470fb1f3 100644 --- a/app/lib/features/user/domain/repositories/general_settings.g.dart +++ b/app/lib/features/user/domain/repositories/general_settings.g.dart @@ -35,7 +35,7 @@ final class GeneralSettingsRepositoryProvider } String _$generalSettingsRepositoryHash() => - r'ed5bca200b840e0802980b85a0c0f682d7b24a8c'; + r'83aed230cdc33b3e15b91fdb433427faaa8c7cc7'; abstract class _$GeneralSettingsRepository extends $StreamNotifier { diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 2a10fcd1..9a6a6521 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: copy_with_extension: ^11.0.0 country_codes: ^3.3.0 country_flags: ^4.1.2 + crypto: ^3.0.6 cryptography_flutter: ^2.3.4 device_info_plus: ^12.3.0 drift: ^2.31.0 diff --git a/app/test/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service_test.dart b/app/test/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service_test.dart new file mode 100644 index 00000000..54ddf26b --- /dev/null +++ b/app/test/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service_test.dart @@ -0,0 +1,1171 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'package:flutter_test/flutter_test.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/entities/url_cleaner_result.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_rule.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_cleaner_service.dart'; + +void main() { + group('cleanUrl', () { + group('basic rule matching', () { + test('returns unchanged URL when no rules match', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.org', + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl('https://different.com?utm_source=test', rules); + + expect(result.changed, isFalse); + expect(result.cleanedUrl, 'https://different.com?utm_source=test'); + expect(result.blocked, isFalse); + }); + + test('returns unchanged URL when no rules provided', () { + final result = cleanUrl('https://example.com?foo=bar', []); + + expect(result.changed, isFalse); + expect(result.cleanedUrl, 'https://example.com?foo=bar'); + }); + + test('matches urlPattern case-insensitively', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['tracking'], + ), + ), + ]; + + final result = cleanUrl('HTTPS://EXAMPLE.COM?tracking=abc', rules); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'HTTPS://EXAMPLE.COM'); + }); + + test('skips provider when urlPattern is null', () { + final rules = [ + UrlCleanerRule( + name: 'broken', + data: UrlCleanerRuleData(rules: ['utm_source']), + ), + ]; + + final result = cleanUrl('https://example.com?utm_source=test', rules); + + expect(result.changed, isFalse); + }); + }); + + group('query parameter removal (rules)', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source', 'utm_medium', 'utm_campaign'], + ), + ), + ]; + + test('removes single tracking parameter', () { + final result = cleanUrl('https://example.com?utm_source=google', rules); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com'); + }); + + test('removes multiple tracking parameters', () { + final result = cleanUrl( + 'https://example.com?utm_source=google&utm_medium=email&utm_campaign=sale', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com'); + }); + + test('preserves non-tracked parameters', () { + final result = cleanUrl( + 'https://example.com?page=1&utm_source=google&sort=date', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com?page=1&sort=date'); + }); + + test('removes parameter with regex pattern', () { + final regexRules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['p[fd]_rd_[a-z]*'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?pd_rd_foo=bar&pf_rd_baz=qux&keep=yes', + regexRules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com?keep=yes'); + }); + + test('handles parameter in fragment', () { + final result = cleanUrl( + 'https://example.com?keep=yes#section&utm_source=test', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com?keep=yes#section'); + }); + }); + + group('rawRules', () { + test('removes matching raw regex pattern from URL', () { + final rules = [ + UrlCleanerRule( + name: 'amazon', + data: UrlCleanerRuleData( + urlPattern: r'^https?://(?:[a-z0-9-]+\.)*?amazon\.com', + rawRules: [r'\/ref=[^/?]*'], + ), + ), + ]; + + final result = cleanUrl( + 'https://www.amazon.com/dp/B08N5WRWNW/ref=cm_cr_arp_d_product_top?ie=UTF8', + rules, + ); + + expect(result.changed, isTrue); + expect( + result.cleanedUrl, + 'https://www.amazon.com/dp/B08N5WRWNW?ie=UTF8', + ); + }); + + test('applies multiple rawRules', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rawRules: [r'\/ref=[^/?]*', r'\/tracking\/[^/?]*'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com/page/ref=abc/tracking/xyz?q=1', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com/page?q=1'); + }); + }); + + group('removed match details', () { + test('stores real query matches instead of regex patterns', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['p[fd]_rd_[a-z]*'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?pd_rd_foo=bar&pf_rd_baz=qux&keep=yes', + rules, + ); + + expect(result.removedParams.map((p) => p.match), [ + 'pd_rd_foo=bar', + 'pf_rd_baz=qux', + ]); + expect( + result.removedParams.every( + (p) => p.type == UrlCleanerMatchType.queryRule, + ), + isTrue, + ); + }); + + test('stores concrete raw regex matches', () { + final rules = [ + UrlCleanerRule( + name: 'amazon', + data: UrlCleanerRuleData( + urlPattern: r'^https?://(?:[a-z0-9-]+\.)*?amazon\.com', + rawRules: [r'\/ref=[^/?]*'], + ), + ), + ]; + + final result = cleanUrl( + 'https://www.amazon.com/dp/B08N5WRWNW/ref=cm_cr_arp_d_product_top?ie=UTF8', + rules, + ); + + expect(result.removedParams, hasLength(1)); + expect(result.removedParams.single.type, UrlCleanerMatchType.rawRule); + expect( + result.removedParams.single.match, + '/ref=cm_cr_arp_d_product_top', + ); + }); + + test('can remove one matched query parameter individually', () { + final removed = RemovedParam( + provider: 'example', + param: 'utm_source', + match: 'utm_source=google', + type: UrlCleanerMatchType.queryRule, + ); + + final result = removeUrlCleanerMatch( + 'https://example.com?utm_source=google&utm_medium=email&keep=1', + removed, + ); + + expect(result, 'https://example.com?utm_medium=email&keep=1'); + }); + + test('can remove one matched raw segment individually', () { + final removed = RemovedParam( + provider: 'example', + param: r'\/ref=[^/?]*', + match: '/ref=aaa', + type: UrlCleanerMatchType.rawRule, + ); + + final result = removeUrlCleanerMatch( + 'https://example.com/path/ref=aaa/ref=bbb?x=1', + removed, + ); + + expect(result, 'https://example.com/path/ref=bbb?x=1'); + }); + + test('can remove one matched referral parameter individually', () { + final removed = RemovedParam( + provider: 'example', + param: 'tag', + match: 'tag=affiliate123', + type: UrlCleanerMatchType.referralRule, + ); + + final result = removeUrlCleanerMatch( + 'https://example.com?tag=affiliate123&ref_code=abc&keep=1', + removed, + ); + + expect(result, 'https://example.com?ref_code=abc&keep=1'); + }); + }); + + group('redirections', () { + test('extracts URL from redirection pattern', () { + final rules = [ + UrlCleanerRule( + name: 'google', + data: UrlCleanerRuleData( + urlPattern: r'^https?://(?:[a-z0-9-]+\.)*?google\.com', + redirections: ['url=(.+)'], + ), + ), + ]; + + // url=(.+) greedily captures everything after url=, including &sa=D + final result = cleanUrl( + 'https://www.google.com/url?url=https%3A%2F%2Fexample.com%2Fpage&sa=D', + rules, + ); + + expect(result.changed, isTrue); + // The greedy (.+) captures "https%3A%2F%2Fexample.com%2Fpage&sa=D" + // which decodes to "https://example.com/page&sa=D" + expect(result.cleanedUrl, 'https://example.com/page&sa=D'); + }); + + test('extracts URL when it is the only parameter', () { + final rules = [ + UrlCleanerRule( + name: 'redirect', + data: UrlCleanerRuleData( + urlPattern: r'^https?://redirect\.example\.com', + redirections: ['url=(.+)'], + ), + ), + ]; + + final result = cleanUrl( + 'https://redirect.example.com?url=https%3A%2F%2Fexample.com%2Fpage', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com/page'); + }); + + test('decodes URL-encoded redirection target', () { + final rules = [ + UrlCleanerRule( + name: 'redirect', + data: UrlCleanerRuleData( + urlPattern: r'^https?://redirect\.example\.com', + redirections: ['target=(.+)'], + ), + ), + ]; + + final result = cleanUrl( + 'https://redirect.example.com?target=https%3A%2F%2Fdest.com%2Fpath%3Fq%3Dhello%20world', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://dest.com/path?q=hello world'); + }); + + test('skips to next provider after redirection', () { + // After redirection, rawRules and rules of the same provider should NOT apply + final rules = [ + UrlCleanerRule( + name: 'redirect', + data: UrlCleanerRuleData( + urlPattern: r'^https?://redirect\.example\.com', + redirections: ['target=(.+)'], + rules: ['should_not_apply'], + ), + ), + ]; + + final result = cleanUrl( + 'https://redirect.example.com?target=https%3A%2F%2Fdest.com%3Fshould_not_apply%3Dvalue', + rules, + ); + + // The redirected URL should still have should_not_apply since + // rules of the same provider are skipped after redirection + expect(result.cleanedUrl, 'https://dest.com?should_not_apply=value'); + }); + + test('reapplies earlier providers after redirection', () { + final rules = [ + UrlCleanerRule( + name: 'amazon', + data: UrlCleanerRuleData( + urlPattern: + r'^https?://(?:[a-z0-9-]+\.)*?amazon(?:\.[a-z]{2,}){1,}', + rules: ['qid'], + referralMarketing: ['tag'], + ), + ), + UrlCleanerRule( + name: 'google', + data: UrlCleanerRuleData( + urlPattern: + r'^https?://(?:[a-z0-9-]+\.)*?google(?:\.[a-z]{2,}){1,}', + redirections: ['url=(.+)'], + ), + ), + ]; + + final result = cleanUrl( + 'https://www.google.com/url?url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB08N5WRWNW%3Fqid%3D123%26tag%3Dmytag-20', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://www.amazon.com/dp/B08N5WRWNW'); + expect(result.matchedProviders, containsAll(['google', 'amazon'])); + }); + }); + + group('completeProvider (blocking)', () { + test('marks URL as blocked when completeProvider is true', () { + final rules = [ + UrlCleanerRule( + name: 'tracker', + data: UrlCleanerRuleData( + completeProvider: true, + urlPattern: r'^https?://tracker\.example\.com', + ), + ), + ]; + + final result = cleanUrl('https://tracker.example.com/pixel', rules); + + expect(result.blocked, isTrue); + expect(result.cleanedUrl, 'https://tracker.example.com/pixel'); + }); + + test('does not block when completeProvider is false', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + // ignore: avoid_redundant_argument_values + completeProvider: false, + urlPattern: r'^https?://example\.com', + rules: ['track'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?track=1', rules); + + expect(result.blocked, isFalse); + expect(result.changed, isTrue); + }); + }); + + group('exceptions', () { + test('skips provider when exception matches', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + exceptions: [r'^https?://example\.com/api/'], + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com/api/callback?utm_source=test', + rules, + ); + + expect(result.changed, isFalse); + expect( + result.cleanedUrl, + 'https://example.com/api/callback?utm_source=test', + ); + }); + + test('applies rules when exception does not match', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + exceptions: [r'^https?://example\.com/api/'], + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com/page?utm_source=test', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com/page'); + }); + }); + + group('referralMarketing', () { + final rules = [ + UrlCleanerRule( + name: 'example', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + referralMarketing: ['tag', 'ref_code'], + ), + ), + ]; + + test('removes referral params by default', () { + final result = cleanUrl( + 'https://example.com?utm_source=test&tag=affiliate123&ref_code=abc', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com'); + }); + + test('preserves referral params when allowReferral is true', () { + final result = cleanUrl( + 'https://example.com?utm_source=test&tag=affiliate123&ref_code=abc', + rules, + allowReferral: true, + ); + + expect(result.changed, isTrue); + expect( + result.cleanedUrl, + 'https://example.com?tag=affiliate123&ref_code=abc', + ); + expect( + result.removedParams.where( + (p) => p.type == UrlCleanerMatchType.referralRule, + ), + hasLength(2), + ); + }); + + test( + 'finds referral params for manual selection when allowReferral is true', + () { + final result = cleanUrl( + 'https://example.com?tag=affiliate123&ref_code=abc', + rules, + allowReferral: true, + ); + + expect(result.changed, isFalse); + expect( + result.cleanedUrl, + 'https://example.com?tag=affiliate123&ref_code=abc', + ); + expect(result.removedParams, hasLength(2)); + expect( + result.removedParams.every( + (p) => p.type == UrlCleanerMatchType.referralRule, + ), + isTrue, + ); + }, + ); + }); + + group('URL cleanup artifacts', () { + test('removes trailing question mark', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['only_param'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?only_param=value', rules); + + expect(result.cleanedUrl, 'https://example.com'); + }); + + test('cleans up ?& to ?', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['first'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?first=a&second=b', rules); + + expect(result.cleanedUrl, 'https://example.com?second=b'); + }); + + test('cleans up trailing ampersand', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['last'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?keep=yes&last=remove', + rules, + ); + + expect(result.cleanedUrl, 'https://example.com?keep=yes'); + }); + + test('cleans up &# to #', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['tracked'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?tracked=x#section', rules); + + expect(result.cleanedUrl, 'https://example.com#section'); + }); + + test('cleans up trailing hash', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['tracked'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?tracked=x#', rules); + + expect(result.cleanedUrl, 'https://example.com'); + }); + }); + + group('scheme restoration', () { + test('prepends https:// when scheme is missing', () { + final rules = [ + UrlCleanerRule( + name: 'redirect', + data: UrlCleanerRuleData( + urlPattern: r'^https?://redirect\.com', + redirections: ['url=(.+)'], + ), + ), + ]; + + final result = cleanUrl( + 'https://redirect.com?url=example.com%2Fpage', + rules, + ); + + expect(result.cleanedUrl, 'https://example.com/page'); + }); + + test('does not prepend when https:// present', () { + final result = cleanUrl('https://example.com', []); + expect(result.cleanedUrl, 'https://example.com'); + }); + + test('does not prepend when http:// present', () { + final result = cleanUrl('http://example.com', []); + expect(result.cleanedUrl, 'http://example.com'); + }); + }); + + group('multiple providers', () { + test('applies rules from multiple matching providers', () { + final rules = [ + UrlCleanerRule( + name: 'provider1', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + ), + ), + UrlCleanerRule( + name: 'provider2', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['fbclid'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?utm_source=google&fbclid=abc123&page=1', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com?page=1'); + }); + + test('only applies matching providers', () { + final rules = [ + UrlCleanerRule( + name: 'google', + data: UrlCleanerRuleData( + urlPattern: r'^https?://google\.com', + rules: ['ved'], + ), + ), + UrlCleanerRule( + name: 'facebook', + data: UrlCleanerRuleData( + urlPattern: r'^https?://facebook\.com', + rules: ['fbclid'], + ), + ), + ]; + + final result = cleanUrl('https://google.com?ved=abc&page=1', rules); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://google.com?page=1'); + }); + }); + + group('real-world ClearURLs catalog rules', () { + test('cleans Amazon URL with tracking params', () { + final rules = [ + UrlCleanerRule( + name: 'amazon', + data: UrlCleanerRuleData( + urlPattern: + r'^https?://(?:[a-z0-9-]+\.)*?amazon(?:\.[a-z]{2,}){1,}', + rules: ['qid', 'sr', 'ref_?', 'keywords', 'crid', 'sprefix'], + rawRules: [r'\/ref=[^/?]*'], + referralMarketing: ['tag', 'ascsubtag'], + ), + ), + ]; + + final result = cleanUrl( + 'https://www.amazon.com/dp/B08N5WRWNW/ref=cm_cr_arp_d_product_top?qid=123&sr=8-1&keywords=widget&tag=mytag-20', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://www.amazon.com/dp/B08N5WRWNW'); + expect(result.blocked, isFalse); + }); + + test('cleans Google search URL', () { + final rules = [ + UrlCleanerRule( + name: 'google', + data: UrlCleanerRuleData( + urlPattern: + r'^https?://(?:[a-z0-9-]+\.)*?google(?:\.[a-z]{2,}){1,}', + rules: [ + 'ved', + 'ei', + 'source', + 'oq', + 'esrc', + 'aqs', + 'sourceid', + 'sxsrf', + 'rlz', + ], + ), + ), + ]; + + final result = cleanUrl( + 'https://www.google.com/search?q=dart+programming&sourceid=chrome&ie=UTF-8&oq=dart+pro&aqs=chrome.0.69i59j69i57&sxsrf=abc&rlz=1C1', + rules, + ); + + expect(result.changed, isTrue); + // q and ie should remain + expect(result.cleanedUrl, contains('q=dart+programming')); + expect(result.cleanedUrl, isNot(contains('sourceid='))); + expect(result.cleanedUrl, isNot(contains('oq='))); + expect(result.cleanedUrl, isNot(contains('aqs='))); + expect(result.cleanedUrl, isNot(contains('sxsrf='))); + expect(result.cleanedUrl, isNot(contains('rlz='))); + }); + + test('blocks fls-na.amazon tracking domain', () { + final rules = [ + UrlCleanerRule( + name: 'fls-na.amazon', + data: UrlCleanerRuleData( + completeProvider: true, + urlPattern: + r'^https?://(?:[a-z0-9-]+\.)*?fls-na\.amazon(?:\.[a-z]{2,}){1,}', + ), + ), + ]; + + final result = cleanUrl( + 'https://fls-na.amazon.com/1/batch/1/OP', + rules, + ); + + expect(result.blocked, isTrue); + }); + + test('handles Google redirect URL', () { + final rules = [ + UrlCleanerRule( + name: 'google', + data: UrlCleanerRuleData( + urlPattern: + r'^https?://(?:[a-z0-9-]+\.)*?google(?:\.[a-z]{2,}){1,}', + redirections: ['url=(.+)'], + rules: ['ved', 'usg'], + ), + ), + ]; + + // When URL is the sole param, redirection works cleanly + final result = cleanUrl( + 'https://www.google.com/url?url=https%3A%2F%2Fexample.com%2Farticle', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com/article'); + }); + }); + + group('edge cases', () { + test('handles URL with no query string', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl('https://example.com/page', rules); + + expect(result.changed, isFalse); + expect(result.cleanedUrl, 'https://example.com/page'); + }); + + test('handles URL with empty query string', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['foo'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?', rules); + + // Trailing ? gets cleaned up + expect(result.cleanedUrl, 'https://example.com'); + }); + + test('handles URL with only fragment', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['track'], + ), + ), + ]; + + final result = cleanUrl('https://example.com#section', rules); + + expect(result.changed, isFalse); + expect(result.cleanedUrl, 'https://example.com#section'); + }); + + test('handles URL with subdomain matching', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://(?:[a-z0-9-]+\.)*?example\.com', + rules: ['track'], + ), + ), + ]; + + final result = cleanUrl( + 'https://sub.domain.example.com?track=1&keep=2', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://sub.domain.example.com?keep=2'); + }); + + test('handles parameter values containing special characters', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?utm_source=my%20source&title=hello%26world', + rules, + ); + + expect(result.changed, isTrue); + expect(result.cleanedUrl, 'https://example.com?title=hello%26world'); + }); + }); + + group('removedParams tracking', () { + test('tracks removed query parameters with provider name', () { + final rules = [ + UrlCleanerRule( + name: 'test_provider', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source', 'utm_medium'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?utm_source=google&utm_medium=email&page=1', + rules, + ); + + expect(result.removedParams, hasLength(2)); + expect( + result.removedParams.map((p) => p.param), + containsAll(['utm_source', 'utm_medium']), + ); + expect( + result.removedParams.every((p) => p.provider == 'test_provider'), + isTrue, + ); + }); + + test('tracks rawRule removals', () { + final rules = [ + UrlCleanerRule( + name: 'amazon', + data: UrlCleanerRuleData( + urlPattern: r'^https?://amazon\.com', + rawRules: [r'\/ref=[^/?]*'], + ), + ), + ]; + + final result = cleanUrl('https://amazon.com/dp/B123/ref=sr_1_1', rules); + + expect(result.removedParams, hasLength(1)); + expect(result.removedParams.first.provider, 'amazon'); + expect(result.removedParams.first.param, r'\/ref=[^/?]*'); + }); + + test('returns empty removedParams when nothing removed', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?page=1', rules); + + expect(result.removedParams, isEmpty); + expect(result.changed, isFalse); + }); + + test('tracks params from multiple providers separately', () { + final rules = [ + UrlCleanerRule( + name: 'provider_a', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + ), + ), + UrlCleanerRule( + name: 'provider_b', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['fbclid'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?utm_source=test&fbclid=abc', + rules, + ); + + expect(result.removedParams, hasLength(2)); + expect( + result.removedParams.any( + (p) => p.provider == 'provider_a' && p.param == 'utm_source', + ), + isTrue, + ); + expect( + result.removedParams.any( + (p) => p.provider == 'provider_b' && p.param == 'fbclid', + ), + isTrue, + ); + }); + + test('does not track unmatched rules', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source', 'not_present'], + ), + ), + ]; + + final result = cleanUrl( + 'https://example.com?utm_source=test&page=1', + rules, + ); + + expect(result.removedParams, hasLength(1)); + expect(result.removedParams.first.param, 'utm_source'); + }); + + test('tracks referralMarketing removals', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + referralMarketing: ['tag'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?tag=affiliate', rules); + + expect(result.removedParams, hasLength(1)); + expect(result.removedParams.first.param, 'tag'); + }); + }); + + group('matchedProviders tracking', () { + test('lists all matched provider names', () { + final rules = [ + UrlCleanerRule( + name: 'provider_a', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['a'], + ), + ), + UrlCleanerRule( + name: 'provider_b', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['b'], + ), + ), + UrlCleanerRule( + name: 'no_match', + data: UrlCleanerRuleData( + urlPattern: r'^https?://other\.com', + rules: ['c'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?a=1&b=2', rules); + + expect( + result.matchedProviders, + containsAll(['provider_a', 'provider_b']), + ); + expect(result.matchedProviders, isNot(contains('no_match'))); + }); + + test('includes blocked providers in matchedProviders', () { + final rules = [ + UrlCleanerRule( + name: 'blocker', + data: UrlCleanerRuleData( + completeProvider: true, + urlPattern: r'^https?://tracker\.com', + ), + ), + ]; + + final result = cleanUrl('https://tracker.com/pixel', rules); + + expect(result.matchedProviders, contains('blocker')); + }); + }); + + group('redirectedFrom tracking', () { + test('records original URL when redirection occurs', () { + final rules = [ + UrlCleanerRule( + name: 'redirect', + data: UrlCleanerRuleData( + urlPattern: r'^https?://redir\.com', + redirections: ['url=(.+)'], + ), + ), + ]; + + final result = cleanUrl( + 'https://redir.com?url=https%3A%2F%2Fdest.com', + rules, + ); + + expect( + result.redirectedFrom, + 'https://redir.com?url=https%3A%2F%2Fdest.com', + ); + expect(result.cleanedUrl, 'https://dest.com'); + }); + + test('redirectedFrom is null when no redirection', () { + final rules = [ + UrlCleanerRule( + name: 'test', + data: UrlCleanerRuleData( + urlPattern: r'^https?://example\.com', + rules: ['utm_source'], + ), + ), + ]; + + final result = cleanUrl('https://example.com?utm_source=test', rules); + + expect(result.redirectedFrom, isNull); + }); + }); + }); +} diff --git a/app/test/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service_test.dart b/app/test/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service_test.dart new file mode 100644 index 00000000..2216280b --- /dev/null +++ b/app/test/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service_test.dart @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2024-2026 Fabian Freund. + * + * This file is part of WebLibre + * (see https://weblibre.eu). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:http/testing.dart'; +import 'package:riverpod/riverpod.dart'; +import 'package:weblibre/features/geckoview/features/open_link_tools/domain/services/url_unshortener_service.dart'; + +void main() { + late ProviderContainer container; + late UrlUnshortenerService service; + + setUp(() { + container = ProviderContainer(); + service = container.read(urlUnshortenerServiceProvider.notifier); + }); + + tearDown(() { + container.dispose(); + }); + + group('warning list asset compatibility', () { + test('parses current MISP url-shortener list format', () { + final rawJson = File( + 'assets/preferences/url-shortener-list.json', + ).readAsStringSync(); + + final decoded = jsonDecode(rawJson) as Map; + expect(decoded['type'], 'hostname'); + expect(decoded['matching_attributes'], isA>()); + expect(decoded['list'], isA>()); + + final hosts = service.parseSupportedShortenerHosts(rawJson); + expect(hosts.length, greaterThan(200)); + expect(hosts, contains('bit.ly')); + expect(service.isSupportedShortenerHost('www.bit.ly', hosts), isTrue); + expect( + service.isSupportedShortenerUrl('https://example.com', hosts), + isFalse, + ); + }); + }); + + group('supported shortener host checks', () { + test('parses list hosts from warning list json', () { + final hosts = service.parseSupportedShortenerHosts( + jsonEncode({ + 'list': ['bit.ly', 't.co', 'TinyURL.com', '*.short.cm'], + }), + ); + + expect(hosts, containsAll({'bit.ly', 't.co', 'tinyurl.com', 'short.cm'})); + }); + + test('normalizes URL-like entries to hostnames', () { + final hosts = service.parseSupportedShortenerHosts( + jsonEncode({ + 'list': ['https://bit.ly/abc', 'tinyurl.com/path?a=1', 't.co/#frag'], + }), + ); + + expect(hosts, containsAll({'bit.ly', 'tinyurl.com', 't.co'})); + }); + + test('matches exact and subdomain hosts', () { + const supportedHosts = {'bit.ly', 't.co'}; + + expect( + service.isSupportedShortenerUrl('https://bit.ly/abc', supportedHosts), + isTrue, + ); + expect( + service.isSupportedShortenerUrl('https://www.t.co/abc', supportedHosts), + isTrue, + ); + expect( + service.isSupportedShortenerUrl( + 'https://example.com/abc', + supportedHosts, + ), + isFalse, + ); + }); + + test('matches urls without a scheme', () { + const supportedHosts = {'tinyurl.com'}; + + expect( + service.isSupportedShortenerUrl('tinyurl.com/abc', supportedHosts), + isTrue, + ); + expect( + service.isSupportedShortenerUrl('notinyurl.com/abc', supportedHosts), + isFalse, + ); + }); + }); + + group('unshortenUrl', () { + group('unauthenticated requests', () { + test('resolves shortened URL successfully', () async { + final client = MockClient((request) async { + expect(request.url.host, 'unshorten.me'); + expect(request.url.pathSegments, contains('json')); + expect(request.headers, isNot(contains('Authorization'))); + + return http.Response( + jsonEncode({ + 'success': true, + 'resolved_url': 'https://example.com/full-article', + 'remaining_calls': 8, + 'usage_count': 10, + }), + 200, + ); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc123', + client: client, + ); + + expect(result.success, isTrue); + expect(result.finalUrl, 'https://example.com/full-article'); + expect(result.remainingCalls, 8); + expect(result.usageCount, 10); + expect(result.error, isNull); + }); + + test('encodes URL in request path', () async { + late Uri capturedUri; + final client = MockClient((request) async { + capturedUri = request.url; + return http.Response( + jsonEncode({ + 'success': true, + 'resolved_url': 'https://example.com', + }), + 200, + ); + }); + + await service.unshortenUrl( + 'https://bit.ly/test?a=1&b=2', + client: client, + ); + + expect( + capturedUri.toString(), + contains(Uri.encodeComponent('https://bit.ly/test?a=1&b=2')), + ); + }); + + test('returns error on API failure', () async { + final client = MockClient((request) async { + return http.Response( + jsonEncode({'success': false, 'error': 'Could not resolve URL'}), + 200, + ); + }); + + final result = await service.unshortenUrl( + 'https://invalid-short.url/x', + client: client, + ); + + expect(result.success, isFalse); + expect(result.error, 'Could not resolve URL'); + expect(result.finalUrl, isNull); + }); + + test('returns error on HTTP error status', () async { + final client = MockClient((request) async { + return http.Response('Server Error', 500); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc', + client: client, + ); + + expect(result.success, isFalse); + expect(result.error, 'HTTP 500'); + }); + + test('returns error on rate limit', () async { + final client = MockClient((request) async { + return http.Response('Too Many Requests', 429); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc', + client: client, + ); + + expect(result.success, isFalse); + expect(result.error, 'HTTP 429'); + }); + + test('handles missing success field', () async { + final client = MockClient((request) async { + return http.Response( + jsonEncode({'resolved_url': 'https://example.com'}), + 200, + ); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc', + client: client, + ); + + // success defaults to false when missing + expect(result.success, isFalse); + }); + + test('handles missing error field on failure', () async { + final client = MockClient((request) async { + return http.Response(jsonEncode({'success': false}), 200); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc', + client: client, + ); + + expect(result.success, isFalse); + expect(result.error, 'Unknown error'); + }); + }); + + group('authenticated requests', () { + test('sends token in Authorization header', () async { + late Map capturedHeaders; + final client = MockClient((request) async { + capturedHeaders = request.headers; + return http.Response( + jsonEncode({ + 'unshortened_url': 'https://example.com/page', + 'remaining_calls': 95, + 'usage_count': 100, + }), + 200, + ); + }); + + await service.unshortenUrl( + 'https://bit.ly/abc', + token: 'my-api-token', + client: client, + ); + + expect(capturedHeaders['Authorization'], 'Token my-api-token'); + }); + + test('uses v2 API endpoint with token', () async { + late Uri capturedUri; + final client = MockClient((request) async { + capturedUri = request.url; + return http.Response( + jsonEncode({'unshortened_url': 'https://example.com'}), + 200, + ); + }); + + await service.unshortenUrl( + 'https://bit.ly/abc', + token: 'token123', + client: client, + ); + + expect(capturedUri.pathSegments, contains('v2')); + expect(capturedUri.pathSegments, contains('unshorten')); + expect(capturedUri.queryParameters['url'], isNotNull); + }); + + test('resolves URL with token successfully', () async { + final client = MockClient((request) async { + return http.Response( + jsonEncode({ + 'unshortened_url': 'https://example.com/target', + 'remaining_calls': 50, + 'usage_count': 100, + }), + 200, + ); + }); + + final result = await service.unshortenUrl( + 'https://t.co/abc', + token: 'valid-token', + client: client, + ); + + expect(result.success, isTrue); + expect(result.finalUrl, 'https://example.com/target'); + expect(result.remainingCalls, 50); + expect(result.usageCount, 100); + }); + + test('returns error from authenticated API', () async { + final client = MockClient((request) async { + return http.Response(jsonEncode({'error': 'Invalid token'}), 200); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc', + token: 'bad-token', + client: client, + ); + + expect(result.success, isFalse); + expect(result.error, 'Invalid token'); + }); + + test('handles empty error field as success', () async { + final client = MockClient((request) async { + return http.Response( + jsonEncode({'error': '', 'unshortened_url': 'https://example.com'}), + 200, + ); + }); + + final result = await service.unshortenUrl( + 'https://bit.ly/abc', + token: 'token', + client: client, + ); + + expect(result.success, isTrue); + expect(result.finalUrl, 'https://example.com'); + }); + }); + }); +} diff --git a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart index c64cca53..c9576e53 100644 --- a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart +++ b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart @@ -15,7 +15,11 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse({ + Object? result, + PlatformException? error, + bool empty = false, +}) { if (empty) { return []; } @@ -24,27 +28,33 @@ List wrapResponse({Object? result, PlatformException? error, bool empty } return [error.code, error.message, error.details]; } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + a.indexed.every( + ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), + ); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every( + (MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key]), + ); } return a == b; } - /// Indicates what location the tabs should be restored at enum RestoreLocation { /// Restore tabs at the beginning of the tab list beginning, + /// Restore tabs at the end of the tab list end, + /// Restore tabs at a specific index in the tab list atIndex, } @@ -65,127 +75,104 @@ enum IconType { /// Supported sizes. /// /// We are trying to limit the supported sizes in order to optimize our caching strategy. -enum IconSize { - defaultSize, - launcher, - launcherAdaptive, -} +enum IconSize { defaultSize, launcher, launcherAdaptive } /// The source of an [Icon]. enum IconSource { /// This icon was generated. generator, + /// This icon was downloaded. download, + /// This icon was inlined in the document. inline, + /// This icon was loaded from an in-memory cache. memory, + /// This icon was loaded from a disk cache. disk, } -enum CookieSameSiteStatus { - noRestriction, - lax, - strict, - unspecified, -} +enum CookieSameSiteStatus { noRestriction, lax, strict, unspecified } enum VisitType { /// The user followed a link and got a new toplevel window. link, + /// The user typed the page's URL in the URL bar or selected it from /// URL bar autocomplete results, clicked on it from a history query /// (from the History sidebar, History menu, or history query in the /// personal toolbar or Places organizer. typed, + /// The user followed a bookmark to get to the page. bookmark, + /// Some inner content is loaded. This is true of all images on a /// page, and the contents of the iframe. It is also true of any /// content in a frame if the user did not explicitly follow a link /// to get there. embed, + /// Set when the transition was a permanent redirect. redirectPermanent, + /// Set when the transition was a temporary redirect. redirectTemporary, + /// Set when the transition is a download. download, + /// The user followed a link and got a visit in a frame. framedLink, + /// The user reloaded a page. reload, } -enum SelectionPattern { - phone, - email, -} +enum SelectionPattern { phone, email } -enum WebExtensionActionType { - browser, - page, -} +enum WebExtensionActionType { browser, page } -enum GeckoSuggestionType { - session, - clipboard, - history, -} +enum GeckoSuggestionType { session, clipboard, history } -enum TrackingProtectionPolicy { - none, - recommended, - strict, - custom, -} +enum TrackingProtectionPolicy { none, recommended, strict, custom } -enum HttpsOnlyMode { - disabled, - privateOnly, - enabled, -} +enum HttpsOnlyMode { disabled, privateOnly, enabled } -enum QueryParameterStripping { - disabled, - privateOnly, - enabled, -} +enum QueryParameterStripping { disabled, privateOnly, enabled } enum BounceTrackingProtectionMode { /// Fully disabled. disabled, + /// Fully enabled. enabled, + /// Disabled, but collects user interaction data. Use this mode as the /// "disabled" state when the feature can be toggled on and off, e.g. via /// preferences. enabledStandby, + /// Feature enabled, but tracker purging is only simulated. Used for /// testing and telemetry collection. enabledDryRun, } -enum ColorScheme { - system, - light, - dark, -} +enum ColorScheme { system, light, dark } -enum CookieBannerHandlingMode { - disabled, - rejectAll, - rejectOrAcceptAll, -} +enum CookieBannerHandlingMode { disabled, rejectAll, rejectOrAcceptAll } /// App links behavior mode - controls how external app links are handled enum AppLinksMode { /// Always open links in their native apps without prompting always, + /// Prompt user before opening in app (with "Always open" checkbox) ask, + /// Never open links in external apps, always use browser never, } @@ -202,15 +189,19 @@ enum CustomCookiePolicy { /// Total Cookie Protection - Dynamic First-Party Isolation (dFPI) /// Most private option, isolates cookies per site totalProtection, + /// Block cross-site and social media tracker cookies /// Allows most cookies but blocks tracking cookies crossSiteTrackers, + /// Block cookies from sites you haven't visited /// Balances privacy with functionality unvisited, + /// Block all third-party cookies /// Only allows first-party cookies thirdParty, + /// Block all cookies (may break many sites) allCookies, } @@ -219,107 +210,76 @@ enum CustomCookiePolicy { enum TrackingScope { /// Apply to all browsing (normal + private) all, + /// Apply only to private browsing tabs privateOnly, } -enum DohSettingsMode { - geckoDefault, - increased, - max, - off, -} +enum DohSettingsMode { geckoDefault, increased, max, off } /// Status that represents every state that a download can be in. enum DownloadStatus { /// Indicates that the download is in the first state after creation but not yet [DOWNLOADING]. initiated, + /// Indicates that an [INITIATED] download is now actively being downloaded. downloading, + /// Indicates that the download that has been [DOWNLOADING] has been paused. paused, + /// Indicates that the download that has been [DOWNLOADING] has been cancelled. cancelled, + /// Indicates that the download that has been [DOWNLOADING] has moved to failed because /// something unexpected has happened. failed, + /// Indicates that the [DOWNLOADING] download has been completed. completed, } -enum LogLevel { - debug, - info, - warn, - error, -} +enum LogLevel { debug, info, warn, error } -enum SyncEngineValue { - history, - bookmarks, - tabs, -} +enum SyncEngineValue { history, bookmarks, tabs } /// Type of ML model operation -enum MlProgressType { - downloading, - loadingFromCache, - runningInference, -} +enum MlProgressType { downloading, loadingFromCache, runningInference } /// Status of the ML operation -enum MlProgressStatus { - initiate, - sizeEstimate, - inProgress, - done, -} +enum MlProgressStatus { initiate, sizeEstimate, inProgress, done } /// Types of browsing data that can be cleared enum ClearDataType { /// Authentication sessions authSessions, + /// All site data (cookies, storage, etc.) allSiteData, + /// Cookies only cookies, + /// Cache only allCaches, } -enum GeckoFetchMethod { - get, - head, - post, - put, - delete, - connect, - options, - trace, -} +enum GeckoFetchMethod { get, head, post, put, delete, connect, options, trace } -enum GeckoFetchRedircet { - follow, - manual, -} +enum GeckoFetchRedircet { follow, manual } -enum GeckoFetchCookiePolicy { - include, - omit, -} +enum GeckoFetchCookiePolicy { include, omit } -enum BookmarkNodeType { - item, - folder, - separator, -} +enum BookmarkNodeType { item, folder, separator } /// Permission status for a site permission enum SitePermissionStatus { /// Permission has been granted allowed, + /// Permission has been denied blocked, + /// No decision has been made yet (ask to allow) noDecision, } @@ -328,10 +288,13 @@ enum SitePermissionStatus { enum AutoplayStatus { /// Allow all autoplay (audible and inaudible) allowed, + /// Block all autoplay blocked, + /// Block audible autoplay only (allow inaudible) blockAudible, + /// Allow autoplay on WiFi only allowOnWifi, } @@ -341,26 +304,21 @@ enum AutoplayStatus { /// @property downloadModel If the necessary models should be downloaded on request. If false, then /// the translation will not complete and throw an exception if the models are not already available. class TranslationOptions { - TranslationOptions({ - required this.downloadModel, - }); + TranslationOptions({required this.downloadModel}); bool downloadModel; List _toList() { - return [ - downloadModel, - ]; + return [downloadModel]; } Object encode() { - return _toList(); } + return _toList(); + } static TranslationOptions decode(Object result) { result as List; - return TranslationOptions( - downloadModel: result[0]! as bool, - ); + return TranslationOptions(downloadModel: result[0]! as bool); } @override @@ -377,8 +335,7 @@ class TranslationOptions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Value type that represents the state of reader mode/view. @@ -431,7 +388,8 @@ class ReaderState { } Object encode() { - return _toList(); } + return _toList(); + } static ReaderState decode(Object result) { result as List; @@ -460,8 +418,7 @@ class ReaderState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Parameters for adding a new tab. @@ -511,7 +468,8 @@ class AddTabParams { } Object encode() { - return _toList(); } + return _toList(); + } static AddTabParams decode(Object result) { result as List; @@ -524,7 +482,8 @@ class AddTabParams { source: result[5]! as SourceValue, private: result[6]! as bool, historyMetadata: result[7] as HistoryMetadataKey?, - additionalHeaders: (result[8] as Map?)?.cast(), + additionalHeaders: (result[8] as Map?) + ?.cast(), ); } @@ -542,8 +501,7 @@ class AddTabParams { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Details about the last playing media in this tab. @@ -573,15 +531,12 @@ class LastMediaAccessState { bool mediaSessionActive; List _toList() { - return [ - lastMediaUrl, - lastMediaAccess, - mediaSessionActive, - ]; + return [lastMediaUrl, lastMediaAccess, mediaSessionActive]; } Object encode() { - return _toList(); } + return _toList(); + } static LastMediaAccessState decode(Object result) { result as List; @@ -606,8 +561,7 @@ class LastMediaAccessState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents a set of history metadata values that uniquely identify a record. Note that @@ -615,11 +569,7 @@ class LastMediaAccessState { /// created, depending on the de-bouncing logic of the underlying storage i.e. recording history /// metadata observations with the exact same values may be combined into a single record. class HistoryMetadataKey { - HistoryMetadataKey({ - required this.url, - this.searchTerm, - this.referrerUrl, - }); + HistoryMetadataKey({required this.url, this.searchTerm, this.referrerUrl}); /// A url of the page. String url; @@ -634,15 +584,12 @@ class HistoryMetadataKey { String? referrerUrl; List _toList() { - return [ - url, - searchTerm, - referrerUrl, - ]; + return [url, searchTerm, referrerUrl]; } Object encode() { - return _toList(); } + return _toList(); + } static HistoryMetadataKey decode(Object result) { result as List; @@ -667,31 +614,25 @@ class HistoryMetadataKey { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class PackageCategoryValue { - PackageCategoryValue({ - required this.value, - }); + PackageCategoryValue({required this.value}); int value; List _toList() { - return [ - value, - ]; + return [value]; } Object encode() { - return _toList(); } + return _toList(); + } static PackageCategoryValue decode(Object result) { result as List; - return PackageCategoryValue( - value: result[0]! as int, - ); + return PackageCategoryValue(value: result[0]! as int); } @override @@ -708,16 +649,12 @@ class PackageCategoryValue { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Describes an external package. class ExternalPackage { - ExternalPackage({ - required this.packageId, - required this.category, - }); + ExternalPackage({required this.packageId, required this.category}); /// An Android package id. String packageId; @@ -726,14 +663,12 @@ class ExternalPackage { PackageCategoryValue category; List _toList() { - return [ - packageId, - category, - ]; + return [packageId, category]; } Object encode() { - return _toList(); } + return _toList(); + } static ExternalPackage decode(Object result) { result as List; @@ -757,31 +692,25 @@ class ExternalPackage { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class LoadUrlFlagsValue { - LoadUrlFlagsValue({ - required this.value, - }); + LoadUrlFlagsValue({required this.value}); int value; List _toList() { - return [ - value, - ]; + return [value]; } Object encode() { - return _toList(); } + return _toList(); + } static LoadUrlFlagsValue decode(Object result) { result as List; - return LoadUrlFlagsValue( - value: result[0]! as int, - ); + return LoadUrlFlagsValue(value: result[0]! as int); } @override @@ -798,29 +727,23 @@ class LoadUrlFlagsValue { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SourceValue { - SourceValue({ - required this.id, - this.caller, - }); + SourceValue({required this.id, this.caller}); int id; ExternalPackage? caller; List _toList() { - return [ - id, - caller, - ]; + return [id, caller]; } Object encode() { - return _toList(); } + return _toList(); + } static SourceValue decode(Object result) { result as List; @@ -844,8 +767,7 @@ class SourceValue { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// A tab that is no longer open and in the list of tabs, but that can be restored (recovered) at @@ -940,7 +862,8 @@ class TabState { } Object encode() { - return _toList(); } + return _toList(); + } static TabState decode(Object result) { result as List; @@ -977,16 +900,12 @@ class TabState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// A recoverable version of [TabState]. class RecoverableTab { - RecoverableTab({ - this.engineSessionStateJson, - required this.state, - }); + RecoverableTab({this.engineSessionStateJson, required this.state}); /// The [EngineSessionState] needed for restoring the previous state of this tab. String? engineSessionStateJson; @@ -995,14 +914,12 @@ class RecoverableTab { TabState state; List _toList() { - return [ - engineSessionStateJson, - state, - ]; + return [engineSessionStateJson, state]; } Object encode() { - return _toList(); } + return _toList(); + } static RecoverableTab decode(Object result) { result as List; @@ -1026,16 +943,12 @@ class RecoverableTab { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// A restored browser state, read from disk. class RecoverableBrowserState { - RecoverableBrowserState({ - required this.tabs, - this.selectedTabId, - }); + RecoverableBrowserState({required this.tabs, this.selectedTabId}); /// The list of restored tabs. List tabs; @@ -1044,14 +957,12 @@ class RecoverableBrowserState { String? selectedTabId; List _toList() { - return [ - tabs, - selectedTabId, - ]; + return [tabs, selectedTabId]; } Object encode() { - return _toList(); } + return _toList(); + } static RecoverableBrowserState decode(Object result) { result as List; @@ -1075,8 +986,7 @@ class RecoverableBrowserState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// A request to load an [Icon]. @@ -1103,18 +1013,12 @@ class IconRequest { bool waitOnNetworkLoad; List _toList() { - return [ - url, - size, - resources, - color, - isPrivate, - waitOnNetworkLoad, - ]; + return [url, size, resources, color, isPrivate, waitOnNetworkLoad]; } Object encode() { - return _toList(); } + return _toList(); + } static IconRequest decode(Object result) { result as List; @@ -1142,36 +1046,27 @@ class IconRequest { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class ResourceSize { - ResourceSize({ - required this.height, - required this.width, - }); + ResourceSize({required this.height, required this.width}); int height; int width; List _toList() { - return [ - height, - width, - ]; + return [height, width]; } Object encode() { - return _toList(); } + return _toList(); + } static ResourceSize decode(Object result) { result as List; - return ResourceSize( - height: result[0]! as int, - width: result[1]! as int, - ); + return ResourceSize(height: result[0]! as int, width: result[1]! as int); } @override @@ -1188,8 +1083,7 @@ class ResourceSize { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// An icon resource that can be loaded. @@ -1213,17 +1107,12 @@ class Resource { bool maskable; List _toList() { - return [ - url, - type, - sizes, - mimeType, - maskable, - ]; + return [url, type, sizes, mimeType, maskable]; } Object encode() { - return _toList(); } + return _toList(); + } static Resource decode(Object result) { result as List; @@ -1250,8 +1139,7 @@ class Resource { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// An [Icon] returned by [BrowserIcons] after processing an [IconRequest] @@ -1276,16 +1164,12 @@ class IconResult { bool maskable; List _toList() { - return [ - image, - color, - source, - maskable, - ]; + return [image, color, source, maskable]; } Object encode() { - return _toList(); } + return _toList(); + } static IconResult decode(Object result) { result as List; @@ -1311,31 +1195,25 @@ class IconResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class CookiePartitionKey { - CookiePartitionKey({ - required this.topLevelSite, - }); + CookiePartitionKey({required this.topLevelSite}); String topLevelSite; List _toList() { - return [ - topLevelSite, - ]; + return [topLevelSite]; } Object encode() { - return _toList(); } + return _toList(); + } static CookiePartitionKey decode(Object result) { result as List; - return CookiePartitionKey( - topLevelSite: result[0]! as String, - ); + return CookiePartitionKey(topLevelSite: result[0]! as String); } @override @@ -1352,8 +1230,7 @@ class CookiePartitionKey { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class Cookie { @@ -1418,7 +1295,8 @@ class Cookie { } Object encode() { - return _toList(); } + return _toList(); + } static Cookie decode(Object result) { result as List; @@ -1453,8 +1331,7 @@ class Cookie { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class VisitInfo { @@ -1495,7 +1372,8 @@ class VisitInfo { } Object encode() { - return _toList(); } + return _toList(); + } static VisitInfo decode(Object result) { result as List; @@ -1524,36 +1402,27 @@ class VisitInfo { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class HistoryItem { - HistoryItem({ - required this.url, - required this.title, - }); + HistoryItem({required this.url, required this.title}); String url; String title; List _toList() { - return [ - url, - title, - ]; + return [url, title]; } Object encode() { - return _toList(); } + return _toList(); + } static HistoryItem decode(Object result) { result as List; - return HistoryItem( - url: result[0]! as String, - title: result[1]! as String, - ); + return HistoryItem(url: result[0]! as String, title: result[1]! as String); } @override @@ -1570,8 +1439,7 @@ class HistoryItem { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class HistoryState { @@ -1591,16 +1459,12 @@ class HistoryState { bool canGoForward; List _toList() { - return [ - items, - currentIndex, - canGoBack, - canGoForward, - ]; + return [items, currentIndex, canGoBack, canGoForward]; } Object encode() { - return _toList(); } + return _toList(); + } static HistoryState decode(Object result) { result as List; @@ -1626,15 +1490,11 @@ class HistoryState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class ReaderableState { - ReaderableState({ - required this.readerable, - required this.active, - }); + ReaderableState({required this.readerable, required this.active}); /// Whether or not the current page can be transformed to /// be displayed in a reader view. @@ -1644,14 +1504,12 @@ class ReaderableState { bool active; List _toList() { - return [ - readerable, - active, - ]; + return [readerable, active]; } Object encode() { - return _toList(); } + return _toList(); + } static ReaderableState decode(Object result) { result as List; @@ -1675,8 +1533,7 @@ class ReaderableState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SecurityInfoState { @@ -1693,15 +1550,12 @@ class SecurityInfoState { String issuer; List _toList() { - return [ - secure, - host, - issuer, - ]; + return [secure, host, issuer]; } Object encode() { - return _toList(); } + return _toList(); + } static SecurityInfoState decode(Object result) { result as List; @@ -1726,8 +1580,7 @@ class SecurityInfoState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class TabContentState { @@ -1780,7 +1633,8 @@ class TabContentState { } Object encode() { - return _toList(); } + return _toList(); + } static TabContentState decode(Object result) { result as List; @@ -1812,8 +1666,7 @@ class TabContentState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class FindResultState { @@ -1830,15 +1683,12 @@ class FindResultState { bool isDoneCounting; List _toList() { - return [ - activeMatchOrdinal, - numberOfMatches, - isDoneCounting, - ]; + return [activeMatchOrdinal, numberOfMatches, isDoneCounting]; } Object encode() { - return _toList(); } + return _toList(); + } static FindResultState decode(Object result) { result as List; @@ -1863,16 +1713,11 @@ class FindResultState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class CustomSelectionAction { - CustomSelectionAction({ - required this.id, - required this.title, - this.pattern, - }); + CustomSelectionAction({required this.id, required this.title, this.pattern}); String id; @@ -1881,15 +1726,12 @@ class CustomSelectionAction { SelectionPattern? pattern; List _toList() { - return [ - id, - title, - pattern, - ]; + return [id, title, pattern]; } Object encode() { - return _toList(); } + return _toList(); + } static CustomSelectionAction decode(Object result) { result as List; @@ -1914,8 +1756,7 @@ class CustomSelectionAction { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class WebExtensionData { @@ -1952,7 +1793,8 @@ class WebExtensionData { } Object encode() { - return _toList(); } + return _toList(); + } static WebExtensionData decode(Object result) { result as List; @@ -1980,8 +1822,7 @@ class WebExtensionData { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class GeckoSuggestion { @@ -2010,19 +1851,12 @@ class GeckoSuggestion { Uint8List? icon; List _toList() { - return [ - id, - type, - score, - title, - description, - editSuggestion, - icon, - ]; + return [id, type, score, title, description, editSuggestion, icon]; } Object encode() { - return _toList(); } + return _toList(); + } static GeckoSuggestion decode(Object result) { result as List; @@ -2051,8 +1885,7 @@ class GeckoSuggestion { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class TabContent { @@ -2089,7 +1922,8 @@ class TabContent { } Object encode() { - return _toList(); } + return _toList(); + } static TabContent decode(Object result) { result as List; @@ -2117,8 +1951,7 @@ class TabContent { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class ContentBlocking { @@ -2147,7 +1980,8 @@ class ContentBlocking { } Object encode() { - return _toList(); } + return _toList(); + } static ContentBlocking decode(Object result) { result as List; @@ -2173,8 +2007,7 @@ class ContentBlocking { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class DohSettings { @@ -2203,7 +2036,8 @@ class DohSettings { } Object encode() { - return _toList(); } + return _toList(); + } static DohSettings decode(Object result) { result as List; @@ -2229,8 +2063,7 @@ class DohSettings { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class GeckoEngineSettings { @@ -2363,7 +2196,8 @@ class GeckoEngineSettings { } Object encode() { - return _toList(); } + return _toList(); + } static GeckoEngineSettings decode(Object result) { result as List; @@ -2374,7 +2208,8 @@ class GeckoEngineSettings { globalPrivacyControlEnabled: result[3] as bool?, preferredColorScheme: result[4] as ColorScheme?, cookieBannerHandlingMode: result[5] as CookieBannerHandlingMode?, - cookieBannerHandlingModePrivateBrowsing: result[6] as CookieBannerHandlingMode?, + cookieBannerHandlingModePrivateBrowsing: + result[6] as CookieBannerHandlingMode?, cookieBannerHandlingGlobalRules: result[7] as bool?, cookieBannerHandlingGlobalRulesSubFrames: result[8] as bool?, webContentIsolationStrategy: result[9] as WebContentIsolationStrategy?, @@ -2412,8 +2247,7 @@ class GeckoEngineSettings { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class AutocompleteResult { @@ -2436,17 +2270,12 @@ class AutocompleteResult { int totalItems; List _toList() { - return [ - input, - text, - url, - source, - totalItems, - ]; + return [input, text, url, source, totalItems]; } Object encode() { - return _toList(); } + return _toList(); + } static AutocompleteResult decode(Object result) { result as List; @@ -2473,37 +2302,30 @@ class AutocompleteResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents all the different supported types of data that can be found from long clicking /// an element. -sealed class HitResult { -} +sealed class HitResult {} /// Default type if we're unable to match the type to anything. It may or may not have a src. class UnknownHitResult extends HitResult { - UnknownHitResult({ - required this.src, - }); + UnknownHitResult({required this.src}); String src; List _toList() { - return [ - src, - ]; + return [src]; } Object encode() { - return _toList(); } + return _toList(); + } static UnknownHitResult decode(Object result) { result as List; - return UnknownHitResult( - src: result[0]! as String, - ); + return UnknownHitResult(src: result[0]! as String); } @override @@ -2520,30 +2342,24 @@ class UnknownHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// If the HTML element was of type 'HTMLImageElement'. class ImageHitResult extends HitResult { - ImageHitResult({ - required this.src, - this.title, - }); + ImageHitResult({required this.src, this.title}); String src; String? title; List _toList() { - return [ - src, - title, - ]; + return [src, title]; } Object encode() { - return _toList(); } + return _toList(); + } static ImageHitResult decode(Object result) { result as List; @@ -2567,30 +2383,24 @@ class ImageHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// If the HTML element was of type 'HTMLVideoElement'. class VideoHitResult extends HitResult { - VideoHitResult({ - required this.src, - this.title, - }); + VideoHitResult({required this.src, this.title}); String src; String? title; List _toList() { - return [ - src, - title, - ]; + return [src, title]; } Object encode() { - return _toList(); } + return _toList(); + } static VideoHitResult decode(Object result) { result as List; @@ -2614,30 +2424,24 @@ class VideoHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// If the HTML element was of type 'HTMLAudioElement'. class AudioHitResult extends HitResult { - AudioHitResult({ - required this.src, - this.title, - }); + AudioHitResult({required this.src, this.title}); String src; String? title; List _toList() { - return [ - src, - title, - ]; + return [src, title]; } Object encode() { - return _toList(); } + return _toList(); + } static AudioHitResult decode(Object result) { result as List; @@ -2661,30 +2465,24 @@ class AudioHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// If the HTML element was of type 'HTMLImageElement' and contained a URI. class ImageSrcHitResult extends HitResult { - ImageSrcHitResult({ - required this.src, - required this.uri, - }); + ImageSrcHitResult({required this.src, required this.uri}); String src; String uri; List _toList() { - return [ - src, - uri, - ]; + return [src, uri]; } Object encode() { - return _toList(); } + return _toList(); + } static ImageSrcHitResult decode(Object result) { result as List; @@ -2708,32 +2506,26 @@ class ImageSrcHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// The type used if the URI is prepended with 'tel:'. class PhoneHitResult extends HitResult { - PhoneHitResult({ - required this.src, - }); + PhoneHitResult({required this.src}); String src; List _toList() { - return [ - src, - ]; + return [src]; } Object encode() { - return _toList(); } + return _toList(); + } static PhoneHitResult decode(Object result) { result as List; - return PhoneHitResult( - src: result[0]! as String, - ); + return PhoneHitResult(src: result[0]! as String); } @override @@ -2750,32 +2542,26 @@ class PhoneHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// The type used if the URI is prepended with 'mailto:'. class EmailHitResult extends HitResult { - EmailHitResult({ - required this.src, - }); + EmailHitResult({required this.src}); String src; List _toList() { - return [ - src, - ]; + return [src]; } Object encode() { - return _toList(); } + return _toList(); + } static EmailHitResult decode(Object result) { result as List; - return EmailHitResult( - src: result[0]! as String, - ); + return EmailHitResult(src: result[0]! as String); } @override @@ -2792,32 +2578,26 @@ class EmailHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// The type used if the URI is prepended with 'geo:'. class GeoHitResult extends HitResult { - GeoHitResult({ - required this.src, - }); + GeoHitResult({required this.src}); String src; List _toList() { - return [ - src, - ]; + return [src]; } Object encode() { - return _toList(); } + return _toList(); + } static GeoHitResult decode(Object result) { result as List; - return GeoHitResult( - src: result[0]! as String, - ); + return GeoHitResult(src: result[0]! as String); } @override @@ -2834,8 +2614,7 @@ class GeoHitResult extends HitResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class DownloadState { @@ -2916,7 +2695,8 @@ class DownloadState { } Object encode() { - return _toList(); } + return _toList(); + } static DownloadState decode(Object result) { result as List; @@ -2955,8 +2735,7 @@ class DownloadState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class ShareInternetResourceState { @@ -2976,16 +2755,12 @@ class ShareInternetResourceState { String? referrerUrl; List _toList() { - return [ - url, - contentType, - private, - referrerUrl, - ]; + return [url, contentType, private, referrerUrl]; } Object encode() { - return _toList(); } + return _toList(); + } static ShareInternetResourceState decode(Object result) { result as List; @@ -3000,7 +2775,8 @@ class ShareInternetResourceState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! ShareInternetResourceState || other.runtimeType != runtimeType) { + if (other is! ShareInternetResourceState || + other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -3011,8 +2787,7 @@ class ShareInternetResourceState { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class AddonCollection { @@ -3029,15 +2804,12 @@ class AddonCollection { String collectionName; List _toList() { - return [ - serverURL, - collectionUser, - collectionName, - ]; + return [serverURL, collectionUser, collectionName]; } Object encode() { - return _toList(); } + return _toList(); + } static AddonCollection decode(Object result) { result as List; @@ -3062,29 +2834,23 @@ class AddonCollection { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncEngineStatus { - SyncEngineStatus({ - required this.engine, - required this.enabled, - }); + SyncEngineStatus({required this.engine, required this.enabled}); SyncEngineValue engine; bool enabled; List _toList() { - return [ - engine, - enabled, - ]; + return [engine, enabled]; } Object encode() { - return _toList(); } + return _toList(); + } static SyncEngineStatus decode(Object result) { result as List; @@ -3108,8 +2874,7 @@ class SyncEngineStatus { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncAccountInfo { @@ -3150,7 +2915,8 @@ class SyncAccountInfo { } Object encode() { - return _toList(); } + return _toList(); + } static SyncAccountInfo decode(Object result) { result as List; @@ -3179,8 +2945,7 @@ class SyncAccountInfo { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncDevice { @@ -3200,16 +2965,12 @@ class SyncDevice { bool canSendTab; List _toList() { - return [ - deviceId, - displayName, - isCurrentDevice, - canSendTab, - ]; + return [deviceId, displayName, isCurrentDevice, canSendTab]; } Object encode() { - return _toList(); } + return _toList(); + } static SyncDevice decode(Object result) { result as List; @@ -3235,8 +2996,7 @@ class SyncDevice { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncIncomingTab { @@ -3256,16 +3016,12 @@ class SyncIncomingTab { String? fromDeviceName; List _toList() { - return [ - title, - url, - fromDeviceId, - fromDeviceName, - ]; + return [title, url, fromDeviceId, fromDeviceName]; } Object encode() { - return _toList(); } + return _toList(); + } static SyncIncomingTab decode(Object result) { result as List; @@ -3291,8 +3047,7 @@ class SyncIncomingTab { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncRemoteTab { @@ -3315,17 +3070,12 @@ class SyncRemoteTab { bool inactive; List _toList() { - return [ - title, - url, - iconUrl, - lastUsed, - inactive, - ]; + return [title, url, iconUrl, lastUsed, inactive]; } Object encode() { - return _toList(); } + return _toList(); + } static SyncRemoteTab decode(Object result) { result as List; @@ -3352,8 +3102,7 @@ class SyncRemoteTab { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncDeviceTabs { @@ -3370,15 +3119,12 @@ class SyncDeviceTabs { List tabs; List _toList() { - return [ - deviceId, - deviceName, - tabs, - ]; + return [deviceId, deviceName, tabs]; } Object encode() { - return _toList(); } + return _toList(); + } static SyncDeviceTabs decode(Object result) { result as List; @@ -3403,8 +3149,7 @@ class SyncDeviceTabs { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class GeckoPref { @@ -3427,17 +3172,12 @@ class GeckoPref { bool hasUserChangedValue; List _toList() { - return [ - name, - value, - defaultValue, - userValue, - hasUserChangedValue, - ]; + return [name, value, defaultValue, userValue, hasUserChangedValue]; } Object encode() { - return _toList(); } + return _toList(); + } static GeckoPref decode(Object result) { result as List; @@ -3464,8 +3204,7 @@ class GeckoPref { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Progress information for ML model operations @@ -3529,7 +3268,8 @@ class MlProgressData { } Object encode() { - return _toList(); } + return _toList(); + } static MlProgressData decode(Object result) { result as List; @@ -3561,8 +3301,7 @@ class MlProgressData { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class ContainerSiteAssignment { @@ -3585,17 +3324,12 @@ class ContainerSiteAssignment { bool blocked; List _toList() { - return [ - requestId, - tabId, - originUrl, - url, - blocked, - ]; + return [requestId, tabId, originUrl, url, blocked]; } Object encode() { - return _toList(); } + return _toList(); + } static ContainerSiteAssignment decode(Object result) { result as List; @@ -3622,36 +3356,27 @@ class ContainerSiteAssignment { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class GeckoHeader { - GeckoHeader({ - required this.key, - required this.value, - }); + GeckoHeader({required this.key, required this.value}); String key; String value; List _toList() { - return [ - key, - value, - ]; + return [key, value]; } Object encode() { - return _toList(); } + return _toList(); + } static GeckoHeader decode(Object result) { result as List; - return GeckoHeader( - key: result[0]! as String, - value: result[1]! as String, - ); + return GeckoHeader(key: result[0]! as String, value: result[1]! as String); } @override @@ -3668,8 +3393,7 @@ class GeckoHeader { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class GeckoFetchRequest { @@ -3734,7 +3458,8 @@ class GeckoFetchRequest { } Object encode() { - return _toList(); } + return _toList(); + } static GeckoFetchRequest decode(Object result) { result as List; @@ -3769,8 +3494,7 @@ class GeckoFetchRequest { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class GeckoFetchResponse { @@ -3790,16 +3514,12 @@ class GeckoFetchResponse { Uint8List body; List _toList() { - return [ - url, - status, - headers, - body, - ]; + return [url, status, headers, body]; } Object encode() { - return _toList(); } + return _toList(); + } static GeckoFetchResponse decode(Object result) { result as List; @@ -3825,8 +3545,7 @@ class GeckoFetchResponse { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class BookmarkNode { @@ -3875,7 +3594,8 @@ class BookmarkNode { } Object encode() { - return _toList(); } + return _toList(); + } static BookmarkNode decode(Object result) { result as List; @@ -3906,18 +3626,12 @@ class BookmarkNode { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Class for making alterations to any bookmark node class BookmarkInfo { - BookmarkInfo({ - this.parentGuid, - this.position, - this.title, - this.url, - }); + BookmarkInfo({this.parentGuid, this.position, this.title, this.url}); String? parentGuid; @@ -3928,16 +3642,12 @@ class BookmarkInfo { String? url; List _toList() { - return [ - parentGuid, - position, - title, - url, - ]; + return [parentGuid, position, title, url]; } Object encode() { - return _toList(); } + return _toList(); + } static BookmarkInfo decode(Object result) { result as List; @@ -3963,8 +3673,7 @@ class BookmarkInfo { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Site permissions data structure @@ -4030,7 +3739,8 @@ class SitePermissions { } Object encode() { - return _toList(); } + return _toList(); + } static SitePermissions decode(Object result) { result as List; @@ -4065,8 +3775,7 @@ class SitePermissions { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Tracking protection exception for a site @@ -4074,32 +3783,28 @@ class SitePermissions { /// This represents a site that has been added to the exceptions list, /// meaning tracking protection is disabled for this specific site. class TrackingProtectionException { - TrackingProtectionException({ - required this.url, - }); + TrackingProtectionException({required this.url}); String url; List _toList() { - return [ - url, - ]; + return [url]; } Object encode() { - return _toList(); } + return _toList(); + } static TrackingProtectionException decode(Object result) { result as List; - return TrackingProtectionException( - url: result[0]! as String, - ); + return TrackingProtectionException(url: result[0]! as String); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! TrackingProtectionException || other.runtimeType != runtimeType) { + if (other is! TrackingProtectionException || + other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -4110,17 +3815,12 @@ class TrackingProtectionException { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents an icon from a PWA manifest. class PwaIcon { - PwaIcon({ - required this.src, - this.sizes, - this.type, - }); + PwaIcon({required this.src, this.sizes, this.type}); String src; @@ -4129,15 +3829,12 @@ class PwaIcon { String? type; List _toList() { - return [ - src, - sizes, - type, - ]; + return [src, sizes, type]; } Object encode() { - return _toList(); } + return _toList(); + } static PwaIcon decode(Object result) { result as List; @@ -4162,30 +3859,24 @@ class PwaIcon { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents a file entry in share target params. class ShareTargetFiles { - ShareTargetFiles({ - required this.name, - required this.accept, - }); + ShareTargetFiles({required this.name, required this.accept}); String name; List accept; List _toList() { - return [ - name, - accept, - ]; + return [name, accept]; } Object encode() { - return _toList(); } + return _toList(); + } static ShareTargetFiles decode(Object result) { result as List; @@ -4209,18 +3900,12 @@ class ShareTargetFiles { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents share target params. class ShareTargetParams { - ShareTargetParams({ - this.title, - this.text, - this.url, - required this.files, - }); + ShareTargetParams({this.title, this.text, this.url, required this.files}); String? title; @@ -4231,16 +3916,12 @@ class ShareTargetParams { List files; List _toList() { - return [ - title, - text, - url, - files, - ]; + return [title, text, url, files]; } Object encode() { - return _toList(); } + return _toList(); + } static ShareTargetParams decode(Object result) { result as List; @@ -4266,18 +3947,12 @@ class ShareTargetParams { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents a share target for PWA. class ShareTarget { - ShareTarget({ - required this.action, - this.method, - this.encType, - this.params, - }); + ShareTarget({required this.action, this.method, this.encType, this.params}); String action; @@ -4288,16 +3963,12 @@ class ShareTarget { ShareTargetParams? params; List _toList() { - return [ - action, - method, - encType, - params, - ]; + return [action, method, encType, params]; } Object encode() { - return _toList(); } + return _toList(); + } static ShareTarget decode(Object result) { result as List; @@ -4323,8 +3994,7 @@ class ShareTarget { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents an external application resource. @@ -4345,16 +4015,12 @@ class ExternalApplicationResource { String? minVersion; List _toList() { - return [ - platform, - url, - id, - minVersion, - ]; + return [platform, url, id, minVersion]; } Object encode() { - return _toList(); } + return _toList(); + } static ExternalApplicationResource decode(Object result) { result as List; @@ -4369,7 +4035,8 @@ class ExternalApplicationResource { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(Object other) { - if (other is! ExternalApplicationResource || other.runtimeType != runtimeType) { + if (other is! ExternalApplicationResource || + other.runtimeType != runtimeType) { return false; } if (identical(this, other)) { @@ -4380,8 +4047,7 @@ class ExternalApplicationResource { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Represents a PWA web app manifest. @@ -4464,7 +4130,8 @@ class PwaManifest { } Object encode() { - return _toList(); } + return _toList(); + } static PwaManifest decode(Object result) { result as List; @@ -4481,7 +4148,8 @@ class PwaManifest { dir: result[9] as String?, lang: result[10] as String?, orientation: result[11] as String?, - relatedApplications: (result[12] as List?)!.cast(), + relatedApplications: (result[12] as List?)! + .cast(), preferRelatedApplications: result[13]! as bool, shareTarget: result[14] as ShareTarget?, currentUrl: result[15]! as String, @@ -4502,11 +4170,9 @@ class PwaManifest { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -4514,298 +4180,298 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is RestoreLocation) { + } else if (value is RestoreLocation) { buffer.putUint8(129); writeValue(buffer, value.index); - } else if (value is IconType) { + } else if (value is IconType) { buffer.putUint8(130); writeValue(buffer, value.index); - } else if (value is IconSize) { + } else if (value is IconSize) { buffer.putUint8(131); writeValue(buffer, value.index); - } else if (value is IconSource) { + } else if (value is IconSource) { buffer.putUint8(132); writeValue(buffer, value.index); - } else if (value is CookieSameSiteStatus) { + } else if (value is CookieSameSiteStatus) { buffer.putUint8(133); writeValue(buffer, value.index); - } else if (value is VisitType) { + } else if (value is VisitType) { buffer.putUint8(134); writeValue(buffer, value.index); - } else if (value is SelectionPattern) { + } else if (value is SelectionPattern) { buffer.putUint8(135); writeValue(buffer, value.index); - } else if (value is WebExtensionActionType) { + } else if (value is WebExtensionActionType) { buffer.putUint8(136); writeValue(buffer, value.index); - } else if (value is GeckoSuggestionType) { + } else if (value is GeckoSuggestionType) { buffer.putUint8(137); writeValue(buffer, value.index); - } else if (value is TrackingProtectionPolicy) { + } else if (value is TrackingProtectionPolicy) { buffer.putUint8(138); writeValue(buffer, value.index); - } else if (value is HttpsOnlyMode) { + } else if (value is HttpsOnlyMode) { buffer.putUint8(139); writeValue(buffer, value.index); - } else if (value is QueryParameterStripping) { + } else if (value is QueryParameterStripping) { buffer.putUint8(140); writeValue(buffer, value.index); - } else if (value is BounceTrackingProtectionMode) { + } else if (value is BounceTrackingProtectionMode) { buffer.putUint8(141); writeValue(buffer, value.index); - } else if (value is ColorScheme) { + } else if (value is ColorScheme) { buffer.putUint8(142); writeValue(buffer, value.index); - } else if (value is CookieBannerHandlingMode) { + } else if (value is CookieBannerHandlingMode) { buffer.putUint8(143); writeValue(buffer, value.index); - } else if (value is AppLinksMode) { + } else if (value is AppLinksMode) { buffer.putUint8(144); writeValue(buffer, value.index); - } else if (value is WebContentIsolationStrategy) { + } else if (value is WebContentIsolationStrategy) { buffer.putUint8(145); writeValue(buffer, value.index); - } else if (value is CustomCookiePolicy) { + } else if (value is CustomCookiePolicy) { buffer.putUint8(146); writeValue(buffer, value.index); - } else if (value is TrackingScope) { + } else if (value is TrackingScope) { buffer.putUint8(147); writeValue(buffer, value.index); - } else if (value is DohSettingsMode) { + } else if (value is DohSettingsMode) { buffer.putUint8(148); writeValue(buffer, value.index); - } else if (value is DownloadStatus) { + } else if (value is DownloadStatus) { buffer.putUint8(149); writeValue(buffer, value.index); - } else if (value is LogLevel) { + } else if (value is LogLevel) { buffer.putUint8(150); writeValue(buffer, value.index); - } else if (value is SyncEngineValue) { + } else if (value is SyncEngineValue) { buffer.putUint8(151); writeValue(buffer, value.index); - } else if (value is MlProgressType) { + } else if (value is MlProgressType) { buffer.putUint8(152); writeValue(buffer, value.index); - } else if (value is MlProgressStatus) { + } else if (value is MlProgressStatus) { buffer.putUint8(153); writeValue(buffer, value.index); - } else if (value is ClearDataType) { + } else if (value is ClearDataType) { buffer.putUint8(154); writeValue(buffer, value.index); - } else if (value is GeckoFetchMethod) { + } else if (value is GeckoFetchMethod) { buffer.putUint8(155); writeValue(buffer, value.index); - } else if (value is GeckoFetchRedircet) { + } else if (value is GeckoFetchRedircet) { buffer.putUint8(156); writeValue(buffer, value.index); - } else if (value is GeckoFetchCookiePolicy) { + } else if (value is GeckoFetchCookiePolicy) { buffer.putUint8(157); writeValue(buffer, value.index); - } else if (value is BookmarkNodeType) { + } else if (value is BookmarkNodeType) { buffer.putUint8(158); writeValue(buffer, value.index); - } else if (value is SitePermissionStatus) { + } else if (value is SitePermissionStatus) { buffer.putUint8(159); writeValue(buffer, value.index); - } else if (value is AutoplayStatus) { + } else if (value is AutoplayStatus) { buffer.putUint8(160); writeValue(buffer, value.index); - } else if (value is TranslationOptions) { + } else if (value is TranslationOptions) { buffer.putUint8(161); writeValue(buffer, value.encode()); - } else if (value is ReaderState) { + } else if (value is ReaderState) { buffer.putUint8(162); writeValue(buffer, value.encode()); - } else if (value is AddTabParams) { + } else if (value is AddTabParams) { buffer.putUint8(163); writeValue(buffer, value.encode()); - } else if (value is LastMediaAccessState) { + } else if (value is LastMediaAccessState) { buffer.putUint8(164); writeValue(buffer, value.encode()); - } else if (value is HistoryMetadataKey) { + } else if (value is HistoryMetadataKey) { buffer.putUint8(165); writeValue(buffer, value.encode()); - } else if (value is PackageCategoryValue) { + } else if (value is PackageCategoryValue) { buffer.putUint8(166); writeValue(buffer, value.encode()); - } else if (value is ExternalPackage) { + } else if (value is ExternalPackage) { buffer.putUint8(167); writeValue(buffer, value.encode()); - } else if (value is LoadUrlFlagsValue) { + } else if (value is LoadUrlFlagsValue) { buffer.putUint8(168); writeValue(buffer, value.encode()); - } else if (value is SourceValue) { + } else if (value is SourceValue) { buffer.putUint8(169); writeValue(buffer, value.encode()); - } else if (value is TabState) { + } else if (value is TabState) { buffer.putUint8(170); writeValue(buffer, value.encode()); - } else if (value is RecoverableTab) { + } else if (value is RecoverableTab) { buffer.putUint8(171); writeValue(buffer, value.encode()); - } else if (value is RecoverableBrowserState) { + } else if (value is RecoverableBrowserState) { buffer.putUint8(172); writeValue(buffer, value.encode()); - } else if (value is IconRequest) { + } else if (value is IconRequest) { buffer.putUint8(173); writeValue(buffer, value.encode()); - } else if (value is ResourceSize) { + } else if (value is ResourceSize) { buffer.putUint8(174); writeValue(buffer, value.encode()); - } else if (value is Resource) { + } else if (value is Resource) { buffer.putUint8(175); writeValue(buffer, value.encode()); - } else if (value is IconResult) { + } else if (value is IconResult) { buffer.putUint8(176); writeValue(buffer, value.encode()); - } else if (value is CookiePartitionKey) { + } else if (value is CookiePartitionKey) { buffer.putUint8(177); writeValue(buffer, value.encode()); - } else if (value is Cookie) { + } else if (value is Cookie) { buffer.putUint8(178); writeValue(buffer, value.encode()); - } else if (value is VisitInfo) { + } else if (value is VisitInfo) { buffer.putUint8(179); writeValue(buffer, value.encode()); - } else if (value is HistoryItem) { + } else if (value is HistoryItem) { buffer.putUint8(180); writeValue(buffer, value.encode()); - } else if (value is HistoryState) { + } else if (value is HistoryState) { buffer.putUint8(181); writeValue(buffer, value.encode()); - } else if (value is ReaderableState) { + } else if (value is ReaderableState) { buffer.putUint8(182); writeValue(buffer, value.encode()); - } else if (value is SecurityInfoState) { + } else if (value is SecurityInfoState) { buffer.putUint8(183); writeValue(buffer, value.encode()); - } else if (value is TabContentState) { + } else if (value is TabContentState) { buffer.putUint8(184); writeValue(buffer, value.encode()); - } else if (value is FindResultState) { + } else if (value is FindResultState) { buffer.putUint8(185); writeValue(buffer, value.encode()); - } else if (value is CustomSelectionAction) { + } else if (value is CustomSelectionAction) { buffer.putUint8(186); writeValue(buffer, value.encode()); - } else if (value is WebExtensionData) { + } else if (value is WebExtensionData) { buffer.putUint8(187); writeValue(buffer, value.encode()); - } else if (value is GeckoSuggestion) { + } else if (value is GeckoSuggestion) { buffer.putUint8(188); writeValue(buffer, value.encode()); - } else if (value is TabContent) { + } else if (value is TabContent) { buffer.putUint8(189); writeValue(buffer, value.encode()); - } else if (value is ContentBlocking) { + } else if (value is ContentBlocking) { buffer.putUint8(190); writeValue(buffer, value.encode()); - } else if (value is DohSettings) { + } else if (value is DohSettings) { buffer.putUint8(191); writeValue(buffer, value.encode()); - } else if (value is GeckoEngineSettings) { + } else if (value is GeckoEngineSettings) { buffer.putUint8(192); writeValue(buffer, value.encode()); - } else if (value is AutocompleteResult) { + } else if (value is AutocompleteResult) { buffer.putUint8(193); writeValue(buffer, value.encode()); - } else if (value is UnknownHitResult) { + } else if (value is UnknownHitResult) { buffer.putUint8(194); writeValue(buffer, value.encode()); - } else if (value is ImageHitResult) { + } else if (value is ImageHitResult) { buffer.putUint8(195); writeValue(buffer, value.encode()); - } else if (value is VideoHitResult) { + } else if (value is VideoHitResult) { buffer.putUint8(196); writeValue(buffer, value.encode()); - } else if (value is AudioHitResult) { + } else if (value is AudioHitResult) { buffer.putUint8(197); writeValue(buffer, value.encode()); - } else if (value is ImageSrcHitResult) { + } else if (value is ImageSrcHitResult) { buffer.putUint8(198); writeValue(buffer, value.encode()); - } else if (value is PhoneHitResult) { + } else if (value is PhoneHitResult) { buffer.putUint8(199); writeValue(buffer, value.encode()); - } else if (value is EmailHitResult) { + } else if (value is EmailHitResult) { buffer.putUint8(200); writeValue(buffer, value.encode()); - } else if (value is GeoHitResult) { + } else if (value is GeoHitResult) { buffer.putUint8(201); writeValue(buffer, value.encode()); - } else if (value is DownloadState) { + } else if (value is DownloadState) { buffer.putUint8(202); writeValue(buffer, value.encode()); - } else if (value is ShareInternetResourceState) { + } else if (value is ShareInternetResourceState) { buffer.putUint8(203); writeValue(buffer, value.encode()); - } else if (value is AddonCollection) { + } else if (value is AddonCollection) { buffer.putUint8(204); writeValue(buffer, value.encode()); - } else if (value is SyncEngineStatus) { + } else if (value is SyncEngineStatus) { buffer.putUint8(205); writeValue(buffer, value.encode()); - } else if (value is SyncAccountInfo) { + } else if (value is SyncAccountInfo) { buffer.putUint8(206); writeValue(buffer, value.encode()); - } else if (value is SyncDevice) { + } else if (value is SyncDevice) { buffer.putUint8(207); writeValue(buffer, value.encode()); - } else if (value is SyncIncomingTab) { + } else if (value is SyncIncomingTab) { buffer.putUint8(208); writeValue(buffer, value.encode()); - } else if (value is SyncRemoteTab) { + } else if (value is SyncRemoteTab) { buffer.putUint8(209); writeValue(buffer, value.encode()); - } else if (value is SyncDeviceTabs) { + } else if (value is SyncDeviceTabs) { buffer.putUint8(210); writeValue(buffer, value.encode()); - } else if (value is GeckoPref) { + } else if (value is GeckoPref) { buffer.putUint8(211); writeValue(buffer, value.encode()); - } else if (value is MlProgressData) { + } else if (value is MlProgressData) { buffer.putUint8(212); writeValue(buffer, value.encode()); - } else if (value is ContainerSiteAssignment) { + } else if (value is ContainerSiteAssignment) { buffer.putUint8(213); writeValue(buffer, value.encode()); - } else if (value is GeckoHeader) { + } else if (value is GeckoHeader) { buffer.putUint8(214); writeValue(buffer, value.encode()); - } else if (value is GeckoFetchRequest) { + } else if (value is GeckoFetchRequest) { buffer.putUint8(215); writeValue(buffer, value.encode()); - } else if (value is GeckoFetchResponse) { + } else if (value is GeckoFetchResponse) { buffer.putUint8(216); writeValue(buffer, value.encode()); - } else if (value is BookmarkNode) { + } else if (value is BookmarkNode) { buffer.putUint8(217); writeValue(buffer, value.encode()); - } else if (value is BookmarkInfo) { + } else if (value is BookmarkInfo) { buffer.putUint8(218); writeValue(buffer, value.encode()); - } else if (value is SitePermissions) { + } else if (value is SitePermissions) { buffer.putUint8(219); writeValue(buffer, value.encode()); - } else if (value is TrackingProtectionException) { + } else if (value is TrackingProtectionException) { buffer.putUint8(220); writeValue(buffer, value.encode()); - } else if (value is PwaIcon) { + } else if (value is PwaIcon) { buffer.putUint8(221); writeValue(buffer, value.encode()); - } else if (value is ShareTargetFiles) { + } else if (value is ShareTargetFiles) { buffer.putUint8(222); writeValue(buffer, value.encode()); - } else if (value is ShareTargetParams) { + } else if (value is ShareTargetParams) { buffer.putUint8(223); writeValue(buffer, value.encode()); - } else if (value is ShareTarget) { + } else if (value is ShareTarget) { buffer.putUint8(224); writeValue(buffer, value.encode()); - } else if (value is ExternalApplicationResource) { + } else if (value is ExternalApplicationResource) { buffer.putUint8(225); writeValue(buffer, value.encode()); - } else if (value is PwaManifest) { + } else if (value is PwaManifest) { buffer.putUint8(226); writeValue(buffer, value.encode()); } else { @@ -4816,233 +4482,235 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: final value = readValue(buffer) as int?; return value == null ? null : RestoreLocation.values[value]; - case 130: + case 130: final value = readValue(buffer) as int?; return value == null ? null : IconType.values[value]; - case 131: + case 131: final value = readValue(buffer) as int?; return value == null ? null : IconSize.values[value]; - case 132: + case 132: final value = readValue(buffer) as int?; return value == null ? null : IconSource.values[value]; - case 133: + case 133: final value = readValue(buffer) as int?; return value == null ? null : CookieSameSiteStatus.values[value]; - case 134: + case 134: final value = readValue(buffer) as int?; return value == null ? null : VisitType.values[value]; - case 135: + case 135: final value = readValue(buffer) as int?; return value == null ? null : SelectionPattern.values[value]; - case 136: + case 136: final value = readValue(buffer) as int?; return value == null ? null : WebExtensionActionType.values[value]; - case 137: + case 137: final value = readValue(buffer) as int?; return value == null ? null : GeckoSuggestionType.values[value]; - case 138: + case 138: final value = readValue(buffer) as int?; return value == null ? null : TrackingProtectionPolicy.values[value]; - case 139: + case 139: final value = readValue(buffer) as int?; return value == null ? null : HttpsOnlyMode.values[value]; - case 140: + case 140: final value = readValue(buffer) as int?; return value == null ? null : QueryParameterStripping.values[value]; - case 141: + case 141: final value = readValue(buffer) as int?; - return value == null ? null : BounceTrackingProtectionMode.values[value]; - case 142: + return value == null + ? null + : BounceTrackingProtectionMode.values[value]; + case 142: final value = readValue(buffer) as int?; return value == null ? null : ColorScheme.values[value]; - case 143: + case 143: final value = readValue(buffer) as int?; return value == null ? null : CookieBannerHandlingMode.values[value]; - case 144: + case 144: final value = readValue(buffer) as int?; return value == null ? null : AppLinksMode.values[value]; - case 145: + case 145: final value = readValue(buffer) as int?; return value == null ? null : WebContentIsolationStrategy.values[value]; - case 146: + case 146: final value = readValue(buffer) as int?; return value == null ? null : CustomCookiePolicy.values[value]; - case 147: + case 147: final value = readValue(buffer) as int?; return value == null ? null : TrackingScope.values[value]; - case 148: + case 148: final value = readValue(buffer) as int?; return value == null ? null : DohSettingsMode.values[value]; - case 149: + case 149: final value = readValue(buffer) as int?; return value == null ? null : DownloadStatus.values[value]; - case 150: + case 150: final value = readValue(buffer) as int?; return value == null ? null : LogLevel.values[value]; - case 151: + case 151: final value = readValue(buffer) as int?; return value == null ? null : SyncEngineValue.values[value]; - case 152: + case 152: final value = readValue(buffer) as int?; return value == null ? null : MlProgressType.values[value]; - case 153: + case 153: final value = readValue(buffer) as int?; return value == null ? null : MlProgressStatus.values[value]; - case 154: + case 154: final value = readValue(buffer) as int?; return value == null ? null : ClearDataType.values[value]; - case 155: + case 155: final value = readValue(buffer) as int?; return value == null ? null : GeckoFetchMethod.values[value]; - case 156: + case 156: final value = readValue(buffer) as int?; return value == null ? null : GeckoFetchRedircet.values[value]; - case 157: + case 157: final value = readValue(buffer) as int?; return value == null ? null : GeckoFetchCookiePolicy.values[value]; - case 158: + case 158: final value = readValue(buffer) as int?; return value == null ? null : BookmarkNodeType.values[value]; - case 159: + case 159: final value = readValue(buffer) as int?; return value == null ? null : SitePermissionStatus.values[value]; - case 160: + case 160: final value = readValue(buffer) as int?; return value == null ? null : AutoplayStatus.values[value]; - case 161: + case 161: return TranslationOptions.decode(readValue(buffer)!); - case 162: + case 162: return ReaderState.decode(readValue(buffer)!); - case 163: + case 163: return AddTabParams.decode(readValue(buffer)!); - case 164: + case 164: return LastMediaAccessState.decode(readValue(buffer)!); - case 165: + case 165: return HistoryMetadataKey.decode(readValue(buffer)!); - case 166: + case 166: return PackageCategoryValue.decode(readValue(buffer)!); - case 167: + case 167: return ExternalPackage.decode(readValue(buffer)!); - case 168: + case 168: return LoadUrlFlagsValue.decode(readValue(buffer)!); - case 169: + case 169: return SourceValue.decode(readValue(buffer)!); - case 170: + case 170: return TabState.decode(readValue(buffer)!); - case 171: + case 171: return RecoverableTab.decode(readValue(buffer)!); - case 172: + case 172: return RecoverableBrowserState.decode(readValue(buffer)!); - case 173: + case 173: return IconRequest.decode(readValue(buffer)!); - case 174: + case 174: return ResourceSize.decode(readValue(buffer)!); - case 175: + case 175: return Resource.decode(readValue(buffer)!); - case 176: + case 176: return IconResult.decode(readValue(buffer)!); - case 177: + case 177: return CookiePartitionKey.decode(readValue(buffer)!); - case 178: + case 178: return Cookie.decode(readValue(buffer)!); - case 179: + case 179: return VisitInfo.decode(readValue(buffer)!); - case 180: + case 180: return HistoryItem.decode(readValue(buffer)!); - case 181: + case 181: return HistoryState.decode(readValue(buffer)!); - case 182: + case 182: return ReaderableState.decode(readValue(buffer)!); - case 183: + case 183: return SecurityInfoState.decode(readValue(buffer)!); - case 184: + case 184: return TabContentState.decode(readValue(buffer)!); - case 185: + case 185: return FindResultState.decode(readValue(buffer)!); - case 186: + case 186: return CustomSelectionAction.decode(readValue(buffer)!); - case 187: + case 187: return WebExtensionData.decode(readValue(buffer)!); - case 188: + case 188: return GeckoSuggestion.decode(readValue(buffer)!); - case 189: + case 189: return TabContent.decode(readValue(buffer)!); - case 190: + case 190: return ContentBlocking.decode(readValue(buffer)!); - case 191: + case 191: return DohSettings.decode(readValue(buffer)!); - case 192: + case 192: return GeckoEngineSettings.decode(readValue(buffer)!); - case 193: + case 193: return AutocompleteResult.decode(readValue(buffer)!); - case 194: + case 194: return UnknownHitResult.decode(readValue(buffer)!); - case 195: + case 195: return ImageHitResult.decode(readValue(buffer)!); - case 196: + case 196: return VideoHitResult.decode(readValue(buffer)!); - case 197: + case 197: return AudioHitResult.decode(readValue(buffer)!); - case 198: + case 198: return ImageSrcHitResult.decode(readValue(buffer)!); - case 199: + case 199: return PhoneHitResult.decode(readValue(buffer)!); - case 200: + case 200: return EmailHitResult.decode(readValue(buffer)!); - case 201: + case 201: return GeoHitResult.decode(readValue(buffer)!); - case 202: + case 202: return DownloadState.decode(readValue(buffer)!); - case 203: + case 203: return ShareInternetResourceState.decode(readValue(buffer)!); - case 204: + case 204: return AddonCollection.decode(readValue(buffer)!); - case 205: + case 205: return SyncEngineStatus.decode(readValue(buffer)!); - case 206: + case 206: return SyncAccountInfo.decode(readValue(buffer)!); - case 207: + case 207: return SyncDevice.decode(readValue(buffer)!); - case 208: + case 208: return SyncIncomingTab.decode(readValue(buffer)!); - case 209: + case 209: return SyncRemoteTab.decode(readValue(buffer)!); - case 210: + case 210: return SyncDeviceTabs.decode(readValue(buffer)!); - case 211: + case 211: return GeckoPref.decode(readValue(buffer)!); - case 212: + case 212: return MlProgressData.decode(readValue(buffer)!); - case 213: + case 213: return ContainerSiteAssignment.decode(readValue(buffer)!); - case 214: + case 214: return GeckoHeader.decode(readValue(buffer)!); - case 215: + case 215: return GeckoFetchRequest.decode(readValue(buffer)!); - case 216: + case 216: return GeckoFetchResponse.decode(readValue(buffer)!); - case 217: + case 217: return BookmarkNode.decode(readValue(buffer)!); - case 218: + case 218: return BookmarkInfo.decode(readValue(buffer)!); - case 219: + case 219: return SitePermissions.decode(readValue(buffer)!); - case 220: + case 220: return TrackingProtectionException.decode(readValue(buffer)!); - case 221: + case 221: return PwaIcon.decode(readValue(buffer)!); - case 222: + case 222: return ShareTargetFiles.decode(readValue(buffer)!); - case 223: + case 223: return ShareTargetParams.decode(readValue(buffer)!); - case 224: + case 224: return ShareTarget.decode(readValue(buffer)!); - case 225: + case 225: return ExternalApplicationResource.decode(readValue(buffer)!); - case 226: + case 226: return PwaManifest.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -5054,9 +4722,13 @@ class GeckoBrowserApi { /// Constructor for [GeckoBrowserApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoBrowserApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoBrowserApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -5064,7 +4736,8 @@ class GeckoBrowserApi { final String pigeonVar_messageChannelSuffix; Future getGeckoVersion() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.getGeckoVersion$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.getGeckoVersion$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5090,14 +4763,30 @@ class GeckoBrowserApi { } } - Future initialize(String profileFolder, LogLevel logLevel, ContentBlocking contentBlocking, AddonCollection? addonCollection, String? fxaServerOverride, String? syncTokenServerOverride) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.initialize$pigeonVar_messageChannelSuffix'; + Future initialize( + String profileFolder, + LogLevel logLevel, + ContentBlocking contentBlocking, + AddonCollection? addonCollection, + String? fxaServerOverride, + String? syncTokenServerOverride, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.initialize$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([profileFolder, logLevel, contentBlocking, addonCollection, fxaServerOverride, syncTokenServerOverride]); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([ + profileFolder, + logLevel, + contentBlocking, + addonCollection, + fxaServerOverride, + syncTokenServerOverride, + ]); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5113,7 +4802,8 @@ class GeckoBrowserApi { } Future showNativeFragment() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.showNativeFragment$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.showNativeFragment$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5140,13 +4830,16 @@ class GeckoBrowserApi { } Future onTrimMemory(int level) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.onTrimMemory$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.onTrimMemory$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([level]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [level], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5161,14 +4854,21 @@ class GeckoBrowserApi { } } - Future openInCustomTab({required String url, required bool private, required String? contextId, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.openInCustomTab$pigeonVar_messageChannelSuffix'; + Future openInCustomTab({ + required String url, + required bool private, + required String? contextId, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserApi.openInCustomTab$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url, private, contextId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url, private, contextId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5188,9 +4888,13 @@ class GeckoSyncApi { /// Constructor for [GeckoSyncApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoSyncApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoSyncApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -5198,7 +4902,8 @@ class GeckoSyncApi { final String pigeonVar_messageChannelSuffix; Future getAccountInfo() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getAccountInfo$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getAccountInfo$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5225,7 +4930,8 @@ class GeckoSyncApi { } Future beginAuthentication() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.beginAuthentication$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.beginAuthentication$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5247,13 +4953,16 @@ class GeckoSyncApi { } Future beginPairingAuthentication(String pairingUrl) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.beginPairingAuthentication$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.beginPairingAuthentication$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([pairingUrl]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [pairingUrl], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5269,7 +4978,8 @@ class GeckoSyncApi { } Future logout() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.logout$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.logout$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5291,7 +5001,8 @@ class GeckoSyncApi { } Future syncNow() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.syncNow$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.syncNow$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5313,13 +5024,16 @@ class GeckoSyncApi { } Future setEngineEnabled(SyncEngineValue engine, bool enabled) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.setEngineEnabled$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.setEngineEnabled$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([engine, enabled]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [engine, enabled], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5335,7 +5049,8 @@ class GeckoSyncApi { } Future> getSyncedTabs() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getSyncedTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getSyncedTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5362,7 +5077,8 @@ class GeckoSyncApi { } Future> getDevices() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getDevices$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getDevices$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5388,14 +5104,21 @@ class GeckoSyncApi { } } - Future sendTabToDevice(String deviceId, String title, String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.sendTabToDevice$pigeonVar_messageChannelSuffix'; + Future sendTabToDevice( + String deviceId, + String title, + String url, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.sendTabToDevice$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([deviceId, title, url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [deviceId, title, url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5416,7 +5139,8 @@ class GeckoSyncApi { } Future refreshDevices() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.refreshDevices$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.refreshDevices$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5438,7 +5162,8 @@ class GeckoSyncApi { } Future pollDeviceCommands() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.pollDeviceCommands$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.pollDeviceCommands$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5460,7 +5185,8 @@ class GeckoSyncApi { } Future> drainIncomingTabs() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.drainIncomingTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.drainIncomingTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5482,12 +5208,14 @@ class GeckoSyncApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as List?)!.cast(); + return (pigeonVar_replyList[0] as List?)! + .cast(); } } Future getDeviceName() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getDeviceName$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.getDeviceName$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5509,13 +5237,16 @@ class GeckoSyncApi { } Future setDeviceName(String newName) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.setDeviceName$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncApi.setDeviceName$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([newName]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [newName], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5540,9 +5271,13 @@ class GeckoEngineSettingsApi { /// Constructor for [GeckoEngineSettingsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoEngineSettingsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoEngineSettingsApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -5550,13 +5285,16 @@ class GeckoEngineSettingsApi { final String pigeonVar_messageChannelSuffix; Future setDefaultSettings(GeckoEngineSettings settings) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setDefaultSettings$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setDefaultSettings$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([settings]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [settings], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5572,13 +5310,16 @@ class GeckoEngineSettingsApi { } Future updateRuntimeSettings(GeckoEngineSettings settings) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.updateRuntimeSettings$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.updateRuntimeSettings$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([settings]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [settings], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5594,13 +5335,16 @@ class GeckoEngineSettingsApi { } Future setPullToRefreshEnabled(bool enabled) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setPullToRefreshEnabled$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setPullToRefreshEnabled$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([enabled]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [enabled], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5618,13 +5362,16 @@ class GeckoEngineSettingsApi { /// Sets the app links mode preference (stored in SharedPreferences). /// Controls how external app links are handled in the browser. Future setAppLinksMode(AppLinksMode mode) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setAppLinksMode$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setAppLinksMode$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([mode]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [mode], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5640,7 +5387,8 @@ class GeckoEngineSettingsApi { } Future getAppLinksMode() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.getAppLinksMode$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.getAppLinksMode$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5669,13 +5417,16 @@ class GeckoEngineSettingsApi { /// Sets whether to use external download managers for downloads. /// When enabled, downloads are forwarded to third-party apps like ADM, 1DM, AB DM. Future setUseExternalDownloadManager(bool enabled) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setUseExternalDownloadManager$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.setUseExternalDownloadManager$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([enabled]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [enabled], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5691,7 +5442,8 @@ class GeckoEngineSettingsApi { } Future getUseExternalDownloadManager() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.getUseExternalDownloadManager$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoEngineSettingsApi.getUseExternalDownloadManager$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -5722,23 +5474,35 @@ class GeckoSessionApi { /// Constructor for [GeckoSessionApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoSessionApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoSessionApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future loadUrl({required String? tabId, required String url, required LoadUrlFlagsValue flags, required Map? additionalHeaders, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.loadUrl$pigeonVar_messageChannelSuffix'; + Future loadUrl({ + required String? tabId, + required String url, + required LoadUrlFlagsValue flags, + required Map? additionalHeaders, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.loadUrl$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, url, flags, additionalHeaders]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, url, flags, additionalHeaders], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5753,14 +5517,22 @@ class GeckoSessionApi { } } - Future loadData({required String? tabId, required String data, required String mimeType, required String encoding, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.loadData$pigeonVar_messageChannelSuffix'; + Future loadData({ + required String? tabId, + required String data, + required String mimeType, + required String encoding, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.loadData$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, data, mimeType, encoding]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, data, mimeType, encoding], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5775,14 +5547,20 @@ class GeckoSessionApi { } } - Future reload({required String? tabId, required LoadUrlFlagsValue flags}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.reload$pigeonVar_messageChannelSuffix'; + Future reload({ + required String? tabId, + required LoadUrlFlagsValue flags, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.reload$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, flags]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, flags], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5798,13 +5576,16 @@ class GeckoSessionApi { } Future stopLoading({required String? tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.stopLoading$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.stopLoading$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5819,14 +5600,20 @@ class GeckoSessionApi { } } - Future goBack({required String? tabId, required bool userInteraction}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.goBack$pigeonVar_messageChannelSuffix'; + Future goBack({ + required String? tabId, + required bool userInteraction, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.goBack$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, userInteraction]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, userInteraction], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5841,14 +5628,20 @@ class GeckoSessionApi { } } - Future goForward({required String? tabId, required bool userInteraction}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.goForward$pigeonVar_messageChannelSuffix'; + Future goForward({ + required String? tabId, + required bool userInteraction, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.goForward$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, userInteraction]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, userInteraction], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5863,14 +5656,20 @@ class GeckoSessionApi { } } - Future goToHistoryIndex({required int index, required String? tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.goToHistoryIndex$pigeonVar_messageChannelSuffix'; + Future goToHistoryIndex({ + required int index, + required String? tabId, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.goToHistoryIndex$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([index, tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [index, tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5885,14 +5684,20 @@ class GeckoSessionApi { } } - Future requestDesktopSite({required String? tabId, required bool enable}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.requestDesktopSite$pigeonVar_messageChannelSuffix'; + Future requestDesktopSite({ + required String? tabId, + required bool enable, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.requestDesktopSite$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, enable]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, enable], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5908,13 +5713,16 @@ class GeckoSessionApi { } Future exitFullscreen({required String? tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.exitFullscreen$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.exitFullscreen$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5930,13 +5738,16 @@ class GeckoSessionApi { } Future saveToPdf({required String? tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.saveToPdf$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.saveToPdf$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5952,13 +5763,16 @@ class GeckoSessionApi { } Future printContent({required String? tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.printContent$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.printContent$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5973,14 +5787,22 @@ class GeckoSessionApi { } } - Future translate({required String? tabId, required String fromLanguage, required String toLanguage, required TranslationOptions? options, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.translate$pigeonVar_messageChannelSuffix'; + Future translate({ + required String? tabId, + required String fromLanguage, + required String toLanguage, + required TranslationOptions? options, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.translate$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, fromLanguage, toLanguage, options]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, fromLanguage, toLanguage, options], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -5996,13 +5818,16 @@ class GeckoSessionApi { } Future translateRestore({required String? tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.translateRestore$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.translateRestore$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6018,13 +5843,16 @@ class GeckoSessionApi { } Future crashRecovery({required List? tabIds}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.crashRecovery$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.crashRecovery$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabIds]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabIds], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6040,7 +5868,8 @@ class GeckoSessionApi { } Future purgeHistory() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.purgeHistory$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.purgeHistory$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6061,14 +5890,20 @@ class GeckoSessionApi { } } - Future updateLastAccess({required String? tabId, required int? lastAccess}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.updateLastAccess$pigeonVar_messageChannelSuffix'; + Future updateLastAccess({ + required String? tabId, + required int? lastAccess, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.updateLastAccess$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, lastAccess]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, lastAccess], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6084,13 +5919,16 @@ class GeckoSessionApi { } Future requestScreenshot(bool sendBack) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.requestScreenshot$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSessionApi.requestScreenshot$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([sendBack]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [sendBack], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6110,23 +5948,57 @@ class GeckoTabsApi { /// Constructor for [GeckoTabsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoTabsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoTabsApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future syncEvents({required bool onSelectedTabChange, required bool onTabListChange, required bool onTabContentStateChange, required bool onIconChange, required bool onSecurityInfoStateChange, required bool onReaderableStateChange, required bool onHistoryStateChange, required bool onFindResults, required bool onThumbnailChange, required bool onBrowserExtensionsChange, required bool onPageExtensionsChange, required bool onBrowserExtensionIcons, required bool onPageExtensionIcons, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.syncEvents$pigeonVar_messageChannelSuffix'; + Future syncEvents({ + required bool onSelectedTabChange, + required bool onTabListChange, + required bool onTabContentStateChange, + required bool onIconChange, + required bool onSecurityInfoStateChange, + required bool onReaderableStateChange, + required bool onHistoryStateChange, + required bool onFindResults, + required bool onThumbnailChange, + required bool onBrowserExtensionsChange, + required bool onPageExtensionsChange, + required bool onBrowserExtensionIcons, + required bool onPageExtensionIcons, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.syncEvents$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([onSelectedTabChange, onTabListChange, onTabContentStateChange, onIconChange, onSecurityInfoStateChange, onReaderableStateChange, onHistoryStateChange, onFindResults, onThumbnailChange, onBrowserExtensionsChange, onPageExtensionsChange, onBrowserExtensionIcons, onPageExtensionIcons]); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([ + onSelectedTabChange, + onTabListChange, + onTabContentStateChange, + onIconChange, + onSecurityInfoStateChange, + onReaderableStateChange, + onHistoryStateChange, + onFindResults, + onThumbnailChange, + onBrowserExtensionsChange, + onPageExtensionsChange, + onBrowserExtensionIcons, + onPageExtensionIcons, + ]); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6142,13 +6014,16 @@ class GeckoTabsApi { } Future selectTab({required String tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.selectTab$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.selectTab$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6164,13 +6039,16 @@ class GeckoTabsApi { } Future removeTab({required String tabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeTab$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeTab$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6185,14 +6063,38 @@ class GeckoTabsApi { } } - Future addTab({required String url, required bool selectTab, required bool startLoading, required String? parentId, required LoadUrlFlagsValue flags, required String? contextId, required SourceValue source, required bool private, required HistoryMetadataKey? historyMetadata, required Map? additionalHeaders, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.addTab$pigeonVar_messageChannelSuffix'; + Future addTab({ + required String url, + required bool selectTab, + required bool startLoading, + required String? parentId, + required LoadUrlFlagsValue flags, + required String? contextId, + required SourceValue source, + required bool private, + required HistoryMetadataKey? historyMetadata, + required Map? additionalHeaders, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.addTab$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url, selectTab, startLoading, parentId, flags, contextId, source, private, historyMetadata, additionalHeaders]); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([ + url, + selectTab, + startLoading, + parentId, + flags, + contextId, + source, + private, + historyMetadata, + additionalHeaders, + ]); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6212,14 +6114,20 @@ class GeckoTabsApi { } } - Future> addMultipleTabs({required List tabs, required String? selectTabId}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.addMultipleTabs$pigeonVar_messageChannelSuffix'; + Future> addMultipleTabs({ + required List tabs, + required String? selectTabId, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.addMultipleTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabs, selectTabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabs, selectTabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6240,13 +6148,16 @@ class GeckoTabsApi { } Future removeAllTabs({required bool recoverable}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeAllTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeAllTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([recoverable]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [recoverable], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6262,13 +6173,16 @@ class GeckoTabsApi { } Future removeTabs({required List ids}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([ids]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [ids], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6284,7 +6198,8 @@ class GeckoTabsApi { } Future removeNormalTabs() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeNormalTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removeNormalTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6306,7 +6221,8 @@ class GeckoTabsApi { } Future removePrivateTabs() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removePrivateTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.removePrivateTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6328,7 +6244,8 @@ class GeckoTabsApi { } Future undo() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.undo$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.undo$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6349,14 +6266,21 @@ class GeckoTabsApi { } } - Future restoreTabsByList({required List tabs, required String? selectTabId, required RestoreLocation restoreLocation, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.restoreTabsByList$pigeonVar_messageChannelSuffix'; + Future restoreTabsByList({ + required List tabs, + required String? selectTabId, + required RestoreLocation restoreLocation, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.restoreTabsByList$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabs, selectTabId, restoreLocation]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabs, selectTabId, restoreLocation], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6371,14 +6295,20 @@ class GeckoTabsApi { } } - Future restoreTabsByBrowserState({required RecoverableBrowserState state, required RestoreLocation restoreLocation}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.restoreTabsByBrowserState$pigeonVar_messageChannelSuffix'; + Future restoreTabsByBrowserState({ + required RecoverableBrowserState state, + required RestoreLocation restoreLocation, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.restoreTabsByBrowserState$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([state, restoreLocation]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [state, restoreLocation], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6395,14 +6325,20 @@ class GeckoTabsApi { /// Selects an already existing tab with the matching [HistoryMetadataKey] or otherwise /// creates a new tab with the given [url]. - Future selectOrAddTabByHistory({required String url, required HistoryMetadataKey historyMetadata}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.selectOrAddTabByHistory$pigeonVar_messageChannelSuffix'; + Future selectOrAddTabByHistory({ + required String url, + required HistoryMetadataKey historyMetadata, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.selectOrAddTabByHistory$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url, historyMetadata]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url, historyMetadata], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6423,14 +6359,23 @@ class GeckoTabsApi { } /// Selects an already existing tab displaying [url] or otherwise creates a new tab. - Future selectOrAddTabByUrl({required String url, required bool private, required SourceValue source, required LoadUrlFlagsValue flags, required bool ignoreFragment, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.selectOrAddTabByUrl$pigeonVar_messageChannelSuffix'; + Future selectOrAddTabByUrl({ + required String url, + required bool private, + required SourceValue source, + required LoadUrlFlagsValue flags, + required bool ignoreFragment, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.selectOrAddTabByUrl$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url, private, source, flags, ignoreFragment]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url, private, source, flags, ignoreFragment], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6450,14 +6395,21 @@ class GeckoTabsApi { } } - Future duplicateTab({required String? selectTabId, required bool selectNewTab, required String? newContextId, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.duplicateTab$pigeonVar_messageChannelSuffix'; + Future duplicateTab({ + required String? selectTabId, + required bool selectNewTab, + required String? newContextId, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.duplicateTab$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([selectTabId, selectNewTab, newContextId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [selectTabId, selectNewTab, newContextId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6477,14 +6429,21 @@ class GeckoTabsApi { } } - Future moveTabs({required List tabIds, required String targetTabId, required bool placeAfter, }) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.moveTabs$pigeonVar_messageChannelSuffix'; + Future moveTabs({ + required List tabIds, + required String targetTabId, + required bool placeAfter, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.moveTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabIds, targetTabId, placeAfter]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabIds, targetTabId, placeAfter], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6499,14 +6458,20 @@ class GeckoTabsApi { } } - Future migratePrivateTabUseCase({required String tabId, required String? alternativeUrl}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.migratePrivateTabUseCase$pigeonVar_messageChannelSuffix'; + Future migratePrivateTabUseCase({ + required String tabId, + required String? alternativeUrl, + }) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabsApi.migratePrivateTabUseCase$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, alternativeUrl]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, alternativeUrl], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6531,9 +6496,13 @@ class GeckoFindApi { /// Constructor for [GeckoFindApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoFindApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoFindApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -6541,13 +6510,16 @@ class GeckoFindApi { final String pigeonVar_messageChannelSuffix; Future findAll(String? tabId, String text) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFindApi.findAll$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFindApi.findAll$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, text]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, text], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6563,13 +6535,16 @@ class GeckoFindApi { } Future findNext(String? tabId, bool forward) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFindApi.findNext$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFindApi.findNext$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, forward]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, forward], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6585,13 +6560,16 @@ class GeckoFindApi { } Future clearMatches(String? tabId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFindApi.clearMatches$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFindApi.clearMatches$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6611,9 +6589,13 @@ class GeckoIconsApi { /// Constructor for [GeckoIconsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoIconsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoIconsApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -6621,13 +6603,16 @@ class GeckoIconsApi { final String pigeonVar_messageChannelSuffix; Future loadIcon(IconRequest request) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoIconsApi.loadIcon$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoIconsApi.loadIcon$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([request]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [request], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6652,9 +6637,13 @@ class GeckoPrefApi { /// Constructor for [GeckoPrefApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoPrefApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoPrefApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -6662,7 +6651,8 @@ class GeckoPrefApi { final String pigeonVar_messageChannelSuffix; Future> getPrefList() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefList$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefList$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6689,13 +6679,16 @@ class GeckoPrefApi { } Future> getPrefs(List preferenceFilter) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([preferenceFilter]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [preferenceFilter], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6711,18 +6704,22 @@ class GeckoPrefApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as Map?)!.cast(); + return (pigeonVar_replyList[0] as Map?)! + .cast(); } } Future> applyPrefs(Map prefs) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.applyPrefs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.applyPrefs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([prefs]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [prefs], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6738,18 +6735,22 @@ class GeckoPrefApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as Map?)!.cast(); + return (pigeonVar_replyList[0] as Map?)! + .cast(); } } Future resetPrefs(List preferenceNames) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.resetPrefs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.resetPrefs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([preferenceNames]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [preferenceNames], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6765,7 +6766,8 @@ class GeckoPrefApi { } Future startObserveChanges() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.startObserveChanges$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.startObserveChanges$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6787,7 +6789,8 @@ class GeckoPrefApi { } Future stopObserveChanges() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.stopObserveChanges$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.stopObserveChanges$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -6809,13 +6812,16 @@ class GeckoPrefApi { } Future registerPrefForObservation(String name) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.registerPrefForObservation$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.registerPrefForObservation$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([name]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [name], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6831,13 +6837,16 @@ class GeckoPrefApi { } Future unregisterPrefForObservation(String name) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.unregisterPrefForObservation$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.unregisterPrefForObservation$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([name]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [name], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6857,9 +6866,13 @@ class GeckoMlApi { /// Constructor for [GeckoMlApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoMlApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoMlApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -6867,13 +6880,16 @@ class GeckoMlApi { final String pigeonVar_messageChannelSuffix; Future predictDocumentTopic(List documents) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoMlApi.predictDocumentTopic$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoMlApi.predictDocumentTopic$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([documents]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [documents], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6893,14 +6909,19 @@ class GeckoMlApi { } } - Future> generateDocumentEmbeddings(List documents) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoMlApi.generateDocumentEmbeddings$pigeonVar_messageChannelSuffix'; + Future> generateDocumentEmbeddings( + List documents, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoMlApi.generateDocumentEmbeddings$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([documents]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [documents], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6925,9 +6946,13 @@ class GeckoBrowserExtensionApi { /// Constructor for [GeckoBrowserExtensionApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoBrowserExtensionApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoBrowserExtensionApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -6935,13 +6960,16 @@ class GeckoBrowserExtensionApi { final String pigeonVar_messageChannelSuffix; Future> getMarkdown(List htmlList) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserExtensionApi.getMarkdown$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBrowserExtensionApi.getMarkdown$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([htmlList]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [htmlList], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6966,9 +6994,13 @@ class GeckoContainerProxyApi { /// Constructor for [GeckoContainerProxyApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoContainerProxyApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoContainerProxyApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -6976,13 +7008,16 @@ class GeckoContainerProxyApi { final String pigeonVar_messageChannelSuffix; Future setProxyPort(int port) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.setProxyPort$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.setProxyPort$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([port]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [port], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -6998,13 +7033,16 @@ class GeckoContainerProxyApi { } Future addContainerProxy(String contextId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.addContainerProxy$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.addContainerProxy$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([contextId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [contextId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7020,13 +7058,16 @@ class GeckoContainerProxyApi { } Future removeContainerProxy(String contextId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.removeContainerProxy$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.removeContainerProxy$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([contextId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [contextId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7042,13 +7083,16 @@ class GeckoContainerProxyApi { } Future setSiteAssignments(Map assignments) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.setSiteAssignments$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.setSiteAssignments$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([assignments]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [assignments], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7064,7 +7108,8 @@ class GeckoContainerProxyApi { } Future healthcheck() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.healthcheck$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoContainerProxyApi.healthcheck$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -7095,23 +7140,36 @@ class GeckoCookieApi { /// Constructor for [GeckoCookieApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoCookieApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoCookieApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future getCookie(String? firstPartyDomain, String name, CookiePartitionKey? partitionKey, String? storeId, String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.getCookie$pigeonVar_messageChannelSuffix'; + Future getCookie( + String? firstPartyDomain, + String name, + CookiePartitionKey? partitionKey, + String? storeId, + String url, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.getCookie$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([firstPartyDomain, name, partitionKey, storeId, url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [firstPartyDomain, name, partitionKey, storeId, url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7131,14 +7189,24 @@ class GeckoCookieApi { } } - Future> getAllCookies(String? domain, String? firstPartyDomain, String? name, CookiePartitionKey? partitionKey, String? storeId, String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.getAllCookies$pigeonVar_messageChannelSuffix'; + Future> getAllCookies( + String? domain, + String? firstPartyDomain, + String? name, + CookiePartitionKey? partitionKey, + String? storeId, + String url, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.getAllCookies$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([domain, firstPartyDomain, name, partitionKey, storeId, url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [domain, firstPartyDomain, name, partitionKey, storeId, url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7158,14 +7226,42 @@ class GeckoCookieApi { } } - Future setCookie(String? domain, int? expirationDate, String? firstPartyDomain, bool? httpOnly, String? name, CookiePartitionKey? partitionKey, String? path, CookieSameSiteStatus? sameSite, bool? secure, String? storeId, String url, String? value) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.setCookie$pigeonVar_messageChannelSuffix'; + Future setCookie( + String? domain, + int? expirationDate, + String? firstPartyDomain, + bool? httpOnly, + String? name, + CookiePartitionKey? partitionKey, + String? path, + CookieSameSiteStatus? sameSite, + bool? secure, + String? storeId, + String url, + String? value, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.setCookie$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([domain, expirationDate, firstPartyDomain, httpOnly, name, partitionKey, path, sameSite, secure, storeId, url, value]); + final Future pigeonVar_sendFuture = pigeonVar_channel + .send([ + domain, + expirationDate, + firstPartyDomain, + httpOnly, + name, + partitionKey, + path, + sameSite, + secure, + storeId, + url, + value, + ]); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7180,14 +7276,23 @@ class GeckoCookieApi { } } - Future removeCookie(String? firstPartyDomain, String name, CookiePartitionKey? partitionKey, String? storeId, String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.removeCookie$pigeonVar_messageChannelSuffix'; + Future removeCookie( + String? firstPartyDomain, + String name, + CookiePartitionKey? partitionKey, + String? storeId, + String url, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoCookieApi.removeCookie$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([firstPartyDomain, name, partitionKey, storeId, url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [firstPartyDomain, name, partitionKey, storeId, url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7224,7 +7329,11 @@ abstract class GeckoStateEvents { void onReaderableStateChange(int sequence, String id, ReaderableState state); - void onSecurityInfoStateChange(int sequence, String id, SecurityInfoState state); + void onSecurityInfoStateChange( + int sequence, + String id, + SecurityInfoState state, + ); void onIconChange(int sequence, String id, Uint8List? bytes); @@ -7242,527 +7351,726 @@ abstract class GeckoStateEvents { void onManifestUpdate(int sequence, String tabId, PwaManifest? manifest); - static void setUp(GeckoStateEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoStateEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange was null, expected non-null int.', + ); final bool? arg_state = (args[1] as bool?); - assert(arg_state != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange was null, expected non-null bool.'); + assert( + arg_state != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onViewReadyStateChange was null, expected non-null bool.', + ); try { api.onViewReadyStateChange(arg_sequence!, arg_state!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange was null, expected non-null int.', + ); final bool? arg_state = (args[1] as bool?); - assert(arg_state != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange was null, expected non-null bool.'); + assert( + arg_state != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onEngineReadyStateChange was null, expected non-null bool.', + ); try { api.onEngineReadyStateChange(arg_sequence!, arg_state!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null, expected non-null int.', + ); final String? arg_url = (args[1] as String?); - assert(arg_url != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null, expected non-null String.'); + assert( + arg_url != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null, expected non-null String.', + ); final Uint8List? arg_bytes = (args[2] as Uint8List?); - assert(arg_bytes != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null, expected non-null Uint8List.'); + assert( + arg_bytes != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconUpdate was null, expected non-null Uint8List.', + ); try { api.onIconUpdate(arg_sequence!, arg_url!, arg_bytes!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded was null, expected non-null int.', + ); final String? arg_tabId = (args[1] as String?); - assert(arg_tabId != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded was null, expected non-null String.'); + assert( + arg_tabId != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabAdded was null, expected non-null String.', + ); try { api.onTabAdded(arg_sequence!, arg_tabId!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange was null, expected non-null int.'); - final List? arg_tabIds = (args[1] as List?)?.cast(); - assert(arg_tabIds != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange was null, expected non-null List.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange was null, expected non-null int.', + ); + final List? arg_tabIds = (args[1] as List?) + ?.cast(); + assert( + arg_tabIds != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabListChange was null, expected non-null List.', + ); try { api.onTabListChange(arg_sequence!, arg_tabIds!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSelectedTabChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSelectedTabChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSelectedTabChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSelectedTabChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSelectedTabChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSelectedTabChange was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); try { api.onSelectedTabChange(arg_sequence!, arg_id); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange was null, expected non-null int.', + ); final TabContentState? arg_state = (args[1] as TabContentState?); - assert(arg_state != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange was null, expected non-null TabContentState.'); + assert( + arg_state != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onTabContentStateChange was null, expected non-null TabContentState.', + ); try { api.onTabContentStateChange(arg_sequence!, arg_state!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null, expected non-null String.', + ); final HistoryState? arg_state = (args[2] as HistoryState?); - assert(arg_state != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null, expected non-null HistoryState.'); + assert( + arg_state != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onHistoryStateChange was null, expected non-null HistoryState.', + ); try { api.onHistoryStateChange(arg_sequence!, arg_id!, arg_state!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null, expected non-null String.', + ); final ReaderableState? arg_state = (args[2] as ReaderableState?); - assert(arg_state != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null, expected non-null ReaderableState.'); + assert( + arg_state != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onReaderableStateChange was null, expected non-null ReaderableState.', + ); try { api.onReaderableStateChange(arg_sequence!, arg_id!, arg_state!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null, expected non-null String.', + ); final SecurityInfoState? arg_state = (args[2] as SecurityInfoState?); - assert(arg_state != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null, expected non-null SecurityInfoState.'); + assert( + arg_state != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onSecurityInfoStateChange was null, expected non-null SecurityInfoState.', + ); try { api.onSecurityInfoStateChange(arg_sequence!, arg_id!, arg_state!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onIconChange was null, expected non-null String.', + ); final Uint8List? arg_bytes = (args[2] as Uint8List?); try { api.onIconChange(arg_sequence!, arg_id!, arg_bytes); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onThumbnailChange was null, expected non-null String.', + ); final Uint8List? arg_bytes = (args[2] as Uint8List?); try { api.onThumbnailChange(arg_sequence!, arg_id!, arg_bytes); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null, expected non-null String.'); - final List? arg_results = (args[2] as List?)?.cast(); - assert(arg_results != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null, expected non-null List.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null, expected non-null String.', + ); + final List? arg_results = (args[2] as List?) + ?.cast(); + assert( + arg_results != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onFindResults was null, expected non-null List.', + ); try { api.onFindResults(arg_sequence!, arg_id!, arg_results!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null, expected non-null int.', + ); final String? arg_id = (args[1] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null, expected non-null String.', + ); final HitResult? arg_hitResult = (args[2] as HitResult?); - assert(arg_hitResult != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null, expected non-null HitResult.'); + assert( + arg_hitResult != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onLongPress was null, expected non-null HitResult.', + ); try { api.onLongPress(arg_sequence!, arg_id!, arg_hitResult!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null, expected non-null int.', + ); final GeckoPref? arg_value = (args[1] as GeckoPref?); - assert(arg_value != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null, expected non-null GeckoPref.'); + assert( + arg_value != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null, expected non-null GeckoPref.', + ); try { api.onPreferenceChange(arg_sequence!, arg_value!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment was null, expected non-null int.'); - final ContainerSiteAssignment? arg_details = (args[1] as ContainerSiteAssignment?); - assert(arg_details != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment was null, expected non-null ContainerSiteAssignment.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment was null, expected non-null int.', + ); + final ContainerSiteAssignment? arg_details = + (args[1] as ContainerSiteAssignment?); + assert( + arg_details != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onContainerSiteAssignment was null, expected non-null ContainerSiteAssignment.', + ); try { api.onContainerSiteAssignment(arg_sequence!, arg_details!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress was null, expected non-null int.', + ); final MlProgressData? arg_progress = (args[1] as MlProgressData?); - assert(arg_progress != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress was null, expected non-null MlProgressData.'); + assert( + arg_progress != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onMlProgress was null, expected non-null MlProgressData.', + ); try { api.onMlProgress(arg_sequence!, arg_progress!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate was null, expected non-null int.', + ); final String? arg_tabId = (args[1] as String?); - assert(arg_tabId != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate was null, expected non-null String.'); + assert( + arg_tabId != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onManifestUpdate was null, expected non-null String.', + ); final PwaManifest? arg_manifest = (args[2] as PwaManifest?); try { api.onManifestUpdate(arg_sequence!, arg_tabId!, arg_manifest); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -7781,108 +8089,149 @@ abstract class GeckoSyncStateEvents { void onSyncError(int sequence, String? errorMessage); - static void setUp(GeckoSyncStateEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoSyncStateEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged was null, expected non-null int.'); - final SyncAccountInfo? arg_accountInfo = (args[1] as SyncAccountInfo?); - assert(arg_accountInfo != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged was null, expected non-null SyncAccountInfo.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged was null, expected non-null int.', + ); + final SyncAccountInfo? arg_accountInfo = + (args[1] as SyncAccountInfo?); + assert( + arg_accountInfo != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onAuthStateChanged was null, expected non-null SyncAccountInfo.', + ); try { api.onAuthStateChanged(arg_sequence!, arg_accountInfo!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncStarted$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncStarted$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncStarted was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncStarted was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncStarted was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncStarted was null, expected non-null int.', + ); try { api.onSyncStarted(arg_sequence!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncCompleted$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncCompleted$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncCompleted was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncCompleted was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncCompleted was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncCompleted was null, expected non-null int.', + ); try { api.onSyncCompleted(arg_sequence!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncError$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncError$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncError was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncError was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncError was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSyncStateEvents.onSyncError was null, expected non-null int.', + ); final String? arg_errorMessage = (args[1] as String?); try { api.onSyncError(arg_sequence!, arg_errorMessage); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -7895,32 +8244,48 @@ abstract class GeckoLogging { void onLog(LogLevel level, String message); - static void setUp(GeckoLogging? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoLogging? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog was null.', + ); final List args = (message as List?)!; final LogLevel? arg_level = (args[0] as LogLevel?); - assert(arg_level != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog was null, expected non-null LogLevel.'); + assert( + arg_level != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog was null, expected non-null LogLevel.', + ); final String? arg_message = (args[1] as String?); - assert(arg_message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog was null, expected non-null String.'); + assert( + arg_message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoLogging.onLog was null, expected non-null String.', + ); try { api.onLog(arg_level!, arg_message!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -7932,9 +8297,13 @@ class ReaderViewEvents { /// Constructor for [ReaderViewEvents]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - ReaderViewEvents({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + ReaderViewEvents({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -7942,13 +8311,16 @@ class ReaderViewEvents { final String pigeonVar_messageChannelSuffix; Future onToggleReaderView(bool enable) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.ReaderViewEvents.onToggleReaderView$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.ReaderViewEvents.onToggleReaderView$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([enable]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [enable], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -7964,7 +8336,8 @@ class ReaderViewEvents { } Future onAppearanceButtonTap() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.ReaderViewEvents.onAppearanceButtonTap$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.ReaderViewEvents.onAppearanceButtonTap$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -7991,32 +8364,48 @@ abstract class ReaderViewController { void appearanceButtonVisibility(int sequence, bool visible); - static void setUp(ReaderViewController? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + ReaderViewController? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility was null, expected non-null int.', + ); final bool? arg_visible = (args[1] as bool?); - assert(arg_visible != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility was null, expected non-null bool.'); + assert( + arg_visible != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.ReaderViewController.appearanceButtonVisibility was null, expected non-null bool.', + ); try { api.appearanceButtonVisibility(arg_sequence!, arg_visible!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -8028,9 +8417,13 @@ class GeckoSelectionActionController { /// Constructor for [GeckoSelectionActionController]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoSelectionActionController({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoSelectionActionController({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8038,13 +8431,16 @@ class GeckoSelectionActionController { final String pigeonVar_messageChannelSuffix; Future setActions(List actions) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionController.setActions$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionController.setActions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([actions]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [actions], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8065,32 +8461,48 @@ abstract class GeckoSelectionActionEvents { void performSelectionAction(String id, String selectedText); - static void setUp(GeckoSelectionActionEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoSelectionActionEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction was null.', + ); final List args = (message as List?)!; final String? arg_id = (args[0] as String?); - assert(arg_id != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction was null, expected non-null String.'); + assert( + arg_id != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction was null, expected non-null String.', + ); final String? arg_selectedText = (args[1] as String?); - assert(arg_selectedText != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction was null, expected non-null String.'); + assert( + arg_selectedText != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSelectionActionEvents.performSelectionAction was null, expected non-null String.', + ); try { api.performSelectionAction(arg_id!, arg_selectedText!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -8102,9 +8514,13 @@ class GeckoAddonsApi { /// Constructor for [GeckoAddonsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoAddonsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoAddonsApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8112,7 +8528,8 @@ class GeckoAddonsApi { final String pigeonVar_messageChannelSuffix; Future startAddonManagerActivity() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonsApi.startAddonManagerActivity$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonsApi.startAddonManagerActivity$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8133,14 +8550,20 @@ class GeckoAddonsApi { } } - Future invokeAddonAction(String extensionId, WebExtensionActionType actionType) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonsApi.invokeAddonAction$pigeonVar_messageChannelSuffix'; + Future invokeAddonAction( + String extensionId, + WebExtensionActionType actionType, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonsApi.invokeAddonAction$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([extensionId, actionType]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [extensionId, actionType], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8156,13 +8579,16 @@ class GeckoAddonsApi { } Future installAddon(String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonsApi.installAddon$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonsApi.installAddon$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8181,109 +8607,187 @@ class GeckoAddonsApi { abstract class GeckoAddonEvents { static const MessageCodec pigeonChannelCodec = _PigeonCodec(); - void onUpsertWebExtensionAction(int sequence, String extensionId, WebExtensionActionType actionType, WebExtensionData extensionData); + void onUpsertWebExtensionAction( + int sequence, + String extensionId, + WebExtensionActionType actionType, + WebExtensionData extensionData, + ); - void onRemoveWebExtensionAction(int sequence, String extensionId, WebExtensionActionType actionType); + void onRemoveWebExtensionAction( + int sequence, + String extensionId, + WebExtensionActionType actionType, + ); - void onUpdateWebExtensionIcon(int sequence, String extensionId, WebExtensionActionType actionType, Uint8List icon); + void onUpdateWebExtensionIcon( + int sequence, + String extensionId, + WebExtensionActionType actionType, + Uint8List icon, + ); - static void setUp(GeckoAddonEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoAddonEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null int.', + ); final String? arg_extensionId = (args[1] as String?); - assert(arg_extensionId != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null String.'); - final WebExtensionActionType? arg_actionType = (args[2] as WebExtensionActionType?); - assert(arg_actionType != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null WebExtensionActionType.'); - final WebExtensionData? arg_extensionData = (args[3] as WebExtensionData?); - assert(arg_extensionData != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null WebExtensionData.'); + assert( + arg_extensionId != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null String.', + ); + final WebExtensionActionType? arg_actionType = + (args[2] as WebExtensionActionType?); + assert( + arg_actionType != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null WebExtensionActionType.', + ); + final WebExtensionData? arg_extensionData = + (args[3] as WebExtensionData?); + assert( + arg_extensionData != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpsertWebExtensionAction was null, expected non-null WebExtensionData.', + ); try { - api.onUpsertWebExtensionAction(arg_sequence!, arg_extensionId!, arg_actionType!, arg_extensionData!); + api.onUpsertWebExtensionAction( + arg_sequence!, + arg_extensionId!, + arg_actionType!, + arg_extensionData!, + ); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null, expected non-null int.', + ); final String? arg_extensionId = (args[1] as String?); - assert(arg_extensionId != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null, expected non-null String.'); - final WebExtensionActionType? arg_actionType = (args[2] as WebExtensionActionType?); - assert(arg_actionType != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null, expected non-null WebExtensionActionType.'); + assert( + arg_extensionId != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null, expected non-null String.', + ); + final WebExtensionActionType? arg_actionType = + (args[2] as WebExtensionActionType?); + assert( + arg_actionType != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onRemoveWebExtensionAction was null, expected non-null WebExtensionActionType.', + ); try { - api.onRemoveWebExtensionAction(arg_sequence!, arg_extensionId!, arg_actionType!); + api.onRemoveWebExtensionAction( + arg_sequence!, + arg_extensionId!, + arg_actionType!, + ); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null int.', + ); final String? arg_extensionId = (args[1] as String?); - assert(arg_extensionId != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null String.'); - final WebExtensionActionType? arg_actionType = (args[2] as WebExtensionActionType?); - assert(arg_actionType != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null WebExtensionActionType.'); + assert( + arg_extensionId != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null String.', + ); + final WebExtensionActionType? arg_actionType = + (args[2] as WebExtensionActionType?); + assert( + arg_actionType != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null WebExtensionActionType.', + ); final Uint8List? arg_icon = (args[3] as Uint8List?); - assert(arg_icon != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null Uint8List.'); + assert( + arg_icon != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoAddonEvents.onUpdateWebExtensionIcon was null, expected non-null Uint8List.', + ); try { - api.onUpdateWebExtensionIcon(arg_sequence!, arg_extensionId!, arg_actionType!, arg_icon!); + api.onUpdateWebExtensionIcon( + arg_sequence!, + arg_extensionId!, + arg_actionType!, + arg_icon!, + ); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -8295,9 +8799,13 @@ class GeckoSuggestionApi { /// Constructor for [GeckoSuggestionApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoSuggestionApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoSuggestionApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8305,13 +8813,16 @@ class GeckoSuggestionApi { final String pigeonVar_messageChannelSuffix; Future getAutocompleteSuggestion(String query) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionApi.getAutocompleteSuggestion$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionApi.getAutocompleteSuggestion$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([query]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [query], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8326,14 +8837,20 @@ class GeckoSuggestionApi { } } - Future querySuggestions(String text, List providers) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionApi.querySuggestions$pigeonVar_messageChannelSuffix'; + Future querySuggestions( + String text, + List providers, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionApi.querySuggestions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([text, providers]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [text, providers], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8352,37 +8869,65 @@ class GeckoSuggestionApi { abstract class GeckoSuggestionEvents { static const MessageCodec pigeonChannelCodec = _PigeonCodec(); - void onSuggestionResult(int sequence, GeckoSuggestionType suggestionType, List suggestions); + void onSuggestionResult( + int sequence, + GeckoSuggestionType suggestionType, + List suggestions, + ); - static void setUp(GeckoSuggestionEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoSuggestionEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null, expected non-null int.'); - final GeckoSuggestionType? arg_suggestionType = (args[1] as GeckoSuggestionType?); - assert(arg_suggestionType != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null, expected non-null GeckoSuggestionType.'); - final List? arg_suggestions = (args[2] as List?)?.cast(); - assert(arg_suggestions != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null, expected non-null List.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null, expected non-null int.', + ); + final GeckoSuggestionType? arg_suggestionType = + (args[1] as GeckoSuggestionType?); + assert( + arg_suggestionType != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null, expected non-null GeckoSuggestionType.', + ); + final List? arg_suggestions = + (args[2] as List?)?.cast(); + assert( + arg_suggestions != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoSuggestionEvents.onSuggestionResult was null, expected non-null List.', + ); try { - api.onSuggestionResult(arg_sequence!, arg_suggestionType!, arg_suggestions!); + api.onSuggestionResult( + arg_sequence!, + arg_suggestionType!, + arg_suggestions!, + ); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -8395,32 +8940,48 @@ abstract class GeckoTabContentEvents { void onContentUpdate(int sequence, TabContent content); - static void setUp(GeckoTabContentEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoTabContentEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate was null, expected non-null int.', + ); final TabContent? arg_content = (args[1] as TabContent?); - assert(arg_content != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate was null, expected non-null TabContent.'); + assert( + arg_content != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoTabContentEvents.onContentUpdate was null, expected non-null TabContent.', + ); try { api.onContentUpdate(arg_sequence!, arg_content!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -8432,9 +8993,13 @@ class GeckoDeleteBrowsingDataController { /// Constructor for [GeckoDeleteBrowsingDataController]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoDeleteBrowsingDataController({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoDeleteBrowsingDataController({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8442,7 +9007,8 @@ class GeckoDeleteBrowsingDataController { final String pigeonVar_messageChannelSuffix; Future deleteTabs() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteTabs$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteTabs$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8464,7 +9030,8 @@ class GeckoDeleteBrowsingDataController { } Future deleteBrowsingHistory() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteBrowsingHistory$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteBrowsingHistory$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8486,7 +9053,8 @@ class GeckoDeleteBrowsingDataController { } Future deleteCookiesAndSiteData() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteCookiesAndSiteData$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteCookiesAndSiteData$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8508,7 +9076,8 @@ class GeckoDeleteBrowsingDataController { } Future deleteCachedFiles() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteCachedFiles$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteCachedFiles$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8530,7 +9099,8 @@ class GeckoDeleteBrowsingDataController { } Future deleteSitePermissions() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteSitePermissions$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteSitePermissions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8552,7 +9122,8 @@ class GeckoDeleteBrowsingDataController { } Future deleteDownloads() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteDownloads$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.deleteDownloads$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -8574,13 +9145,16 @@ class GeckoDeleteBrowsingDataController { } Future clearDataForSessionContext(String contextId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.clearDataForSessionContext$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.clearDataForSessionContext$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([contextId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [contextId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8596,14 +9170,20 @@ class GeckoDeleteBrowsingDataController { } /// Clear browsing data for a specific host/domain - Future clearDataForHost(String host, List dataTypes) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.clearDataForHost$pigeonVar_messageChannelSuffix'; + Future clearDataForHost( + String host, + List dataTypes, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDeleteBrowsingDataController.clearDataForHost$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([host, dataTypes]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [host, dataTypes], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8623,23 +9203,34 @@ class GeckoHistoryApi { /// Constructor for [GeckoHistoryApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoHistoryApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoHistoryApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future> getDetailedVisits(int startMillis, int endMillis, List excludeTypes) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.getDetailedVisits$pigeonVar_messageChannelSuffix'; + Future> getDetailedVisits( + int startMillis, + int endMillis, + List excludeTypes, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.getDetailedVisits$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([startMillis, endMillis, excludeTypes]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [startMillis, endMillis, excludeTypes], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8659,14 +9250,21 @@ class GeckoHistoryApi { } } - Future> getVisitsPaginated(int offset, int count, List excludeTypes) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.getVisitsPaginated$pigeonVar_messageChannelSuffix'; + Future> getVisitsPaginated( + int offset, + int count, + List excludeTypes, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.getVisitsPaginated$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([offset, count, excludeTypes]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [offset, count, excludeTypes], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8687,13 +9285,16 @@ class GeckoHistoryApi { } Future deleteVisit(String url, int timestamp) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteVisit$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteVisit$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url, timestamp]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url, timestamp], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8709,13 +9310,16 @@ class GeckoHistoryApi { } Future deleteDownload(String id) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteDownload$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteDownload$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([id]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [id], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8731,13 +9335,16 @@ class GeckoHistoryApi { } Future deleteVisitsBetween(int startMillis, int endMillis) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteVisitsBetween$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteVisitsBetween$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([startMillis, endMillis]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [startMillis, endMillis], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8757,9 +9364,13 @@ class GeckoDownloadsApi { /// Constructor for [GeckoDownloadsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoDownloadsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoDownloadsApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8767,13 +9378,16 @@ class GeckoDownloadsApi { final String pigeonVar_messageChannelSuffix; Future requestDownload(String tabId, DownloadState state) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDownloadsApi.requestDownload$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDownloadsApi.requestDownload$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, state]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, state], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8788,14 +9402,20 @@ class GeckoDownloadsApi { } } - Future copyInternetResource(String tabId, ShareInternetResourceState state) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDownloadsApi.copyInternetResource$pigeonVar_messageChannelSuffix'; + Future copyInternetResource( + String tabId, + ShareInternetResourceState state, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDownloadsApi.copyInternetResource$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, state]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, state], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8810,14 +9430,20 @@ class GeckoDownloadsApi { } } - Future shareInternetResource(String tabId, ShareInternetResourceState state) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDownloadsApi.shareInternetResource$pigeonVar_messageChannelSuffix'; + Future shareInternetResource( + String tabId, + ShareInternetResourceState state, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoDownloadsApi.shareInternetResource$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, state]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, state], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8838,32 +9464,48 @@ abstract class BrowserExtensionEvents { void onFeedRequested(int sequence, String url); - static void setUp(BrowserExtensionEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + BrowserExtensionEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested was null, expected non-null int.', + ); final String? arg_url = (args[1] as String?); - assert(arg_url != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested was null, expected non-null String.'); + assert( + arg_url != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.BrowserExtensionEvents.onFeedRequested was null, expected non-null String.', + ); try { api.onFeedRequested(arg_sequence!, arg_url!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -8875,9 +9517,13 @@ class GeckoFetchApi { /// Constructor for [GeckoFetchApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoFetchApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoFetchApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8885,13 +9531,16 @@ class GeckoFetchApi { final String pigeonVar_messageChannelSuffix; Future fetch(GeckoFetchRequest request) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFetchApi.fetch$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoFetchApi.fetch$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([request]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [request], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8925,9 +9574,13 @@ class GeckoViewportApi { /// Constructor for [GeckoViewportApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoViewportApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoViewportApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -8944,13 +9597,16 @@ class GeckoViewportApi { /// /// [heightPx] Combined height of top and bottom toolbars in pixels. Future setDynamicToolbarMaxHeight(int heightPx) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportApi.setDynamicToolbarMaxHeight$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportApi.setDynamicToolbarMaxHeight$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([heightPx]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [heightPx], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -8975,13 +9631,16 @@ class GeckoViewportApi { /// /// [clippingPx] The clipping offset in pixels. Negative = bottom clip. Future setVerticalClipping(int clippingPx) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportApi.setVerticalClipping$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportApi.setVerticalClipping$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([clippingPx]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [clippingPx], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9013,7 +9672,12 @@ abstract class GeckoViewportEvents { /// [heightPx] Keyboard height in pixels (0 when hidden). /// [isVisible] Whether the keyboard is currently visible. /// [isAnimating] Whether the keyboard is currently animating. - void onKeyboardVisibilityChanged(int sequence, int heightPx, bool isVisible, bool isAnimating); + void onKeyboardVisibilityChanged( + int sequence, + int heightPx, + bool isVisible, + bool isAnimating, + ); /// Called when GeckoView scroll-handling eligibility changes. /// @@ -9023,66 +9687,101 @@ abstract class GeckoViewportEvents { /// the page consumed touch input. void onBrowserHandlingScrollChanged(int sequence, bool isHandling); - static void setUp(GeckoViewportEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + GeckoViewportEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null int.', + ); final int? arg_heightPx = (args[1] as int?); - assert(arg_heightPx != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null int.'); + assert( + arg_heightPx != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null int.', + ); final bool? arg_isVisible = (args[2] as bool?); - assert(arg_isVisible != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null bool.'); + assert( + arg_isVisible != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null bool.', + ); final bool? arg_isAnimating = (args[3] as bool?); - assert(arg_isAnimating != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null bool.'); + assert( + arg_isAnimating != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onKeyboardVisibilityChanged was null, expected non-null bool.', + ); try { - api.onKeyboardVisibilityChanged(arg_sequence!, arg_heightPx!, arg_isVisible!, arg_isAnimating!); + api.onKeyboardVisibilityChanged( + arg_sequence!, + arg_heightPx!, + arg_isVisible!, + arg_isAnimating!, + ); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged was null, expected non-null int.', + ); final bool? arg_isHandling = (args[1] as bool?); - assert(arg_isHandling != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged was null, expected non-null bool.'); + assert( + arg_isHandling != null, + 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoViewportEvents.onBrowserHandlingScrollChanged was null, expected non-null bool.', + ); try { api.onBrowserHandlingScrollChanged(arg_sequence!, arg_isHandling!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -9094,9 +9793,13 @@ class GeckoBookmarksApi { /// Constructor for [GeckoBookmarksApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoBookmarksApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoBookmarksApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -9109,13 +9812,16 @@ class GeckoBookmarksApi { /// @param recursive Whether to recurse and obtain all levels of children. /// @return The populated root starting from the guid. Future getTree(String guid, bool recursive) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getTree$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getTree$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([guid, recursive]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [guid, recursive], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9135,13 +9841,16 @@ class GeckoBookmarksApi { /// @param guid The bookmark guid to obtain. /// @return The bookmark node or null if it does not exist. Future getBookmark(String guid) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getBookmark$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getBookmark$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([guid]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [guid], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9161,13 +9870,16 @@ class GeckoBookmarksApi { /// @param url The URL string. /// @return The list of bookmarks that match the URL Future> getBookmarksWithUrl(String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getBookmarksWithUrl$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getBookmarksWithUrl$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9193,14 +9905,21 @@ class GeckoBookmarksApi { /// @param maxAge Optional parameter used to filter out entries older than this number of milliseconds. /// @param currentTime Optional parameter for current time. Defaults toSystem.currentTimeMillis() /// @return The list of bookmarks that have been recently added up to the limit number of items. - Future> getRecentBookmarks(int limit, int? maxAge, int currentTime) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getRecentBookmarks$pigeonVar_messageChannelSuffix'; + Future> getRecentBookmarks( + int limit, + int? maxAge, + int currentTime, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.getRecentBookmarks$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([limit, maxAge, currentTime]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [limit, maxAge, currentTime], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9226,13 +9945,16 @@ class GeckoBookmarksApi { /// @param limit The maximum number of entries to return. /// @return The list of matching bookmark nodes up to the limit number of items. Future> searchBookmarks(String query, int limit) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.searchBookmarks$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.searchBookmarks$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([query, limit]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [query, limit], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9261,14 +9983,22 @@ class GeckoBookmarksApi { /// @param title The title of the bookmark item to add. /// @param position The optional position to add the new node or null to append. /// @return The guid of the newly inserted bookmark item. - Future addItem(String parentGuid, String url, String title, int? position) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.addItem$pigeonVar_messageChannelSuffix'; + Future addItem( + String parentGuid, + String url, + String title, + int? position, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.addItem$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([parentGuid, url, title, position]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [parentGuid, url, title, position], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9296,14 +10026,21 @@ class GeckoBookmarksApi { /// @param title The title of the bookmark folder to add. /// @param position The optional position to add the new node or null to append. /// @return The guid of the newly inserted bookmark item. - Future addFolder(String parentGuid, String title, int? position) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.addFolder$pigeonVar_messageChannelSuffix'; + Future addFolder( + String parentGuid, + String title, + int? position, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.addFolder$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([parentGuid, title, position]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [parentGuid, title, position], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9330,13 +10067,16 @@ class GeckoBookmarksApi { /// @param guid The guid of the item to update. /// @param info The info to change in the bookmark. Future updateNode(String guid, BookmarkInfo info) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.updateNode$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.updateNode$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([guid, info]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [guid, info], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9357,13 +10097,16 @@ class GeckoBookmarksApi { /// /// @return Whether the bookmark existed or not. Future deleteNode(String guid) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.deleteNode$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoBookmarksApi.deleteNode$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([guid]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [guid], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9389,9 +10132,13 @@ class GeckoSitePermissionsApi { /// Constructor for [GeckoSitePermissionsApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoSitePermissionsApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoSitePermissionsApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -9399,14 +10146,20 @@ class GeckoSitePermissionsApi { final String pigeonVar_messageChannelSuffix; /// Get permissions for origin (single source of truth from GeckoView) - Future getSitePermissions(String origin, bool private) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSitePermissionsApi.getSitePermissions$pigeonVar_messageChannelSuffix'; + Future getSitePermissions( + String origin, + bool private, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSitePermissionsApi.getSitePermissions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([origin, private]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [origin, private], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9422,14 +10175,20 @@ class GeckoSitePermissionsApi { } /// Save/update permissions (persisted by GeckoView) - Future setSitePermissions(SitePermissions permissions, bool private) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSitePermissionsApi.setSitePermissions$pigeonVar_messageChannelSuffix'; + Future setSitePermissions( + SitePermissions permissions, + bool private, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSitePermissionsApi.setSitePermissions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([permissions, private]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [permissions, private], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9446,13 +10205,16 @@ class GeckoSitePermissionsApi { /// Delete permissions for origin (removed from GeckoView storage) Future deleteSitePermissions(String origin, bool private) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSitePermissionsApi.deleteSitePermissions$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoSitePermissionsApi.deleteSitePermissions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([origin, private]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [origin, private], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9473,9 +10235,13 @@ class GeckoPublicSuffixListApi { /// Constructor for [GeckoPublicSuffixListApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoPublicSuffixListApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoPublicSuffixListApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -9485,13 +10251,16 @@ class GeckoPublicSuffixListApi { /// Get base domain (eTLD+1) from host using Mozilla's Public Suffix List /// Returns the host unchanged if PSL lookup fails Future getPublicSuffixPlusOne(String host) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPublicSuffixListApi.getPublicSuffixPlusOne$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPublicSuffixListApi.getPublicSuffixPlusOne$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([host]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [host], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9521,9 +10290,13 @@ class GeckoTrackingProtectionApi { /// Constructor for [GeckoTrackingProtectionApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoTrackingProtectionApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoTrackingProtectionApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -9535,13 +10308,16 @@ class GeckoTrackingProtectionApi { /// Uses callback pattern to match Mozilla Android Components API. /// Returns true if the site is in the exceptions list (ETP disabled). Future containsException(String tabId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.containsException$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.containsException$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9566,13 +10342,16 @@ class GeckoTrackingProtectionApi { /// This adds the current tab's URL to the exceptions list. /// ETP will be disabled for this site until the exception is removed. Future addException(String tabId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.addException$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.addException$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9592,13 +10371,16 @@ class GeckoTrackingProtectionApi { /// This removes the current tab's URL from the exceptions list. /// ETP will be re-enabled for this site. Future removeException(String tabId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.removeException$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.removeException$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9618,13 +10400,16 @@ class GeckoTrackingProtectionApi { /// Alternative to removeException(tabId) for cases where you /// have a URL rather than a tabId. Future removeExceptionByUrl(String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.removeExceptionByUrl$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.removeExceptionByUrl$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9643,7 +10428,8 @@ class GeckoTrackingProtectionApi { /// /// Returns list of all sites that have exceptions (ETP disabled). Future> fetchExceptions() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.fetchExceptions$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.fetchExceptions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -9665,7 +10451,8 @@ class GeckoTrackingProtectionApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as List?)!.cast(); + return (pigeonVar_replyList[0] as List?)! + .cast(); } } @@ -9673,7 +10460,8 @@ class GeckoTrackingProtectionApi { /// /// This re-enables ETP for all exception sites. Future removeAllExceptions() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.removeAllExceptions$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoTrackingProtectionApi.removeAllExceptions$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -9703,9 +10491,13 @@ class GeckoAppLinksApi { /// Constructor for [GeckoAppLinksApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoAppLinksApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoAppLinksApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -9719,13 +10511,16 @@ class GeckoAppLinksApi { /// /// Returns true if an external app is available, false otherwise. Future hasExternalApp(String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAppLinksApi.hasExternalApp$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAppLinksApi.hasExternalApp$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9754,13 +10549,16 @@ class GeckoAppLinksApi { /// /// Returns true if URL was opened in external app, false if no app available. Future openAppLink(String url) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAppLinksApi.openAppLink$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoAppLinksApi.openAppLink$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([url]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [url], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9789,9 +10587,13 @@ class GeckoPwaApi { /// Constructor for [GeckoPwaApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - GeckoPwaApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + GeckoPwaApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -9808,14 +10610,21 @@ class GeckoPwaApi { /// The [profileUuid] is the UUID of the current user profile. /// The [contextId] is the container's contextual identity (optional, null for default container). /// Returns true if installation was successful. - Future installWebApp(String? tabId, String profileUuid, String? contextId) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPwaApi.installWebApp$pigeonVar_messageChannelSuffix'; + Future installWebApp( + String? tabId, + String profileUuid, + String? contextId, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPwaApi.installWebApp$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([tabId, profileUuid, contextId]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [tabId, profileUuid, contextId], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -9837,7 +10646,8 @@ class GeckoPwaApi { /// Returns a list of all installed PWA manifests. Future> getInstalledWebApps() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPwaApi.getInstalledWebApps$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPwaApi.getInstalledWebApps$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, diff --git a/packages/flutter_tor/lib/src/tor_api.g.dart b/packages/flutter_tor/lib/src/tor_api.g.dart index a4a00beb..36594c9c 100644 --- a/packages/flutter_tor/lib/src/tor_api.g.dart +++ b/packages/flutter_tor/lib/src/tor_api.g.dart @@ -15,7 +15,11 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse({ + Object? result, + PlatformException? error, + bool empty = false, +}) { if (empty) { return []; } @@ -24,37 +28,48 @@ List wrapResponse({Object? result, PlatformException? error, bool empty } return [error.code, error.message, error.details]; } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + a.indexed.every( + ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), + ); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every( + (MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key]), + ); } return a == b; } - /// Transport types for Tor connections enum TransportType { /// Direct Tor connection (no bridges) none, + /// obfs4 pluggable transport obfs4, + /// Snowflake pluggable transport (default broker) snowflake, + /// Snowflake via AMP cache snowflakeAmp, + /// Meek pluggable transport meek, + /// Meek via Azure CDN meekAzure, + /// WebTunnel pluggable transport webtunnel, + /// Custom bridge lines (passthrough) custom, } @@ -95,7 +110,8 @@ class TorConfiguration { } Object encode() { - return _toList(); } + return _toList(); + } static TorConfiguration decode(Object result) { result as List; @@ -122,8 +138,7 @@ class TorConfiguration { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Current Tor status @@ -162,7 +177,8 @@ class TorStatus { } Object encode() { - return _toList(); } + return _toList(); + } static TorStatus decode(Object result) { result as List; @@ -189,8 +205,7 @@ class TorStatus { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } /// Log message from Tor @@ -211,15 +226,12 @@ class TorLogMessage { int timestamp; List _toList() { - return [ - severity, - message, - timestamp, - ]; + return [severity, message, timestamp]; } Object encode() { - return _toList(); } + return _toList(); + } static TorLogMessage decode(Object result) { result as List; @@ -244,11 +256,9 @@ class TorLogMessage { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -256,16 +266,16 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is TransportType) { + } else if (value is TransportType) { buffer.putUint8(129); writeValue(buffer, value.index); - } else if (value is TorConfiguration) { + } else if (value is TorConfiguration) { buffer.putUint8(130); writeValue(buffer, value.encode()); - } else if (value is TorStatus) { + } else if (value is TorStatus) { buffer.putUint8(131); writeValue(buffer, value.encode()); - } else if (value is TorLogMessage) { + } else if (value is TorLogMessage) { buffer.putUint8(132); writeValue(buffer, value.encode()); } else { @@ -276,14 +286,14 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: final value = readValue(buffer) as int?; return value == null ? null : TransportType.values[value]; - case 130: + case 130: return TorConfiguration.decode(readValue(buffer)!); - case 131: + case 131: return TorStatus.decode(readValue(buffer)!); - case 132: + case 132: return TorLogMessage.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -297,8 +307,10 @@ class TorApi { /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. TorApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -308,13 +320,16 @@ class TorApi { /// Start Tor with the given configuration /// Returns a Future to avoid blocking the main thread Future startTor(TorConfiguration config) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_tor.TorApi.startTor$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_tor.TorApi.startTor$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([config]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [config], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -336,7 +351,8 @@ class TorApi { /// Stop Tor Future stopTor() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_tor.TorApi.stopTor$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_tor.TorApi.stopTor$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -359,7 +375,8 @@ class TorApi { /// Get current status Future getStatus() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_tor.TorApi.getStatus$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_tor.TorApi.getStatus$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -387,7 +404,8 @@ class TorApi { /// Request a new Tor identity (new circuit) Future requestNewIdentity() async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_tor.TorApi.requestNewIdentity$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_tor.TorApi.requestNewIdentity$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -419,54 +437,76 @@ abstract class TorLogApi { /// Called when status changes void onStatusChanged(TorStatus status); - static void setUp(TorLogApi? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + TorLogApi? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_tor.TorLogApi.onLogMessage$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_tor.TorLogApi.onLogMessage$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onLogMessage was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onLogMessage was null.', + ); final List args = (message as List?)!; final TorLogMessage? arg_log = (args[0] as TorLogMessage?); - assert(arg_log != null, - 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onLogMessage was null, expected non-null TorLogMessage.'); + assert( + arg_log != null, + 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onLogMessage was null, expected non-null TorLogMessage.', + ); try { api.onLogMessage(arg_log!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } } { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_tor.TorLogApi.onStatusChanged$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.flutter_tor.TorLogApi.onStatusChanged$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onStatusChanged was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onStatusChanged was null.', + ); final List args = (message as List?)!; final TorStatus? arg_status = (args[0] as TorStatus?); - assert(arg_status != null, - 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onStatusChanged was null, expected non-null TorStatus.'); + assert( + arg_status != null, + 'Argument for dev.flutter.pigeon.flutter_tor.TorLogApi.onStatusChanged was null, expected non-null TorStatus.', + ); try { api.onStatusChanged(arg_status!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } @@ -478,9 +518,13 @@ class IPtProxyController { /// Constructor for [IPtProxyController]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - IPtProxyController({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + IPtProxyController({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -488,13 +532,16 @@ class IPtProxyController { final String pigeonVar_messageChannelSuffix; Future start(TransportType proxyType, String proxy) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_tor.IPtProxyController.start$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_tor.IPtProxyController.start$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([proxyType, proxy]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [proxyType, proxy], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -515,13 +562,16 @@ class IPtProxyController { } Future stop(TransportType proxyType) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_tor.IPtProxyController.stop$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.flutter_tor.IPtProxyController.stop$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([proxyType]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [proxyType], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); diff --git a/packages/locale_resolver/lib/src/pigeons/locales.g.dart b/packages/locale_resolver/lib/src/pigeons/locales.g.dart index ab677b69..8a48b580 100644 --- a/packages/locale_resolver/lib/src/pigeons/locales.g.dart +++ b/packages/locale_resolver/lib/src/pigeons/locales.g.dart @@ -14,40 +14,39 @@ PlatformException _createConnectionError(String channelName) { message: 'Unable to establish connection on channel: "$channelName".', ); } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + a.indexed.every( + ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), + ); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every( + (MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key]), + ); } return a == b; } - class LocalizedResult { - LocalizedResult({ - required this.languageName, - this.countryName, - }); + LocalizedResult({required this.languageName, this.countryName}); String languageName; String? countryName; List _toList() { - return [ - languageName, - countryName, - ]; + return [languageName, countryName]; } Object encode() { - return _toList(); } + return _toList(); + } static LocalizedResult decode(Object result) { result as List; @@ -71,11 +70,9 @@ class LocalizedResult { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -83,7 +80,7 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is LocalizedResult) { + } else if (value is LocalizedResult) { buffer.putUint8(129); writeValue(buffer, value.encode()); } else { @@ -94,7 +91,7 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return LocalizedResult.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -106,23 +103,33 @@ class LocaleResolver { /// Constructor for [LocaleResolver]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - LocaleResolver({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + LocaleResolver({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); final String pigeonVar_messageChannelSuffix; - Future resolve(String languageTag, String targetLangouageTag) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.locale_resolver.LocaleResolver.resolve$pigeonVar_messageChannelSuffix'; + Future resolve( + String languageTag, + String targetLangouageTag, + ) async { + final pigeonVar_channelName = + 'dev.flutter.pigeon.locale_resolver.LocaleResolver.resolve$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([languageTag, targetLangouageTag]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [languageTag, targetLangouageTag], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); diff --git a/packages/simple_intent_receiver/lib/src/pigeons/intent.g.dart b/packages/simple_intent_receiver/lib/src/pigeons/intent.g.dart index 070b0674..43836e71 100644 --- a/packages/simple_intent_receiver/lib/src/pigeons/intent.g.dart +++ b/packages/simple_intent_receiver/lib/src/pigeons/intent.g.dart @@ -8,7 +8,11 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; -List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse({ + Object? result, + PlatformException? error, + bool empty = false, +}) { if (empty) { return []; } @@ -17,21 +21,25 @@ List wrapResponse({Object? result, PlatformException? error, bool empty } return [error.code, error.message, error.details]; } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && - a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + a.indexed.every( + ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]), + ); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every( + (MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key]), + ); } return a == b; } - class Intent { Intent({ this.fromPackageName, @@ -66,7 +74,8 @@ class Intent { } Object encode() { - return _toList(); } + return _toList(); + } static Intent decode(Object result) { result as List; @@ -94,11 +103,9 @@ class Intent { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -106,7 +113,7 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is Intent) { + } else if (value is Intent) { buffer.putUint8(129); writeValue(buffer, value.encode()); } else { @@ -117,7 +124,7 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return Intent.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -130,32 +137,48 @@ abstract class IntentEvents { void onIntentReceived(int sequence, Intent intent); - static void setUp(IntentEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + IntentEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived was null.', + ); final List args = (message as List?)!; final int? arg_sequence = (args[0] as int?); - assert(arg_sequence != null, - 'Argument for dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived was null, expected non-null int.'); + assert( + arg_sequence != null, + 'Argument for dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived was null, expected non-null int.', + ); final Intent? arg_intent = (args[1] as Intent?); - assert(arg_intent != null, - 'Argument for dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived was null, expected non-null Intent.'); + assert( + arg_intent != null, + 'Argument for dev.flutter.pigeon.simple_intent_receiver.IntentEvents.onIntentReceived was null, expected non-null Intent.', + ); try { api.onIntentReceived(arg_sequence!, arg_intent!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } diff --git a/packages/speech_to_text_dialog/lib/src/pigeons/speech_to_text.g.dart b/packages/speech_to_text_dialog/lib/src/pigeons/speech_to_text.g.dart index 1665f8e2..612b76ce 100644 --- a/packages/speech_to_text_dialog/lib/src/pigeons/speech_to_text.g.dart +++ b/packages/speech_to_text_dialog/lib/src/pigeons/speech_to_text.g.dart @@ -15,7 +15,11 @@ PlatformException _createConnectionError(String channelName) { ); } -List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { +List wrapResponse({ + Object? result, + PlatformException? error, + bool empty = false, +}) { if (empty) { return []; } @@ -25,7 +29,6 @@ List wrapResponse({Object? result, PlatformException? error, bool empty return [error.code, error.message, error.details]; } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -52,9 +55,13 @@ class SpeechToTextApi { /// Constructor for [SpeechToTextApi]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - SpeechToTextApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) - : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + SpeechToTextApi({ + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) : pigeonVar_binaryMessenger = binaryMessenger, + pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -69,13 +76,16 @@ class SpeechToTextApi { /// The [locale] parameter specifies the language locale for recognition /// (e.g., 'en-US', 'de-DE'). If null, uses the device default. Future showDialog({String? locale}) async { - final pigeonVar_channelName = 'dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextApi.showDialog$pigeonVar_messageChannelSuffix'; + final pigeonVar_channelName = + 'dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextApi.showDialog$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([locale]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send( + [locale], + ); final pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); @@ -106,29 +116,43 @@ abstract class SpeechToTextEvents { /// recognition failed or was cancelled. void onTextReceived(String text); - static void setUp(SpeechToTextEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) { - messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + static void setUp( + SpeechToTextEvents? api, { + BinaryMessenger? binaryMessenger, + String messageChannelSuffix = '', + }) { + messageChannelSuffix = messageChannelSuffix.isNotEmpty + ? '.$messageChannelSuffix' + : ''; { final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextEvents.onTextReceived$messageChannelSuffix', pigeonChannelCodec, - binaryMessenger: binaryMessenger); + 'dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextEvents.onTextReceived$messageChannelSuffix', + pigeonChannelCodec, + binaryMessenger: binaryMessenger, + ); if (api == null) { pigeonVar_channel.setMessageHandler(null); } else { pigeonVar_channel.setMessageHandler((Object? message) async { - assert(message != null, - 'Argument for dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextEvents.onTextReceived was null.'); + assert( + message != null, + 'Argument for dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextEvents.onTextReceived was null.', + ); final List args = (message as List?)!; final String? arg_text = (args[0] as String?); - assert(arg_text != null, - 'Argument for dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextEvents.onTextReceived was null, expected non-null String.'); + assert( + arg_text != null, + 'Argument for dev.flutter.pigeon.speech_to_text_dialog.SpeechToTextEvents.onTextReceived was null, expected non-null String.', + ); try { api.onTextReceived(arg_text!); return wrapResponse(empty: true); } on PlatformException catch (e) { return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } catch (e) { + return wrapResponse( + error: PlatformException(code: 'error', message: e.toString()), + ); } }); } diff --git a/scripts/update-url-cleaner-catalog.sh b/scripts/update-url-cleaner-catalog.sh new file mode 100755 index 00000000..1a9e97ca --- /dev/null +++ b/scripts/update-url-cleaner-catalog.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env sh + +set -eu + +BASE=$(dirname "$0") + +cd "$BASE/../app/assets/preferences" || exit + +TARGET="url_cleaner_data.minify.json" +TMP_FILE="${TARGET}.tmp" + +if wget -O "$TMP_FILE" "https://rules2.clearurls.xyz/data.minify.json"; then + mv "$TMP_FILE" "$TARGET" + echo "Updated $TARGET" +else + rm -f "$TMP_FILE" + echo "Failed to fetch $TARGET, keeping existing file" >&2 +fi diff --git a/scripts/update-url-shorteners.sh b/scripts/update-url-shorteners.sh new file mode 100755 index 00000000..a86b4931 --- /dev/null +++ b/scripts/update-url-shorteners.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env sh + +set -eu + +BASE=$(dirname "$0") + +cd "$BASE/../app/assets/preferences" || exit + +TARGET="url-shortener-list.json" +TMP_FILE="${TARGET}.tmp" + +if wget -O "$TMP_FILE" https://raw.githubusercontent.com/MISP/misp-warninglists/refs/heads/main/lists/url-shortener/list.json; then + mv "$TMP_FILE" "$TARGET" + echo "Updated $TARGET" +else + rm -f "$TMP_FILE" + echo "Failed to fetch $TARGET, keeping existing file" >&2 +fi