diff --git a/Core/Handling/Filters/ResponseFilterVendor.cs b/Core/Handling/Filters/ResponseFilterVendor.cs new file mode 100644 index 00000000..13f2bfbf --- /dev/null +++ b/Core/Handling/Filters/ResponseFilterVendor.cs @@ -0,0 +1,20 @@ +using System.Text; +using System.Text.RegularExpressions; + +namespace TweetDuck.Core.Handling.Filters{ + sealed class ResponseFilterVendor : ResponseFilterBase{ + private static readonly Regex RegexRestoreJQuery = new Regex(@"(\w+)\.fn=\1\.prototype", RegexOptions.Compiled); + + public ResponseFilterVendor(int totalBytes) : base(totalBytes, Encoding.UTF8){} + + public override bool InitFilter(){ + return true; + } + + protected override string ProcessResponse(string text){ + return RegexRestoreJQuery.Replace(text, "window.$$=$1;$&", 1); + } + + public override void Dispose(){} + } +} diff --git a/Core/Handling/RequestHandlerBrowser.cs b/Core/Handling/RequestHandlerBrowser.cs index 872a6865..336fe6b1 100644 --- a/Core/Handling/RequestHandlerBrowser.cs +++ b/Core/Handling/RequestHandlerBrowser.cs @@ -1,13 +1,14 @@ // Uncomment to force TweetDeck to load a predefined version of the vendor/bundle scripts -#define FREEZE_TWEETDECK_SCRIPTS // TODO delaying the apocalypse +// #define FREEZE_TWEETDECK_SCRIPTS -using System.Text.RegularExpressions; +using System.Collections.Specialized; using CefSharp; +using TweetDuck.Core.Handling.Filters; using TweetDuck.Core.Utils; #if FREEZE_TWEETDECK_SCRIPTS using System.Collections.Generic; -using System.Diagnostics; +using System.Text.RegularExpressions; #endif namespace TweetDuck.Core.Handling{ @@ -55,10 +56,10 @@ public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser bro if (match.Success && TweetDeckHashes.TryGetValue(match.Groups[1].Value, out string hash)){ if (match.Groups[2].Value == hash){ - Debug.WriteLine($"accepting {request.Url}"); + System.Diagnostics.Debug.WriteLine($"accepting {request.Url}"); } else{ - Debug.WriteLine($"rewriting {request.Url} to {hash}"); + System.Diagnostics.Debug.WriteLine($"rewriting {request.Url} to {hash}"); request.Url = TweetDeckScriptUrl.Replace(request.Url, "dist/$1."+hash+".js"); return true; } @@ -68,5 +69,28 @@ public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser bro return base.OnResourceResponse(browserControl, browser, frame, request, response); } + + public override IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){ + if (request.ResourceType == ResourceType.Script && request.Url.Contains("dist/vendor")){ + NameValueCollection headers = response.ResponseHeaders; + + if (int.TryParse(headers["x-ton-expected-size"], out int totalBytes)){ + return new ResponseFilterVendor(totalBytes); + } + #if DEBUG + else{ + System.Diagnostics.Debug.WriteLine($"Missing uncompressed size header in {request.Url}"); + + foreach(string key in headers){ + System.Diagnostics.Debug.WriteLine($" {key}: {headers[key]}"); + } + + System.Diagnostics.Debugger.Break(); + } + #endif + } + + return base.GetResourceResponseFilter(browserControl, browser, frame, request, response); + } } } diff --git a/TweetDuck.csproj b/TweetDuck.csproj index 72a302f8..8c21a886 100644 --- a/TweetDuck.csproj +++ b/TweetDuck.csproj @@ -73,6 +73,7 @@ <Compile Include="Core\Handling\ContextMenuGuide.cs" /> <Compile Include="Core\Handling\DragHandlerBrowser.cs" /> <Compile Include="Core\Handling\Filters\ResponseFilterBase.cs" /> + <Compile Include="Core\Handling\Filters\ResponseFilterVendor.cs" /> <Compile Include="Core\Handling\General\BrowserProcessHandler.cs" /> <Compile Include="Core\Handling\ContextMenuBase.cs" /> <Compile Include="Core\Handling\ContextMenuBrowser.cs" />