public void OnSendNavigated_Navigated_IsInvoked()
        {
            // Arrange
            var label        = new HtmlLabel();
            var url          = Guid.NewGuid().ToString();
            var source       = new UrlWebViewSource();
            var expectedArgs = new WebNavigatingEventArgs(WebNavigationEvent.Forward, source, url);

            label.Navigated += LabelNavigated;

            WebNavigatingEventArgs actualArgs = null;
            object actualSender = null;

            void LabelNavigated(object sender, WebNavigatingEventArgs e)
            {
                actualSender = sender;
                actualArgs   = e;
            }

            // Act
            label.SendNavigated(expectedArgs);

            // Assert
            Assert.Equal(expectedArgs, actualArgs);
            Assert.Equal(label, actualSender);
        }
            public override void OnClick(global::Android.Views.View widget)
            {
                var args = new WebNavigatingEventArgs(WebNavigationEvent.NewPage, new UrlWebViewSource {
                    Url = _span.URL
                }, _span.URL);

                _label.SendNavigating(args);

                if (args.Cancel)
                {
                    return;
                }

                Device.OpenUri(new Uri(_span.URL));
                _label.SendNavigated(args);
            }
Beispiel #3
0
        private static void ParseText(XElement element, InlineCollection inlines, HtmlLabel label)
        {
            if (element == null)
            {
                return;
            }

            InlineCollection currentInlines = inlines;
            var elementName = element.Name.ToString().ToUpperInvariant();

            switch (elementName)
            {
            case _elementA:
                var        link = new Hyperlink();
                XAttribute href = element.Attribute("href");
                if (href != null)
                {
                    try
                    {
                        link.NavigateUri = new Uri(href.Value);
                    }
                    catch (FormatException) { /* href is not valid */ }
                }
                link.Click += (sender, e) =>
                {
                    sender.NavigateUri = null;
                    if (href == null)
                    {
                        return;
                    }

                    var args = new WebNavigatingEventArgs(WebNavigationEvent.NewPage, new UrlWebViewSource {
                        Url = href.Value
                    }, href.Value);
                    label.SendNavigating(args);

                    if (args.Cancel)
                    {
                        return;
                    }

                    Device.OpenUri(new Uri(href.Value));
                    label.SendNavigated(args);
                };
                inlines.Add(link);
                currentInlines = link.Inlines;
                break;

            case _elementB:
            case _elementStrong:
                var bold = new Bold();
                inlines.Add(bold);
                currentInlines = bold.Inlines;
                break;

            case _elementI:
            case _elementEm:
                var italic = new Italic();
                inlines.Add(italic);
                currentInlines = italic.Inlines;
                break;

            case _elementU:
                var underline = new Underline();
                inlines.Add(underline);
                currentInlines = underline.Inlines;
                break;

            case _elementBr:
                inlines.Add(new LineBreak());
                break;

            case _elementP:
                // Add two line breaks, one for the current text and the second for the gap.
                if (AddLineBreakIfNeeded(inlines))
                {
                    inlines.Add(new LineBreak());
                }

                var paragraphSpan = new Span();
                inlines.Add(paragraphSpan);
                currentInlines = paragraphSpan.Inlines;
                break;

            case _elementLi:
                inlines.Add(new LineBreak());
                inlines.Add(new Run {
                    Text = " • "
                });
                break;

            case _elementUl:
            case _elementDiv:
                _ = AddLineBreakIfNeeded(inlines);
                var divSpan = new Span();
                inlines.Add(divSpan);
                currentInlines = divSpan.Inlines;
                break;
            }
            foreach (XNode node in element.Nodes())
            {
                if (node is XText textElement)
                {
                    currentInlines.Add(new Run {
                        Text = textElement.Value
                    });
                }
                else
                {
                    ParseText(node as XElement, currentInlines, label);
                }
            }
            // Add newlines for paragraph tags
            if (elementName == "ElementP")
            {
                currentInlines.Add(new LineBreak());
            }
        }