protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            // F*****g BitBucket and their horrible user interface.
            if (ForbiddenRoutes.Any(navigationAction.Request.Url.AbsoluteString.StartsWith))
            {
                AlertDialogService.ShowAlert("Invalid Request", "Sorry, due to restrictions, you can not sign-up for a new account in CodeBucket.");
                return(false);
            }

            //We're being redirected to our redirect URL so we must have been successful
            if (navigationAction.Request.Url.Host == "codebucket")
            {
                var queryParams = navigationAction
                                  .Request.Url.Query.Split('&')
                                  .Select(x => x.Split('=').Select(Uri.EscapeDataString).ToArray())
                                  .Where(x => x.Length >= 2)
                                  .ToDictionary(x => x[0], x => x[1]);

                if (queryParams.TryGetValue("code", out string code))
                {
                    ViewModel.LoginCommand.Execute(code).LoggedCatch(this).Subscribe();
                    return(false);
                }
            }

            //if (navigationAction.Request.Url.Path.StartsWith("/socialauth", StringComparison.Ordinal))
            //{
            //    var safari = new SFSafariViewController(new NSUrl(ViewModel.LoginUrl));
            //    PresentViewController(safari, true, null);
            //    return false;
            //}

            return(base.ShouldStartLoad(webView, navigationAction));
        }
示例#2
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            try
            {
                //We're being redirected to our redirect URL so we must have been successful
                if (navigationAction.Request.Url.Host == "dillonbuchanan.com")
                {
                    var code = navigationAction.Request.Url.Query.Split('=')[1];
                    ViewModel.Login(code);
                    return(false);
                }

                if (navigationAction.Request.Url.AbsoluteString.StartsWith("https://github.com/join"))
                {
                    Mvx.Resolve <IAlertDialogService>().Alert("Error", "Sorry, due to restrictions, creating GitHub accounts cannot be done in CodeHub.");
                    return(false);
                }

                return(base.ShouldStartLoad(webView, navigationAction));
            }
            catch
            {
                Mvx.Resolve <IAlertDialogService>().Alert("Error Logging in!", "CodeHub is unable to login you in due to an unexpected error. Please try again.");
                return(false);
            }
        }
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            if (Reference == null || !Reference.TryGetTarget(out FormsWebViewRenderer renderer))
            {
                return;
            }
            if (renderer.Element == null)
            {
                return;
            }

            var response = renderer.Element.HandleNavigationStartRequest(navigationAction.Request.Url.ToString());

            if (response.Cancel || response.OffloadOntoDevice)
            {
                if (response.OffloadOntoDevice)
                {
                    AttemptOpenCustomUrlScheme(navigationAction.Request.Url);
                }

                decisionHandler(WKNavigationActionPolicy.Cancel);
            }

            else
            {
                decisionHandler(WKNavigationActionPolicy.Allow);
                renderer.Element.Navigating = true;
            }
        }
示例#4
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            var url = navigationAction.Request.Url;

            if (url.Scheme.Equals("app"))
            {
                var func = url.Host;

                if (func.Equals("ready"))
                {
                    _domLoaded = true;
                    foreach (var e in _toBeExecuted)
                    {
                        Web.EvaluateJavaScript(e, null);
                    }
                }
                else if (func.Equals("comment"))
                {
                    var commentModel = _serializationService.Deserialize <JavascriptCommentModel>(UrlDecode(url.Fragment));
                    PromptForComment(commentModel);
                }

                return(false);
            }

            return(base.ShouldStartLoad(webView, navigationAction));
        }
示例#5
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            try
            {
                //We're being redirected to our redirect URL so we must have been successful
                if (navigationAction.Request.Url.Host == "dillonbuchanan.com")
                {
                    var code = navigationAction.Request.Url.Query.Split('=')[1];
                    ViewModel.Login(code);
                    return false;
                }
    
                if (navigationAction.Request.Url.AbsoluteString.StartsWith("https://github.com/join"))
                {
                    Mvx.Resolve<IAlertDialogService>().Alert("Error", "Sorry, due to restrictions, creating GitHub accounts cannot be done in CodeHub.");
                    return false;
                }

                return base.ShouldStartLoad(webView, navigationAction);
            }
            catch 
            {
                Mvx.Resolve<IAlertDialogService>().Alert("Error Logging in!", "CodeHub is unable to login you in due to an unexpected error. Please try again.");
                return false;
            }
        }
示例#6
0
    public override void DecidePolicy(WKWebView webView, WKNavigationAction
                                      navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
    {
        var navType     = navigationAction.NavigationType;
        var targetFrame = navigationAction.TargetFrame;
        var url         = navigationAction.Request.Url;

        if (
            url.ToString().StartsWith("http") && (targetFrame != null &&
                                                  targetFrame.MainFrame == true)
            )
        {
            decisionHandler(WKNavigationActionPolicy.Allow);
        }
        else if (
            //(url.ToString().StartsWith("http") && targetFrame == null)
            //||
            url.ToString().StartsWith("mailto:") ||
            url.ToString().StartsWith("tel:") ||
            url.ToString().StartsWith("Tel:"))
        {
            //decisionHandler(WKNavigationActionPolicy.Allow);

            UIApplication.SharedApplication.OpenUrl(url);
        }
    }
        public override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            var url = navigationAction.Request.Url;

            if (url != null && url.Scheme.Equals("app"))
            {
                var func = url.Host;

                if (func.Equals("comment"))
                {
                    var q            = System.Web.HttpUtility.ParseQueryString(url.Query);
                    var commentModel = new JavascriptCommentModel
                    {
                        LineFrom = ToNullableInt(q["lineFrom"]),
                        LineTo   = ToNullableInt(q["lineTo"])
                    };

                    PromptForComment(commentModel);
                }

                return(false);
            }

            return(base.ShouldStartLoad(webView, navigationAction));
        }
        public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            if (_handler == null)
            {
                return;
            }

            var navEvent       = WebNavigationEvent.NewPage;
            var navigationType = navigationAction.NavigationType;

            switch (navigationType)
            {
            case WKNavigationType.LinkActivated:
                navEvent = WebNavigationEvent.NewPage;

                if (navigationAction.TargetFrame == null)
                {
                    webView?.LoadRequest(navigationAction.Request);
                }

                break;

            case WKNavigationType.FormSubmitted:
                navEvent = WebNavigationEvent.NewPage;
                break;

            case WKNavigationType.BackForward:
                navEvent = _handler.CurrentNavigationEvent;
                break;

            case WKNavigationType.Reload:
                navEvent = WebNavigationEvent.Refresh;
                break;

            case WKNavigationType.FormResubmitted:
                navEvent = WebNavigationEvent.NewPage;
                break;

            case WKNavigationType.Other:
                navEvent = WebNavigationEvent.NewPage;
                break;
            }

            _lastEvent = navEvent;

            var virtualView = _handler.VirtualView;

            if (virtualView == null)
            {
                return;
            }

            var request = navigationAction.Request;
            var lastUrl = request.Url.ToString();

            bool cancel = virtualView.Navigating(navEvent, lastUrl);

            _handler.PlatformView?.UpdateCanGoBackForward(virtualView);
            decisionHandler(cancel ? WKNavigationActionPolicy.Cancel : WKNavigationActionPolicy.Allow);
        }
示例#9
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            try
            {
                //We're being redirected to our redirect URL so we must have been successful
                if (navigationAction.Request.Url.Host == "dillonbuchanan.com")
                {
                    var queryParameters = navigationAction.Request.Url.Query.Split('&');

                    var code      = queryParameters.FirstOrDefault(x => x.StartsWith("code=", StringComparison.OrdinalIgnoreCase));
                    var codeValue = code?.Replace("code=", String.Empty);
                    ViewModel.LoginCommand.ExecuteNow(codeValue);
                    return(false);
                }

                if (navigationAction.Request.Url.AbsoluteString.StartsWith("https://github.com/join"))
                {
                    _alertDialogService.Alert("Error", "Sorry, due to restrictions, creating GitHub accounts cannot be done in CodeHub.");
                    return(false);
                }

                return(base.ShouldStartLoad(webView, navigationAction));
            }
            catch
            {
                _alertDialogService.Alert("Error Logging in!", "CodeHub is unable to login you in due to an unexpected error. Please try again.");
                return(false);
            }
        }
示例#10
0
            public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
            {
                var requestUrl = navigationAction.Request?.Url.ToUri();

                if (this.Log().IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug))
                {
                    this.Log().Debug($"WKNavigationDelegate.DecidePolicy: NavigationType: {navigationAction.NavigationType} Request:{requestUrl} TargetRequest: {navigationAction.TargetFrame?.Request}");
                }

                var scheme = requestUrl.Scheme.ToLower();

                // Note that the "file" scheme is not officially supported by the UWP WebView (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.webview.unsupportedurischemeidentified?view=winrt-19041#remarks).
                // We have to support it here for anchor navigation (as long as https://github.com/unoplatform/uno/issues/2998 is not resolved).
                var isUnsupportedScheme = scheme != "http" && scheme != "https" && scheme != "file";

                if (isUnsupportedScheme)
                {
                    bool cancelled = _unoWKWebView.OnUnsupportedUriSchemeIdentified(requestUrl);

                    decisionHandler(cancelled ? WKNavigationActionPolicy.Cancel : WKNavigationActionPolicy.Allow);

                    return;
                }

                // The WKWebView doesn't raise navigation event for anchor navigation.
                // When we detect anchor navigation, we must raise the events (NavigationStarting & NavigationFinished) ourselves.
                var isAnchorNavigation = GetIsAnchorNavigation();

                if (isAnchorNavigation)
                {
                    bool cancelled = _unoWKWebView.OnStarted(requestUrl, stopLoadingOnCanceled: false);

                    decisionHandler(cancelled ? WKNavigationActionPolicy.Cancel : WKNavigationActionPolicy.Allow);

                    if (!cancelled)
                    {
                        _unoWKWebView.OnNavigationFinished(requestUrl);
                    }

                    return;
                }

                // For all other cases, we allow the navigation. This will results in other WKNavigationDelegate methods being called.
                decisionHandler(WKNavigationActionPolicy.Allow);

                bool GetIsAnchorNavigation()
                {
                    // If we navigate to the exact same page but with a different location (using anchors), the native control will not notify us of
                    // any navigation. We need to create this notification to indicate that the navigation worked.

                    // To detect an anchor navigation, both the previous and new urls need to match on the left part of the anchor indicator ("#")
                    // AND the new url needs to have content on the right of the anchor indicator.
                    var currentUrlParts = _unoWKWebView._urlLastNavigation?.AbsoluteUrl?.ToString().Split(new string[] { "#" }, StringSplitOptions.None);
                    var newUrlParts     = requestUrl?.AbsoluteUri?.ToString().Split(new string[] { "#" }, StringSplitOptions.None);

                    return(currentUrlParts?.Length > 0 &&
                           newUrlParts?.Length > 1 &&
                           currentUrlParts[0].Equals(newUrlParts[0]));
                }
            }
示例#11
0
 public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     if (navigationAction.TargetFrame !.MainFrame)
     {
         _currentUri = navigationAction.Request.Url;
     }
     decisionHandler(WKNavigationActionPolicy.Allow);
 }
            public override void DecidePolicy
            (
                WKWebView webView,
                WKNavigationAction navigationAction,
                Action <WKNavigationActionPolicy> decisionHandler
            )
            {
                #if DEBUG
                StringBuilder sb = new StringBuilder();
                sb.AppendLine($"WKWebViewNavigationDelegate.DecidePolicy ");
                sb.AppendLine($"        webView.Url.AbsoluteString = {webView.Url.AbsoluteString}");
                sb.AppendLine($"        navigationAction?.Request?.Url = {navigationAction?.Request?.Url}");
                sb.AppendLine($"        navigationAction?.NavigationType = {navigationAction?.NavigationType}");
                System.Diagnostics.Debug.WriteLine(sb.ToString());
                #endif

                Uri    uri      = new Uri(webView.Url.AbsoluteString);
                string fragment = uri.Fragment;

                if
                (
                    fragment.Contains("access_token")
                    ||
                    fragment.Contains("state")
                    ||
                    fragment.Contains("expires_in")
                    ||
                    fragment.Contains("error")
                )
                {
                    IDictionary <string, string> fragments = WebEx.FormDecode(uri.Fragment);

                    Account account = new Account
                                      (
                        "",
                        new Dictionary <string, string>(fragments)
                                      );
                    controller.authenticator.OnSucceeded(account);
                }
                else if
                (
                    fragment.Contains("code")
                )
                {
                    throw new NotImplementedException("code - Explicit/Server");
                }

                if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
                {
                    UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
                    decisionHandler(WKNavigationActionPolicy.Cancel);
                    return;
                }

                // Navigation Allowed?
                // page will not load without this one!
                decisionHandler(WKNavigationActionPolicy.Allow);
            }
示例#13
0
 public WKWebView CreateWebView(
     WKWebView webView,
     WKWebViewConfiguration configuration,
     WKNavigationAction navigationAction,
     WKWindowFeatures windowFeatures)
 {
     UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
     return(null);
 }
示例#14
0
            public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction,
                                              Action <WKNavigationActionPolicy> decisionHandler)
            {
                System.Console.WriteLine("=========================== DecidePolicy");

                var ret = _webView.Get()?.ShouldStartLoad(webView, navigationAction) ?? true;

                decisionHandler(ret ? WKNavigationActionPolicy.Allow : WKNavigationActionPolicy.Cancel);
            }
示例#15
0
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            WKNavigationActionPolicy policy = WKNavigationActionPolicy.Cancel;

            if (!finishedDelegate(navigationAction.Request.Url.AbsoluteString, false))
            {
                policy = WKNavigationActionPolicy.Allow;
            }
            decisionHandler(policy);
        }
示例#16
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            if (!navigationAction.Request.Url.AbsoluteString.StartsWith("file://", System.StringComparison.Ordinal))
            {
                ViewModel.GoToLinkCommand.Execute(navigationAction.Request.Url.AbsoluteString);
                return false;
            }

            return base.ShouldStartLoad(webView, navigationAction);
        }
示例#17
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            if (!navigationAction.Request.Url.AbsoluteString.StartsWith("file://", System.StringComparison.Ordinal))
            {
                ViewModel.GoToLinkCommand.Execute(navigationAction.Request.Url.AbsoluteString);
                return(false);
            }

            return(base.ShouldStartLoad(webView, navigationAction));
        }
        public virtual void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            if (navigationAction.Request.Url != null && navigationAction.Request.Url != Url)
            {
                decisionHandler(WKNavigationActionPolicy.Cancel);
                Delegate?.AuthenticationControllerDidAuthenticate(this);
                return;
            }

            decisionHandler(WKNavigationActionPolicy.Allow);
        }
示例#19
0
 public override void DecidePolicy(WebKit.WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     if (wvp.OnNavigationStarting(new Uri(navigationAction.Request.Url.AbsoluteString)))
     {
         decisionHandler(WKNavigationActionPolicy.Cancel);
     }
     else
     {
         decisionHandler(WKNavigationActionPolicy.Allow);
     }
 }
示例#20
0
 public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     if (UIApplication.SharedApplication.CanOpenUrl(navigationAction.Request.Url))
     {
         UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
         decisionHandler(WKNavigationActionPolicy.Cancel);
     }
     else
     {
         decisionHandler(WKNavigationActionPolicy.Allow);
     }
 }
示例#21
0
 public override void DecidePolicy(WKWebView view, WKNavigationAction navAction, Action <WKNavigationActionPolicy> handler)
 {
     if (navAction.NavigationType == WKNavigationType.LinkActivated)
     {
         handler?.Invoke(WKNavigationActionPolicy.Cancel);
         view.BeginInvokeOnMainThread(() => UIApplication.SharedApplication.OpenUrl(navAction.Request.Url));
     }
     else
     {
         handler?.Invoke(WKNavigationActionPolicy.Allow);
     }
 }
 public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     if (navigationAction.Request?.Url is NSUrl url)
     {
         if (url.Scheme == new NSUrl(_options.EndUrl).Scheme)
         {
             Console.WriteLine("Policy Decision: Handled callback with URL {0}", url);
             ActivityMediator.Instance.Send(url.AbsoluteString);
         }
         else if (_options.RestartFlowRoutes is string[] restartRoutes &&
                  url.Host == new NSUrl(_options.StartUrl).Host &&
                  string.IsNullOrEmpty(url.Query) &&
                  restartRoutes.Contains(url.Path, StringComparer.OrdinalIgnoreCase))
         {
             Console.WriteLine("Policy Decision: We hit a redirect route, starting a new session {0}", url);
             if (_options.Headers != null)
             {
                 var newSessionRequest = UpdateHeaders(new NSMutableUrlRequest(new NSUrl(_options.StartUrl)),
                                                       _options.Headers.ToDictionary(k => k.Key.ToString(), v => v.Value.ToString()));
                 if (newSessionRequest != null)
                 {
                     WebView.LoadRequest(newSessionRequest);
                 }
             }
         }
         else if (_options.ViewableUrls != null && _options.ViewableUrls.Any(x => new NSUrl(x).IsEqual(url)))
         {
             if (UIApplication.SharedApplication.CanOpenUrl(url))
             {
                 Console.WriteLine("Policy Decision: We hit other URL, open in Safari");
                 UIApplication.SharedApplication.OpenUrl(url);
             }
             decisionHandler(WKNavigationActionPolicy.Cancel);
             return;
         }
         else
         {
             // Inject custom headers into HTTP request. Currently only support GET request, due to https://forums.developer.apple.com/thread/125753
             if (_options.Headers != null &&
                 navigationAction.Request.HttpMethod == "GET" &&
                 (navigationAction.Request.Url.Host == new NSUrl(_options.StartUrl).Host || (_options.DetourUrl != null && navigationAction.Request.Url.Host == new NSUrl(_options.DetourUrl).Host)))
             {
                 var request = UpdateHeaders(navigationAction.Request, _options.Headers.ToDictionary(k => k.Key.ToString(), v => v.Value.ToString()));
                 if (request != null)
                 {
                     WebView.LoadRequest(request);
                     decisionHandler(WKNavigationActionPolicy.Cancel);
                     return;
                 }
             }
         }
     }
        public override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            var url = navigationAction.Request.Url.AbsoluteString;

            if (!url.StartsWith("file://", StringComparison.Ordinal))
            {
                var webBrowser = new WebBrowserViewController(url);
                PresentViewController(webBrowser, true, null);
                return(false);
            }

            return(base.ShouldStartLoad(webView, navigationAction));
        }
 public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     // Load the "about.html" file locally inside the web view but open the links in there in external browser.
     if (navigationAction.Request.Url.IsFileUrl)
     {
         decisionHandler(WKNavigationActionPolicy.Allow);
     }
     else
     {
         decisionHandler(WKNavigationActionPolicy.Cancel);
         UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
     }
 }
示例#25
0
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            NavigationRequestedDelegate res = (NavigationRequestedDelegate)Element.InvokeEvent(WebViewEventType.NavigationRequested, new NavigationRequestedDelegate(Element, navigationAction.Request.Url.ToString()));

            if (res.Cancel)
            {
                decisionHandler(WKNavigationActionPolicy.Cancel);
            }
            else
            {
                decisionHandler(WKNavigationActionPolicy.Allow);
            }
        }
示例#26
0
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            if (Reference == null || !Reference.TryGetTarget(out FormsWebViewRenderer renderer))
            {
                return;
            }
            if (renderer.Element == null)
            {
                return;
            }

#if DEBUG
            if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
            {
                webView.Configuration.WebsiteDataStore.HttpCookieStore.GetAllCookies((NSHttpCookie[] obj) => {
                    System.Diagnostics.Debug.WriteLine("*** DecidePolicy webView.Configuration.WebsiteDataStore");
                    for (var i = 0; i < obj.Length; i++)
                    {
                        var nsCookie = obj[i];
                        var domain   = nsCookie.Domain;
                        System.Diagnostics.Debug.WriteLine($"Domain={nsCookie.Domain}; Name={nsCookie.Name}; Value={nsCookie.Value};");
                    }
                });
            }
#endif
            if (!UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
            {
                var headers          = navigationAction.Request.Headers as NSMutableDictionary;
                var cookieDictionary = NSHttpCookie.RequestHeaderFieldsWithCookies(NSHttpCookieStorage.SharedStorage.Cookies);
                foreach (var item in cookieDictionary)
                {
                    headers.SetValueForKey(item.Value, new NSString(item.Key.ToString()));
                }
            }
            var response = renderer.Element.HandleNavigationStartRequest(navigationAction.Request.Url.ToString());

            if (response.Cancel || response.OffloadOntoDevice)
            {
                if (response.OffloadOntoDevice)
                {
                    AttemptOpenCustomUrlScheme(navigationAction.Request.Url);
                }

                decisionHandler(WKNavigationActionPolicy.Cancel);
            }
            else
            {
                decisionHandler(WKNavigationActionPolicy.Allow);
                renderer.Element.Navigating = true;
            }
        }
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
        {
            var urlToCheck = $"{navigationAction.Request.Url.Scheme}:{navigationAction.Request.Url.AbsoluteString}";

            if (!_urls.Contains(urlToCheck))
            {
                decisionHandler(WKNavigationActionPolicy.Allow);
                return; //base.ShouldInterceptRequest(view, request);
            }

            decisionHandler(WKNavigationActionPolicy.Cancel);

            // TODO: how to handle response?
        }
            public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
            {
                // base.DecidePolicy(webView, navigationAction, decisionHandler);

                if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
                {
                    var url = navigationAction.Request.Url;
                    if (url.AbsoluteUrl.AbsoluteString.StartsWith("https://fixity.io")) //Whatever your test happens to be
                    {
                        decisionHandler(WKNavigationActionPolicy.Allow);
                    }
                    else if (url.AbsoluteUrl.AbsoluteString.StartsWith("mailto:"))
                    {
                        decisionHandler(WKNavigationActionPolicy.Cancel);
                        Device.OpenUri(new Uri(url.AbsoluteString)); //note: mail app not installed on simulator, must test with real device.
                    }
                    else
                    {
                        //tel:, sms: , and URLs outside the fixity.io domain
                        decisionHandler(WKNavigationActionPolicy.Cancel);
                        //webView.LoadFileUrl()
                        Device.OpenUri(new Uri(url.AbsoluteString));
                    }
                }
                else if (navigationAction.NavigationType == WKNavigationType.Other)
                {
                    var url = navigationAction.Request.Url;
                    if (url.AbsoluteUrl.AbsoluteString.Contains("download.wx"))
                    {
                        //wisej download: cancel navigation and open in new Safari window.
                        //decisionHandler(WKNavigationActionPolicy.Cancel);
                        //Device.OpenUri(new Uri(url.AbsoluteString));

                        //Ideally, this would download the file to the users's home folder and then open it locally.
                        decisionHandler(WKNavigationActionPolicy.Cancel);
                        //Xamarin.Forms.DependencyService.Get<IMessage>().ShortAlert("Downloading...");
                        var fileName = MyDownloader.DownloadAndWriteFile(url.AbsoluteString);
                        //Xamarin.Forms.DependencyService.Get<IMessage>().CancelAlert(); //kill alert so preview window can pop up in next call.
                        MyDownloader.OpenFileByName(fileName);
                    }
                    else
                    {
                        decisionHandler(WKNavigationActionPolicy.Allow);
                    }
                }
                else
                {
                    decisionHandler(WKNavigationActionPolicy.Allow);
                }
            }
示例#29
0
            // https://stackoverflow.com/questions/37509990/migrating-from-uiwebview-to-wkwebview
            public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
            {
                var navEvent       = WebNavigationEvent.NewPage;
                var navigationType = navigationAction.NavigationType;

                switch (navigationType)
                {
                case WKNavigationType.LinkActivated:
                    navEvent = WebNavigationEvent.NewPage;

                    if (navigationAction.TargetFrame == null)
                    {
                        webView?.LoadRequest(navigationAction.Request);
                    }

                    break;

                case WKNavigationType.FormSubmitted:
                    navEvent = WebNavigationEvent.NewPage;
                    break;

                case WKNavigationType.BackForward:
                    navEvent = _renderer._lastBackForwardEvent;
                    break;

                case WKNavigationType.Reload:
                    navEvent = WebNavigationEvent.Refresh;
                    break;

                case WKNavigationType.FormResubmitted:
                    navEvent = WebNavigationEvent.NewPage;
                    break;

                case WKNavigationType.Other:
                    navEvent = WebNavigationEvent.NewPage;
                    break;
                }

                _lastEvent = navEvent;
                var request = navigationAction.Request;
                var lastUrl = request.Url.ToString();
                var args    = new WebNavigatingEventArgs(navEvent, new UrlWebViewSource {
                    Url = lastUrl
                }, lastUrl);

                WebView.SendNavigating(args);
                _renderer.UpdateCanGoBackForward();
                decisionHandler(args.Cancel ? WKNavigationActionPolicy.Cancel : WKNavigationActionPolicy.Allow);
            }
示例#30
0
 public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
     {
         decisionHandler.Invoke(WKNavigationActionPolicy.Cancel);
         if (navigationAction.Request.Url != null)
         {
             UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
         }
     }
     else
     {
         decisionHandler.Invoke(WKNavigationActionPolicy.Allow);
     }
 }
示例#31
0
 public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action <WKNavigationActionPolicy> decisionHandler)
 {
     if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
     {
         // Open links in browser.
         if (UIApplication.SharedApplication.CanOpenUrl(navigationAction.Request.Url))
         {
             UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
         }
         decisionHandler(WKNavigationActionPolicy.Cancel);
     }
     else
     {
         decisionHandler(WKNavigationActionPolicy.Allow);
     }
 }
示例#32
0
        //private async Task HandleEditButton()
        //{
//            try
//            {
//                var page = ViewModel.CurrentWikiPage(Web.Url.AbsoluteString);
//                var wiki = await Task.Run(() => ViewModel.GetApplication().Client.Users[ViewModel.Username].Repositories[ViewModel.Repository].Wikis[page].GetInfo());
//                var composer = new Composer { Title = "Edit" + Title, Text = wiki.Data };
//                composer.NewComment(this, async (text) => {
//                    try
//                    {
//                        await composer.DoWorkAsync("Saving...", () => Task.Run(() => ViewModel.GetApplication().Client.Users[ViewModel.Username].Repositories[ViewModel.Repository].Wikis[page].Update(text, Uri.UnescapeDataString("/" + page))));
//                        composer.CloseComposer();
//                        Refresh();
//                    }
//                    catch (Exception ex)
//                    {
//                        AlertDialogService.ShowAlert("Unable to update page!", ex.Message);
//                        composer.EnableSendButton = true;
//                    };
//                });
//            }
//            catch (Exception e)
//            {
//                AlertDialogService.ShowAlert("Error", e.Message);
//            }
        //}

        public override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            try
            {
                if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
                {
                    ViewModel.GoToWebCommand.ExecuteNow(navigationAction.Request.Url.ToString());
                    return(false);
                }
            }
            catch
            {
            }

            return(base.ShouldStartLoad(webView, navigationAction));
        }
示例#33
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            // F*****g BitBucket and their horrible user interface.
            if (ForbiddenRoutes.Any(navigationAction.Request.Url.AbsoluteString.StartsWith))
            {
                AlertDialogService.ShowAlert("Invalid Request", "Sorry, due to restrictions you can not sign-up for a new account in CodeBucket.");
                return false;
            }

            //We're being redirected to our redirect URL so we must have been successful
            if (navigationAction.Request.Url.Host == "codebucket")
            {
                ViewModel.Code = navigationAction.Request.Url.Query.Split('=')[1];
                ViewModel.LoginCommand.ExecuteIfCan();
                return false;
            }

            return base.ShouldStartLoad(webView, navigationAction);
        }
示例#34
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            try 
            {
                if (navigationAction.NavigationType == WKNavigationType.LinkActivated) 
                {
                    if (navigationAction.Request.Url.ToString().Substring(0, 7).Equals("wiki://"))
                    {
                        GoToPage(navigationAction.Request.Url.ToString().Substring(7));
                        return false;
                    }
                }
            }
            catch
            {
            }

            return base.ShouldStartLoad(webView, navigationAction);
        }
示例#35
0
 protected virtual bool ShouldStartLoad (WKWebView webView, WKNavigationAction navigationAction)
 {
     return true;
 }
示例#36
0
 public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
 {
     var ret = _webView.Get()?.ShouldStartLoad(webView, navigationAction) ?? true;
     decisionHandler(ret ? WKNavigationActionPolicy.Allow : WKNavigationActionPolicy.Cancel);
 }
示例#37
0
        protected override bool ShouldStartLoad(WKWebView webView, WKNavigationAction navigationAction)
        {
            var url = navigationAction.Request.Url;
            if(url.Scheme.Equals("app")) {
                var func = url.Host;

                if (func.Equals("ready"))
                {
                    _domLoaded = true;
                    foreach (var e in _toBeExecuted)
                        Web.EvaluateJavaScript(e, null);
                }
                else if(func.Equals("comment"))
                {
                    var commentModel = _serializationService.Deserialize<JavascriptCommentModel>(UrlDecode(url.Fragment));
                    PromptForComment(commentModel);
                }

                return false;
            }

            return base.ShouldStartLoad(webView, navigationAction);
        }
示例#38
0
        private bool OnLoadStart(WKNavigationAction navigation)
        {
            if (navigation.Request.Url.AbsoluteString.StartsWith("app://resize"))
            {
                RefreshSize().ToBackground();
                return false;
            }

            if (!navigation.Request.Url.AbsoluteString.StartsWith("file://"))
            {
                if (UrlRequested != null)
                    _urlSubject.OnNext(navigation.Request.Url.AbsoluteString);
                return false;
            }

            return true;
        }