├── .editorconfig ├── .gitignore ├── Blazor.BrowserExtension.Samples.sln ├── CONTRIBUTING.md ├── Directory.Packages.props ├── LICENSE ├── Messaging ├── Demo.gif ├── README.md ├── dist │ └── browserextension │ │ ├── Messaging.styles.css │ │ ├── app.js │ │ ├── content │ │ ├── BackgroundWorker.js │ │ ├── Blazor.BrowserExtension │ │ │ ├── BackgroundWorkerRunner.js │ │ │ ├── Blazor.BrowserExtension.lib.module.js │ │ │ ├── ContentScript.js │ │ │ ├── Core.js │ │ │ ├── CoreInternal.js │ │ │ └── lib │ │ │ │ ├── browser-polyfill.js │ │ │ │ ├── browser-polyfill.js.map │ │ │ │ ├── browser-polyfill.min.js │ │ │ │ ├── browser-polyfill.min.js.map │ │ │ │ ├── decode.js │ │ │ │ └── decode.min.js │ │ ├── JsBind.Net │ │ │ └── JsBindNet.js │ │ └── browserextension.config.json │ │ ├── contentscript.html │ │ ├── css │ │ └── app.css │ │ ├── favicon.ico │ │ ├── framework │ │ ├── Blazor.BrowserExtension.wasm.br │ │ ├── JsBind.Net.Extensions.DependencyInjection.wasm.br │ │ ├── JsBind.Net.wasm.br │ │ ├── Messaging.wasm.br │ │ ├── Microsoft.AspNetCore.Components.Web.wasm.br │ │ ├── Microsoft.AspNetCore.Components.WebAssembly.wasm.br │ │ ├── Microsoft.AspNetCore.Components.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Json.wasm.br │ │ ├── Microsoft.Extensions.Configuration.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.wasm.br │ │ ├── Microsoft.Extensions.Logging.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Logging.wasm.br │ │ ├── Microsoft.Extensions.Options.wasm.br │ │ ├── Microsoft.Extensions.Primitives.wasm.br │ │ ├── Microsoft.JSInterop.WebAssembly.wasm.br │ │ ├── Microsoft.JSInterop.wasm.br │ │ ├── System.Collections.Concurrent.wasm.br │ │ ├── System.Collections.Immutable.wasm.br │ │ ├── System.Collections.wasm.br │ │ ├── System.ComponentModel.wasm.br │ │ ├── System.Console.wasm.br │ │ ├── System.IO.Pipelines.wasm.br │ │ ├── System.Linq.Expressions.wasm.br │ │ ├── System.Linq.wasm.br │ │ ├── System.Memory.wasm.br │ │ ├── System.Net.Http.wasm.br │ │ ├── System.Net.Primitives.wasm.br │ │ ├── System.Private.CoreLib.wasm.br │ │ ├── System.Private.Uri.wasm.br │ │ ├── System.Runtime.InteropServices.JavaScript.wasm.br │ │ ├── System.Runtime.wasm.br │ │ ├── System.Text.Encodings.Web.wasm.br │ │ ├── System.Text.Json.wasm.br │ │ ├── System.Text.RegularExpressions.wasm.br │ │ ├── WebExtensions.Net.Extensions.DependencyInjection.wasm.br │ │ ├── WebExtensions.Net.wasm.br │ │ ├── blazor.boot.json │ │ ├── blazor.webassembly.js │ │ ├── dotnet.js │ │ ├── dotnet.native.8.0.4.yk09ax7arl.js │ │ ├── dotnet.native.js │ │ ├── dotnet.native.wasm.br │ │ ├── dotnet.runtime.8.0.4.ogva3chynz.js │ │ ├── dotnet.runtime.js │ │ ├── icudt_CJK.dat.br │ │ ├── icudt_EFIGS.dat.br │ │ └── icudt_no_CJK.dat.br │ │ ├── index.html │ │ ├── manifest.json │ │ ├── options.html │ │ └── popup.html └── src │ ├── App.razor │ ├── BackgroundWorker.cs │ ├── Messages │ ├── Message.cs │ └── MessageTarget.cs │ ├── Messaging.csproj │ ├── Pages │ ├── ContentScript.razor │ ├── ContentScript.razor.css │ ├── Index.razor │ ├── Options.razor │ └── Popup.razor │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Shared │ └── MainLayout.razor │ ├── _Imports.razor │ └── wwwroot │ ├── app.js │ ├── css │ └── app.css │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── NewTabPage ├── Demo.gif ├── README.md ├── dist │ └── browserextension │ │ ├── content │ │ ├── Blazor.BrowserExtension │ │ │ ├── BackgroundWorkerRunner.js │ │ │ ├── Blazor.BrowserExtension.lib.module.js │ │ │ ├── ContentScript.js │ │ │ ├── Core.js │ │ │ ├── CoreInternal.js │ │ │ └── lib │ │ │ │ ├── browser-polyfill.js │ │ │ │ ├── browser-polyfill.js.map │ │ │ │ ├── browser-polyfill.min.js │ │ │ │ ├── browser-polyfill.min.js.map │ │ │ │ ├── decode.js │ │ │ │ └── decode.min.js │ │ ├── JsBind.Net │ │ │ └── JsBindNet.js │ │ └── browserextension.config.json │ │ ├── css │ │ └── app.css │ │ ├── favicon.ico │ │ ├── framework │ │ ├── Blazor.BrowserExtension.wasm.br │ │ ├── JsBind.Net.Extensions.DependencyInjection.wasm.br │ │ ├── JsBind.Net.wasm.br │ │ ├── Microsoft.AspNetCore.Components.Web.wasm.br │ │ ├── Microsoft.AspNetCore.Components.WebAssembly.wasm.br │ │ ├── Microsoft.AspNetCore.Components.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Json.wasm.br │ │ ├── Microsoft.Extensions.Configuration.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.wasm.br │ │ ├── Microsoft.Extensions.Logging.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Logging.wasm.br │ │ ├── Microsoft.Extensions.Options.wasm.br │ │ ├── Microsoft.Extensions.Primitives.wasm.br │ │ ├── Microsoft.JSInterop.WebAssembly.wasm.br │ │ ├── Microsoft.JSInterop.wasm.br │ │ ├── NewTabPage.wasm.br │ │ ├── System.Collections.Concurrent.wasm.br │ │ ├── System.Collections.Immutable.wasm.br │ │ ├── System.Collections.wasm.br │ │ ├── System.ComponentModel.wasm.br │ │ ├── System.Console.wasm.br │ │ ├── System.IO.Pipelines.wasm.br │ │ ├── System.Linq.Expressions.wasm.br │ │ ├── System.Linq.wasm.br │ │ ├── System.Memory.wasm.br │ │ ├── System.Private.CoreLib.wasm.br │ │ ├── System.Private.Uri.wasm.br │ │ ├── System.Runtime.InteropServices.JavaScript.wasm.br │ │ ├── System.Runtime.wasm.br │ │ ├── System.Text.Encodings.Web.wasm.br │ │ ├── System.Text.Json.wasm.br │ │ ├── System.Text.RegularExpressions.wasm.br │ │ ├── WebExtensions.Net.Extensions.DependencyInjection.wasm.br │ │ ├── WebExtensions.Net.wasm.br │ │ ├── blazor.boot.json │ │ ├── blazor.webassembly.js │ │ ├── dotnet.js │ │ ├── dotnet.native.8.0.4.0wznhhvnr6.js │ │ ├── dotnet.native.js │ │ ├── dotnet.native.wasm.br │ │ ├── dotnet.runtime.8.0.4.ogva3chynz.js │ │ ├── dotnet.runtime.js │ │ ├── icudt_CJK.dat.br │ │ ├── icudt_EFIGS.dat.br │ │ └── icudt_no_CJK.dat.br │ │ ├── index.html │ │ ├── manifest.json │ │ └── newtab.html └── src │ ├── App.razor │ ├── NewTabPage.csproj │ ├── Pages │ └── NewTab.razor │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Shared │ └── MainLayout.razor │ ├── _Imports.razor │ └── wwwroot │ ├── css │ └── app.css │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── README.md ├── SidebarUsingContentScripts ├── Demo.gif ├── README.md ├── dist │ └── browserextension │ │ ├── SidebarUsingContentScripts.styles.css │ │ ├── app.js │ │ ├── content │ │ ├── Blazor.BrowserExtension │ │ │ ├── BackgroundWorkerRunner.js │ │ │ ├── Blazor.BrowserExtension.lib.module.js │ │ │ ├── ContentScript.js │ │ │ ├── Core.js │ │ │ ├── CoreInternal.js │ │ │ └── lib │ │ │ │ ├── browser-polyfill.js │ │ │ │ ├── browser-polyfill.js.map │ │ │ │ ├── browser-polyfill.min.js │ │ │ │ ├── browser-polyfill.min.js.map │ │ │ │ ├── decode.js │ │ │ │ └── decode.min.js │ │ ├── JsBind.Net │ │ │ └── JsBindNet.js │ │ └── browserextension.config.json │ │ ├── contentscript.html │ │ ├── css │ │ └── app.css │ │ ├── favicon.ico │ │ ├── framework │ │ ├── Blazor.BrowserExtension.wasm.br │ │ ├── JsBind.Net.Extensions.DependencyInjection.wasm.br │ │ ├── JsBind.Net.wasm.br │ │ ├── Microsoft.AspNetCore.Components.Web.wasm.br │ │ ├── Microsoft.AspNetCore.Components.WebAssembly.wasm.br │ │ ├── Microsoft.AspNetCore.Components.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Json.wasm.br │ │ ├── Microsoft.Extensions.Configuration.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.wasm.br │ │ ├── Microsoft.Extensions.Logging.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Logging.wasm.br │ │ ├── Microsoft.Extensions.Options.wasm.br │ │ ├── Microsoft.Extensions.Primitives.wasm.br │ │ ├── Microsoft.JSInterop.WebAssembly.wasm.br │ │ ├── Microsoft.JSInterop.wasm.br │ │ ├── SidebarUsingContentScripts.wasm.br │ │ ├── System.Collections.Concurrent.wasm.br │ │ ├── System.Collections.Immutable.wasm.br │ │ ├── System.Collections.wasm.br │ │ ├── System.ComponentModel.wasm.br │ │ ├── System.Console.wasm.br │ │ ├── System.IO.Pipelines.wasm.br │ │ ├── System.Linq.Expressions.wasm.br │ │ ├── System.Linq.wasm.br │ │ ├── System.Memory.wasm.br │ │ ├── System.Private.CoreLib.wasm.br │ │ ├── System.Private.Uri.wasm.br │ │ ├── System.Runtime.InteropServices.JavaScript.wasm.br │ │ ├── System.Runtime.wasm.br │ │ ├── System.Text.Encodings.Web.wasm.br │ │ ├── System.Text.Json.wasm.br │ │ ├── System.Text.RegularExpressions.wasm.br │ │ ├── WebExtensions.Net.Extensions.DependencyInjection.wasm.br │ │ ├── WebExtensions.Net.wasm.br │ │ ├── blazor.boot.json │ │ ├── blazor.webassembly.js │ │ ├── dotnet.js │ │ ├── dotnet.native.8.0.4.5oc0uk492x.js │ │ ├── dotnet.native.js │ │ ├── dotnet.native.wasm.br │ │ ├── dotnet.runtime.8.0.4.ogva3chynz.js │ │ ├── dotnet.runtime.js │ │ ├── icudt_CJK.dat.br │ │ ├── icudt_EFIGS.dat.br │ │ └── icudt_no_CJK.dat.br │ │ ├── index.html │ │ └── manifest.json └── src │ ├── App.razor │ ├── Pages │ ├── ContentScript.razor │ └── ContentScript.razor.css │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Shared │ └── MainLayout.razor │ ├── SidebarUsingContentScripts.csproj │ ├── _Imports.razor │ └── wwwroot │ ├── app.js │ ├── css │ └── app.css │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── SidebarUsingIframe ├── Demo.gif ├── README.md ├── dist │ └── browserextension │ │ ├── ContentScript.css │ │ ├── ContentScript.js │ │ ├── SidebarUsingIframe.styles.css │ │ ├── content │ │ ├── Blazor.BrowserExtension │ │ │ ├── BackgroundWorkerRunner.js │ │ │ ├── Blazor.BrowserExtension.lib.module.js │ │ │ ├── ContentScript.js │ │ │ ├── Core.js │ │ │ ├── CoreInternal.js │ │ │ └── lib │ │ │ │ ├── browser-polyfill.js │ │ │ │ ├── browser-polyfill.js.map │ │ │ │ ├── browser-polyfill.min.js │ │ │ │ ├── browser-polyfill.min.js.map │ │ │ │ ├── decode.js │ │ │ │ └── decode.min.js │ │ ├── JsBind.Net │ │ │ └── JsBindNet.js │ │ └── browserextension.config.json │ │ ├── contentscript.html │ │ ├── css │ │ └── app.css │ │ ├── favicon.ico │ │ ├── framework │ │ ├── Blazor.BrowserExtension.wasm.br │ │ ├── JsBind.Net.Extensions.DependencyInjection.wasm.br │ │ ├── JsBind.Net.wasm.br │ │ ├── Microsoft.AspNetCore.Components.Web.wasm.br │ │ ├── Microsoft.AspNetCore.Components.WebAssembly.wasm.br │ │ ├── Microsoft.AspNetCore.Components.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Configuration.Json.wasm.br │ │ ├── Microsoft.Extensions.Configuration.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.DependencyInjection.wasm.br │ │ ├── Microsoft.Extensions.Logging.Abstractions.wasm.br │ │ ├── Microsoft.Extensions.Logging.wasm.br │ │ ├── Microsoft.Extensions.Options.wasm.br │ │ ├── Microsoft.Extensions.Primitives.wasm.br │ │ ├── Microsoft.JSInterop.WebAssembly.wasm.br │ │ ├── Microsoft.JSInterop.wasm.br │ │ ├── SidebarUsingIframe.wasm.br │ │ ├── System.Collections.Concurrent.wasm.br │ │ ├── System.Collections.Immutable.wasm.br │ │ ├── System.Collections.wasm.br │ │ ├── System.ComponentModel.wasm.br │ │ ├── System.Console.wasm.br │ │ ├── System.IO.Pipelines.wasm.br │ │ ├── System.Linq.Expressions.wasm.br │ │ ├── System.Linq.wasm.br │ │ ├── System.Memory.wasm.br │ │ ├── System.Private.CoreLib.wasm.br │ │ ├── System.Private.Uri.wasm.br │ │ ├── System.Runtime.InteropServices.JavaScript.wasm.br │ │ ├── System.Runtime.wasm.br │ │ ├── System.Text.Encodings.Web.wasm.br │ │ ├── System.Text.Json.wasm.br │ │ ├── System.Text.RegularExpressions.wasm.br │ │ ├── WebExtensions.Net.Extensions.DependencyInjection.wasm.br │ │ ├── WebExtensions.Net.wasm.br │ │ ├── blazor.boot.json │ │ ├── blazor.webassembly.js │ │ ├── dotnet.js │ │ ├── dotnet.native.8.0.4.o5deegs3wn.js │ │ ├── dotnet.native.js │ │ ├── dotnet.native.wasm.br │ │ ├── dotnet.runtime.8.0.4.ogva3chynz.js │ │ ├── dotnet.runtime.js │ │ ├── icudt_CJK.dat.br │ │ ├── icudt_EFIGS.dat.br │ │ └── icudt_no_CJK.dat.br │ │ ├── index.html │ │ └── manifest.json └── src │ ├── App.razor │ ├── Messaging │ ├── HeadersData.cs │ ├── MessagingEvent.cs │ └── PostRequest.cs │ ├── Pages │ ├── ContentScript.razor │ └── ContentScript.razor.css │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Shared │ ├── MainLayout.razor │ └── MainLayout.razor.css │ ├── SidebarUsingIframe.csproj │ ├── _Imports.razor │ └── wwwroot │ ├── ContentScript.css │ ├── ContentScript.js │ ├── css │ └── app.css │ ├── favicon.ico │ ├── index.html │ └── manifest.json └── Sidepanel ├── Demo.gif ├── README.md ├── dist └── browserextension │ ├── Sidepanel.styles.css │ ├── content │ ├── Blazor.BrowserExtension │ │ ├── BackgroundWorkerRunner.js │ │ ├── Blazor.BrowserExtension.lib.module.js │ │ ├── ContentScript.js │ │ ├── Core.js │ │ ├── CoreInternal.js │ │ └── lib │ │ │ ├── browser-polyfill.js │ │ │ ├── browser-polyfill.js.map │ │ │ ├── browser-polyfill.min.js │ │ │ ├── browser-polyfill.min.js.map │ │ │ ├── decode.js │ │ │ └── decode.min.js │ ├── JsBind.Net │ │ └── JsBindNet.js │ └── browserextension.config.json │ ├── css │ └── app.css │ ├── favicon.ico │ ├── framework │ ├── Blazor.BrowserExtension.wasm.br │ ├── JsBind.Net.Extensions.DependencyInjection.wasm.br │ ├── JsBind.Net.wasm.br │ ├── Microsoft.AspNetCore.Components.Web.wasm.br │ ├── Microsoft.AspNetCore.Components.WebAssembly.wasm.br │ ├── Microsoft.AspNetCore.Components.wasm.br │ ├── Microsoft.Extensions.Configuration.Abstractions.wasm.br │ ├── Microsoft.Extensions.Configuration.Json.wasm.br │ ├── Microsoft.Extensions.Configuration.wasm.br │ ├── Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br │ ├── Microsoft.Extensions.DependencyInjection.wasm.br │ ├── Microsoft.Extensions.Logging.Abstractions.wasm.br │ ├── Microsoft.Extensions.Logging.wasm.br │ ├── Microsoft.Extensions.Options.wasm.br │ ├── Microsoft.Extensions.Primitives.wasm.br │ ├── Microsoft.JSInterop.WebAssembly.wasm.br │ ├── Microsoft.JSInterop.wasm.br │ ├── Sidepanel.wasm.br │ ├── System.Collections.Concurrent.wasm.br │ ├── System.Collections.Immutable.wasm.br │ ├── System.Collections.wasm.br │ ├── System.ComponentModel.wasm.br │ ├── System.Console.wasm.br │ ├── System.IO.Pipelines.wasm.br │ ├── System.Linq.Expressions.wasm.br │ ├── System.Linq.wasm.br │ ├── System.Memory.wasm.br │ ├── System.Private.CoreLib.wasm.br │ ├── System.Private.Uri.wasm.br │ ├── System.Runtime.InteropServices.JavaScript.wasm.br │ ├── System.Runtime.wasm.br │ ├── System.Text.Encodings.Web.wasm.br │ ├── System.Text.Json.wasm.br │ ├── System.Text.RegularExpressions.wasm.br │ ├── WebExtensions.Net.Extensions.DependencyInjection.wasm.br │ ├── WebExtensions.Net.wasm.br │ ├── blazor.boot.json │ ├── blazor.webassembly.js │ ├── dotnet.js │ ├── dotnet.native.8.0.4.w3qz2knejd.js │ ├── dotnet.native.js │ ├── dotnet.native.wasm.br │ ├── dotnet.runtime.8.0.4.ogva3chynz.js │ ├── dotnet.runtime.js │ ├── icudt_CJK.dat.br │ ├── icudt_EFIGS.dat.br │ └── icudt_no_CJK.dat.br │ ├── index.html │ ├── manifest.json │ └── sidepanel.html └── src ├── App.razor ├── Pages ├── SidePanel.razor └── SidePanel.razor.css ├── Program.cs ├── Properties └── launchSettings.json ├── Shared ├── MainLayout.razor └── MainLayout.razor.css ├── Sidepanel.csproj ├── _Imports.razor └── wwwroot ├── css └── app.css ├── favicon.ico ├── index.html └── manifest.json /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific files 2 | *.rsuser 3 | *.suo 4 | *.user 5 | *.userosscache 6 | *.sln.docstates 7 | 8 | # Build results 9 | [Dd]ebug/ 10 | [Dd]ebugPublic/ 11 | [Rr]elease/ 12 | [Rr]eleases/ 13 | x64/ 14 | x86/ 15 | [Aa][Rr][Mm]/ 16 | [Aa][Rr][Mm]64/ 17 | bld/ 18 | [Bb]in/ 19 | [Oo]bj/ 20 | [Ll]og/ 21 | [Ll]ogs/ 22 | [Bb]uild[Oo]utput/ 23 | [Pp]ackage[Oo]utput/ 24 | 25 | # Test results 26 | [Tt]est[Rr]esults/ 27 | 28 | # Visual Studio 2015/2017 cache/options directory 29 | .vs/ 30 | 31 | # .NET Core 32 | project.lock.json 33 | project.fragment.lock.json 34 | artifacts/ 35 | 36 | # Files built by Visual Studio 37 | *_i.c 38 | *_p.c 39 | *_h.h 40 | *.ilk 41 | *.meta 42 | *.obj 43 | *.iobj 44 | *.pch 45 | *.pdb 46 | *.ipdb 47 | *.pgc 48 | *.pgd 49 | *.rsp 50 | *.sbr 51 | *.tlb 52 | *.tli 53 | *.tlh 54 | *.tmp 55 | *.tmp_proj 56 | *_wpftmp.csproj 57 | *.log 58 | *.vspscc 59 | *.vssscc 60 | .builds 61 | *.pidb 62 | *.svclog 63 | *.scc 64 | 65 | # NuGet Packages 66 | *.nupkg 67 | # NuGet Symbol Packages 68 | *.snupkg 69 | # The packages folder can be ignored because of Package Restore 70 | **/[Pp]ackages/* 71 | # except build/, which is used as an MSBuild target. 72 | !**/[Pp]ackages/build/ 73 | # Uncomment if necessary however generally it will be regenerated when needed 74 | #!**/[Pp]ackages/repositories.config 75 | # NuGet v3's project.json files produces more ignorable files 76 | *.nuget.props 77 | *.nuget.targets 78 | 79 | # Visual Studio cache files 80 | # files ending in .cache can be ignored 81 | *.[Cc]ache 82 | # but keep track of directories ending in .cache 83 | !?*.[Cc]ache/ 84 | 85 | # Browser Extension Output 86 | # Exclude the dist publish folder 87 | **/dist/* 88 | # Except the folder named browserextension 89 | !**/dist/browserextension/ 90 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to this repository 2 | 3 | ## We Develop with Github 4 | We use GitHub to host code, to track issues and feature requests, as well as accept pull requests. 5 | 6 | ## Report bugs using Github's issues 7 | We use GitHub issues to track bugs. Report a bug by opening a new issue. 8 | 9 | ## Write bug reports with detail, background, and sample code 10 | Great Bug Reports tend to have: 11 | 12 | - A quick summary and/or background 13 | - Steps to reproduce 14 | - Be specific! 15 | - Give sample code if you can. 16 | - What you expected would happen 17 | - What actually happens 18 | - Notes (possibly including why you think this might be happening, or what you have tried that didn't work) 19 | 20 | ## We Use Github Flow, So All Code Changes Happen Through Pull Requests 21 | Pull requests are the best way to propose changes to the codebase. We actively welcome your pull requests: 22 | 23 | 1. Fork the repo and create your branch from main. 24 | 0. If you've added code that should be tested, add tests. 25 | 0. Ensure the test suite passes. 26 | 0. Create a pull request! 27 | 28 | ## Working in this repository 29 | Each sample project has a `dist` and `src` directory, where 30 | - the `dist` directory contains the published output and can be loaded in the browser directly. 31 | - the `src` directory contains the source files that can be compiled and published. 32 | 33 | Therefore, any changes in the sample project source files means that the project needs to be published again. 34 | This can be done with `dotnet publish --configuration Release` in the project directory. 35 | 36 | ### Use a Consistent Coding Style 37 | - 4 spaces (C#) or 2 spaces (XML/JSON/JS) for indentation rather than tabs. 38 | - Every `if`, `else`, `for`, `foreach`, `while` etc should have its own opening and closing bracket, even if it is a single line statement. 39 | - Every code file changed should be formatted properly (CTRL+K, CTRL+D in VS or ALT+SHIFT+F in VS Code). 40 | 41 | ## License 42 | By contributing, you agree that your contributions will be licensed under its MIT License. -------------------------------------------------------------------------------- /Directory.Packages.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 mingyaulee 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Messaging/Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/Demo.gif -------------------------------------------------------------------------------- /Messaging/README.md: -------------------------------------------------------------------------------- 1 | # Messaging sample 2 | 3 | ![Demo](Demo.gif) 4 | 5 | This sample project shows how the different messaging APIs work. 6 | 7 | You can load the output directly in the browser by following the steps [here](../README.md#test-the-sample-projects). -------------------------------------------------------------------------------- /Messaging/dist/browserextension/Messaging.styles.css: -------------------------------------------------------------------------------- 1 | /* /Pages/ContentScript.razor.rz.scp.css */ 2 | .content-script-container[b-5t614019rp] { 3 | position: absolute; 4 | top: 0; 5 | left: 0; 6 | width: 100%; 7 | height: 320px; 8 | background: #fff; 9 | border-bottom: 1px solid #000; 10 | z-index: 1000000; 11 | } 12 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Called before Blazor starts. 3 | * @param {object} options Blazor WebAssembly start options. Refer to https://github.com/dotnet/aspnetcore/blob/main/src/Components/Web.JS/src/Platform/WebAssemblyStartOptions.ts 4 | * @param {object} extensions Extensions added during publishing 5 | * @param {object} blazorBrowserExtension Blazor browser extension 6 | */ 7 | export function beforeStart(options, extensions, blazorBrowserExtension) { 8 | if (blazorBrowserExtension.BrowserExtension.Mode === blazorBrowserExtension.Modes.ContentScript) { 9 | const appDiv = document.createElement("div"); 10 | appDiv.id = "Sample_Messaging_app"; 11 | document.body.appendChild(appDiv); 12 | } 13 | } -------------------------------------------------------------------------------- /Messaging/dist/browserextension/content/BackgroundWorker.js: -------------------------------------------------------------------------------- 1 | import { importRequested, fromReference } from "/content/Blazor.BrowserExtension/BackgroundWorkerRunner.js"; 2 | import * as s0 from "/framework/dotnet.js"; 3 | import * as s1 from "/framework/dotnet.native.js"; 4 | import * as s2 from "/framework/dotnet.runtime.js"; 5 | import * as s3 from "/framework/blazor.webassembly.js"; 6 | import * as s4 from "/content/Blazor.BrowserExtension/BackgroundWorkerRunner.js"; 7 | import * as s5 from "/content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js"; 8 | import * as s6 from "/content/Blazor.BrowserExtension/CoreInternal.js"; 9 | import * as s7 from "/content/Blazor.BrowserExtension/lib/browser-polyfill.min.js"; 10 | import * as s8 from "/content/Blazor.BrowserExtension/lib/decode.min.js"; 11 | import * as s9 from "/content/JsBind.Net/JsBindNet.js"; 12 | import * as s10 from "/app.js"; 13 | 14 | const allImports = [["framework/dotnet.js", s0], ["framework/dotnet.native.js", s1], ["framework/dotnet.runtime.js", s2], ["framework/blazor.webassembly.js", s3], ["content/Blazor.BrowserExtension/BackgroundWorkerRunner.js", s4], ["content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js", s5], ["content/Blazor.BrowserExtension/CoreInternal.js", s6], ["content/Blazor.BrowserExtension/lib/browser-polyfill.min.js", s7], ["content/Blazor.BrowserExtension/lib/decode.min.js", s8], ["content/JsBind.Net/JsBindNet.js", s9], ["app.js", s10]]; 15 | 16 | const importModule = (requestedModulePath) => { 17 | let candidateModule; 18 | for (const [importedPath, importedModule] of allImports) { 19 | if (requestedModulePath.includes(importedPath)) { 20 | return importedModule; 21 | } else if (importedPath.substring(importedPath.lastIndexOf('/')) === requestedModulePath.substring(requestedModulePath.lastIndexOf('/'))) { 22 | candidateModule = importedModule; 23 | } 24 | } 25 | 26 | if (candidateModule) { 27 | return candidateModule; 28 | } 29 | 30 | console.warn("Unhandled module import: " + requestedModulePath); 31 | return {}; 32 | } 33 | 34 | globalThis.importProxy = (module) => Promise.resolve(importModule(module)); 35 | for (const importRequest of importRequested) { 36 | importRequest.resolve(importModule(importRequest.module)); 37 | } 38 | 39 | // Generated by Blazor.BrowserExtension.Analyzer 40 | browser.runtime.onInstalled.addListener(fromReference('OnInstalled')); 41 | browser.runtime.onMessage.addListener(fromReference('OnMessage')); 42 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js: -------------------------------------------------------------------------------- 1 | import { initializeInternal } from './CoreInternal.js'; 2 | 3 | let debugMode = false; 4 | const hasExtensionsApi = (namespace) => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 5 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 6 | debugMode = true; 7 | } 8 | 9 | let url; 10 | let browserExtensionMode; 11 | if (!debugMode) { 12 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 13 | browserExtensionMode = "Standard"; 14 | } else { 15 | url = globalThis.location.origin + "/"; 16 | browserExtensionMode = "Debug"; 17 | } 18 | 19 | let config; 20 | let appJs; 21 | 22 | async function beforeStart(options, extensions) { 23 | const configUrl = `${url}content/browserextension.config.json`; 24 | const configRequest = await fetch(configUrl); 25 | 26 | config = await configRequest.json(); 27 | 28 | const blazorBrowserExtension = options.BlazorBrowserExtension ?? initializeInternal(config, url, browserExtensionMode); 29 | 30 | if (debugMode) { 31 | blazorBrowserExtension.ImportBrowserPolyfill = false; 32 | } 33 | 34 | if (config.HasAppJs) { 35 | appJs = await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 36 | } 37 | 38 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 39 | // import browser extension API polyfill 40 | // @ts-ignore JS is not a module 41 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 42 | } 43 | 44 | await blazorBrowserExtension.BrowserExtension.InitializeCoreAsync(options); 45 | 46 | if (appJs?.beforeStart) { 47 | const beforeStartReturn = appJs.beforeStart(options, extensions, blazorBrowserExtension); 48 | if (beforeStartReturn instanceof Promise) { 49 | await beforeStartReturn; 50 | } 51 | } 52 | } 53 | 54 | function afterStarted(blazor) { 55 | if (appJs?.afterStarted) { 56 | return appJs.afterStarted(blazor); 57 | } 58 | } 59 | 60 | export { afterStarted, beforeStart }; 61 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/content/Blazor.BrowserExtension/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 3 | const url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 4 | 5 | const configRequest = await fetch(`${url}content/browserextension.config.json`); 6 | const config = await configRequest.json(); 7 | 8 | const blazorBrowserExtension = initializeInternal(config, url, "ContentScript"); 9 | 10 | globalThis.importProxy = (module) => { 11 | if (module.startsWith(document.baseURI) && blazorBrowserExtension.BrowserExtension) { 12 | module = new URL(module.substring(document.baseURI.length), blazorBrowserExtension.BrowserExtension.Url); 13 | } 14 | 15 | return import(module); 16 | }; 17 | 18 | await blazorBrowserExtension.BrowserExtension.InitializeContentScriptAsync({ 19 | BlazorBrowserExtension: blazorBrowserExtension 20 | }); 21 | })(); 22 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/content/Blazor.BrowserExtension/Core.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | console.warn("Core.js is deprecated. Use 'framework/blazor.webassembly.js' in the script tag."); 3 | 4 | let debugMode = false; 5 | const hasExtensionsApi = namespace => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 6 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 7 | debugMode = true; 8 | } 9 | 10 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 11 | let url; 12 | let browserExtensionMode; 13 | if (!debugMode) { 14 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 15 | browserExtensionMode = "Standard"; 16 | } else { 17 | url = globalThis.location.origin + "/"; 18 | browserExtensionMode = "Debug"; 19 | } 20 | 21 | const configUrl = `${url}content/browserextension.config.json`; 22 | 23 | const configRequest = await fetch(configUrl); 24 | const config = await configRequest.json(); 25 | 26 | const blazorBrowserExtension = initializeInternal(config, url, browserExtensionMode); 27 | // Clear the BrowserExtension property for the module initializer to initialize it 28 | const browserExtension = blazorBrowserExtension.BrowserExtension; 29 | blazorBrowserExtension.BrowserExtension = null; 30 | 31 | if (debugMode) { 32 | blazorBrowserExtension.ImportBrowserPolyfill = false; 33 | } 34 | 35 | if (config.HasAppJs) { 36 | await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 37 | } 38 | 39 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 40 | // import browser extension API polyfill 41 | // @ts-ignore JS is not a module 42 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 43 | } 44 | 45 | if (blazorBrowserExtension.StartBlazorBrowserExtension) { 46 | await browserExtension.InitializeAsync(); 47 | } 48 | })(); 49 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/content/browserextension.config.json: -------------------------------------------------------------------------------- 1 | {"EnvironmentName":"","CompressionEnabled":true,"HasAppJs":true} -------------------------------------------------------------------------------- /Messaging/dist/browserextension/contentscript.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Messaging 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/favicon.ico -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/JsBind.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/JsBind.Net.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Messaging.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Messaging.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/Microsoft.JSInterop.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/Microsoft.JSInterop.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Collections.Concurrent.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Collections.Concurrent.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Collections.Immutable.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Collections.Immutable.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Collections.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Collections.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.ComponentModel.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.ComponentModel.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Console.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Console.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.IO.Pipelines.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.IO.Pipelines.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Linq.Expressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Linq.Expressions.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Linq.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Linq.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Memory.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Memory.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Net.Http.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Net.Http.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Net.Primitives.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Net.Primitives.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Private.CoreLib.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Private.CoreLib.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Private.Uri.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Private.Uri.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Runtime.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Runtime.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Text.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Text.Json.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/WebExtensions.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/WebExtensions.Net.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/dotnet.native.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/dotnet.native.wasm.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/icudt_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/icudt_CJK.dat.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/icudt_EFIGS.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/icudt_EFIGS.dat.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/framework/icudt_no_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/dist/browserextension/framework/icudt_no_CJK.dat.br -------------------------------------------------------------------------------- /Messaging/dist/browserextension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Messaging 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Messaging Extension", 4 | "description": "Sample for messaging in browser extension", 5 | "version": "0.1", 6 | "action": { 7 | "default_popup": "popup.html" 8 | }, 9 | "background": { 10 | "service_worker": "content/BackgroundWorker.js", 11 | "type": "module" 12 | }, 13 | "content_scripts": [ 14 | { 15 | "matches": [ "*://*/*" ], 16 | "js": [ "content/Blazor.BrowserExtension/ContentScript.js" ], 17 | "css": [ "Messaging.styles.css" ] 18 | } 19 | ], 20 | "options_ui": { 21 | "page": "options.html", 22 | "open_in_tab": true 23 | }, 24 | "content_security_policy": { 25 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 26 | }, 27 | "web_accessible_resources": [ 28 | { 29 | "resources": [ 30 | "framework/*", 31 | "content/*", 32 | "app.js" 33 | ], 34 | "matches": [ "" ] 35 | } 36 | ], 37 | "permissions": [ 38 | "tabs" 39 | ] 40 | } -------------------------------------------------------------------------------- /Messaging/dist/browserextension/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Messaging 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Messaging/dist/browserextension/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Messaging 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Messaging/src/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |

Sorry, there's nothing at this address.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /Messaging/src/BackgroundWorker.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Blazor.BrowserExtension; 4 | using Messaging.Messages; 5 | using WebExtensions.Net.Runtime; 6 | 7 | namespace Messaging 8 | { 9 | public partial class BackgroundWorker : BackgroundWorkerBase 10 | { 11 | [BackgroundWorkerMain] 12 | public override void Main() 13 | { 14 | WebExtensions.Runtime.OnInstalled.AddListener(OnInstalled); 15 | WebExtensions.Runtime.OnMessage.AddListener(OnMessage); 16 | } 17 | 18 | async Task OnInstalled() 19 | { 20 | var indexPageUrl = WebExtensions.Runtime.GetURL("index.html"); 21 | await WebExtensions.Tabs.Create(new() 22 | { 23 | Url = indexPageUrl 24 | }); 25 | } 26 | 27 | bool OnMessage(object message, MessageSender sender, Action sendResponse) 28 | { 29 | if (!Message.IsForTarget(MessageTarget.Background, message, out var msg)) 30 | { 31 | return false; 32 | } 33 | 34 | if (msg.Content == "OPEN_OPTIONS_PAGE") 35 | { 36 | WebExtensions.Runtime.OpenOptionsPage(); 37 | sendResponse("Options page opened"); 38 | _ = SayHelloAfter3Seconds(); 39 | } 40 | 41 | return true; 42 | } 43 | 44 | async Task SayHelloAfter3Seconds() 45 | { 46 | await Task.Delay(3000); 47 | await WebExtensions.Runtime.SendMessage(new Message() 48 | { 49 | Target = MessageTarget.All, 50 | Content = "Hello from background" 51 | }); 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Messaging/src/Messages/Message.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | using System.Text.Json.Serialization; 3 | using WebExtensions.Net; 4 | 5 | namespace Messaging.Messages 6 | { 7 | public class Message 8 | { 9 | [JsonPropertyName("target")] 10 | [JsonConverter(typeof(EnumStringConverter))] 11 | public MessageTarget Target { get; set; } 12 | 13 | [JsonPropertyName("content")] 14 | public string Content { get; set; } 15 | 16 | public static bool IsForTarget(MessageTarget intendedTarget, object msg, out Message message) 17 | { 18 | message = null; 19 | if (msg is JsonElement jsonMessage) 20 | { 21 | message = jsonMessage.Deserialize(); 22 | return message is not null && (message.Target == intendedTarget || message.Target == MessageTarget.All); 23 | } 24 | 25 | return false; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Messaging/src/Messages/MessageTarget.cs: -------------------------------------------------------------------------------- 1 | namespace Messaging.Messages 2 | { 3 | public enum MessageTarget 4 | { 5 | All, 6 | Background, 7 | Index, 8 | Options, 9 | ContentScript, 10 | Popup, 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Messaging/src/Messaging.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net9.0 5 | ../dist 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Messaging/src/Pages/ContentScript.razor: -------------------------------------------------------------------------------- 1 | @page "/contentscript.html" 2 | @using System.Text.Json 3 | @using Messaging.Messages 4 | @using WebExtensions.Net.Runtime 5 | @inherits BasePage 6 | 7 |
8 |

My content script

9 |

Open the popup by clicking on the extension icon above, next to the address bar

10 |

Logs

11 | @foreach (var log in logs) 12 | { 13 |

@log

14 | } 15 |
16 | 17 | @code { 18 | List logs = new(); 19 | 20 | protected override async Task OnInitializedAsync() 21 | { 22 | await base.OnInitializedAsync(); 23 | WebExtensions.Runtime.OnMessage.AddListener(OnMessage); 24 | } 25 | 26 | private bool OnMessage(object message, MessageSender sender, Action sendResponse) 27 | { 28 | if (Message.IsForTarget(MessageTarget.ContentScript, message, out var msg)) 29 | { 30 | logs.Add("Received new message: " + msg.Content); 31 | sendResponse("Message acknowledged from Content Script"); 32 | StateHasChanged(); 33 | return true; 34 | } 35 | 36 | return false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Messaging/src/Pages/ContentScript.razor.css: -------------------------------------------------------------------------------- 1 | .content-script-container { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 320px; 7 | background: #fff; 8 | border-bottom: 1px solid #000; 9 | z-index: 1000000; 10 | } -------------------------------------------------------------------------------- /Messaging/src/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/index.html" 2 | @using System.Text.Json 3 | @using Messaging.Messages 4 | @using WebExtensions.Net.Runtime 5 | @inherits IndexPage 6 | 7 |

Messaging Demo

8 | 9 | 10 |

You can also see the messaging with ContentScripts and PopUp by visiting a web page where the content script will be rendered, for example https://google.com

11 | 12 |

Logs

13 | @foreach (var log in logs) 14 | { 15 |

@log

16 | } 17 | 18 | @code { 19 | List logs = new(); 20 | 21 | protected override async Task OnInitializedAsync() 22 | { 23 | await base.OnInitializedAsync(); 24 | WebExtensions.Runtime.OnMessage.AddListener(OnMessage); 25 | } 26 | 27 | private bool OnMessage(object message, MessageSender sender, Action sendResponse) 28 | { 29 | if (Message.IsForTarget(MessageTarget.Index, message, out var msg)) 30 | { 31 | logs.Add("Received new message: " + msg.Content); 32 | StateHasChanged(); 33 | return true; 34 | } 35 | 36 | return false; 37 | } 38 | 39 | private async Task OpenOptionsPageAndSendMessage() 40 | { 41 | logs.Add("Sending message to background worker to open options page"); 42 | var openOptionsResponse = await WebExtensions.Runtime.SendMessage(new Message() 43 | { 44 | Target = MessageTarget.Background, 45 | Content = "OPEN_OPTIONS_PAGE" 46 | }); 47 | logs.Add("Received response from background: " + openOptionsResponse); 48 | 49 | await Task.Delay(3000); 50 | 51 | logs.Add("Sending message to options page"); 52 | var optionsPageResponse = await WebExtensions.Runtime.SendMessage(new Message() 53 | { 54 | Target = MessageTarget.Options, 55 | Content = "Hello from Index page" 56 | }); 57 | logs.Add("Received response from options page: " + optionsPageResponse); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Messaging/src/Pages/Options.razor: -------------------------------------------------------------------------------- 1 | @page "/options.html" 2 | @using System.Text.Json 3 | @using Messaging.Messages 4 | @using WebExtensions.Net.Runtime 5 | @inherits BasePage 6 | 7 |

My options page

8 |

Logs

9 | @foreach (var log in logs) 10 | { 11 |

@log

12 | } 13 | 14 | @code { 15 | List logs = new(); 16 | 17 | protected override async Task OnInitializedAsync() 18 | { 19 | await base.OnInitializedAsync(); 20 | WebExtensions.Runtime.OnMessage.AddListener(OnMessage); 21 | } 22 | 23 | private bool OnMessage(object message, MessageSender sender, Action sendResponse) 24 | { 25 | if (Message.IsForTarget(MessageTarget.Options, message, out var msg)) 26 | { 27 | logs.Add("Received new message: " + msg.Content); 28 | sendResponse("Message acknowledged from Options page"); 29 | logs.Add("Go back to index page to see the full message logs"); 30 | StateHasChanged(); 31 | return true; 32 | } 33 | 34 | return false; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Messaging/src/Pages/Popup.razor: -------------------------------------------------------------------------------- 1 | @page "/popup.html" 2 | @using System.Text.Json 3 | @using System.Linq 4 | @using Messaging.Messages 5 | @using WebExtensions.Net.Runtime 6 | @inherits BasePage 7 | 8 |

My popup page

9 | @if (activeTabId is not null) 10 | { 11 | 12 | } 13 | 14 |

Logs

15 | @foreach (var log in logs) 16 | { 17 |

@log

18 | } 19 | 20 | @code { 21 | List logs = new(); 22 | int? activeTabId; 23 | 24 | protected override async Task OnInitializedAsync() 25 | { 26 | await base.OnInitializedAsync(); 27 | activeTabId = (await WebExtensions.Tabs.Query(new() 28 | { 29 | Active = true, 30 | CurrentWindow = true 31 | })).SingleOrDefault()?.Id; 32 | WebExtensions.Runtime.OnMessage.AddListener(OnMessage); 33 | } 34 | 35 | private bool OnMessage(object message, MessageSender sender, Action sendResponse) 36 | { 37 | if (Message.IsForTarget(MessageTarget.Popup, message, out var msg)) 38 | { 39 | logs.Add("Received new message: " + msg.Content); 40 | sendResponse("Message acknowledged from Popup page"); 41 | StateHasChanged(); 42 | return true; 43 | } 44 | 45 | return false; 46 | } 47 | 48 | private async Task SendMessage() 49 | { 50 | logs.Add("Sending message to content script"); 51 | var openOptionsResponse = await WebExtensions.Tabs.SendMessage(activeTabId.Value, new Message() 52 | { 53 | Target = MessageTarget.ContentScript, 54 | Content = "Hello from Popup" 55 | }); 56 | logs.Add("Received response from content script: " + openOptionsResponse); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Messaging/src/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Http; 3 | using System.Threading.Tasks; 4 | using Blazor.BrowserExtension; 5 | using Microsoft.AspNetCore.Components.Web; 6 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 7 | using Microsoft.Extensions.DependencyInjection; 8 | using Messaging.Pages; 9 | using System.ComponentModel; 10 | 11 | namespace Messaging 12 | { 13 | public static class Program 14 | { 15 | public static async Task Main(string[] args) 16 | { 17 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 18 | 19 | builder.UseBrowserExtension(browserExtension => 20 | { 21 | if (browserExtension.Mode == BrowserExtensionMode.ContentScript) 22 | { 23 | builder.RootComponents.Add("#Sample_Messaging_app"); 24 | } 25 | else if (browserExtension.Mode == BrowserExtensionMode.Background) 26 | { 27 | builder.RootComponents.AddBackgroundWorker(); 28 | } 29 | else 30 | { 31 | builder.RootComponents.Add("#app"); 32 | builder.RootComponents.Add("head::after"); 33 | } 34 | }); 35 | 36 | builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); 37 | await builder.Build().RunAsync(); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Messaging/src/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:10657", 7 | "sslPort": 44314 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "Messaging": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Messaging/src/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | @Body -------------------------------------------------------------------------------- /Messaging/src/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.JSInterop 9 | @using Messaging 10 | @using Messaging.Shared 11 | @using Blazor.BrowserExtension.Pages 12 | -------------------------------------------------------------------------------- /Messaging/src/wwwroot/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Called before Blazor starts. 3 | * @param {object} options Blazor WebAssembly start options. Refer to https://github.com/dotnet/aspnetcore/blob/main/src/Components/Web.JS/src/Platform/WebAssemblyStartOptions.ts 4 | * @param {object} extensions Extensions added during publishing 5 | * @param {object} blazorBrowserExtension Blazor browser extension 6 | */ 7 | export function beforeStart(options, extensions, blazorBrowserExtension) { 8 | if (blazorBrowserExtension.BrowserExtension.Mode === blazorBrowserExtension.Modes.ContentScript) { 9 | const appDiv = document.createElement("div"); 10 | appDiv.id = "Sample_Messaging_app"; 11 | document.body.appendChild(appDiv); 12 | } 13 | } -------------------------------------------------------------------------------- /Messaging/src/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Messaging/src/wwwroot/favicon.ico -------------------------------------------------------------------------------- /Messaging/src/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Messaging 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Messaging/src/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Messaging Extension", 4 | "description": "Sample for messaging in browser extension", 5 | "version": "0.1", 6 | "action": { 7 | "default_popup": "popup.html" 8 | }, 9 | "background": { 10 | "service_worker": "content/BackgroundWorker.js", 11 | "type": "module" 12 | }, 13 | "content_scripts": [ 14 | { 15 | "matches": [ "*://*/*" ], 16 | "js": [ "content/Blazor.BrowserExtension/ContentScript.js" ], 17 | "css": [ "Messaging.styles.css" ] 18 | } 19 | ], 20 | "options_ui": { 21 | "page": "options.html", 22 | "open_in_tab": true 23 | }, 24 | "content_security_policy": { 25 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 26 | }, 27 | "web_accessible_resources": [ 28 | { 29 | "resources": [ 30 | "framework/*", 31 | "content/*", 32 | "app.js" 33 | ], 34 | "matches": [ "" ] 35 | } 36 | ], 37 | "permissions": [ 38 | "tabs" 39 | ] 40 | } -------------------------------------------------------------------------------- /NewTabPage/Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/Demo.gif -------------------------------------------------------------------------------- /NewTabPage/README.md: -------------------------------------------------------------------------------- 1 | # New tab page sample 2 | 3 | ![Demo](Demo.gif) 4 | 5 | This sample project overrides the default new tab page and uses the bookmarks API. 6 | 7 | You can load the output directly in the browser by following the steps [here](../README.md#test-the-sample-projects). -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js: -------------------------------------------------------------------------------- 1 | import { initializeInternal } from './CoreInternal.js'; 2 | 3 | let debugMode = false; 4 | const hasExtensionsApi = (namespace) => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 5 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 6 | debugMode = true; 7 | } 8 | 9 | let url; 10 | let browserExtensionMode; 11 | if (!debugMode) { 12 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 13 | browserExtensionMode = "Standard"; 14 | } else { 15 | url = globalThis.location.origin + "/"; 16 | browserExtensionMode = "Debug"; 17 | } 18 | 19 | let config; 20 | let appJs; 21 | 22 | async function beforeStart(options, extensions) { 23 | const configUrl = `${url}content/browserextension.config.json`; 24 | const configRequest = await fetch(configUrl); 25 | 26 | config = await configRequest.json(); 27 | 28 | const blazorBrowserExtension = options.BlazorBrowserExtension ?? initializeInternal(config, url, browserExtensionMode); 29 | 30 | if (debugMode) { 31 | blazorBrowserExtension.ImportBrowserPolyfill = false; 32 | } 33 | 34 | if (config.HasAppJs) { 35 | appJs = await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 36 | } 37 | 38 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 39 | // import browser extension API polyfill 40 | // @ts-ignore JS is not a module 41 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 42 | } 43 | 44 | await blazorBrowserExtension.BrowserExtension.InitializeCoreAsync(options); 45 | 46 | if (appJs?.beforeStart) { 47 | const beforeStartReturn = appJs.beforeStart(options, extensions, blazorBrowserExtension); 48 | if (beforeStartReturn instanceof Promise) { 49 | await beforeStartReturn; 50 | } 51 | } 52 | } 53 | 54 | function afterStarted(blazor) { 55 | if (appJs?.afterStarted) { 56 | return appJs.afterStarted(blazor); 57 | } 58 | } 59 | 60 | export { afterStarted, beforeStart }; 61 | -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/content/Blazor.BrowserExtension/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 3 | const url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 4 | 5 | const configRequest = await fetch(`${url}content/browserextension.config.json`); 6 | const config = await configRequest.json(); 7 | 8 | const blazorBrowserExtension = initializeInternal(config, url, "ContentScript"); 9 | 10 | globalThis.importProxy = (module) => { 11 | if (module.startsWith(document.baseURI) && blazorBrowserExtension.BrowserExtension) { 12 | module = new URL(module.substring(document.baseURI.length), blazorBrowserExtension.BrowserExtension.Url); 13 | } 14 | 15 | return import(module); 16 | }; 17 | 18 | await blazorBrowserExtension.BrowserExtension.InitializeContentScriptAsync({ 19 | BlazorBrowserExtension: blazorBrowserExtension 20 | }); 21 | })(); 22 | -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/content/Blazor.BrowserExtension/Core.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | console.warn("Core.js is deprecated. Use 'framework/blazor.webassembly.js' in the script tag."); 3 | 4 | let debugMode = false; 5 | const hasExtensionsApi = namespace => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 6 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 7 | debugMode = true; 8 | } 9 | 10 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 11 | let url; 12 | let browserExtensionMode; 13 | if (!debugMode) { 14 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 15 | browserExtensionMode = "Standard"; 16 | } else { 17 | url = globalThis.location.origin + "/"; 18 | browserExtensionMode = "Debug"; 19 | } 20 | 21 | const configUrl = `${url}content/browserextension.config.json`; 22 | 23 | const configRequest = await fetch(configUrl); 24 | const config = await configRequest.json(); 25 | 26 | const blazorBrowserExtension = initializeInternal(config, url, browserExtensionMode); 27 | // Clear the BrowserExtension property for the module initializer to initialize it 28 | const browserExtension = blazorBrowserExtension.BrowserExtension; 29 | blazorBrowserExtension.BrowserExtension = null; 30 | 31 | if (debugMode) { 32 | blazorBrowserExtension.ImportBrowserPolyfill = false; 33 | } 34 | 35 | if (config.HasAppJs) { 36 | await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 37 | } 38 | 39 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 40 | // import browser extension API polyfill 41 | // @ts-ignore JS is not a module 42 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 43 | } 44 | 45 | if (blazorBrowserExtension.StartBlazorBrowserExtension) { 46 | await browserExtension.InitializeAsync(); 47 | } 48 | })(); 49 | -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/content/browserextension.config.json: -------------------------------------------------------------------------------- 1 | {"EnvironmentName":"","CompressionEnabled":true,"HasAppJs":false} -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/favicon.ico -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/JsBind.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/JsBind.Net.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/Microsoft.JSInterop.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/Microsoft.JSInterop.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/NewTabPage.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/NewTabPage.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Collections.Concurrent.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Collections.Concurrent.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Collections.Immutable.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Collections.Immutable.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Collections.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Collections.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.ComponentModel.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.ComponentModel.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Console.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Console.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.IO.Pipelines.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.IO.Pipelines.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Linq.Expressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Linq.Expressions.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Linq.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Linq.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Memory.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Memory.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Private.CoreLib.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Private.CoreLib.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Private.Uri.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Private.Uri.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Runtime.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Runtime.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Text.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Text.Json.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/WebExtensions.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/WebExtensions.Net.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/dotnet.native.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/dotnet.native.wasm.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/icudt_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/icudt_CJK.dat.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/icudt_EFIGS.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/icudt_EFIGS.dat.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/framework/icudt_no_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/dist/browserextension/framework/icudt_no_CJK.dat.br -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | NewTabPage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 |

20 | Loading... 21 |

22 |
23 |
24 |
25 |
26 | 27 |
28 | An unhandled error has occurred. 29 | Reload 30 | 🗙 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "New Tab Page", 4 | "description": "Sample for new tab page.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "chrome_url_overrides": { 10 | "newtab": "newtab.html" 11 | }, 12 | "web_accessible_resources": [ 13 | { 14 | "resources": [ 15 | "framework/*", 16 | "content/*" 17 | ], 18 | "matches": [ "" ] 19 | } 20 | ], 21 | "permissions": [ 22 | "bookmarks" 23 | ] 24 | } -------------------------------------------------------------------------------- /NewTabPage/dist/browserextension/newtab.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | NewTabPage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 |

20 | Loading... 21 |

22 |
23 |
24 |
25 |
26 | 27 |
28 | An unhandled error has occurred. 29 | Reload 30 | 🗙 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /NewTabPage/src/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |

Sorry, there's nothing at this address.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /NewTabPage/src/NewTabPage.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net9.0 5 | ../dist 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /NewTabPage/src/Pages/NewTab.razor: -------------------------------------------------------------------------------- 1 | @page "/newtab.html" 2 | @using WebExtensions.Net.Bookmarks 3 | @inherits Blazor.BrowserExtension.Pages.BasePage 4 | 5 |
6 |
7 |
8 |

9 | My Bookmarks 10 |

11 | @if (bookmarks is null || !bookmarks.Any()) 12 | { 13 |

14 | There is no bookmark yet. 15 |

16 | } 17 | else 18 | { 19 | foreach (BookmarkTreeNode bookmark in bookmarks) 20 | { 21 | 28 | } 29 | } 30 |
31 |
32 |
33 | 34 | @code { 35 | private IEnumerable bookmarks; 36 | 37 | protected override async Task OnInitializedAsync() 38 | { 39 | await base.OnInitializedAsync(); 40 | var root = await WebExtensions.Bookmarks.GetTree(); 41 | var nodes = new List(); 42 | FlattenBookmarkTree(nodes, root?.FirstOrDefault()); 43 | bookmarks = nodes; 44 | } 45 | 46 | private void FlattenBookmarkTree(List nodes, BookmarkTreeNode node) 47 | { 48 | if (node is null) 49 | { 50 | return; 51 | } 52 | 53 | if (node.Children is not null && node.Children.Any()) 54 | { 55 | foreach (var childNode in node.Children) 56 | { 57 | FlattenBookmarkTree(nodes, childNode); 58 | } 59 | } 60 | else if (!string.IsNullOrEmpty(node.Url)) 61 | { 62 | nodes.Add(node); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /NewTabPage/src/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.Web; 2 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 3 | using System.Threading.Tasks; 4 | 5 | namespace NewTabPage 6 | { 7 | public static class Program 8 | { 9 | public static async Task Main(string[] args) 10 | { 11 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 12 | builder.UseBrowserExtension(browserExtension => 13 | { 14 | builder.RootComponents.Add("#app"); 15 | builder.RootComponents.Add("head::after"); 16 | }); 17 | await builder.Build().RunAsync(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /NewTabPage/src/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:10657", 7 | "sslPort": 44314 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "NewTabPage": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /NewTabPage/src/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | @Body -------------------------------------------------------------------------------- /NewTabPage/src/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.JSInterop 9 | @using NewTabPage 10 | @using NewTabPage.Shared 11 | @using Blazor.BrowserExtension.Pages 12 | -------------------------------------------------------------------------------- /NewTabPage/src/wwwroot/css/app.css: -------------------------------------------------------------------------------- 1 | #blazor-error-ui { 2 | background: lightyellow; 3 | bottom: 0; 4 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 5 | display: none; 6 | left: 0; 7 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 8 | position: fixed; 9 | width: 100%; 10 | z-index: 1000; 11 | } 12 | 13 | #blazor-error-ui .dismiss { 14 | cursor: pointer; 15 | position: absolute; 16 | right: 0.75rem; 17 | top: 0.5rem; 18 | } 19 | 20 | .blazor-error-boundary { 21 | background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; 22 | padding: 1rem 1rem 1rem 3.7rem; 23 | color: white; 24 | } 25 | 26 | .blazor-error-boundary::after { 27 | content: "An error has occurred." 28 | } 29 | 30 | .loading-progress { 31 | position: relative; 32 | display: block; 33 | width: 8rem; 34 | height: 8rem; 35 | margin: 20vh auto 1rem auto; 36 | } 37 | 38 | .loading-progress circle { 39 | fill: none; 40 | stroke: #e0e0e0; 41 | stroke-width: 0.6rem; 42 | transform-origin: 50% 50%; 43 | transform: rotate(-90deg); 44 | } 45 | 46 | .loading-progress circle:last-child { 47 | stroke: #1b6ec2; 48 | stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; 49 | transition: stroke-dasharray 0.05s ease-in-out; 50 | } 51 | 52 | .loading-progress-text { 53 | position: absolute; 54 | text-align: center; 55 | font-weight: bold; 56 | inset: calc(20vh + 3.25rem) 0 auto 0.2rem; 57 | } 58 | 59 | .loading-progress-text:after { 60 | content: var(--blazor-load-percentage-text, "Loading"); 61 | } 62 | -------------------------------------------------------------------------------- /NewTabPage/src/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/NewTabPage/src/wwwroot/favicon.ico -------------------------------------------------------------------------------- /NewTabPage/src/wwwroot/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | NewTabPage 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 |

20 | Loading... 21 |

22 |
23 |
24 |
25 |
26 | 27 |
28 | An unhandled error has occurred. 29 | Reload 30 | 🗙 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /NewTabPage/src/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "New Tab Page", 4 | "description": "Sample for new tab page.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "chrome_url_overrides": { 10 | "newtab": "newtab.html" 11 | }, 12 | "web_accessible_resources": [ 13 | { 14 | "resources": [ 15 | "framework/*", 16 | "content/*" 17 | ], 18 | "matches": [ "" ] 19 | } 20 | ], 21 | "permissions": [ 22 | "bookmarks" 23 | ] 24 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blazor.BrowserExtension.Samples 2 | 3 | This repository contains samples of browser extensions built with Blazor using [Blazor.BrowserExtension](https://github.com/mingyaulee/Blazor.BrowserExtension). 4 | 5 | Each directory contains the source file in `src` and the published files in `dist`. 6 | 7 | ## Samples 8 | 9 | ### Messaging 10 | ![Messaging Demo](Messaging/Demo.gif) 11 | - Runtime Messaging API 12 | - Tabs Messaging API 13 | 14 | ### New tab page 15 | ![New Tab Page Demo](NewTabPage/Demo.gif) 16 | - Bookmarks API 17 | - Override default new tab page 18 | 19 | ### Sidebar using content scripts 20 | ![Sidebar Demo](SidebarUsingContentScripts/Demo.gif) 21 | - Content scripts 22 | 23 | ### Sidebar using content scripts and iframe 24 | ![Sidebar Demo](SidebarUsingIframe/Demo.gif) 25 | - Content scripts 26 | - Messaging 27 | 28 | ### Sidepanel 29 | ![Sidepanel Demo](Sidepanel/Demo.gif) 30 | - Side panel 31 | - Tabs API 32 | 33 | ## Test the sample projects 34 | You can compile and load the projects yourself or just load the published files directly in the browser. 35 | 36 | ### Google Chrome 37 | 1. Launch the Extensions page ( ⋮ → Extensions → Manage Extensions) or navigate to the URL [chrome://extensions/](chrome://extensions/). 38 | 2. Switch on `Developer mode`. 39 | 3. Click on the `Load unpacked` button, then navigate to `sampleproject\dist` and select the folder `browserextension`. 40 | 41 | ### Microsoft Edge 42 | 1. Launch the Extensions page ( ⋮ → Extensions → Manage Extensions) or navigate to the URL [edge://extensions/](edge://extensions/). 43 | 2. Click on the ☰ and switch on `Developer mode`. 44 | 3. Click on the button with the title `Load unpacked`, then navigate to `sampleproject\dist` and select the folder `browserextension`. 45 | 46 | ### Mozilla Firefox 47 | 1. Navigate to the URL [about:debugging#/runtime/this-firefox](about:debugging#/runtime/this-firefox). 48 | 2. Click on `Load Temporary Add-on...`, then navigate to `sampleproject\dist\browserextension` and select any file in the directory. 49 | 50 | ## Sample extensions without Blazor 51 | There are plenty of sample extensions provided by Google and Mozilla which is based on JavaScript, HTML and CSS, all of which can be ported to Razor HTML and Blazor scoped CSS. 52 | 53 | These samples are good references to how certain features can be implemented, including what API to use and how the manifest is declared. 54 | 55 | 1. [Google Chrome sample extensions](https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/mv2-archive) 56 | 2. [MDN sample extensions](https://github.com/mdn/webextensions-examples) 57 | 3. [Example DevTools extension](https://github.com/firefox-devtools/extension-examples) 58 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/Demo.gif -------------------------------------------------------------------------------- /SidebarUsingContentScripts/README.md: -------------------------------------------------------------------------------- 1 | # Sidebar sample 2 | 3 | ![Demo](Demo.gif) 4 | 5 | This sample project uses content scripts to inject a sidebar on every page. 6 | 7 | You can load the output directly in the browser by following the steps [here](../README.md#test-the-sample-projects). -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/SidebarUsingContentScripts.styles.css: -------------------------------------------------------------------------------- 1 | /* /Pages/ContentScript.razor.rz.scp.css */ 2 | .sidebar-container[b-4hipy4m5r9] { 3 | position: absolute; 4 | top: 0; 5 | left: 0; 6 | bottom: 0; 7 | width: 300px; 8 | background-color: #68ceff; 9 | z-index: 999999999; 10 | } 11 | 12 | .sidebar-container.collapsed[b-4hipy4m5r9] { 13 | left: -300px; 14 | } 15 | 16 | .content-container[b-4hipy4m5r9] { 17 | width: 100%; 18 | height: 100%; 19 | position: relative; 20 | } 21 | 22 | .toggle[b-4hipy4m5r9] { 23 | position: absolute; 24 | width: 50px; 25 | height: 30px; 26 | right: -50px; 27 | top: 40%; 28 | box-sizing: border-box; 29 | text-align: center; 30 | background-color: #4285f4; 31 | color: #fff; 32 | cursor: pointer; 33 | padding: 6px 4px; 34 | } 35 | 36 | .text-container[b-4hipy4m5r9] { 37 | padding: 15px; 38 | font-size: 16px; 39 | } 40 | 41 | h1[b-4hipy4m5r9] { 42 | font-size: 3em; 43 | } 44 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Called before Blazor starts. 3 | * @param {object} options Blazor WebAssembly start options. Refer to https://github.com/dotnet/aspnetcore/blob/main/src/Components/Web.JS/src/Platform/WebAssemblyStartOptions.ts 4 | * @param {object} extensions Extensions added during publishing 5 | * @param {object} blazorBrowserExtension Blazor browser extension instance 6 | */ 7 | export function beforeStart(options, extensions, blazorBrowserExtension) { 8 | if (blazorBrowserExtension.BrowserExtension.Mode === blazorBrowserExtension.Modes.ContentScript) { 9 | const appDiv = document.createElement("div"); 10 | appDiv.id = "SidebarUsingContentScriptsSampleApp"; 11 | document.body.appendChild(appDiv); 12 | } 13 | } -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js: -------------------------------------------------------------------------------- 1 | import { initializeInternal } from './CoreInternal.js'; 2 | 3 | let debugMode = false; 4 | const hasExtensionsApi = (namespace) => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 5 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 6 | debugMode = true; 7 | } 8 | 9 | let url; 10 | let browserExtensionMode; 11 | if (!debugMode) { 12 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 13 | browserExtensionMode = "Standard"; 14 | } else { 15 | url = globalThis.location.origin + "/"; 16 | browserExtensionMode = "Debug"; 17 | } 18 | 19 | let config; 20 | let appJs; 21 | 22 | async function beforeStart(options, extensions) { 23 | const configUrl = `${url}content/browserextension.config.json`; 24 | const configRequest = await fetch(configUrl); 25 | 26 | config = await configRequest.json(); 27 | 28 | const blazorBrowserExtension = options.BlazorBrowserExtension ?? initializeInternal(config, url, browserExtensionMode); 29 | 30 | if (debugMode) { 31 | blazorBrowserExtension.ImportBrowserPolyfill = false; 32 | } 33 | 34 | if (config.HasAppJs) { 35 | appJs = await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 36 | } 37 | 38 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 39 | // import browser extension API polyfill 40 | // @ts-ignore JS is not a module 41 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 42 | } 43 | 44 | await blazorBrowserExtension.BrowserExtension.InitializeCoreAsync(options); 45 | 46 | if (appJs?.beforeStart) { 47 | const beforeStartReturn = appJs.beforeStart(options, extensions, blazorBrowserExtension); 48 | if (beforeStartReturn instanceof Promise) { 49 | await beforeStartReturn; 50 | } 51 | } 52 | } 53 | 54 | function afterStarted(blazor) { 55 | if (appJs?.afterStarted) { 56 | return appJs.afterStarted(blazor); 57 | } 58 | } 59 | 60 | export { afterStarted, beforeStart }; 61 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/content/Blazor.BrowserExtension/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 3 | const url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 4 | 5 | const configRequest = await fetch(`${url}content/browserextension.config.json`); 6 | const config = await configRequest.json(); 7 | 8 | const blazorBrowserExtension = initializeInternal(config, url, "ContentScript"); 9 | 10 | globalThis.importProxy = (module) => { 11 | if (module.startsWith(document.baseURI) && blazorBrowserExtension.BrowserExtension) { 12 | module = new URL(module.substring(document.baseURI.length), blazorBrowserExtension.BrowserExtension.Url); 13 | } 14 | 15 | return import(module); 16 | }; 17 | 18 | await blazorBrowserExtension.BrowserExtension.InitializeContentScriptAsync({ 19 | BlazorBrowserExtension: blazorBrowserExtension 20 | }); 21 | })(); 22 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/content/Blazor.BrowserExtension/Core.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | console.warn("Core.js is deprecated. Use 'framework/blazor.webassembly.js' in the script tag."); 3 | 4 | let debugMode = false; 5 | const hasExtensionsApi = namespace => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 6 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 7 | debugMode = true; 8 | } 9 | 10 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 11 | let url; 12 | let browserExtensionMode; 13 | if (!debugMode) { 14 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 15 | browserExtensionMode = "Standard"; 16 | } else { 17 | url = globalThis.location.origin + "/"; 18 | browserExtensionMode = "Debug"; 19 | } 20 | 21 | const configUrl = `${url}content/browserextension.config.json`; 22 | 23 | const configRequest = await fetch(configUrl); 24 | const config = await configRequest.json(); 25 | 26 | const blazorBrowserExtension = initializeInternal(config, url, browserExtensionMode); 27 | // Clear the BrowserExtension property for the module initializer to initialize it 28 | const browserExtension = blazorBrowserExtension.BrowserExtension; 29 | blazorBrowserExtension.BrowserExtension = null; 30 | 31 | if (debugMode) { 32 | blazorBrowserExtension.ImportBrowserPolyfill = false; 33 | } 34 | 35 | if (config.HasAppJs) { 36 | await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 37 | } 38 | 39 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 40 | // import browser extension API polyfill 41 | // @ts-ignore JS is not a module 42 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 43 | } 44 | 45 | if (blazorBrowserExtension.StartBlazorBrowserExtension) { 46 | await browserExtension.InitializeAsync(); 47 | } 48 | })(); 49 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/content/browserextension.config.json: -------------------------------------------------------------------------------- 1 | {"EnvironmentName":"","CompressionEnabled":true,"HasAppJs":true} -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/contentscript.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SidebarUsingContentScripts 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/favicon.ico -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/JsBind.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/JsBind.Net.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.JSInterop.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/Microsoft.JSInterop.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/SidebarUsingContentScripts.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/SidebarUsingContentScripts.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Collections.Concurrent.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Collections.Concurrent.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Collections.Immutable.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Collections.Immutable.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Collections.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Collections.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.ComponentModel.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.ComponentModel.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Console.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Console.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.IO.Pipelines.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.IO.Pipelines.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Linq.Expressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Linq.Expressions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Linq.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Linq.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Memory.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Memory.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Private.CoreLib.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Private.CoreLib.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Private.Uri.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Private.Uri.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Runtime.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Runtime.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Text.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Text.Json.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/WebExtensions.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/WebExtensions.Net.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/dotnet.native.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/dotnet.native.wasm.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/icudt_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/icudt_CJK.dat.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/icudt_EFIGS.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/icudt_EFIGS.dat.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/framework/icudt_no_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/dist/browserextension/framework/icudt_no_CJK.dat.br -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SidebarUsingContentScripts 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/dist/browserextension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Sidebar Using ContentScripts", 4 | "description": "Sample for sidebar using content scripts.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "content_scripts": [ 10 | { 11 | "matches": [ "*://*/*" ], 12 | "js": [ "content/Blazor.BrowserExtension/ContentScript.js" ], 13 | "css": [ "SidebarUsingContentScripts.styles.css" ] 14 | } 15 | ], 16 | "web_accessible_resources": [ 17 | { 18 | "resources": [ 19 | "framework/*", 20 | "content/*", 21 | "app.js" 22 | ], 23 | "matches": [ "" ] 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |

Sorry, there's nothing at this address.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/Pages/ContentScript.razor: -------------------------------------------------------------------------------- 1 | @page "/contentscript.html" 2 | @inherits Blazor.BrowserExtension.Pages.BasePage 3 | 4 | 16 | 17 | @code { 18 | private bool isCollapsed = true; 19 | 20 | private void Toggle() 21 | { 22 | isCollapsed = !isCollapsed; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/Pages/ContentScript.razor.css: -------------------------------------------------------------------------------- 1 | .sidebar-container { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | bottom: 0; 6 | width: 300px; 7 | background-color: #68ceff; 8 | z-index: 999999999; 9 | } 10 | 11 | .sidebar-container.collapsed { 12 | left: -300px; 13 | } 14 | 15 | .content-container { 16 | width: 100%; 17 | height: 100%; 18 | position: relative; 19 | } 20 | 21 | .toggle { 22 | position: absolute; 23 | width: 50px; 24 | height: 30px; 25 | right: -50px; 26 | top: 40%; 27 | box-sizing: border-box; 28 | text-align: center; 29 | background-color: #4285f4; 30 | color: #fff; 31 | cursor: pointer; 32 | padding: 6px 4px; 33 | } 34 | 35 | .text-container { 36 | padding: 15px; 37 | font-size: 16px; 38 | } 39 | 40 | h1 { 41 | font-size: 3em; 42 | } 43 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/Program.cs: -------------------------------------------------------------------------------- 1 | using Blazor.BrowserExtension; 2 | using Microsoft.AspNetCore.Components.Web; 3 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 4 | using SidebarUsingContentScripts.Pages; 5 | using System.Threading.Tasks; 6 | 7 | namespace SidebarUsingContentScripts 8 | { 9 | public static class Program 10 | { 11 | public static async Task Main(string[] args) 12 | { 13 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 14 | builder.UseBrowserExtension(browserExtension => 15 | { 16 | if (browserExtension.Mode == BrowserExtensionMode.ContentScript) 17 | { 18 | builder.RootComponents.Add("#SidebarUsingContentScriptsSampleApp"); 19 | } 20 | else 21 | { 22 | builder.RootComponents.Add("#app"); 23 | builder.RootComponents.Add("head::after"); 24 | } 25 | }); 26 | await builder.Build().RunAsync(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:10657", 7 | "sslPort": 44314 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "SidebarUsingContentScripts": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | @Body -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/SidebarUsingContentScripts.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net9.0 5 | ../dist 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.JSInterop 9 | @using SidebarUsingContentScripts 10 | @using SidebarUsingContentScripts.Shared 11 | @using Blazor.BrowserExtension.Pages 12 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/wwwroot/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Called before Blazor starts. 3 | * @param {object} options Blazor WebAssembly start options. Refer to https://github.com/dotnet/aspnetcore/blob/main/src/Components/Web.JS/src/Platform/WebAssemblyStartOptions.ts 4 | * @param {object} extensions Extensions added during publishing 5 | * @param {object} blazorBrowserExtension Blazor browser extension instance 6 | */ 7 | export function beforeStart(options, extensions, blazorBrowserExtension) { 8 | if (blazorBrowserExtension.BrowserExtension.Mode === blazorBrowserExtension.Modes.ContentScript) { 9 | const appDiv = document.createElement("div"); 10 | appDiv.id = "SidebarUsingContentScriptsSampleApp"; 11 | document.body.appendChild(appDiv); 12 | } 13 | } -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingContentScripts/src/wwwroot/favicon.ico -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/wwwroot/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | SidebarUsingContentScripts 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SidebarUsingContentScripts/src/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Sidebar Using ContentScripts", 4 | "description": "Sample for sidebar using content scripts.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "content_scripts": [ 10 | { 11 | "matches": [ "*://*/*" ], 12 | "js": [ "content/Blazor.BrowserExtension/ContentScript.js" ], 13 | "css": [ "SidebarUsingContentScripts.styles.css" ] 14 | } 15 | ], 16 | "web_accessible_resources": [ 17 | { 18 | "resources": [ 19 | "framework/*", 20 | "content/*", 21 | "app.js" 22 | ], 23 | "matches": [ "" ] 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /SidebarUsingIframe/Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/Demo.gif -------------------------------------------------------------------------------- /SidebarUsingIframe/README.md: -------------------------------------------------------------------------------- 1 | # Sidebar sample 2 | 3 | ![Demo](Demo.gif) 4 | 5 | This sample project uses content scripts to inject a iframe as a sidebar on every page and `postMessage` API for communication. 6 | 7 | You can load the output directly in the browser by following the steps [here](../README.md#test-the-sample-projects). -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/ContentScript.css: -------------------------------------------------------------------------------- 1 | [data-extension-app-id=abc] { 2 | position: fixed; 3 | top: 0; 4 | bottom: 0; 5 | left: 0; 6 | width: 25%; 7 | min-width: 350px; 8 | z-index: 2147483647; 9 | } 10 | 11 | [data-extension-app-id=abc].hidden { 12 | display: none; 13 | } 14 | 15 | [data-extension-app-id=abc].sidebar-collapsed { 16 | overflow: visible; 17 | height: 30px; 18 | width: 50px; 19 | min-width: 50px; 20 | top: 40%; 21 | } 22 | 23 | [data-extension-app-id=abc] iframe { 24 | width: 100%; 25 | height: 100%; 26 | border: 0; 27 | } 28 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async function () { 2 | // @ts-ignore JS is not a module 3 | await (globalThis.importProxy ?? (m => import(m)))("./content/Blazor.BrowserExtension/lib/browser-polyfill.min.js"); 4 | 5 | // Define a unique ID to know you are interacting with your own extension 6 | const extensionAppId = "abc"; 7 | 8 | // Inject iframe into the current tab 9 | const url = browser.runtime.getURL("contentscript.html"); 10 | const appDiv = document.createElement("div"); 11 | appDiv.dataset.extensionAppId = extensionAppId; 12 | appDiv.classList.add("hidden"); 13 | document.body.appendChild(appDiv); 14 | const iframe = document.createElement("iframe"); 15 | iframe.src = url; 16 | appDiv.appendChild(iframe); 17 | 18 | // Communicate with the iframe to know what is the current state 19 | const messagingEvent = { 20 | post: (data) => { 21 | data.extensionAppId = extensionAppId; 22 | iframe.contentWindow.postMessage(data, "*"); 23 | }, 24 | listen: (handler) => { 25 | const extensionOrigin = url.replace("/contentscript.html", ""); 26 | window.addEventListener("message", (event) => { 27 | if (event.origin == extensionOrigin && event.data && event.data.extensionAppId == extensionAppId) { 28 | handler(event.data); 29 | } 30 | }); 31 | } 32 | }; 33 | 34 | let isLoaded = false; 35 | const messageHandler = (data) => { 36 | if (!isLoaded) { 37 | isLoaded = true; 38 | appDiv.classList.remove("hidden"); 39 | } 40 | 41 | if (data.isCollapsed === true) { 42 | appDiv.classList.add("sidebar-collapsed"); 43 | } else if (data.isCollapsed === false) { 44 | appDiv.classList.remove("sidebar-collapsed"); 45 | } 46 | 47 | if (data.requestForData === true) { 48 | const dataToSend = [...document.querySelectorAll("main h1, main h2, main h3")].map(header => { 49 | return { 50 | tag: header.tagName, 51 | text: header.textContent 52 | } 53 | }); 54 | 55 | messagingEvent.post({ 56 | headersData: dataToSend 57 | }); 58 | } 59 | }; 60 | messagingEvent.listen(messageHandler); 61 | })(); -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/SidebarUsingIframe.styles.css: -------------------------------------------------------------------------------- 1 | /* /Pages/ContentScript.razor.rz.scp.css */ 2 | .sidebar-container[b-3khj6uxxws] { 3 | position: absolute; 4 | top: 0; 5 | left: 0; 6 | bottom: 0; 7 | width: 300px; 8 | background-color: #68ceff; 9 | z-index: 999999999; 10 | transition: left ease-out .4s; 11 | } 12 | 13 | .sidebar-container.collapsed[b-3khj6uxxws] { 14 | left: -300px; 15 | transition: none; 16 | } 17 | 18 | .content-container[b-3khj6uxxws] { 19 | width: 100%; 20 | height: 100%; 21 | position: relative; 22 | } 23 | 24 | .toggle[b-3khj6uxxws] { 25 | position: absolute; 26 | width: 50px; 27 | height: 30px; 28 | right: -50px; 29 | top: 40%; 30 | box-sizing: border-box; 31 | text-align: center; 32 | background-color: #4285f4; 33 | color: #fff; 34 | cursor: pointer; 35 | padding: 6px 4px; 36 | } 37 | 38 | .collapsed .toggle[b-3khj6uxxws] { 39 | top: 0; 40 | } 41 | 42 | .text-container[b-3khj6uxxws] { 43 | padding: 15px; 44 | font-size: 16px; 45 | overflow-y: auto; 46 | height: 100%; 47 | box-sizing: border-box; 48 | } 49 | 50 | .collapsed .text-container[b-3khj6uxxws] { 51 | display: none; 52 | } 53 | 54 | h1[b-3khj6uxxws] { 55 | font-size: 3em; 56 | } 57 | /* /Shared/MainLayout.razor.rz.scp.css */ 58 | body[b-il5n7ee7mk] { 59 | background-color: #f8f9fa; 60 | } 61 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js: -------------------------------------------------------------------------------- 1 | import { initializeInternal } from './CoreInternal.js'; 2 | 3 | let debugMode = false; 4 | const hasExtensionsApi = (namespace) => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 5 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 6 | debugMode = true; 7 | } 8 | 9 | let url; 10 | let browserExtensionMode; 11 | if (!debugMode) { 12 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 13 | browserExtensionMode = "Standard"; 14 | } else { 15 | url = globalThis.location.origin + "/"; 16 | browserExtensionMode = "Debug"; 17 | } 18 | 19 | let config; 20 | let appJs; 21 | 22 | async function beforeStart(options, extensions) { 23 | const configUrl = `${url}content/browserextension.config.json`; 24 | const configRequest = await fetch(configUrl); 25 | 26 | config = await configRequest.json(); 27 | 28 | const blazorBrowserExtension = options.BlazorBrowserExtension ?? initializeInternal(config, url, browserExtensionMode); 29 | 30 | if (debugMode) { 31 | blazorBrowserExtension.ImportBrowserPolyfill = false; 32 | } 33 | 34 | if (config.HasAppJs) { 35 | appJs = await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 36 | } 37 | 38 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 39 | // import browser extension API polyfill 40 | // @ts-ignore JS is not a module 41 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 42 | } 43 | 44 | await blazorBrowserExtension.BrowserExtension.InitializeCoreAsync(options); 45 | 46 | if (appJs?.beforeStart) { 47 | const beforeStartReturn = appJs.beforeStart(options, extensions, blazorBrowserExtension); 48 | if (beforeStartReturn instanceof Promise) { 49 | await beforeStartReturn; 50 | } 51 | } 52 | } 53 | 54 | function afterStarted(blazor) { 55 | if (appJs?.afterStarted) { 56 | return appJs.afterStarted(blazor); 57 | } 58 | } 59 | 60 | export { afterStarted, beforeStart }; 61 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/content/Blazor.BrowserExtension/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 3 | const url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 4 | 5 | const configRequest = await fetch(`${url}content/browserextension.config.json`); 6 | const config = await configRequest.json(); 7 | 8 | const blazorBrowserExtension = initializeInternal(config, url, "ContentScript"); 9 | 10 | globalThis.importProxy = (module) => { 11 | if (module.startsWith(document.baseURI) && blazorBrowserExtension.BrowserExtension) { 12 | module = new URL(module.substring(document.baseURI.length), blazorBrowserExtension.BrowserExtension.Url); 13 | } 14 | 15 | return import(module); 16 | }; 17 | 18 | await blazorBrowserExtension.BrowserExtension.InitializeContentScriptAsync({ 19 | BlazorBrowserExtension: blazorBrowserExtension 20 | }); 21 | })(); 22 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/content/Blazor.BrowserExtension/Core.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | console.warn("Core.js is deprecated. Use 'framework/blazor.webassembly.js' in the script tag."); 3 | 4 | let debugMode = false; 5 | const hasExtensionsApi = namespace => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 6 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 7 | debugMode = true; 8 | } 9 | 10 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 11 | let url; 12 | let browserExtensionMode; 13 | if (!debugMode) { 14 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 15 | browserExtensionMode = "Standard"; 16 | } else { 17 | url = globalThis.location.origin + "/"; 18 | browserExtensionMode = "Debug"; 19 | } 20 | 21 | const configUrl = `${url}content/browserextension.config.json`; 22 | 23 | const configRequest = await fetch(configUrl); 24 | const config = await configRequest.json(); 25 | 26 | const blazorBrowserExtension = initializeInternal(config, url, browserExtensionMode); 27 | // Clear the BrowserExtension property for the module initializer to initialize it 28 | const browserExtension = blazorBrowserExtension.BrowserExtension; 29 | blazorBrowserExtension.BrowserExtension = null; 30 | 31 | if (debugMode) { 32 | blazorBrowserExtension.ImportBrowserPolyfill = false; 33 | } 34 | 35 | if (config.HasAppJs) { 36 | await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 37 | } 38 | 39 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 40 | // import browser extension API polyfill 41 | // @ts-ignore JS is not a module 42 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 43 | } 44 | 45 | if (blazorBrowserExtension.StartBlazorBrowserExtension) { 46 | await browserExtension.InitializeAsync(); 47 | } 48 | })(); 49 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/content/browserextension.config.json: -------------------------------------------------------------------------------- 1 | {"EnvironmentName":"","CompressionEnabled":true,"HasAppJs":false} -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/contentscript.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SidebarUsingIframe 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/favicon.ico -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/JsBind.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/JsBind.Net.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/Microsoft.JSInterop.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/Microsoft.JSInterop.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/SidebarUsingIframe.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/SidebarUsingIframe.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Collections.Concurrent.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Collections.Concurrent.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Collections.Immutable.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Collections.Immutable.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Collections.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Collections.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.ComponentModel.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.ComponentModel.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Console.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Console.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.IO.Pipelines.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.IO.Pipelines.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Linq.Expressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Linq.Expressions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Linq.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Linq.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Memory.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Memory.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Private.CoreLib.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Private.CoreLib.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Private.Uri.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Private.Uri.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Runtime.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Runtime.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Text.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Text.Json.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/WebExtensions.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/WebExtensions.Net.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/dotnet.native.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/dotnet.native.wasm.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/icudt_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/icudt_CJK.dat.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/icudt_EFIGS.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/icudt_EFIGS.dat.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/framework/icudt_no_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/dist/browserextension/framework/icudt_no_CJK.dat.br -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SidebarUsingIframe 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SidebarUsingIframe/dist/browserextension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Sidebar Using iframe", 4 | "description": "Sample for sidebar using iframe.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "content_scripts": [ 10 | { 11 | "matches": [ "*://*/*" ], 12 | "js": [ "ContentScript.js" ], 13 | "css": [ "ContentScript.css" ] 14 | } 15 | ], 16 | "web_accessible_resources": [ 17 | { 18 | "resources": [ 19 | "framework/*", 20 | "content/*", 21 | "ContentScript.js", 22 | "contentscript.html" 23 | ], 24 | "matches": [ "" ] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /SidebarUsingIframe/src/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |

Sorry, there's nothing at this address.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Messaging/HeadersData.cs: -------------------------------------------------------------------------------- 1 | namespace SidebarUsingIframe.Messaging 2 | { 3 | public class HeadersData 4 | { 5 | public string Tag { get; set; } 6 | public string Text { get; set; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Messaging/MessagingEvent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using JsBind.Net; 3 | 4 | namespace SidebarUsingIframe.Messaging 5 | { 6 | public class MessagingEvent : ObjectBindingBase 7 | { 8 | const string ExtensionAppId = "abc"; 9 | private WindowParent parent; 10 | 11 | public MessagingEvent(IJsRuntimeAdapter jsRuntime) 12 | { 13 | SetAccessPath("window"); 14 | Initialize(jsRuntime); 15 | } 16 | 17 | public void Listen(Action handler) 18 | => SetProperty("onmessage", (MessageEventArgs args) => 19 | { 20 | if (args.Data?.ExtensionAppId == ExtensionAppId) 21 | { 22 | handler?.Invoke(args.Data); 23 | } 24 | }); 25 | 26 | public void Post(PostRequest data) 27 | { 28 | parent ??= new(JsRuntime); 29 | data.ExtensionAppId = ExtensionAppId; 30 | parent.Post(data, "*"); 31 | } 32 | 33 | private sealed class WindowParent : ObjectBindingBase 34 | { 35 | public WindowParent(IJsRuntimeAdapter jsRuntime) 36 | { 37 | SetAccessPath("parent"); 38 | Initialize(jsRuntime); 39 | } 40 | 41 | public void Post(object data, string targetOrigin) 42 | => InvokeVoid("postMessage", data, targetOrigin); 43 | } 44 | 45 | [BindDeclaredProperties] 46 | private sealed class MessageEventArgs 47 | { 48 | public PostRequest Data { get; set; } 49 | public string Origin { get; set; } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Messaging/PostRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text.Json.Serialization; 3 | 4 | namespace SidebarUsingIframe.Messaging 5 | { 6 | public class PostRequest 7 | { 8 | public string ExtensionAppId { get; set; } 9 | 10 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 11 | public bool? IsCollapsed { get; set; } 12 | 13 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 14 | public bool? RequestForData { get; set; } 15 | 16 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 17 | public IEnumerable HeadersData { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Pages/ContentScript.razor: -------------------------------------------------------------------------------- 1 | @page "/contentscript.html" 2 | @using SidebarUsingIframe.Messaging 3 | @inherits Blazor.BrowserExtension.Pages.BasePage 4 | @inject MessagingEvent MessagingEvent 5 | 6 | 40 | 41 | @code { 42 | private bool isCollapsed = true; 43 | private IEnumerable headersData; 44 | 45 | private void Toggle() 46 | { 47 | isCollapsed = !isCollapsed; 48 | PostCollapseStateToContentScript(); 49 | } 50 | 51 | protected override void OnInitialized() 52 | { 53 | base.OnInitialized(); 54 | PostCollapseStateToContentScript(); 55 | ListenToMessageFromContentScript(); 56 | PostDataRequestToContentScript(); 57 | } 58 | 59 | private void PostCollapseStateToContentScript() 60 | { 61 | MessagingEvent.Post(new() 62 | { 63 | IsCollapsed = isCollapsed 64 | }); 65 | } 66 | 67 | private void ListenToMessageFromContentScript() 68 | { 69 | MessagingEvent.Listen((data) => 70 | { 71 | headersData = data.HeadersData; 72 | StateHasChanged(); 73 | }); 74 | } 75 | 76 | private void PostDataRequestToContentScript() 77 | { 78 | MessagingEvent.Post(new() 79 | { 80 | RequestForData = true 81 | }); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Pages/ContentScript.razor.css: -------------------------------------------------------------------------------- 1 | .sidebar-container { 2 | position: absolute; 3 | top: 0; 4 | left: 0; 5 | bottom: 0; 6 | width: 300px; 7 | background-color: #68ceff; 8 | z-index: 999999999; 9 | transition: left ease-out .4s; 10 | } 11 | 12 | .sidebar-container.collapsed { 13 | left: -300px; 14 | transition: none; 15 | } 16 | 17 | .content-container { 18 | width: 100%; 19 | height: 100%; 20 | position: relative; 21 | } 22 | 23 | .toggle { 24 | position: absolute; 25 | width: 50px; 26 | height: 30px; 27 | right: -50px; 28 | top: 40%; 29 | box-sizing: border-box; 30 | text-align: center; 31 | background-color: #4285f4; 32 | color: #fff; 33 | cursor: pointer; 34 | padding: 6px 4px; 35 | } 36 | 37 | .collapsed .toggle { 38 | top: 0; 39 | } 40 | 41 | .text-container { 42 | padding: 15px; 43 | font-size: 16px; 44 | overflow-y: auto; 45 | height: 100%; 46 | box-sizing: border-box; 47 | } 48 | 49 | .collapsed .text-container { 50 | display: none; 51 | } 52 | 53 | h1 { 54 | font-size: 3em; 55 | } 56 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.AspNetCore.Components.Web; 3 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using SidebarUsingIframe.Messaging; 6 | 7 | namespace SidebarUsingIframe 8 | { 9 | public static class Program 10 | { 11 | public static async Task Main(string[] args) 12 | { 13 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 14 | 15 | builder.UseBrowserExtension(browserExtension => 16 | { 17 | builder.RootComponents.Add("#app"); 18 | builder.RootComponents.Add("head::after"); 19 | }); 20 | 21 | builder.Services.AddTransient(); 22 | 23 | await builder.Build().RunAsync(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:10657", 7 | "sslPort": 44314 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "SidebarUsingIframe": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | @Body -------------------------------------------------------------------------------- /SidebarUsingIframe/src/Shared/MainLayout.razor.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f8f9fa; 3 | } 4 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/SidebarUsingIframe.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net9.0 5 | ../dist 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.JSInterop 9 | @using SidebarUsingIframe 10 | @using SidebarUsingIframe.Shared 11 | @using Blazor.BrowserExtension.Pages 12 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/wwwroot/ContentScript.css: -------------------------------------------------------------------------------- 1 | [data-extension-app-id=abc] { 2 | position: fixed; 3 | top: 0; 4 | bottom: 0; 5 | left: 0; 6 | width: 25%; 7 | min-width: 350px; 8 | z-index: 2147483647; 9 | } 10 | 11 | [data-extension-app-id=abc].hidden { 12 | display: none; 13 | } 14 | 15 | [data-extension-app-id=abc].sidebar-collapsed { 16 | overflow: visible; 17 | height: 30px; 18 | width: 50px; 19 | min-width: 50px; 20 | top: 40%; 21 | } 22 | 23 | [data-extension-app-id=abc] iframe { 24 | width: 100%; 25 | height: 100%; 26 | border: 0; 27 | } 28 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/wwwroot/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async function () { 2 | // @ts-ignore JS is not a module 3 | await import("./content/Blazor.BrowserExtension/lib/browser-polyfill.min.js"); 4 | 5 | // Define a unique ID to know you are interacting with your own extension 6 | const extensionAppId = "abc"; 7 | 8 | // Inject iframe into the current tab 9 | const url = browser.runtime.getURL("contentscript.html"); 10 | const appDiv = document.createElement("div"); 11 | appDiv.dataset.extensionAppId = extensionAppId; 12 | appDiv.classList.add("hidden"); 13 | document.body.appendChild(appDiv); 14 | const iframe = document.createElement("iframe"); 15 | iframe.src = url; 16 | appDiv.appendChild(iframe); 17 | 18 | // Communicate with the iframe to know what is the current state 19 | const messagingEvent = { 20 | post: (data) => { 21 | data.extensionAppId = extensionAppId; 22 | iframe.contentWindow.postMessage(data, "*"); 23 | }, 24 | listen: (handler) => { 25 | const extensionOrigin = url.replace("/contentscript.html", ""); 26 | window.addEventListener("message", (event) => { 27 | if (event.origin == extensionOrigin && event.data && event.data.extensionAppId == extensionAppId) { 28 | handler(event.data); 29 | } 30 | }); 31 | } 32 | }; 33 | 34 | let isLoaded = false; 35 | const messageHandler = (data) => { 36 | if (!isLoaded) { 37 | isLoaded = true; 38 | appDiv.classList.remove("hidden"); 39 | } 40 | 41 | if (data.isCollapsed === true) { 42 | appDiv.classList.add("sidebar-collapsed"); 43 | } else if (data.isCollapsed === false) { 44 | appDiv.classList.remove("sidebar-collapsed"); 45 | } 46 | 47 | if (data.requestForData === true) { 48 | const dataToSend = [...document.querySelectorAll("main h1, main h2, main h3")].map(header => { 49 | return { 50 | tag: header.tagName, 51 | text: header.textContent 52 | } 53 | }); 54 | 55 | messagingEvent.post({ 56 | headersData: dataToSend 57 | }); 58 | } 59 | }; 60 | messagingEvent.listen(messageHandler); 61 | })(); -------------------------------------------------------------------------------- /SidebarUsingIframe/src/wwwroot/css/app.css: -------------------------------------------------------------------------------- 1 | #blazor-error-ui { 2 | background: lightyellow; 3 | bottom: 0; 4 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 5 | display: none; 6 | left: 0; 7 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 8 | position: fixed; 9 | width: 100%; 10 | z-index: 1000; 11 | } 12 | 13 | #blazor-error-ui .dismiss { 14 | cursor: pointer; 15 | position: absolute; 16 | right: 0.75rem; 17 | top: 0.5rem; 18 | } 19 | 20 | .blazor-error-boundary { 21 | background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; 22 | padding: 1rem 1rem 1rem 3.7rem; 23 | color: white; 24 | } 25 | 26 | .blazor-error-boundary::after { 27 | content: "An error has occurred." 28 | } 29 | 30 | .loading-progress { 31 | position: relative; 32 | display: block; 33 | width: 8rem; 34 | height: 8rem; 35 | margin: 20vh auto 1rem auto; 36 | } 37 | 38 | .loading-progress circle { 39 | fill: none; 40 | stroke: #e0e0e0; 41 | stroke-width: 0.6rem; 42 | transform-origin: 50% 50%; 43 | transform: rotate(-90deg); 44 | } 45 | 46 | .loading-progress circle:last-child { 47 | stroke: #1b6ec2; 48 | stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; 49 | transition: stroke-dasharray 0.05s ease-in-out; 50 | } 51 | 52 | .loading-progress-text { 53 | position: absolute; 54 | text-align: center; 55 | font-weight: bold; 56 | inset: calc(20vh + 3.25rem) 0 auto 0.2rem; 57 | } 58 | 59 | .loading-progress-text:after { 60 | content: var(--blazor-load-percentage-text, "Loading"); 61 | } 62 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/SidebarUsingIframe/src/wwwroot/favicon.ico -------------------------------------------------------------------------------- /SidebarUsingIframe/src/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SidebarUsingIframe 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SidebarUsingIframe/src/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Sidebar Using iframe", 4 | "description": "Sample for sidebar using iframe.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "content_scripts": [ 10 | { 11 | "matches": [ "*://*/*" ], 12 | "js": [ "ContentScript.js" ], 13 | "css": [ "ContentScript.css" ] 14 | } 15 | ], 16 | "web_accessible_resources": [ 17 | { 18 | "resources": [ 19 | "framework/*", 20 | "content/*", 21 | "ContentScript.js", 22 | "contentscript.html" 23 | ], 24 | "matches": [ "" ] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /Sidepanel/Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/Demo.gif -------------------------------------------------------------------------------- /Sidepanel/README.md: -------------------------------------------------------------------------------- 1 | # Sidepanel sample 2 | 3 | ![Demo](Demo.gif) 4 | 5 | This sample project shows a simple extension side panel. 6 | 7 | You can load the output directly in the browser by following the steps [here](../README.md#test-the-sample-projects). -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/Sidepanel.styles.css: -------------------------------------------------------------------------------- 1 | /* /Pages/SidePanel.razor.rz.scp.css */ 2 | .text-container[b-2tj9hahjus] { 3 | padding: 15px; 4 | font-size: 16px; 5 | overflow-y: auto; 6 | height: 100%; 7 | box-sizing: border-box; 8 | } 9 | 10 | .collapsed .text-container[b-2tj9hahjus] { 11 | display: none; 12 | } 13 | 14 | h1[b-2tj9hahjus] { 15 | font-size: 3em; 16 | } 17 | /* /Shared/MainLayout.razor.rz.scp.css */ 18 | body[b-6dxdv60enw] { 19 | background-color: #f8f9fa; 20 | } 21 | -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/content/Blazor.BrowserExtension/Blazor.BrowserExtension.lib.module.js: -------------------------------------------------------------------------------- 1 | import { initializeInternal } from './CoreInternal.js'; 2 | 3 | let debugMode = false; 4 | const hasExtensionsApi = (namespace) => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 5 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 6 | debugMode = true; 7 | } 8 | 9 | let url; 10 | let browserExtensionMode; 11 | if (!debugMode) { 12 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 13 | browserExtensionMode = "Standard"; 14 | } else { 15 | url = globalThis.location.origin + "/"; 16 | browserExtensionMode = "Debug"; 17 | } 18 | 19 | let config; 20 | let appJs; 21 | 22 | async function beforeStart(options, extensions) { 23 | const configUrl = `${url}content/browserextension.config.json`; 24 | const configRequest = await fetch(configUrl); 25 | 26 | config = await configRequest.json(); 27 | 28 | const blazorBrowserExtension = options.BlazorBrowserExtension ?? initializeInternal(config, url, browserExtensionMode); 29 | 30 | if (debugMode) { 31 | blazorBrowserExtension.ImportBrowserPolyfill = false; 32 | } 33 | 34 | if (config.HasAppJs) { 35 | appJs = await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 36 | } 37 | 38 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 39 | // import browser extension API polyfill 40 | // @ts-ignore JS is not a module 41 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 42 | } 43 | 44 | await blazorBrowserExtension.BrowserExtension.InitializeCoreAsync(options); 45 | 46 | if (appJs?.beforeStart) { 47 | const beforeStartReturn = appJs.beforeStart(options, extensions, blazorBrowserExtension); 48 | if (beforeStartReturn instanceof Promise) { 49 | await beforeStartReturn; 50 | } 51 | } 52 | } 53 | 54 | function afterStarted(blazor) { 55 | if (appJs?.afterStarted) { 56 | return appJs.afterStarted(blazor); 57 | } 58 | } 59 | 60 | export { afterStarted, beforeStart }; 61 | -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/content/Blazor.BrowserExtension/ContentScript.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 3 | const url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 4 | 5 | const configRequest = await fetch(`${url}content/browserextension.config.json`); 6 | const config = await configRequest.json(); 7 | 8 | const blazorBrowserExtension = initializeInternal(config, url, "ContentScript"); 9 | 10 | globalThis.importProxy = (module) => { 11 | if (module.startsWith(document.baseURI) && blazorBrowserExtension.BrowserExtension) { 12 | module = new URL(module.substring(document.baseURI.length), blazorBrowserExtension.BrowserExtension.Url); 13 | } 14 | 15 | return import(module); 16 | }; 17 | 18 | await blazorBrowserExtension.BrowserExtension.InitializeContentScriptAsync({ 19 | BlazorBrowserExtension: blazorBrowserExtension 20 | }); 21 | })(); 22 | -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/content/Blazor.BrowserExtension/Core.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | console.warn("Core.js is deprecated. Use 'framework/blazor.webassembly.js' in the script tag."); 3 | 4 | let debugMode = false; 5 | const hasExtensionsApi = namespace => typeof globalThis[namespace] == "object" && globalThis[namespace]?.runtime?.id; 6 | if (!hasExtensionsApi("browser") && !hasExtensionsApi("chrome")) { 7 | debugMode = true; 8 | } 9 | 10 | const initializeInternal = (await (globalThis.importProxy ?? (m => import(m)))('./CoreInternal.js')).initializeInternal; 11 | let url; 12 | let browserExtensionMode; 13 | if (!debugMode) { 14 | url = (globalThis.browser || globalThis.chrome).runtime.getURL(""); 15 | browserExtensionMode = "Standard"; 16 | } else { 17 | url = globalThis.location.origin + "/"; 18 | browserExtensionMode = "Debug"; 19 | } 20 | 21 | const configUrl = `${url}content/browserextension.config.json`; 22 | 23 | const configRequest = await fetch(configUrl); 24 | const config = await configRequest.json(); 25 | 26 | const blazorBrowserExtension = initializeInternal(config, url, browserExtensionMode); 27 | // Clear the BrowserExtension property for the module initializer to initialize it 28 | const browserExtension = blazorBrowserExtension.BrowserExtension; 29 | blazorBrowserExtension.BrowserExtension = null; 30 | 31 | if (debugMode) { 32 | blazorBrowserExtension.ImportBrowserPolyfill = false; 33 | } 34 | 35 | if (config.HasAppJs) { 36 | await (globalThis.importProxy ?? (m => import(m)))(`${url}app.js`); 37 | } 38 | 39 | if (blazorBrowserExtension.ImportBrowserPolyfill) { 40 | // import browser extension API polyfill 41 | // @ts-ignore JS is not a module 42 | await (globalThis.importProxy ?? (m => import(m)))('./lib/browser-polyfill.min.js'); 43 | } 44 | 45 | if (blazorBrowserExtension.StartBlazorBrowserExtension) { 46 | await browserExtension.InitializeAsync(); 47 | } 48 | })(); 49 | -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/content/browserextension.config.json: -------------------------------------------------------------------------------- 1 | {"EnvironmentName":"","CompressionEnabled":true,"HasAppJs":false} -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/favicon.ico -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Blazor.BrowserExtension.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/JsBind.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/JsBind.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/JsBind.Net.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.AspNetCore.Components.Web.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.AspNetCore.Components.WebAssembly.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.AspNetCore.Components.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Configuration.Abstractions.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Configuration.Json.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Configuration.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.Abstractions.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Logging.Abstractions.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Logging.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Options.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.Extensions.Primitives.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.JSInterop.WebAssembly.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Microsoft.JSInterop.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Microsoft.JSInterop.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/Sidepanel.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/Sidepanel.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Collections.Concurrent.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Collections.Concurrent.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Collections.Immutable.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Collections.Immutable.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Collections.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Collections.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.ComponentModel.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.ComponentModel.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Console.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Console.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.IO.Pipelines.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.IO.Pipelines.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Linq.Expressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Linq.Expressions.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Linq.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Linq.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Memory.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Memory.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Private.CoreLib.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Private.CoreLib.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Private.Uri.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Private.Uri.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Runtime.InteropServices.JavaScript.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Runtime.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Runtime.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Text.Encodings.Web.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Text.Json.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Text.Json.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/System.Text.RegularExpressions.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/WebExtensions.Net.Extensions.DependencyInjection.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/WebExtensions.Net.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/WebExtensions.Net.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/dotnet.native.wasm.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/dotnet.native.wasm.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/icudt_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/icudt_CJK.dat.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/icudt_EFIGS.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/icudt_EFIGS.dat.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/framework/icudt_no_CJK.dat.br: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/dist/browserextension/framework/icudt_no_CJK.dat.br -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sidepanel 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Sidepanel", 4 | "description": "Sample for sidepanel.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "side_panel": { 10 | "default_path": "sidepanel.html" 11 | }, 12 | "permissions": [ 13 | "sidePanel", 14 | "tabs" 15 | ], 16 | "web_accessible_resources": [ 17 | { 18 | "resources": [ 19 | "framework/*", 20 | "content/*" 21 | ], 22 | "matches": [ "" ] 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /Sidepanel/dist/browserextension/sidepanel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sidepanel 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Sidepanel/src/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |

Sorry, there's nothing at this address.

8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /Sidepanel/src/Pages/SidePanel.razor: -------------------------------------------------------------------------------- 1 | @page "/sidepanel.html" 2 | @using WebExtensions.Net.Tabs 3 | @inherits Blazor.BrowserExtension.Pages.BasePage 4 | 5 |
6 |

My Sidepanel

7 |

This is a demo of the extension side panel.

8 | @if (activeTab is not null) 9 | { 10 |

The current active tab title is @activeTab.Title

11 | } 12 |
13 | 14 | @code { 15 | Tab activeTab = null; 16 | 17 | protected override async Task OnInitializedAsync() 18 | { 19 | await base.OnInitializedAsync(); 20 | WebExtensions.Tabs.OnActivated.AddListener(OnTabChanged); 21 | activeTab = (await WebExtensions.Tabs.Query(new() 22 | { 23 | Active = true, 24 | CurrentWindow = true 25 | })).FirstOrDefault(); 26 | } 27 | 28 | void OnTabChanged(ActiveInfo activeTabInfo) 29 | { 30 | _ = OnTabChangedAsync(activeTabInfo); 31 | } 32 | 33 | async Task OnTabChangedAsync(ActiveInfo activeTabInfo) 34 | { 35 | activeTab = await WebExtensions.Tabs.Get(activeTabInfo.TabId); 36 | StateHasChanged(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sidepanel/src/Pages/SidePanel.razor.css: -------------------------------------------------------------------------------- 1 | .text-container { 2 | padding: 15px; 3 | font-size: 16px; 4 | overflow-y: auto; 5 | height: 100%; 6 | box-sizing: border-box; 7 | } 8 | 9 | .collapsed .text-container { 10 | display: none; 11 | } 12 | 13 | h1 { 14 | font-size: 3em; 15 | } 16 | -------------------------------------------------------------------------------- /Sidepanel/src/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.AspNetCore.Components.Web; 3 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 4 | 5 | namespace Sidepanel 6 | { 7 | public static class Program 8 | { 9 | public static async Task Main(string[] args) 10 | { 11 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 12 | 13 | builder.UseBrowserExtension(browserExtension => 14 | { 15 | builder.RootComponents.Add("#app"); 16 | builder.RootComponents.Add("head::after"); 17 | }); 18 | 19 | await builder.Build().RunAsync(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Sidepanel/src/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:10657", 7 | "sslPort": 44314 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "Sidepanel": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sidepanel/src/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | @Body -------------------------------------------------------------------------------- /Sidepanel/src/Shared/MainLayout.razor.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f8f9fa; 3 | } 4 | -------------------------------------------------------------------------------- /Sidepanel/src/Sidepanel.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net9.0 5 | ../dist 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Sidepanel/src/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.JSInterop 9 | @using Sidepanel 10 | @using Sidepanel.Shared 11 | @using Blazor.BrowserExtension.Pages 12 | -------------------------------------------------------------------------------- /Sidepanel/src/wwwroot/css/app.css: -------------------------------------------------------------------------------- 1 | #blazor-error-ui { 2 | background: lightyellow; 3 | bottom: 0; 4 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 5 | display: none; 6 | left: 0; 7 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 8 | position: fixed; 9 | width: 100%; 10 | z-index: 1000; 11 | } 12 | 13 | #blazor-error-ui .dismiss { 14 | cursor: pointer; 15 | position: absolute; 16 | right: 0.75rem; 17 | top: 0.5rem; 18 | } 19 | 20 | .blazor-error-boundary { 21 | background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; 22 | padding: 1rem 1rem 1rem 3.7rem; 23 | color: white; 24 | } 25 | 26 | .blazor-error-boundary::after { 27 | content: "An error has occurred." 28 | } 29 | 30 | .loading-progress { 31 | position: relative; 32 | display: block; 33 | width: 8rem; 34 | height: 8rem; 35 | margin: 20vh auto 1rem auto; 36 | } 37 | 38 | .loading-progress circle { 39 | fill: none; 40 | stroke: #e0e0e0; 41 | stroke-width: 0.6rem; 42 | transform-origin: 50% 50%; 43 | transform: rotate(-90deg); 44 | } 45 | 46 | .loading-progress circle:last-child { 47 | stroke: #1b6ec2; 48 | stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; 49 | transition: stroke-dasharray 0.05s ease-in-out; 50 | } 51 | 52 | .loading-progress-text { 53 | position: absolute; 54 | text-align: center; 55 | font-weight: bold; 56 | inset: calc(20vh + 3.25rem) 0 auto 0.2rem; 57 | } 58 | 59 | .loading-progress-text:after { 60 | content: var(--blazor-load-percentage-text, "Loading"); 61 | } 62 | -------------------------------------------------------------------------------- /Sidepanel/src/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mingyaulee/Blazor.BrowserExtension.Samples/a639e5bf30075a2c23e8544f6cf1711f52ff0009/Sidepanel/src/wwwroot/favicon.ico -------------------------------------------------------------------------------- /Sidepanel/src/wwwroot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sidepanel 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 |
24 | An unhandled error has occurred. 25 | Reload 26 | 🗙 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Sidepanel/src/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Sidepanel", 4 | "description": "Sample for sidepanel.", 5 | "version": "0.1", 6 | "content_security_policy": { 7 | "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" 8 | }, 9 | "side_panel": { 10 | "default_path": "sidepanel.html" 11 | }, 12 | "permissions": [ 13 | "sidePanel", 14 | "tabs" 15 | ], 16 | "web_accessible_resources": [ 17 | { 18 | "resources": [ 19 | "framework/*", 20 | "content/*" 21 | ], 22 | "matches": [ "" ] 23 | } 24 | ] 25 | } --------------------------------------------------------------------------------