private static RenderHtmlWriterDirective AddRenderHtmlDirective(WebFormsControlPageCompositionElement placedRendering, Control contentPlaceHolder)
        {
            var compositionElement = (WebFormsControlPageCompositionElement)placedRendering;
            var wrapped            = new RenderHtmlWriterDirective(compositionElement);

            contentPlaceHolder.Controls.Add(wrapped);
            wrapped.Initialize();
            return(wrapped);
        }
        public RenderingFragmentCollection Execute(PageCompositionElement pp)
        {
            SwitchingHtmlWriter _writer = new SwitchingHtmlWriter();


            var isWebFormsInChargeOfPageBase = pp is WebFormsPageCompositionElement;

            if (isWebFormsInChargeOfPageBase)
            {
                var nativePageRendering = (WebFormsPageCompositionElement)pp;
                var nativePage          = nativePageRendering.GetPage();
                nativePage.PreInit += (sender, args) =>
                {
                    var topMostControl = nativePage.GetRootControl();
                    foreach (var ph in pp.PlaceHolders.Values)
                    {
                        var contentPlaceHolder = topMostControl.FindControl(ph.Id);
                        contentPlaceHolder.Controls.Add(new SubsitutionHtmlWriterDirective(ph));
                    }

                    BuildServerSidePage(topMostControl, pp);
                };
                nativePage.Init += (sender, args) =>
                {
                };
                nativePage.InitComplete += (sender, args) =>
                {
                    if (nativePage.Header == null)
                    {
                        throw new Exception(
                                  "Add a <head runat='server'> tag in order to use this master page as a layout.");
                    }

                    if (nativePage.Form == null)
                    {
                        throw new Exception(
                                  "Add a <form runat='server'> tag in order to use this master page as a layout.");
                    }


                    nativePage.Header.Controls.Add(new GlobalSubstitionComponent(GlobalLayoutPlaceHolderIds.Head));
                    nativePage.Form.Controls.Add(new GlobalSubstitionComponent(GlobalLayoutPlaceHolderIds.Scripts));
                    nativePage.Form.Controls.Add(new GlobalSubstitionComponent(GlobalLayoutPlaceHolderIds.InternalStateTracking));
                };


                _writer.BeginWriting(pp);


                var originalHandler = HttpContext.Current.Handler;
                try
                {
                    HttpContext.Current.Handler = nativePage; // required in order to process postbacks.
                                                              // if aspnet thinks that another renderer is in charge of the
                                                              // the execution, then 'GET' content is returned only.

                    HttpContext.Current.Server.Execute(nativePage, _writer, true);
                }
                finally
                {
                    HttpContext.Current.Handler = originalHandler;
                }

                _writer.EndWriting();
            }
            else
            {
                var nativeRoot = new System.Web.UI.Page();
                var body       = new HtmlGenericControl("body");
                var form       = new HtmlGenericControl("form");


                var wrapper = new RenderHtmlWriterDirective(new WebFormsControlPageCompositionElement(body)
                {
                    ContentId = SpecialRenderingFragmentContentIds.WebFormsInterop
                });
                wrapper.Controls.Add(body);
                wrapper.Initialize();

                body.Controls.Add(form);
                nativeRoot.Controls.Add(wrapper);

                foreach (var placeholder in pp.PlaceHolders)
                {
                    form.Controls.Add(new ContentPlaceHolder {
                        ID = placeholder.Value.Id
                    });
                }

                BuildServerSidePage(nativeRoot, pp);
                HttpContext.Current.Server.Execute(nativeRoot, _writer, true);
            }

            return(new RenderingFragmentCollection
            {
                RenderingResults = _writer.output,
            });
        }