public AssetSchemeHandler(BrowserConfig config, CefRequest request)
        {
            this.config = config;
            isComplete = false;

            length = remaining = -1;
        }
        public BrowserSource(XElement configElement)
        {
            this.configElement = configElement;
            this.browserConfig = new BrowserConfig();
            this.textureMap = new Dictionary<IntPtr, Texture>();

            UpdateSettings();
        }
        public ConfigDialog(XElement dataElement)
        {
            InitializeComponent();
            this.dataElement = dataElement;

            config = new BrowserConfig();
            config.Reload(dataElement);

            cssEditor = new TextEditor
            {
                FontFamily = new FontFamily("Consolas"),
                SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("CSS"),
                ShowLineNumbers = true,
                Options =
                {
                    ConvertTabsToSpaces = true,
                    IndentationSize = 2
                }
            };

            templateEditor = new TextEditor
            {
                FontFamily = new FontFamily("Consolas"),
                SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("HTML"),
                ShowLineNumbers = true,
                Options =
                {
                    ConvertTabsToSpaces = true,
                    IndentationSize = 2
                }
            };

            advancedPropertiesCheckBox.IsChecked = config.BrowserSourceSettings.IsShowingAdvancedProperties;
            SetTabVisibility(advancedTab, config.BrowserSourceSettings.IsShowingAdvancedProperties);

            SetTabVisibility(templateTab, config.BrowserSourceSettings.IsApplyingTemplate);

            url.Text = config.BrowserSourceSettings.Url;
            cssEditor.Text = config.BrowserSourceSettings.CSS;
            templateEditor.Text = config.BrowserSourceSettings.Template;
            widthText.Text = config.BrowserSourceSettings.Width.ToString();
            heightText.Text = config.BrowserSourceSettings.Height.ToString();
            opacitySlider.Value = config.BrowserSourceSettings.Opacity;
            fpsTextBox.Text = config.BrowserSourceSettings.Fps.ToString();

            applyTemplateCheckBox.IsChecked = config.BrowserSourceSettings.IsApplyingTemplate;

            instanceSettings.SelectedObject = config.BrowserInstanceSettings;

            cssGrid.Children.Add(cssEditor);
            templateGrid.Children.Add(templateEditor);
        }
        public override bool ShowConfiguration(XElement data)
        {
            ConfigDialog dialog = new ConfigDialog(data);
            if (dialog.ShowDialog().GetValueOrDefault(false))
            {
                BrowserConfig config = new BrowserConfig();
                config.Reload(data);

                data.Parent.SetFloat("cx", (float)config.BrowserSourceSettings.Width);
                data.Parent.SetFloat("cy", (float)config.BrowserSourceSettings.Height);

                return true;
            }
            else
            {
                return false;
            }
        }
        public bool CreateBrowser(BrowserSource browserSource, BrowserConfig browserConfig)
        {
            Debug.Assert(Status == BrowserStatus.Initial);

            InitClient(browserSource);

            Debug.Assert(browserClient != null);
            Debug.Assert(browserConfig != null);

            BrowserConfig = browserConfig;

            CefWindowInfo windowInfo = CefWindowInfo.Create();
            windowInfo.TransparentPainting = true;
            windowInfo.SetAsOffScreen(IntPtr.Zero);
            windowInfo.Width = (int)browserConfig.BrowserSourceSettings.Width;
            windowInfo.Height = (int)browserConfig.BrowserSourceSettings.Height;
            windowInfo.MenuHandle = IntPtr.Zero;
            windowInfo.ParentHandle = IntPtr.Zero;

            String base64EncodedDataUri = "data:text/css;charset=utf-8;base64,";
            String base64EncodedCss = Convert.ToBase64String(Encoding.UTF8.GetBytes(browserConfig.BrowserSourceSettings.CSS));

            BrowserInstanceSettings settings = AbstractSettings.DeepClone(BrowserSettings.Instance.InstanceSettings);
            settings.MergeWith(browserConfig.BrowserInstanceSettings);

            CefBrowserSettings browserSettings = new CefBrowserSettings {
                AcceleratedCompositing = settings.AcceleratedCompositing,
                ApplicationCache = settings.ApplicationCache,
                AuthorAndUserStyles = settings.AuthorAndUserStyles,
                CaretBrowsing = settings.CaretBrowsing,
                CursiveFontFamily = settings.CursiveFontFamily,
                Databases = settings.Databases,
                DefaultEncoding = settings.DefaultEncoding,
                DefaultFixedFontSize = settings.DefaultFixedFontSize,
                DefaultFontSize = settings.DefaultFontSize,
                DeveloperTools = settings.DeveloperTools,
                FantasyFontFamily = settings.FantasyFontFamily,
                FileAccessFromFileUrls = settings.FileAccessFromFileUrls,
                FixedFontFamily = settings.FixedFontFamily,
                ImageLoading = settings.ImageLoading,
                ImageShrinkStandaloneToFit = settings.ImageShrinkStandaloneToFit,
                Java = settings.Java,
                JavaScript = settings.JavaScript,
                JavaScriptAccessClipboard = settings.JavaScriptAccessClipboard,
                JavaScriptCloseWindows = settings.JavaScriptCloseWindows,
                JavaScriptDomPaste = settings.JavaScriptDomPaste,
                JavaScriptOpenWindows = settings.JavaScriptOpenWindows,
                LocalStorage = settings.LocalStorage,
                MinimumFontSize = settings.MinimumFontSize,
                MinimumLogicalFontSize = settings.MinimumLogicalFontSize,
                PageCache = settings.PageCache,
                Plugins = settings.Plugins,
                RemoteFonts = settings.RemoteFonts,
                SansSerifFontFamily = settings.SansSerifFontFamily,
                SerifFontFamily = settings.SerifFontFamily,
                StandardFontFamily = settings.StandardFontFamily,
                //TabToLinks = settings.TabToLinks,
                //TextAreaResize = settings.TextAreaResize,
                UniversalAccessFromFileUrls = settings.UniversalAccessFromFileUrls,
                UserStyleSheetLocation = base64EncodedDataUri + base64EncodedCss,
                WebGL = settings.WebGL,
                WebSecurity = settings.WebSecurity,
            };

            String url = browserConfig.BrowserSourceSettings.Url;

            if (browserConfig.BrowserSourceSettings.IsApplyingTemplate)
            {
                String resolvedTemplate = browserConfig.BrowserSourceSettings.Template;
                resolvedTemplate = resolvedTemplate.Replace("$(FILE)", browserConfig.BrowserSourceSettings.Url);
                resolvedTemplate = resolvedTemplate.Replace("$(WIDTH)", browserConfig.BrowserSourceSettings.Width.ToString());
                resolvedTemplate = resolvedTemplate.Replace("$(HEIGHT)", browserConfig.BrowserSourceSettings.Height.ToString());

                url = "http://absolute";
            }

            // must be sync invoke because wrapper can be destroyed before it is run

            try
            {
                // Since the event methods can be called before the next statement
                // set the status before we call it
                Status = BrowserStatus.Creating;
                CefBrowserHost.CreateBrowser(windowInfo, browserClient, browserSettings, url);
            }
            catch (InvalidOperationException e)
            {
                API.Instance.Log("BrowserWrapper::CreateBrowser failed; {0}", e.Message);
                UninitClient();
                return false;
            }

            BrowserManager.Instance.IncrementBrowserInstanceCount();

            return true;
        }