Skip to content

Commit

Permalink
Update Web browser control for Markdown Previewer (microsoft#1464)
Browse files Browse the repository at this point in the history
* Updated Webbrowser control

* Updated Unit tests

* Disabled Navigation for Svg Previewer
  • Loading branch information
udit3333 committed Mar 10, 2020
1 parent bb0076e commit efc711e
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using Common;
using Markdig;
using MarkdownPreviewHandler.Properties;
using PreviewHandlerCommon;

namespace MarkdownPreviewHandler
{
Expand Down Expand Up @@ -46,9 +47,9 @@ public class MarkdownPreviewHandlerControl : FormHandlerControl
private RichTextBox infoBar;

/// <summary>
/// WebBrowser control to display markdown html.
/// Extended Browser Control to display markdown html.
/// </summary>
private WebBrowser browser;
private WebBrowserExt browser;

/// <summary>
/// True if external image is blocked, false otherwise.
Expand Down Expand Up @@ -85,17 +86,17 @@ public override void DoPreview<T>(T dataSource)
MarkdownPipeline pipeline = this.pipelineBuilder.Build();
string parsedMarkdown = Markdown.ToHtml(fileText, pipeline);
sb.AppendFormat("{0}{1}{2}", this.htmlHeader, parsedMarkdown, this.htmlFooter);
string markdownHTML = this.RemoveScriptFromHTML(sb.ToString());
string markdownHTML = sb.ToString();

this.browser = new WebBrowser
this.browser = new WebBrowserExt
{
DocumentText = markdownHTML,
Dock = DockStyle.Fill,
IsWebBrowserContextMenuEnabled = false,
ScriptErrorsSuppressed = true,
ScrollBarsEnabled = true,
AllowNavigation = false,
};
this.browser.Navigating += this.WebBrowserNavigating;
this.Controls.Add(this.browser);

if (this.infoBarDisplayed)
Expand All @@ -121,23 +122,6 @@ public override void DoPreview<T>(T dataSource)
});
}

/// <summary>
/// Removes script tag from html string.
/// </summary>
/// <param name="html">html string.</param>
/// <returns>HTML string without script tag.</returns>
public string RemoveScriptFromHTML(string html)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

doc.DocumentNode.Descendants()
.Where(n => n.Name == "script")
.ToList()
.ForEach(n => n.Remove());
return doc.DocumentNode.InnerHtml;
}

/// <summary>
/// Gets a textbox control.
/// </summary>
Expand Down Expand Up @@ -191,16 +175,5 @@ private void ImagesBlockedCallBack()
{
this.infoBarDisplayed = true;
}

/// <summary>
/// Callback when link tag is clicked in html.
/// </summary>
/// <param name="sender">Reference to resized control.</param>
/// <param name="e">Provides data for the WebBrowserNavigatingEventArgs event.</param>
private void WebBrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
e.Cancel = true;
Process.Start(e.Url.ToString());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Markdig;
using MarkdownPreviewHandler;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PreviewHandlerCommon;

namespace PreviewPaneUnitTests
{
Expand All @@ -24,7 +25,7 @@ public void MarkdownPreviewHandlerControl__AddsBrowserToForm_WhenDoPreviewIsCall

// Assert
Assert.AreEqual(markdownPreviewHandlerControl.Controls.Count, 2);
Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowser));
Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowserExt));
}

[TestMethod]
Expand Down Expand Up @@ -52,7 +53,7 @@ public void MarkdownPreviewHandlerControl__DoesNotAddInfoBarToFormIfExternalImag

// Assert
Assert.AreEqual(markdownPreviewHandlerControl.Controls.Count, 1);
Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowser));
Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowserExt));
}

[TestMethod]
Expand All @@ -65,12 +66,13 @@ public void MarkdownPreviewHandlerControl__UpdatesWebBrowserSettings_WhenDoPrevi
markdownPreviewHandlerControl.DoPreview<string>("HelperFiles/MarkdownWithExternalImage.txt");

// Assert
Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowser));
Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowserExt));
Assert.IsNotNull(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).DocumentText);
Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).Dock, DockStyle.Fill);
Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).IsWebBrowserContextMenuEnabled, false);
Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).ScriptErrorsSuppressed, true);
Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).ScrollBarsEnabled, true);
Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).AllowNavigation, false);
}

[TestMethod]
Expand All @@ -90,19 +92,5 @@ public void MarkdownPreviewHandlerControl__UpdateInfobarSettings_WhenDoPreviewIs
Assert.AreEqual(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).BackColor, Color.LightYellow);
Assert.AreEqual(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).Multiline, true);
}

[TestMethod]
public void MarkdownPreviewHandlerControl_RemovesScriptTags_RemoveScriptFromHTMLIsCalled()
{
// Arrange
MarkdownPreviewHandlerControl markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl();
string html = "<html><style></style><script>alert(\"hello\");</script><script></script></html>";

// Act
string parsedHTML = markdownPreviewHandlerControl.RemoveScriptFromHTML(html);

// Assert
Assert.AreEqual(parsedHTML, "<html>\r\n <style></style>\r\n</html>");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ private void AddBrowserControl(string svgData)
this.browser.IsWebBrowserContextMenuEnabled = false;
this.browser.ScriptErrorsSuppressed = true;
this.browser.ScrollBarsEnabled = true;
this.browser.AllowNavigation = false;
this.Controls.Add(this.browser);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,19 @@ public void SvgPreviewControl_ShouldSetScrollBarsEnabledProperty_WhenDoPreviewCa
Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).ScrollBarsEnabled, true);
}

[TestMethod]
public void SvgPreviewControl_ShouldDisableAllowNavigation_WhenDoPreviewCalled()
{
// Arrange
var svgPreviewControl = new SvgPreviewControl();

// Act
svgPreviewControl.DoPreview(GetMockStream("<svg></svg>"));

// Assert
Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).AllowNavigation, false);
}

[TestMethod]
public void SvgPreviewControl_ShouldAddValidInfoBar_IfSvgPreviewThrows()
{
Expand Down

0 comments on commit efc711e

Please sign in to comment.