Пример #1
0
        public async void LoadUrl(string?url)
        {
            Uri uri = new Uri(url ?? string.Empty, UriKind.RelativeOrAbsolute);

            if (!uri.IsAbsoluteUri)
            {
                await EnsureCoreWebView2Async();

                CoreWebView2.SetVirtualHostNameToFolderMapping(
                    LocalHostName,
                    ApplicationPath,
                    Web.WebView2.Core.CoreWebView2HostResourceAccessKind.Allow);

                uri = new Uri(LocalScheme + url, UriKind.RelativeOrAbsolute);
            }

            // TODO: Sync Cookies

            try
            {
                Source = uri;
            }
            catch (Exception exc)
            {
                Debug.WriteLine(nameof(MauiWebView), $"Failed to load: {uri} {exc}");
            }
        }
Пример #2
0
        internal async static Task <string> ExtractTextAsJson(CoreWebView2 webview, bool displayColoredRectangles)
        {
            var extractTextCommand = String.Format(JS_COMMAND, displayColoredRectangles.ToString().ToLower());
            var jsonResult         = await ExecuteJavascriptCodeAsync(webview, extractTextCommand);

            return(jsonResult);
        }
Пример #3
0
        public async void ShouldInterceptRequest(CoreWebView2 view, CoreWebView2WebResourceRequestedEventArgs args)
        {
            //var uri = args.Request.RequestUri;
            var uri = new Uri(args.Request.Uri);
            int index;

            // walk up our multipart/related stack looking for the MIME part for the requested URL
            for (int i = stack.Count - 1; i >= 0; i--)
            {
                var related = stack[i];

                if ((index = related.IndexOf(uri)) == -1)
                {
                    continue;
                }

                if (related[index] is MimePart part)
                {
                    var mimeType = part.ContentType.MimeType;
                    var charset  = part.ContentType.Charset;
                    var stream   = part.Content.Open();

                    // construct our response containing the decoded content
                    // https://stackoverflow.com/questions/7669311/is-there-a-way-to-convert-a-system-io-stream-to-a-windows-storage-streams-irando
                    var memStream = new MemoryStream();
                    await stream.CopyToAsync(memStream);

                    memStream.Position = 0;
                    args.Response      = view.Environment.CreateWebResourceResponse(memStream.AsRandomAccessStream(), 200, "OK", $"Content-Type: {mimeType}; charset={charset}");
                }
            }
        }
Пример #4
0
        private async void NewTab(string startUrl)
        {
            TabPage page = new TabPage("新标签页")
            {
                Padding = new Padding(0, 0, 0, 0)
            };
            WebView2 browser = new WebView2
            {
                Source = new Uri(startUrl),
                Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom,
                Dock   = DockStyle.Fill
            };
            CoreWebView2Environment ev = await CoreWebView2Environment.CreateAsync(null, AppContext.BaseDirectory);

            await browser.EnsureCoreWebView2Async(ev);

            CoreWebView2 coreWebView2 = browser.CoreWebView2;

            //Event Start

            coreWebView2.SourceChanged += (s, e) =>
            {
                BeginInvoke(new Action(() =>
                {
                    addressTextBox.Text = coreWebView2.Source;
                }));
            };
            coreWebView2.DocumentTitleChanged += (s, e) =>
            {
                BeginInvoke(new Action(() =>
                {
                    var title = coreWebView2.DocumentTitle;
                    if (title != null)
                    {
                        if (tabControl.SelectedTab == page)
                        {
                            Text = coreWebView2.DocumentTitle + " - " + _mainTitle;
                        }
                        page.ToolTipText = title;
                        if (title.Length > size)
                        {
                            title = title.Substring(0, size) + "...";
                        }
                        page.Text = title;
                    }
                }));
            };
            refreshToolStripButton.Image      = CloseImage;
            refreshToolStripButton.Click     += stopRefreshToolStripButton_Click;
            coreWebView2.NavigationCompleted += (s, e) =>
            {
                refreshToolStripButton.Image  = RefreshImage;
                refreshToolStripButton.Click += refreshToolStripButton_Click;
            };
            coreWebView2.NewWindowRequested += OnNewWindowRequested;

            page.Controls.Add(browser);
            tabControl.TabPages.Add(page);
            tabControl.SelectedTab = page;
        }
Пример #5
0
        private void BrowserWindow_ContainsFullScreenElementChanged(CoreWebView2 sender, object args)
        {
            var applicationView = ApplicationView.GetForCurrentView();

            if (sender.ContainsFullScreenElement)
            {
                CommBar.Visibility  = Visibility.Collapsed;
                TitleBar.Visibility = Visibility.Collapsed;

                if (applicationView.ViewMode == ApplicationViewMode.Default)
                {
                    applicationView.TryEnterFullScreenMode();
                }
                else if (applicationView.ViewMode == ApplicationViewMode.CompactOverlay)
                {
                    // 281 = 500 * (9/16)
                    bool success = applicationView.TryResizeView(new Windows.Foundation.Size(500, 281));
                }
            }
            else
            {
                CommBar.Visibility  = Visibility.Visible;
                TitleBar.Visibility = Visibility.Visible;

                if (applicationView.IsFullScreenMode)
                {
                    applicationView.ExitFullScreenMode();
                }
                else if (applicationView.ViewMode == ApplicationViewMode.CompactOverlay)
                {
                    bool success = applicationView.TryResizeView(new Windows.Foundation.Size(500, 500)); // Max size
                }
            }
        }
Пример #6
0
        internal static async Task <string> GetUniqueFileNameFromURLAsync(CoreWebView2 webview)
        {
            var url = await JavascriptInterop.ExecuteJavascriptCodeAsync(webview, "document.location.href");

            var fileName = HtmlFileUtils.GetFileNameFromUri(url);

            return(fileName);
        }
Пример #7
0
 public void Initialize(CoreWebView2 wv2)
 {
     this._tabItem.Initialize(wv2);
     this.CloseCommand.Subscribe(() =>
     {
         this._tabItem.Close();
     });
 }
Пример #8
0
        internal async static Task <PageElement> ExtractTextAsPageElementsAsync(CoreWebView2 webview, bool displayColoredRectangles)
        {
            var jsonResult = await ExtractTextAsJson(webview, displayColoredRectangles);

            var pageTree = ConvertJsonToPageElements(jsonResult);

            return(pageTree);
        }
Пример #9
0
        public async void LoadHtml(string?html, string?baseUrl)
        {
            var mapBaseDirectory = false;

            if (string.IsNullOrEmpty(baseUrl))
            {
                baseUrl          = LocalScheme;
                mapBaseDirectory = true;
            }

            // Generate a base tag for the document
            var baseTag = $"<base href=\"{baseUrl}\"></base>";

            string htmlWithBaseTag;

            // Set up an internal WebView we can use to load and parse the original HTML string
            // Make _internalWebView a field instead of local variable to avoid garbage collection
            _internalWebView = new WebView2();

            // TODO: For now, the CoreWebView2 won't be created without either setting Source or
            // calling EnsureCoreWebView2Async().
            await _internalWebView.EnsureCoreWebView2Async();

            // When the 'navigation' to the original HTML string is done, we can modify it to include our <base> tag
            _internalWebView.NavigationCompleted += async(sender, args) =>
            {
                // Generate a version of the <base> script with the correct <base> tag
                var script = BaseInsertionScript.Replace("baseTag", baseTag, StringComparison.Ordinal);

                // Run it and retrieve the updated HTML from our WebView
                await sender.ExecuteScriptAsync(script);

                htmlWithBaseTag = await sender.ExecuteScriptAsync("document.documentElement.outerHTML;");

                htmlWithBaseTag = Regex.Unescape(htmlWithBaseTag);
                htmlWithBaseTag = htmlWithBaseTag.Remove(0, 1);
                htmlWithBaseTag = htmlWithBaseTag.Remove(htmlWithBaseTag.Length - 1, 1);

                await EnsureCoreWebView2Async();

                if (mapBaseDirectory)
                {
                    CoreWebView2.SetVirtualHostNameToFolderMapping(
                        LocalHostName,
                        ApplicationPath,
                        Web.WebView2.Core.CoreWebView2HostResourceAccessKind.Allow);
                }

                // Set the HTML for the 'real' WebView to the updated HTML
                NavigateToString(!string.IsNullOrEmpty(htmlWithBaseTag) ? htmlWithBaseTag : html);

                // Free up memory after we're done with _internalWebView
                _internalWebView = null;
            };

            // Kick off the initial navigation
            _internalWebView.NavigateToString(html);
        }
 public void CompleteNewTabInitialize(CoreWebView2 coreWebView)
 {
     if (Def != null)
     {
         Args.NewWindow = coreWebView;
         Args.Handled   = true;
         Def.Complete();
         Def = null;
     }
 }
Пример #11
0
        private async void NavigationStarting(CoreWebView2 coreWebView2, CoreWebView2NavigationStartingEventArgs args)
        {
            if (PixivAPI.Utils.CheckUrlLogin(args.Uri, out string code))
            {
                var result = await Instances.Get <PixivAPI.AuthClient>().InitAuthToken(code, this.args !.CodeVerifier);

                Instances.Get <IAccountService>().Add(result);
                this.args.LoginSuccessCallback.Invoke();
            }
        }
 public void CompleteNewTabInitialize(CoreWebView2 coreWebView)
 {   //When changing WPF Tab Items everything initializes again.
     if (Def != null)
     {
         Args.NewWindow = coreWebView;
         Args.Handled   = true;
         Def.Complete();
         Def = null;
     }
 }
Пример #13
0
        // Create a new event monitor window that monitors events from
        // the provided WebView2 and its corresponding CoreWebView2.
        public EventMonitor(WebView2 webview2)
        {
            _webview2     = webview2;
            _coreWebView2 = webview2.CoreWebView2;

            InitializeComponent();
            LayoutControls();

            SubscribeToEvents();
        }
Пример #14
0
 public void Initialize(CoreWebView2 wv2)
 {
     if (this._isInitialized)
     {
         return;
     }
     this._webView2Handler.Initialize(wv2);
     this._webView2Handler.RegisterFilterFunc(url => this._tabInfomation.CanAccess(url));
     this._webView2Handler.AddMessageHandler(this.OnMessage);
     this.OnInitialize();
     this._isInitialized = true;
 }
        public AsyncDataProviderInterface(CoreWebView2 webView)
        {
            _webView = webView;

            string channelJson = File.ReadAllText("ExternalData\\channelList.json");

            //this.channelJson = channelJson; // To remove once null object situation is resolved.
            channelData = JsonConvert.DeserializeObject <List <VestelSdkChannelDefinition> >(channelJson);

            string JScode = ResourceLoader.GetJsResource("AsyncDataProviderInterface.js");

            _webView.AddScriptToExecuteOnDocumentCreatedAsync(JScode);
        }
Пример #16
0
        public void Initialize(CoreWebView2 wv2)
        {
            if (this.isInitialized)
            {
                return;
            }

            this.wv2 = wv2;
            this.ctx = SynchronizationContext.Current;
            this.wv2.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All);
            this.wv2.WebResourceRequested += this.OnNavigate;
            this.isInitialized             = true;
        }
Пример #17
0
 public TableOfTime(CoreWebView2 vistaHtml, Chart diagrama, DataGridView grid)
 {
     this._vistaHtml = vistaHtml;
     this._diagrama  = diagrama;
     this._grid      = grid;
     this._vistaHtml.NavigationStarting          += _vistaHtml_NavigationStarting;
     this._vistaHtml.ContentLoading              += _vistaHtml_ContentLoading;
     this._vistaHtml.NavigationCompleted         += _vistaHtml_NavigationCompleted;
     this._vistaHtml.DOMContentLoaded            += _vistaHtml_DOMContentLoaded;
     this._vistaHtml.FrameNavigationCompleted    += _vistaHtml_FrameNavigationCompleted;
     this._vistaHtml.FrameNavigationStarting     += _vistaHtml_FrameNavigationStarting;
     this._vistaHtml.WebMessageReceived          += _vistaHtml_WebMessageReceived;
     this._vistaHtml.WebResourceRequested        += _vistaHtml_WebResourceRequested;
     this._vistaHtml.WebResourceResponseReceived += _vistaHtml_WebResourceResponseReceived;
 }
Пример #18
0
        public static void DisableEdgeFeatures([NotNull] this CoreWebView2 coreWeb)
        {
            if (coreWeb == null)
            {
                throw new ArgumentNullException(nameof(coreWeb));
            }

            coreWeb.Settings.AreDefaultContextMenusEnabled  = false;
            coreWeb.Settings.IsZoomControlEnabled           = false;
            coreWeb.Settings.AreDevToolsEnabled             = false;
            coreWeb.Settings.AreDefaultScriptDialogsEnabled = false;
            coreWeb.Settings.IsBuiltInErrorPageEnabled      = false;

            // Issue #145 fixed
            coreWeb.Settings.IsStatusBarEnabled = true;
        }
Пример #19
0
 public MauiWebView()
 {
     NavigationStarting += (sender, args) =>
     {
         // Auto map local virtual app dir host, e.g. if navigating back to local site from a link to an external site
         if (args?.Uri?.ToLowerInvariant().StartsWith(LocalScheme.TrimEnd('/').ToLowerInvariant()) == true)
         {
             CoreWebView2.SetVirtualHostNameToFolderMapping(
                 LocalHostName,
                 ApplicationPath,
                 Web.WebView2.Core.CoreWebView2HostResourceAccessKind.Allow);
         }
         // Auto unmap local virtual app dir host if navigating to any other potentially unsafe domain
         else
         {
             CoreWebView2.ClearVirtualHostNameToFolderMapping(LocalHostName);
         }
     };
 }
Пример #20
0
        internal async static Task <string> ExecuteJavascriptCodeAsync(CoreWebView2 webview, string javascriptCode)
        {
            var executeScriptTask = webview.ExecuteScriptAsync(javascriptCode);

            if (await Task.WhenAny(executeScriptTask, Task.Delay(10000)) != executeScriptTask)
            {
                throw new Exception("Timeout error : waited more than 10 seconds for javascript call to finish");
            }
            var result = executeScriptTask.Result;

            if (result.Length > 0 && result.StartsWith('"'))
            {
                return(result.Substring(1, result.Length - 2));
            }
            else
            {
                return(result);
            }
        }
Пример #21
0
        public static async Task WaitForWebViewReady(WebView2 wv2)
        {
            CoreWebView2 coreWebView2 = null;

            for (int i = 0; i < MaxWaitTimes; i++)
            {
                coreWebView2 = wv2.CoreWebView2;
                if (coreWebView2 != null)
                {
                    break;
                }
                await Task.Delay(WaitTimeInMS);
            }

            if (coreWebView2 == null)
            {
                throw new Exception($"Waited {MaxWaitTimes * WaitTimeInMS}ms but couldn't get CoreWebView2 to be available.");
            }

            var domLoaded = false;
            var sem       = new SemaphoreSlim(1);
            await sem.WaitAsync();

            wv2.CoreWebView2.DOMContentLoaded += (s, e) =>
            {
                domLoaded = true;
                sem.Release();
            };

            await Task.WhenAny(Task.Delay(1000), sem.WaitAsync());

            if (!domLoaded)
            {
                throw new Exception($"Waited {MaxWaitTimes * WaitTimeInMS}ms but couldn't get CoreWebView2.DOMContentLoaded to complete.");
            }
            return;
        }
        async Task InitializeAsync(string userDataFolder, ControlsBrowserTypes browserType, string navigationPath)
        {
            if (browserType == ControlsBrowserTypes.UIControlsBrowser)
            {  //set up an Environment which we can then use for the Options Browser as well.
                ControlsCoreWebView2Environment = await Microsoft.Web.WebView2.Core.CoreWebView2Environment.CreateAsync(null, userDataFolder, null);
            }

            await EnsureCoreWebView2Async(ControlsCoreWebView2Environment);

            CoreWebView2.Settings.AreDevToolsEnabled            = false;
            CoreWebView2.Settings.IsZoomControlEnabled          = false;
            CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
            DefaultBackgroundColor = System.Drawing.Color.Transparent;

            ZoomFactorChanged += ControlsBrowser_ZoomFactorChanged;

            CoreWebView2.Navigate(navigationPath);

            if (browserType == ControlsBrowserTypes.OptionsControlsBrowser)
            {
                LostFocus += OptionsControlsBrowser_LostFocus;
                Visibility = System.Windows.Visibility.Hidden;
            }
        }
Пример #23
0
 private void MainForm_Resize(object sender, EventArgs e)
 {
     addressTextBox.Width = toolStrip.Width - 30 * 5;
     size = (int)(this.Width / (1.5 * tabControl.Font.Size) / tabControl.TabCount);
     if (tabControl.TabCount > 0)
     {
         var page = tabControl.TabPages[tabControl.SelectedIndex];
         foreach (var crl in page.Controls)
         {
             WebView2     browser      = crl as WebView2;
             CoreWebView2 coreWebView2 = browser.CoreWebView2;
             var          title        = coreWebView2.DocumentTitle;
             if (title != null)
             {
                 page.ToolTipText = title;
                 if (title.Length > size)
                 {
                     title = title.Substring(0, size) + "...";
                 }
                 page.Text = title;
             }
         }
     }
 }
Пример #24
0
 public HTMLDateInputElement(CoreWebView2 coreWebView, string referenceId)
     : base(coreWebView, referenceId)
 {
 }
Пример #25
0
 protected internal CSSCounterStyleRule(CoreWebView2 coreWebView, string referenceId) : base(coreWebView, referenceId)
 {
 }
Пример #26
0
 protected internal HTMLHeadElement(CoreWebView2 coreWebView, string referenceId) : base(coreWebView, referenceId)
 {
 }
 protected internal HTMLInputElementWithCheckednessBase(CoreWebView2 coreWebView, string referenceId)
     : base(coreWebView, referenceId)
 {
 }
Пример #28
0
 protected internal SVGStringList(CoreWebView2 coreWebView, string referenceId)
     : base(coreWebView, referenceId)
 {
 }
Пример #29
0
 protected internal CSSPerspective(CoreWebView2 coreWebView, string referenceId) : base(coreWebView, referenceId)
 {
 }
Пример #30
0
 protected internal TextTrack(CoreWebView2 coreWebView, string referenceId) : base(coreWebView, referenceId)
 {
 }