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

Fix calling OpenExternalBrowser from non-UI threads, causing crashes or errors

This commit is contained in:
chylex 2017-09-02 21:49:45 +02:00
parent 13ea388f5e
commit c808e7bd83
6 changed files with 30 additions and 26 deletions

View File

@ -120,12 +120,12 @@ public void FixClipboard(){
form.InvokeAsyncSafe(WindowsUtils.ClipboardStripHtmlStyles); form.InvokeAsyncSafe(WindowsUtils.ClipboardStripHtmlStyles);
} }
public int GetIdleSeconds(){ public void OpenBrowser(string url){
return NativeMethods.GetIdleSeconds(); form.InvokeAsyncSafe(() => BrowserUtils.OpenExternalBrowser(url));
} }
public void OpenBrowser(string url){ public int GetIdleSeconds(){
BrowserUtils.OpenExternalBrowser(url); return NativeMethods.GetIdleSeconds();
} }
public void Alert(string type, string contents){ public void Alert(string type, string contents){

View File

@ -36,16 +36,10 @@ private static string GetMediaLink(IContextMenuParams parameters){
private const CefMenuCommand MenuSaveMedia = (CefMenuCommand)26505; private const CefMenuCommand MenuSaveMedia = (CefMenuCommand)26505;
private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26506; private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26506;
private const CefMenuCommand MenuOpenDevTools = (CefMenuCommand)26599; private const CefMenuCommand MenuOpenDevTools = (CefMenuCommand)26599;
private readonly Form form;
private string[] lastHighlightedTweetAuthors; private string[] lastHighlightedTweetAuthors;
private string[] lastHighlightedTweetImageList; private string[] lastHighlightedTweetImageList;
protected ContextMenuBase(Form form){
this.form = form;
}
public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){ if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){
lastHighlightedTweetAuthors = StringUtils.EmptyArray; lastHighlightedTweetAuthors = StringUtils.EmptyArray;
@ -100,24 +94,24 @@ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser bro
public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){ public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
switch(commandId){ switch(commandId){
case MenuOpenLinkUrl: case MenuOpenLinkUrl:
BrowserUtils.OpenExternalBrowser(IsLink ? ContextInfo.Value : parameters.LinkUrl); OpenBrowser(browserControl.AsControl(), IsLink ? ContextInfo.Value : parameters.LinkUrl);
break; break;
case MenuCopyLinkUrl: case MenuCopyLinkUrl:
SetClipboardText(IsLink ? ContextInfo.Value : parameters.UnfilteredLinkUrl); SetClipboardText(browserControl.AsControl(), IsLink ? ContextInfo.Value : parameters.UnfilteredLinkUrl);
break; break;
case MenuCopyUsername: case MenuCopyUsername:
Match match = TwitterUtils.RegexAccount.Match(parameters.UnfilteredLinkUrl); Match match = TwitterUtils.RegexAccount.Match(parameters.UnfilteredLinkUrl);
SetClipboardText(match.Success ? match.Groups[1].Value : parameters.UnfilteredLinkUrl); SetClipboardText(browserControl.AsControl(), match.Success ? match.Groups[1].Value : parameters.UnfilteredLinkUrl);
break; break;
case MenuOpenMediaUrl: case MenuOpenMediaUrl:
BrowserUtils.OpenExternalBrowser(TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality)); OpenBrowser(browserControl.AsControl(), TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality));
break; break;
case MenuCopyMediaUrl: case MenuCopyMediaUrl:
SetClipboardText(TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality)); SetClipboardText(browserControl.AsControl(), TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality));
break; break;
case MenuSaveMedia: case MenuSaveMedia:
@ -150,8 +144,12 @@ public virtual bool RunContextMenu(IWebBrowser browserControl, IBrowser browser,
return false; return false;
} }
protected void SetClipboardText(string text){ protected void OpenBrowser(Control control, string url){
form.InvokeAsyncSafe(() => WindowsUtils.SetClipboard(text, TextDataFormat.UnicodeText)); control.InvokeAsyncSafe(() => BrowserUtils.OpenExternalBrowser(url));
}
protected void SetClipboardText(Control control, string text){
control.InvokeAsyncSafe(() => WindowsUtils.SetClipboard(text, TextDataFormat.UnicodeText));
} }
protected static void AddDebugMenuItems(IMenuModel model){ protected static void AddDebugMenuItems(IMenuModel model){

View File

@ -29,7 +29,7 @@ sealed class ContextMenuBrowser : ContextMenuBase{
private string lastHighlightedTweetUrl; private string lastHighlightedTweetUrl;
private string lastHighlightedQuoteUrl; private string lastHighlightedQuoteUrl;
public ContextMenuBrowser(FormBrowser form) : base(form){ public ContextMenuBrowser(FormBrowser form){
this.form = form; this.form = form;
} }
@ -118,11 +118,11 @@ public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser b
return true; return true;
case MenuOpenTweetUrl: case MenuOpenTweetUrl:
BrowserUtils.OpenExternalBrowser(lastHighlightedTweetUrl); OpenBrowser(form, lastHighlightedTweetUrl);
return true; return true;
case MenuCopyTweetUrl: case MenuCopyTweetUrl:
SetClipboardText(lastHighlightedTweetUrl); SetClipboardText(form, lastHighlightedTweetUrl);
return true; return true;
case MenuScreenshotTweet: case MenuScreenshotTweet:
@ -130,11 +130,11 @@ public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser b
return true; return true;
case MenuOpenQuotedTweetUrl: case MenuOpenQuotedTweetUrl:
BrowserUtils.OpenExternalBrowser(lastHighlightedQuoteUrl); OpenBrowser(form, lastHighlightedQuoteUrl);
return true; return true;
case MenuCopyQuotedTweetUrl: case MenuCopyQuotedTweetUrl:
SetClipboardText(lastHighlightedQuoteUrl); SetClipboardText(form, lastHighlightedQuoteUrl);
return true; return true;
} }

View File

@ -13,7 +13,7 @@ sealed class ContextMenuNotification : ContextMenuBase{
private readonly FormNotificationBase form; private readonly FormNotificationBase form;
private readonly bool enableCustomMenu; private readonly bool enableCustomMenu;
public ContextMenuNotification(FormNotificationBase form, bool enableCustomMenu) : base(form){ public ContextMenuNotification(FormNotificationBase form, bool enableCustomMenu){
this.form = form; this.form = form;
this.enableCustomMenu = enableCustomMenu; this.enableCustomMenu = enableCustomMenu;
} }
@ -76,11 +76,11 @@ public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser b
return true; return true;
case MenuCopyTweetUrl: case MenuCopyTweetUrl:
SetClipboardText(form.CurrentTweetUrl); SetClipboardText(form, form.CurrentTweetUrl);
return true; return true;
case MenuCopyQuotedTweetUrl: case MenuCopyQuotedTweetUrl:
SetClipboardText(form.CurrentQuoteUrl); SetClipboardText(form, form.CurrentQuoteUrl);
return true; return true;
} }

View File

@ -1,4 +1,5 @@
using CefSharp; using CefSharp;
using TweetDuck.Core.Controls;
using TweetDuck.Core.Utils; using TweetDuck.Core.Utils;
namespace TweetDuck.Core.Handling.General{ namespace TweetDuck.Core.Handling.General{
@ -11,7 +12,7 @@ public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame f
case WindowOpenDisposition.NewForegroundTab: case WindowOpenDisposition.NewForegroundTab:
case WindowOpenDisposition.NewPopup: case WindowOpenDisposition.NewPopup:
case WindowOpenDisposition.NewWindow: case WindowOpenDisposition.NewWindow:
BrowserUtils.OpenExternalBrowser(targetUrl); browserControl.AsControl().InvokeAsyncSafe(() => BrowserUtils.OpenExternalBrowser(targetUrl));
return true; return true;
default: default:

View File

@ -5,6 +5,7 @@
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Windows.Forms; using System.Windows.Forms;
using CefSharp.WinForms;
using TweetDuck.Core.Other; using TweetDuck.Core.Other;
namespace TweetDuck.Core.Utils{ namespace TweetDuck.Core.Utils{
@ -42,6 +43,10 @@ public static void SetupCefArgs(IDictionary<string, string> args){
} }
} }
public static ChromiumWebBrowser AsControl(this IWebBrowser browserControl){
return (ChromiumWebBrowser)browserControl;
}
private const string TwitterTrackingUrl = "t.co"; private const string TwitterTrackingUrl = "t.co";
public enum UrlCheckResult{ public enum UrlCheckResult{