1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-06-14 07:34:05 +02:00

Rewrite plugins.js, plugin state handling and script execution (separate instead of combining)

This commit is contained in:
chylex 2016-06-30 16:31:02 +02:00
parent dc78c68f12
commit b6a683dfe1
5 changed files with 101 additions and 105 deletions

View File

@ -122,8 +122,9 @@ private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEvent
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){ private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
if (e.Frame.IsMain){ if (e.Frame.IsMain){
ScriptLoader.ExecuteFile(browser,"code.js"); ScriptLoader.ExecuteFile(e.Frame,"code.js");
plugins_Reloaded(plugins,new PluginLoadEventArgs(new string[0])); ScriptLoader.ExecuteFile(e.Frame,PluginManager.PluginScriptFile);
plugins.ExecutePlugins(e.Frame,PluginEnvironment.Browser);
} }
} }
@ -191,11 +192,11 @@ private void trayIcon_ClickClose(object sender, EventArgs e){
} }
private void plugins_Reloaded(object sender, PluginLoadEventArgs e){ private void plugins_Reloaded(object sender, PluginLoadEventArgs e){
browser.ExecuteScriptAsync(plugins.GenerateScript(PluginEnvironment.Browser)); browser.ExecuteScriptAsync("window.location.reload()");
} }
private void plugins_PluginChangedState(object sender, PluginChangedStateEventArgs e){ private void plugins_PluginChangedState(object sender, PluginChangedStateEventArgs e){
ScriptLoader.ExecuteScript(browser,PluginScriptGenerator.GenerateSetPluginState(e.Plugin,e.IsEnabled),"gen:pluginstate:"+e.Plugin); browser.ExecuteScriptAsync("window.TDPF_setPluginState",e.Plugin,e.IsEnabled ? 1 : 0); // ExecuteScriptAsync cannot handle boolean values as of yet
} }
private void updates_UpdateAccepted(object sender, UpdateAcceptedEventArgs e){ private void updates_UpdateAccepted(object sender, UpdateAcceptedEventArgs e){

View File

@ -115,7 +115,8 @@ private void Config_MuteToggled(object sender, EventArgs e){
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){ private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
if (e.Frame.IsMain && notificationJS != null && browser.Address != "about:blank"){ if (e.Frame.IsMain && notificationJS != null && browser.Address != "about:blank"){
ScriptLoader.ExecuteScript(e.Frame,notificationJS,"root:notification"); ScriptLoader.ExecuteScript(e.Frame,notificationJS,"root:notification");
browser.ExecuteScriptAsync(plugins.GenerateScript(PluginEnvironment.Notification)); ScriptLoader.ExecuteFile(e.Frame,PluginManager.PluginScriptFile);
plugins.ExecutePlugins(e.Frame,PluginEnvironment.Notification);
} }
} }

View File

@ -2,12 +2,14 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using CefSharp;
using TweetDck.Plugins.Events; using TweetDck.Plugins.Events;
using TweetDck.Resources; using TweetDck.Resources;
namespace TweetDck.Plugins{ namespace TweetDck.Plugins{
class PluginManager{ class PluginManager{
public const string PluginScriptFile = "plugins.js";
public string PathOfficialPlugins { get { return Path.Combine(rootPath,"official"); } } public string PathOfficialPlugins { get { return Path.Combine(rootPath,"official"); } }
public string PathCustomPlugins { get { return Path.Combine(rootPath,"user"); } } public string PathCustomPlugins { get { return Path.Combine(rootPath,"user"); } }
@ -53,29 +55,24 @@ public void Reload(){
} }
} }
public string GenerateScript(PluginEnvironment environment){ public void ExecutePlugins(IFrame frame, PluginEnvironment environment){
string mainScript = ScriptLoader.LoadResource("plugins.js"); ScriptLoader.ExecuteScript(frame,PluginScriptGenerator.GenerateConfig(Config),"gen:pluginconfig");
if (mainScript == null)return string.Empty;
StringBuilder build = new StringBuilder((1+plugins.Count)*512);
PluginScriptGenerator.AppendStart(build,environment);
build.Append(mainScript);
PluginScriptGenerator.AppendConfig(build,Config);
foreach(Plugin plugin in Plugins){ foreach(Plugin plugin in Plugins){
string path = plugin.GetScriptPath(environment); string path = plugin.GetScriptPath(environment);
if (string.IsNullOrEmpty(path) || !plugin.CanRun)continue; if (string.IsNullOrEmpty(path) || !plugin.CanRun)continue;
string script;
try{ try{
PluginScriptGenerator.AppendPlugin(build,plugin.Identifier,File.ReadAllText(path)); script = File.ReadAllText(path);
}catch{ }catch{
// TODO // TODO
} continue;
} }
PluginScriptGenerator.AppendEnd(build,environment); ScriptLoader.ExecuteScript(frame,PluginScriptGenerator.GeneratePlugin(plugin.Identifier,script,environment),"plugin:"+plugin);
return build.ToString(); }
} }
private IEnumerable<Plugin> LoadPluginsFrom(string path, PluginGroup group){ private IEnumerable<Plugin> LoadPluginsFrom(string path, PluginGroup group){

View File

@ -2,30 +2,23 @@
namespace TweetDck.Plugins{ namespace TweetDck.Plugins{
static class PluginScriptGenerator{ static class PluginScriptGenerator{
public static void AppendStart(StringBuilder build, PluginEnvironment environment){ public static string GenerateConfig(PluginConfig config){
return config.AnyDisabled ? "window.TD_PLUGINS.disabled = [\""+string.Join("\",\"",config.DisabledPlugins)+"\"];" : string.Empty;
}
public static string GeneratePlugin(string pluginIdentifier, string pluginContents, PluginEnvironment environment){
StringBuilder build = new StringBuilder(pluginIdentifier.Length+pluginContents.Length+110);
build.Append("(function(").Append(environment.GetScriptVariables()).Append("){"); build.Append("(function(").Append(environment.GetScriptVariables()).Append("){");
}
public static void AppendConfig(StringBuilder build, PluginConfig config){ build.Append("window.TD_PLUGINS.install({");
if (config.AnyDisabled){ build.Append("id:\"").Append(pluginIdentifier).Append("\",");
build.Append("PLUGINS.disabled = [\"").Append(string.Join("\",\"",config.DisabledPlugins)).Append("\"];"); build.Append("obj:new class extends PluginBase{").Append(pluginContents).Append("}");
}
}
public static void AppendPlugin(StringBuilder build, string pluginIdentifier, string pluginContents){
build.Append("PLUGINS.installed.push({");
build.Append("id: \"").Append(pluginIdentifier).Append("\",");
build.Append("obj: new class extends PluginBase{ ").Append(pluginContents).Append(" }");
build.Append("});"); build.Append("});");
}
public static void AppendEnd(StringBuilder build, PluginEnvironment environment){
build.Append("PLUGINS.load();");
build.Append("})(").Append(environment.GetScriptVariables()).Append(");"); build.Append("})(").Append(environment.GetScriptVariables()).Append(");");
}
public static string GenerateSetPluginState(Plugin plugin, bool enabled){ return build.ToString();
return new StringBuilder().Append("window.TD_PLUGINS.setState(\"").Append(plugin.Identifier).Append("\",").Append(enabled ? "true" : "false").Append(");").ToString();
} }
} }
} }

View File

@ -1,14 +1,8 @@
var isReloading = "TD_PLUGINS" in window; (function(){
//
if (isReloading){ // Class: Abstract plugin base class.
window.TD_PLUGINS.installed.forEach(plugin => { //
if (!window.TD_PLUGINS.isDisabled(plugin)){ window.PluginBase = class{
plugin.obj.disabled();
}
});
}
class PluginBase{
constructor(pluginSettings){ constructor(pluginSettings){
this.$pluginSettings = pluginSettings || {}; this.$pluginSettings = pluginSettings || {};
} }
@ -16,49 +10,52 @@ class PluginBase{
enabled(){} enabled(){}
ready(){} ready(){}
disabled(){} disabled(){}
} };
var PLUGINS = { //
installed: [], // Variable: Main object for containing and managing plugins.
disabled: [], //
waiting: [], window.TD_PLUGINS = new class{
constructor(){
isDisabled: plugin => PLUGINS.disabled.includes(plugin.id), this.installed = [];
findObject: identifier => PLUGINS.installed.find(plugin => plugin.id === identifier), this.disabled = [];
this.waiting = [];
load: function(){
PLUGINS.installed.forEach(plugin => {
if (!PLUGINS.isDisabled(plugin)){
plugin.obj.enabled();
PLUGINS.runWhenReady(plugin);
} }
});
},
onReady: function(){ isDisabled(plugin){
PLUGINS.waiting.forEach(plugin => plugin.obj.ready()); return this.disabled.includes(plugin.id);
PLUGINS.waiting = []; }
},
runWhenReady: function(plugin){ findObject(identifier){
return this.installed.find(plugin => plugin.id === identifier);
}
install(plugin){
this.installed.push(plugin);
if (!this.isDisabled(plugin)){
plugin.obj.enabled();
this.runWhenReady(plugin);
}
}
runWhenReady(plugin){
if (window.TD_APP_READY){ if (window.TD_APP_READY){
plugin.obj.ready(); plugin.obj.ready();
} }
else{ else{
PLUGINS.waiting.push(plugin); this.waiting.push(plugin);
}
} }
},
setState: function(identifier, enable){ setState(plugin, enable){
var plugin = PLUGINS.findObject(identifier); if (enable && this.isDisabled(plugin)){
this.disabled.splice(this.disabled.indexOf(plugin.id),1);
if (enable && PLUGINS.isDisabled(plugin)){
PLUGINS.disabled.splice(PLUGINS.disabled.indexOf(identifier),1);
plugin.obj.enabled(); plugin.obj.enabled();
PLUGINS.runWhenReady(plugin); this.runWhenReady(plugin);
} }
else if (!enable && !PLUGINS.isDisabled(plugin)){ else if (!enable && !this.isDisabled(plugin)){
PLUGINS.disabled.push(identifier); this.disabled.push(plugin.id);
plugin.obj.disabled(); plugin.obj.disabled();
} }
else return; else return;
@ -67,10 +64,17 @@ var PLUGINS = {
window.location.reload(); window.location.reload();
} }
} }
};
window.TD_PLUGINS = PLUGINS; onReady(){
this.waiting.forEach(plugin => plugin.obj.ready());
this.waiting = [];
}
};
if (isReloading){ //
window.location.reload(); // Block: Setup global function to change plugin state.
} //
window.TDPF_setPluginState = function(identifier, enable){
window.TD_PLUGINS.setState(window.TD_PLUGINS.findObject(identifier),enable);
};
})();