internal static GeckoCanvasElement CreateCanvasOfImageElement(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { if (width == 0) throw new ArgumentException("width"); if (height == 0) throw new ArgumentException("height"); // Some opertations fail without a proper JSContext. using(var jsContext = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { GeckoCanvasElement canvas = (GeckoCanvasElement)browser.Document.CreateElement("canvas"); canvas.Width = (uint)width; canvas.Height = (uint)height; nsIDOMHTMLCanvasElement canvasPtr = (nsIDOMHTMLCanvasElement)canvas.DomObject; nsIDOMCanvasRenderingContext2D context; using (var str = new nsAString("2d")) { context = (nsIDOMCanvasRenderingContext2D)canvasPtr.MozGetIPCContext(str); } context.DrawImage((nsIDOMElement)element.DomObject, xOffset, yOffset, width, height, xOffset, yOffset, width, height, 6); return canvas; } }
private static string CopyImageElementToDataImageString(IGeckoWebBrowser browser, GeckoHtmlElement element, string imageFormat, float xOffset, float yOffset, float width, float height) { if (width == 0) { throw new ArgumentException("width"); } if (height == 0) { throw new ArgumentException("height"); } string data; using (var context = new AutoJSContext()) { context.EvaluateScript(string.Format(@"(function(element, canvas, ctx) {{ canvas = element.ownerDocument.createElement('canvas'); canvas.width = {2}; canvas.height = {3}; ctx = canvas.getContext('2d'); ctx.drawImage(element, -{0}, -{1}); return canvas.toDataURL('{4}'); }} )(this)" , xOffset, yOffset, width, height, imageFormat), (nsISupports)(nsIDOMElement)element.DomObject, out data); } return(data); }
/// <summary> /// Need the GeckoWebBrowser , ImageElement , X-OffSet , Y-Offset (put 0.0F if you want offset), Width , height) /// Return the png image in data bytes[] /// </summary> public static byte[] ConvertGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { GeckoCanvasElement canvas = CreateCanvasOfImageElement(browser, element, xOffset, yOffset, width, height); string data = canvas.toDataURL("image/png"); byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); return bytes; }
public ImageCreator(IGeckoWebBrowser browser) { if (Xpcom.IsLinux) { throw new NotImplementedException(); } m_browser = browser; }
private void DoCallbacks(IGeckoWebBrowser browser) { browser.ExecuteJQuery(@" $('a.repo-link').each(function(){ var content = $(this).text(); var event = new MessageEvent('callback', { 'view' : window, 'bubbles' : true, 'cancelable' : false, 'data' : content}); document.dispatchEvent (event); });"); }
/// <summary> /// Need the GeckoWebBrowser , ImageElement , X-OffSet , Y-Offset (put 0.0F if you want offset), Width , height) /// Return true if the image was copied in the ClipBoard /// </summary> public bool CopyGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { GeckoCanvasElement canvas = CreateCanvasOfImageElement(browser, element, xOffset, yOffset, width, height); string data = canvas.toDataURL("image/png"); byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); Clipboard.SetImage(System.Drawing.Image.FromStream(new System.IO.MemoryStream(bytes))); return Clipboard.ContainsImage(); }
/// <summary> /// Need the GeckoWebBrowser , ImageElement , X-OffSet , Y-Offset (put 0.0F if you want offset), Width , height) /// Return true if the image was copied in the ClipBoard /// </summary> public bool CopyGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { string data = CopyImageElementToDataImageString(element, "image/png", xOffset, yOffset, width, height); if (data == null || !data.StartsWith("data:image/png;base64,")) return false; byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); Clipboard.SetImage(System.Drawing.Image.FromStream(new System.IO.MemoryStream(bytes))); return Clipboard.ContainsImage(); }
/// <summary> /// Need the GeckoWebBrowser , ImageElement , X-OffSet , Y-Offset (put 0.0F if you want offset), Width , height) /// Return the png image in data bytes[] /// </summary> public static byte[] ConvertGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { string data = CopyImageElementToDataImageString(element, "image/png", xOffset, yOffset, width, height); if (data == null || !data.StartsWith("data:image/png;base64,")) throw new InvalidOperationException(); byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); return bytes; }
/// <summary> /// Need the GeckoWebBrowser , ImageElement , X-OffSet , Y-Offset (put 0.0F if you want offset), Width , height) /// Return the png image in data bytes[] /// </summary> public static byte[] ConvertGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { string data = CopyImageElementToDataImageString(element, "image/png", xOffset, yOffset, width, height); if (data == null || !data.StartsWith("data:image/png;base64,")) { throw new InvalidOperationException(); } byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); return(bytes); }
public static async Task WaitUntilNavigatinFinished(this IGeckoWebBrowser browser) { var done = false; browser.DocumentCompleted += (sender, e) => done = true; browser.NavigationError += (sender, e) => done = true; browser.Retargeted += (sender, e) => done = true; while (!done) { await Task.Delay(50); } }
/// <summary> /// Need the GeckoWebBrowser , ImageElement , X-OffSet , Y-Offset (put 0.0F if you want offset), Width , height) /// Return true if the image was copied in the ClipBoard /// </summary> public bool CopyGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height) { string data = CopyImageElementToDataImageString(element, "image/png", xOffset, yOffset, width, height); if (data == null || !data.StartsWith("data:image/png;base64,")) { return(false); } byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); Clipboard.SetImage(System.Drawing.Image.FromStream(new System.IO.MemoryStream(bytes))); return(Clipboard.ContainsImage()); }
/// <summary> /// Get byte array with png image of the current browsers Window. /// Wpf methods on windows platform don't use a Bitmap :-/ /// Not captures plugin (Flash,etc...) windows /// </summary> /// <param name="xOffset"></param> /// <param name="yOffset"></param> /// <param name="width"></param> /// <param name="height"></param> /// <returns></returns> public static byte[] CanvasGetPngImage(IGeckoWebBrowser browser, uint xOffset, uint yOffset, uint width, uint height) { if (width == 0) throw new ArgumentException("width"); if (height == 0) throw new ArgumentException("height"); // Use of the canvas technique was inspired by: the abduction! firefox plugin by Rowan Lewis // https://addons.mozilla.org/en-US/firefox/addon/abduction/ // Some opertations fail without a proper JSContext. using (AutoJSContext jsContext = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { GeckoCanvasElement canvas = (GeckoCanvasElement)browser.Document.CreateElement("canvas"); canvas.Width = width; canvas.Height = height; nsIDOMHTMLCanvasElement canvasPtr = (nsIDOMHTMLCanvasElement)canvas.DomObject; nsIDOMCanvasRenderingContext2D context; using (nsAString str = new nsAString("2d")) { context = (nsIDOMCanvasRenderingContext2D)canvasPtr.MozGetIPCContext(str); } // the bitmap image needs to conform to the (Full)Zoom being applied, otherwise it will render wrongly var zoom = browser.GetMarkupDocumentViewer().GetFullZoomAttribute(); context.Scale(zoom, zoom); using (nsAString color = new nsAString("rgb(255,255,255)")) { context.DrawWindow((nsIDOMWindow)browser.Window.DomWindow, xOffset, yOffset, width, height, color, (uint)(nsIDOMCanvasRenderingContext2DConsts.DRAWWINDOW_DO_NOT_FLUSH | nsIDOMCanvasRenderingContext2DConsts.DRAWWINDOW_DRAW_VIEW | nsIDOMCanvasRenderingContext2DConsts.DRAWWINDOW_ASYNC_DECODE_IMAGES | nsIDOMCanvasRenderingContext2DConsts.DRAWWINDOW_USE_WIDGET_LAYERS)); ; } string data = canvas.toDataURL("image/png"); byte[] bytes = Convert.FromBase64String(data.Substring("data:image/png;base64,".Length)); return bytes; } }
public NavigateFinishedNotifier(IGeckoWebBrowser browser) { m_browser = browser; }
private static async Task <IEnumerable <string> > RetrieveBitbucketRepositoryLinks(IGeckoWebBrowser browser, string pageLink) { await browser.NavigateAndWait(pageLink); return(browser.GetElementsByJQuery(@"$(""a.repo-link"")").OfType <GeckoAnchorElement>().Select(element => element.Href).ToList()); }
public static JsVal ExecuteJQuery(IGeckoWebBrowser browser, string jQuery) { var jquery = new JQueryExecutor(browser.Window); return(jquery.ExecuteJQuery(jQuery)); }
public static IEnumerable <GeckoElement> GetElementsByJQuery(IGeckoWebBrowser browser, string jQuery) { var jquery = new JQueryExecutor(browser.Window); return(jquery.GetElementsByJQuery(jQuery)); }
public ImageCreator(IGeckoWebBrowser browser) { m_browser = browser; }
public static GeckoElement GetElementByJQuery(this IGeckoWebBrowser browser, string jQuery) { var jquery = new JQueryExecutor(browser.Window); return(jquery.GetElementByJQuery(jQuery)); }
public static byte[] CanvasGetPngImage(IGeckoWebBrowser browser,uint width, uint height) { return CanvasGetPngImage(browser,0, 0, width, height); }
public static async Task NavigateAndWait(this IGeckoWebBrowser browser, string url) { browser.Navigate(url); await browser.WaitUntilNavigatinFinished(); }