diff --git a/src/lib/installPlugin.js b/src/lib/installPlugin.js
index 13385c37..3dc8bc29 100644
--- a/src/lib/installPlugin.js
+++ b/src/lib/installPlugin.js
@@ -77,7 +77,7 @@ export default async function installPlugin(
const zip = new JSZip();
await zip.loadAsync(plugin);
- if (!zip.files["plugin.json"] || !zip.files["main.js"]) {
+ if (!zip.files["plugin.json"]) {
throw new Error(strings["invalid plugin"]);
}
@@ -86,6 +86,25 @@ export default async function installPlugin(
await zip.files["plugin.json"].async("text"),
);
+ /** patch main in manifest */
+ if (!zip.files[pluginJson.main]) {
+ pluginJson.main = "main.js";
+ }
+
+ /** patch icon in manifest */
+ if (!zip.files[pluginJson.icon]) {
+ pluginJson.icon = "icon.png";
+ }
+
+ /** patch readme in manifest */
+ if (!zip.files[pluginJson.readme]) {
+ pluginJson.readme = "readme.md";
+ }
+
+ if (!zip.files[pluginJson.main]) {
+ throw new Error(strings["invalid plugin"]);
+ }
+
if (!isDependency && pluginJson.dependencies) {
const manifests = await resolveDepsManifest(pluginJson.dependencies);
diff --git a/src/lib/loadPlugin.js b/src/lib/loadPlugin.js
index dd968758..687dd5a2 100644
--- a/src/lib/loadPlugin.js
+++ b/src/lib/loadPlugin.js
@@ -8,10 +8,12 @@ export default async function loadPlugin(pluginId, justInstalled = false) {
const baseUrl = await helpers.toInternalUri(Url.join(PLUGIN_DIR, pluginId));
const cacheFile = Url.join(CACHE_STORAGE, pluginId);
- return new Promise((resolve, reject) => {
- const $script = ;
+ const pluginJson = await fsOperation(
+ Url.join(PLUGIN_DIR, pluginId, "plugin.json"),
+ ).readFile("json");
- $script.onerror = (error) => {
+ return new Promise((resolve, reject) => {
+ const onerror = (error) => {
reject(
new Error(
`Failed to load script for plugin ${pluginId}: ${error.message || error}`,
@@ -19,7 +21,7 @@ export default async function loadPlugin(pluginId, justInstalled = false) {
);
};
- $script.onload = async () => {
+ const onload = async () => {
const $page = Page("Plugin");
$page.show = () => {
actionStack.push({
@@ -51,6 +53,17 @@ export default async function loadPlugin(pluginId, justInstalled = false) {
}
};
- document.head.append($script);
+ const $script = ;
+ $script.onload = onload;
+ $script.onerror = onerror;
+
+ try {
+ document.head.append($script);
+ } catch (_) {
+ const $script = ;
+ $script.onload = onload;
+ $script.onerror = onerror;
+ document.head.append($script);
+ }
});
}
diff --git a/src/pages/plugin/plugin.js b/src/pages/plugin/plugin.js
index 82202cf5..ef4aa9ba 100644
--- a/src/pages/plugin/plugin.js
+++ b/src/pages/plugin/plugin.js
@@ -77,10 +77,10 @@ export default async function PluginInclude(
).readFile("json");
const { author } = installedPlugin;
const description = await fsOperation(
- Url.join(PLUGIN_DIR, id, "readme.md"),
+ Url.join(PLUGIN_DIR, id, installedPlugin.readme),
).readFile("utf8");
const iconUrl = await helpers.toInternalUri(
- Url.join(PLUGIN_DIR, id, "icon.png"),
+ Url.join(PLUGIN_DIR, id, installedPlugin.icon),
);
const iconData = await fsOperation(iconUrl).readFile();
const icon = URL.createObjectURL(
diff --git a/src/pages/plugins/plugins.js b/src/pages/plugins/plugins.js
index a817a591..ff4ba903 100644
--- a/src/pages/plugins/plugins.js
+++ b/src/pages/plugins/plugins.js
@@ -331,7 +331,7 @@ export default function PluginsInclude(updates) {
if (!((updates && updates.includes(id)) || !updates)) return;
const url = Url.join(item.url, "plugin.json");
const plugin = await fsOperation(url).readFile("json");
- const iconUrl = getLocalRes(id, "icon.png");
+ const iconUrl = getLocalRes(id, plugin.icon);
plugin.icon = await helpers.toInternalUri(iconUrl);
plugin.installed = true;
plugins.installed.push(plugin);
diff --git a/src/sidebarApps/extensions/index.js b/src/sidebarApps/extensions/index.js
index bcb90191..e069d784 100644
--- a/src/sidebarApps/extensions/index.js
+++ b/src/sidebarApps/extensions/index.js
@@ -268,7 +268,7 @@ async function listInstalledPlugins() {
const id = Url.basename(item.url);
const url = Url.join(item.url, "plugin.json");
const plugin = await fsOperation(url).readFile("json");
- const iconUrl = getLocalRes(id, "icon.png");
+ const iconUrl = getLocalRes(id, plugin.icon);
plugin.icon = await helpers.toInternalUri(iconUrl);
plugin.installed = true;
return plugin;