Remove instrumentation from public API surface

Fixes #1262
This commit is contained in:
Pranav K 2014-10-08 19:50:40 -07:00
parent 75084ba0cd
commit 20eadb94ee
11 changed files with 89 additions and 98 deletions

View File

@ -6,10 +6,10 @@ using Microsoft.AspNet.FileSystems;
namespace Microsoft.AspNet.Mvc.Razor namespace Microsoft.AspNet.Mvc.Razor
{ {
public interface ICompilerCache public interface ICompilerCache
{ {
CompilationResult GetOrAdd([NotNull] RelativeFileInfo fileInfo, CompilationResult GetOrAdd([NotNull] RelativeFileInfo fileInfo,
bool enableInstrumentation, bool enableInstrumentation,
[NotNull] Func<CompilationResult> compile); [NotNull] Func<CompilationResult> compile);
} }
} }

View File

@ -12,8 +12,7 @@ namespace Microsoft.AspNet.Mvc.Razor
/// Creates a <see cref="IRazorPage"/> for the specified path. /// Creates a <see cref="IRazorPage"/> for the specified path.
/// </summary> /// </summary>
/// <param name="relativePath">The path to locate the page.</param> /// <param name="relativePath">The path to locate the page.</param>
/// <param name="enableInstrumentation">Indicates that execution of the page should be instrumented.</param>
/// <returns>The IRazorPage instance if it exists, null otherwise.</returns> /// <returns>The IRazorPage instance if it exists, null otherwise.</returns>
IRazorPage CreateInstance(string relativePath, bool enableInstrumentation); IRazorPage CreateInstance(string relativePath);
} }
} }

View File

@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.PageExecutionInstrumentation;
namespace Microsoft.AspNet.Mvc.Razor namespace Microsoft.AspNet.Mvc.Razor
{ {
@ -18,8 +17,6 @@ namespace Microsoft.AspNet.Mvc.Razor
/// </summary> /// </summary>
/// <param name="razorPage">The <see cref="IRazorPage"/> instance to execute.</param> /// <param name="razorPage">The <see cref="IRazorPage"/> instance to execute.</param>
/// <param name="isPartial">Determines if the view is to be executed as a partial.</param> /// <param name="isPartial">Determines if the view is to be executed as a partial.</param>
void Contextualize(IRazorPage razorPage, void Contextualize(IRazorPage razorPage, bool isPartial);
bool isPartial,
IPageExecutionListenerFeature pageExecutionListenerFeature);
} }
} }

View File

@ -15,8 +15,7 @@ namespace Microsoft.AspNet.Mvc.Razor
/// that are applicable to the specified view. /// that are applicable to the specified view.
/// </summary> /// </summary>
/// <param name="path">The path of the page to locate ViewStart files for.</param> /// <param name="path">The path of the page to locate ViewStart files for.</param>
/// <param name="enableInstrumentation">Indicates that execution of the page should be instrumented.</param>
/// <returns>A sequence of <see cref="IRazorPage"/> that represent ViewStart.</returns> /// <returns>A sequence of <see cref="IRazorPage"/> that represent ViewStart.</returns>
IEnumerable<IRazorPage> GetViewStartPages(string path, bool enableInstrumentation); IEnumerable<IRazorPage> GetViewStartPages(string path);
} }
} }

View File

@ -44,12 +44,10 @@ namespace Microsoft.AspNet.Mvc.Razor
/// <inheritdoc /> /// <inheritdoc />
public virtual void Contextualize([NotNull] IRazorPage razorPage, public virtual void Contextualize([NotNull] IRazorPage razorPage,
bool isPartial, bool isPartial)
IPageExecutionListenerFeature pageExecutionListener)
{ {
_razorPage = razorPage; _razorPage = razorPage;
_isPartial = isPartial; _isPartial = isPartial;
_pageExecutionFeature = pageExecutionListener;
} }
/// <inheritdoc /> /// <inheritdoc />
@ -61,6 +59,8 @@ namespace Microsoft.AspNet.Mvc.Razor
throw new InvalidOperationException(message); throw new InvalidOperationException(message);
} }
_pageExecutionFeature = context.HttpContext.GetFeature<IPageExecutionListenerFeature>();
if (!_isPartial) if (!_isPartial)
{ {
var bodyWriter = await RenderPageAsync(_razorPage, context, executeViewStart: true); var bodyWriter = await RenderPageAsync(_razorPage, context, executeViewStart: true);
@ -131,7 +131,7 @@ namespace Microsoft.AspNet.Mvc.Razor
private async Task RenderViewStartAsync(ViewContext context) private async Task RenderViewStartAsync(ViewContext context)
{ {
var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path, EnableInstrumentation); var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path);
foreach (var viewStart in viewStarts) foreach (var viewStart in viewStarts)
{ {
@ -161,7 +161,7 @@ namespace Microsoft.AspNet.Mvc.Razor
throw new InvalidOperationException(message); throw new InvalidOperationException(message);
} }
var layoutPage = _pageFactory.CreateInstance(previousPage.Layout, EnableInstrumentation); var layoutPage = _pageFactory.CreateInstance(previousPage.Layout);
if (layoutPage == null) if (layoutPage == null)
{ {
var message = Resources.FormatLayoutCannotBeLocated(previousPage.Layout); var message = Resources.FormatLayoutCannotBeLocated(previousPage.Layout);

View File

@ -3,7 +3,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization; using System.Globalization;
using Microsoft.AspNet.Mvc.Razor.OptionDescriptors; using Microsoft.AspNet.Mvc.Razor.OptionDescriptors;
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.Rendering;
@ -37,9 +36,6 @@ namespace Microsoft.AspNet.Mvc.Razor
private readonly IRazorPageFactory _pageFactory; private readonly IRazorPageFactory _pageFactory;
private readonly IReadOnlyList<IViewLocationExpander> _viewLocationExpanders; private readonly IReadOnlyList<IViewLocationExpander> _viewLocationExpanders;
private readonly IViewLocationCache _viewLocationCache; private readonly IViewLocationCache _viewLocationCache;
// The RazorViewEngine is Request scoped which allows us to cache these value for the lifetime of a Request.
private bool _isPageExecutionFeatureInitialized;
private IPageExecutionListenerFeature _pageExecutionListenerFeature;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="RazorViewEngine" /> class. /// Initializes a new instance of the <see cref="RazorViewEngine" /> class.
@ -95,7 +91,7 @@ namespace Microsoft.AspNet.Mvc.Razor
{ {
if (viewName.EndsWith(ViewExtension, StringComparison.OrdinalIgnoreCase)) if (viewName.EndsWith(ViewExtension, StringComparison.OrdinalIgnoreCase))
{ {
var page = _pageFactory.CreateInstance(viewName, IsInstrumentationEnabled(context)); var page = _pageFactory.CreateInstance(viewName);
if (page != null) if (page != null)
{ {
return CreateFoundResult(context, page, viewName, partial); return CreateFoundResult(context, page, viewName, partial);
@ -137,7 +133,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var viewLocation = _viewLocationCache.Get(expanderContext); var viewLocation = _viewLocationCache.Get(expanderContext);
if (!string.IsNullOrEmpty(viewLocation)) if (!string.IsNullOrEmpty(viewLocation))
{ {
var page = _pageFactory.CreateInstance(viewLocation, IsInstrumentationEnabled(context)); var page = _pageFactory.CreateInstance(viewLocation);
if (page != null) if (page != null)
{ {
@ -163,9 +159,7 @@ namespace Microsoft.AspNet.Mvc.Razor
viewName, viewName,
controllerName, controllerName,
areaName); areaName);
var page = _pageFactory.CreateInstance(transformedPath);
var isInstrumentated = IsInstrumentationEnabled(context);
var page = _pageFactory.CreateInstance(transformedPath, isInstrumentated);
if (page != null) if (page != null)
{ {
// 3a. We found a page. Cache the set of values that produced it and return a found result. // 3a. We found a page. Cache the set of values that produced it and return a found result.
@ -190,9 +184,8 @@ namespace Microsoft.AspNet.Mvc.Razor
var services = actionContext.HttpContext.RequestServices; var services = actionContext.HttpContext.RequestServices;
var view = services.GetService<IRazorView>(); var view = services.GetService<IRazorView>();
Debug.Assert(_isPageExecutionFeatureInitialized, "IsInstrumentationEnabled must be called prior to this.");
view.Contextualize(page, partial, _pageExecutionListenerFeature); view.Contextualize(page, partial);
return ViewEngineResult.Found(viewName, view); return ViewEngineResult.Found(viewName, view);
} }
@ -200,16 +193,5 @@ namespace Microsoft.AspNet.Mvc.Razor
{ {
return name[0] == '~' || name[0] == '/'; return name[0] == '~' || name[0] == '/';
} }
private bool IsInstrumentationEnabled(ActionContext context)
{
if (!_isPageExecutionFeatureInitialized)
{
_isPageExecutionFeatureInitialized = true;
_pageExecutionListenerFeature = context.HttpContext.GetFeature<IPageExecutionListenerFeature>();
}
return _pageExecutionListenerFeature != null;
}
} }
} }

View File

@ -23,10 +23,10 @@ namespace Microsoft.AspNet.Mvc.Razor
} }
/// <inheritdoc /> /// <inheritdoc />
public IEnumerable<IRazorPage> GetViewStartPages([NotNull] string path, bool enableInstrumentation) public IEnumerable<IRazorPage> GetViewStartPages([NotNull] string path)
{ {
var viewStartLocations = ViewStartUtility.GetViewStartLocations(_fileSystem, path); var viewStartLocations = ViewStartUtility.GetViewStartLocations(_fileSystem, path);
var viewStarts = viewStartLocations.Select(p => _pageFactory.CreateInstance(p, enableInstrumentation)) var viewStarts = viewStartLocations.Select(_pageFactory.CreateInstance)
.Where(p => p != null) .Where(p => p != null)
.ToArray(); .ToArray();

View File

@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.PageExecutionInstrumentation;
using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection;
namespace Microsoft.AspNet.Mvc.Razor namespace Microsoft.AspNet.Mvc.Razor
@ -16,9 +18,22 @@ namespace Microsoft.AspNet.Mvc.Razor
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly IFileInfoCache _fileInfoCache; private readonly IFileInfoCache _fileInfoCache;
private readonly ICompilerCache _compilerCache; private readonly ICompilerCache _compilerCache;
private readonly bool _isInstrumentationEnabled;
private IRazorCompilationService _razorcompilationService; private IRazorCompilationService _razorcompilationService;
public VirtualPathRazorPageFactory(ITypeActivator typeActivator,
IServiceProvider serviceProvider,
ICompilerCache compilerCache,
IFileInfoCache fileInfoCache,
IContextAccessor<HttpContext> contextAccessor)
{
_activator = typeActivator;
_serviceProvider = serviceProvider;
_compilerCache = compilerCache;
_fileInfoCache = fileInfoCache;
_isInstrumentationEnabled = IsInstrumentationEnabled(contextAccessor.Value);
}
private IRazorCompilationService RazorCompilationService private IRazorCompilationService RazorCompilationService
{ {
get get
@ -27,26 +42,15 @@ namespace Microsoft.AspNet.Mvc.Razor
{ {
// it is ok to use the cached service provider because this service has // it is ok to use the cached service provider because this service has
// a lifetime of Scoped. // a lifetime of Scoped.
_razorcompilationService = _serviceProvider.GetService<IRazorCompilationService>(); _razorcompilationService = _serviceProvider.GetService<IRazorCompilationService>();
} }
return _razorcompilationService; return _razorcompilationService;
} }
} }
public VirtualPathRazorPageFactory(ITypeActivator typeActivator,
IServiceProvider serviceProvider,
ICompilerCache compilerCache,
IFileInfoCache fileInfoCache)
{
_activator = typeActivator;
_serviceProvider = serviceProvider;
_compilerCache = compilerCache;
_fileInfoCache = fileInfoCache;
}
/// <inheritdoc /> /// <inheritdoc />
public IRazorPage CreateInstance([NotNull] string relativePath, bool enableInstrumentation) public IRazorPage CreateInstance([NotNull] string relativePath)
{ {
if (relativePath.StartsWith("~/", StringComparison.Ordinal)) if (relativePath.StartsWith("~/", StringComparison.Ordinal))
{ {
@ -64,8 +68,10 @@ namespace Microsoft.AspNet.Mvc.Razor
RelativePath = relativePath, RelativePath = relativePath,
}; };
var result = _compilerCache.GetOrAdd(relativeFileInfo, enableInstrumentation, () => var result = _compilerCache.GetOrAdd(
RazorCompilationService.Compile(relativeFileInfo, enableInstrumentation)); relativeFileInfo,
_isInstrumentationEnabled,
() => RazorCompilationService.Compile(relativeFileInfo, _isInstrumentationEnabled));
var page = (IRazorPage)_activator.CreateInstance(_serviceProvider, result.CompiledType); var page = (IRazorPage)_activator.CreateInstance(_serviceProvider, result.CompiledType);
page.Path = relativePath; page.Path = relativePath;
@ -75,5 +81,10 @@ namespace Microsoft.AspNet.Mvc.Razor
return null; return null;
} }
private static bool IsInstrumentationEnabled(HttpContext context)
{
return context.GetFeature<IPageExecutionListenerFeature>() != null;
}
} }
} }

View File

@ -59,7 +59,8 @@ namespace Microsoft.AspNet.Mvc
// specific services. // specific services.
yield return describe.Transient<IViewEngineProvider, DefaultViewEngineProvider>(); yield return describe.Transient<IViewEngineProvider, DefaultViewEngineProvider>();
yield return describe.Scoped<ICompositeViewEngine, CompositeViewEngine>(); yield return describe.Scoped<ICompositeViewEngine, CompositeViewEngine>();
yield return describe.Singleton<IViewStartProvider, ViewStartProvider>(); // The ViewStartProvider needs to be able to consume scoped instances of IRazorPageFactory
yield return describe.Scoped<IViewStartProvider, ViewStartProvider>();
yield return describe.Transient<IRazorView, RazorView>(); yield return describe.Transient<IRazorView, RazorView>();
// Transient since the IViewLocationExpanders returned by the instance is cached by view engines. // Transient since the IViewLocationExpanders returned by the instance is cached by view engines.

View File

@ -183,7 +183,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
var page = Mock.Of<IRazorPage>(); var page = Mock.Of<IRazorPage>();
pageFactory.Setup(p => p.CreateInstance(It.IsAny<string>(), false)) pageFactory.Setup(p => p.CreateInstance(It.IsAny<string>()))
.Returns(Mock.Of<IRazorPage>()); .Returns(Mock.Of<IRazorPage>());
var viewEngine = CreateViewEngine(pageFactory.Object); var viewEngine = CreateViewEngine(pageFactory.Object);
var context = GetActionContext(_controllerTestContext); var context = GetActionContext(_controllerTestContext);
@ -203,7 +203,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
var page = Mock.Of<IRazorPage>(); var page = Mock.Of<IRazorPage>();
pageFactory.Setup(p => p.CreateInstance("fake-path1/bar/test-view.rzr", false)) pageFactory.Setup(p => p.CreateInstance("fake-path1/bar/test-view.rzr"))
.Returns(Mock.Of<IRazorPage>()) .Returns(Mock.Of<IRazorPage>())
.Verifiable(); .Verifiable();
var viewEngine = new OverloadedLocationViewEngine(pageFactory.Object, var viewEngine = new OverloadedLocationViewEngine(pageFactory.Object,
@ -224,7 +224,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
var page = Mock.Of<IRazorPage>(); var page = Mock.Of<IRazorPage>();
pageFactory.Setup(p => p.CreateInstance("fake-area-path/foo/bar/test-view2.rzr", false)) pageFactory.Setup(p => p.CreateInstance("fake-area-path/foo/bar/test-view2.rzr"))
.Returns(Mock.Of<IRazorPage>()) .Returns(Mock.Of<IRazorPage>())
.Verifiable(); .Verifiable();
var viewEngine = new OverloadedLocationViewEngine(pageFactory.Object, var viewEngine = new OverloadedLocationViewEngine(pageFactory.Object,
@ -273,7 +273,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("test-string/bar.cshtml", false)) pageFactory.Setup(p => p.CreateInstance("test-string/bar.cshtml"))
.Returns(Mock.Of<IRazorPage>()) .Returns(Mock.Of<IRazorPage>())
.Verifiable(); .Verifiable();
var expander1Result = new[] { "some-seed" }; var expander1Result = new[] { "some-seed" };
@ -325,9 +325,9 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("/Views/bar/baz.cshtml", false)) pageFactory.Setup(p => p.CreateInstance("/Views/bar/baz.cshtml"))
.Verifiable(); .Verifiable();
pageFactory.Setup(p => p.CreateInstance("/Views/Shared/baz.cshtml", false)) pageFactory.Setup(p => p.CreateInstance("/Views/Shared/baz.cshtml"))
.Returns(Mock.Of<IRazorPage>()) .Returns(Mock.Of<IRazorPage>())
.Verifiable(); .Verifiable();
var cache = GetViewLocationCache(); var cache = GetViewLocationCache();
@ -353,7 +353,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(MockBehavior.Strict); var pageFactory = new Mock<IRazorPageFactory>(MockBehavior.Strict);
pageFactory.Setup(p => p.CreateInstance("some-view-location", false)) pageFactory.Setup(p => p.CreateInstance("some-view-location"))
.Returns(Mock.Of<IRazorPage>()) .Returns(Mock.Of<IRazorPage>())
.Verifiable(); .Verifiable();
var expander = new Mock<IViewLocationExpander>(MockBehavior.Strict); var expander = new Mock<IViewLocationExpander>(MockBehavior.Strict);
@ -384,10 +384,10 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("expired-location", false)) pageFactory.Setup(p => p.CreateInstance("expired-location"))
.Returns((IRazorPage)null) .Returns((IRazorPage)null)
.Verifiable(); .Verifiable();
pageFactory.Setup(p => p.CreateInstance("some-view-location", false)) pageFactory.Setup(p => p.CreateInstance("some-view-location"))
.Returns(Mock.Of<IRazorPage>()) .Returns(Mock.Of<IRazorPage>())
.Verifiable(); .Verifiable();
var cacheMock = new Mock<IViewLocationCache>(); var cacheMock = new Mock<IViewLocationCache>();

View File

@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: true, pageExecutionListener: null); view.Contextualize(page, isPartial: true);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
var expected = viewContext.Writer; var expected = viewContext.Writer;
@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
activator.Object, activator.Object,
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: true, pageExecutionListener: null); view.Contextualize(page, isPartial: true);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
var expectedWriter = viewContext.Writer; var expectedWriter = viewContext.Writer;
activator.Setup(a => a.Activate(page, It.IsAny<ViewContext>())) activator.Setup(a => a.Activate(page, It.IsAny<ViewContext>()))
@ -104,7 +104,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
activator.Object, activator.Object,
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: true, pageExecutionListener: null); view.Contextualize(page, isPartial: true);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -126,16 +126,16 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
viewStartProvider); viewStartProvider);
view.Contextualize(page, isPartial: true, pageExecutionListener: null); view.Contextualize(page, isPartial: true);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
await view.RenderAsync(viewContext); await view.RenderAsync(viewContext);
// Assert // Assert
pageFactory.Verify(v => v.CreateInstance(It.IsAny<string>(), It.IsAny<bool>()), Times.Never()); pageFactory.Verify(v => v.CreateInstance(It.IsAny<string>()), Times.Never());
Mock.Get(viewStartProvider) Mock.Get(viewStartProvider)
.Verify(v => v.GetViewStartPages(It.IsAny<string>(), It.IsAny<bool>()), Times.Never()); .Verify(v => v.GetViewStartPages(It.IsAny<string>()), Times.Never());
} }
[Fact] [Fact]
@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
var original = viewContext.Writer; var original = viewContext.Writer;
@ -173,7 +173,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
var original = viewContext.Writer; var original = viewContext.Writer;
@ -198,7 +198,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
activator.Object, activator.Object,
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
@ -240,7 +240,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
activator.Object, activator.Object,
CreateViewStartProvider(viewStart1, viewStart2)); CreateViewStartProvider(viewStart1, viewStart2));
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -288,13 +288,13 @@ foot-content";
activator.Setup(a => a.Activate(layout, It.IsAny<ViewContext>())) activator.Setup(a => a.Activate(layout, It.IsAny<ViewContext>()))
.Verifiable(); .Verifiable();
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance(LayoutPath, false)) pageFactory.Setup(p => p.CreateInstance(LayoutPath))
.Returns(layout); .Returns(layout);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
activator.Object, activator.Object,
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -321,13 +321,13 @@ foot-content";
v.RenderBodyPublic(); v.RenderBodyPublic();
}); });
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance(LayoutPath, false)) pageFactory.Setup(p => p.CreateInstance(LayoutPath))
.Returns(layout); .Returns(layout);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act and Assert // Act and Assert
@ -347,13 +347,13 @@ foot-content";
{ {
}); });
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance(LayoutPath, false)) pageFactory.Setup(p => p.CreateInstance(LayoutPath))
.Returns(layout); .Returns(layout);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act and Assert // Act and Assert
@ -399,15 +399,15 @@ body-content";
v.RenderBodyPublic(); v.RenderBodyPublic();
}); });
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml", false)) pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml"))
.Returns(layout1); .Returns(layout1);
pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout2.cshtml", false)) pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout2.cshtml"))
.Returns(layout2); .Returns(layout2);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -447,13 +447,13 @@ section-content-2";
}); });
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("layout-1", false)) pageFactory.Setup(p => p.CreateInstance("layout-1"))
.Returns(layout1); .Returns(layout1);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -491,13 +491,13 @@ section-content-2";
}); });
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("layout-1", false)) pageFactory.Setup(p => p.CreateInstance("layout-1"))
.Returns(layout1); .Returns(layout1);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -523,7 +523,7 @@ section-content-2";
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act and Assert // Act and Assert
@ -558,13 +558,13 @@ section-content-2";
v.Layout = "~/Shared/Layout2.cshtml"; v.Layout = "~/Shared/Layout2.cshtml";
}); });
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml", false)) pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml"))
.Returns(layout1); .Returns(layout1);
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider()); CreateViewStartProvider());
view.Contextualize(page, isPartial: false, pageExecutionListener: null); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act and Assert // Act and Assert
@ -627,17 +627,18 @@ section-content-2";
layout.Path = "/Layout.cshtml"; layout.Path = "/Layout.cshtml";
var pageFactory = new Mock<IRazorPageFactory>(); var pageFactory = new Mock<IRazorPageFactory>();
pageFactory.Setup(p => p.CreateInstance("/Layout.cshtml", true)) pageFactory.Setup(p => p.CreateInstance("/Layout.cshtml"))
.Returns(layout); .Returns(layout);
var viewStartProvider = new Mock<IViewStartProvider>(); var viewStartProvider = new Mock<IViewStartProvider>();
viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny<string>(), true)) viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny<string>()))
.Returns(Enumerable.Empty<IRazorPage>()) .Returns(Enumerable.Empty<IRazorPage>())
.Verifiable(); .Verifiable();
var view = new RazorView(pageFactory.Object, var view = new RazorView(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
viewStartProvider.Object); viewStartProvider.Object);
view.Contextualize(page, isPartial: false, pageExecutionListener: feature.Object); view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
viewContext.HttpContext.SetFeature<IPageExecutionListenerFeature>(feature.Object);
// Act // Act
await view.RenderAsync(viewContext); await view.RenderAsync(viewContext);
@ -672,9 +673,10 @@ section-content-2";
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
Mock.Of<IViewStartProvider>()); Mock.Of<IViewStartProvider>());
view.Contextualize(page, isPartial: true, pageExecutionListener: feature.Object); view.Contextualize(page, isPartial: true);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
viewContext.Writer = writer; viewContext.Writer = writer;
viewContext.HttpContext.SetFeature<IPageExecutionListenerFeature>(feature.Object);
// Act // Act
await view.RenderAsync(viewContext); await view.RenderAsync(viewContext);
@ -700,7 +702,7 @@ section-content-2";
var view = new RazorView(Mock.Of<IRazorPageFactory>(), var view = new RazorView(Mock.Of<IRazorPageFactory>(),
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
Mock.Of<IViewStartProvider>()); Mock.Of<IViewStartProvider>());
view.Contextualize(page, isPartial, pageExecutionListener: null); view.Contextualize(page, isPartial);
var viewContext = CreateViewContext(view); var viewContext = CreateViewContext(view);
// Act // Act
@ -734,7 +736,7 @@ section-content-2";
{ {
viewStartPages = viewStartPages ?? new IRazorPage[0]; viewStartPages = viewStartPages ?? new IRazorPage[0];
var viewStartProvider = new Mock<IViewStartProvider>(); var viewStartProvider = new Mock<IViewStartProvider>();
viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny<string>(), false)) viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny<string>()))
.Returns(viewStartPages); .Returns(viewStartPages);
return viewStartProvider.Object; return viewStartProvider.Object;