Open up link previews to work with all sites.

This commit is contained in:
Greyson Parrelli
2020-08-12 10:41:52 -04:00
parent d569419e13
commit 6e6105af05
18 changed files with 377 additions and 200 deletions

View File

@@ -1,73 +0,0 @@
package org.thoughtcrime.securesms.linkpreview;
import org.junit.Test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
public class LinkPreviewUtilTest {
@Test
public void isLegal_allAscii_noProtocol() {
assertTrue(LinkPreviewUtil.isLegalUrl("google.com"));
}
@Test
public void isLegal_allAscii_noProtocol_subdomain() {
assertTrue(LinkPreviewUtil.isLegalUrl("foo.google.com"));
}
@Test
public void isLegal_allAscii_subdomain() {
assertTrue(LinkPreviewUtil.isLegalUrl("https://foo.google.com"));
}
@Test
public void isLegal_allAscii_subdomain_path() {
assertTrue(LinkPreviewUtil.isLegalUrl("https://foo.google.com/some/path.html"));
}
@Test
public void isLegal_cyrillicHostAsciiTld() {
assertFalse(LinkPreviewUtil.isLegalUrl("http://кц.com"));
}
@Test
public void isLegal_cyrillicHostAsciiTld_noProtocol() {
assertFalse(LinkPreviewUtil.isLegalUrl("кц.com"));
}
@Test
public void isLegal_mixedHost_noProtocol() {
assertFalse(LinkPreviewUtil.isLegalUrl("http://asĸ.com"));
}
@Test
public void isLegal_cyrillicHostAndTld_noProtocol() {
assertTrue(LinkPreviewUtil.isLegalUrl("кц.рф"));
}
@Test
public void isLegal_cyrillicHostAndTld_asciiPath_noProtocol() {
assertTrue(LinkPreviewUtil.isLegalUrl("кц.рф/some/path"));
}
@Test
public void isLegal_cyrillicHostAndTld_asciiPath() {
assertTrue(LinkPreviewUtil.isLegalUrl("https://кц.рф/some/path"));
}
@Test
public void isLegal_asciiSubdomain_cyrillicHostAndTld() {
assertFalse(LinkPreviewUtil.isLegalUrl("http://foo.кц.рф"));
}
@Test
public void isLegal_emptyUrl() {
assertFalse(LinkPreviewUtil.isLegalUrl(""));
}
}

View File

@@ -0,0 +1,44 @@
package org.thoughtcrime.securesms.linkpreview;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import static junit.framework.TestCase.assertEquals;
@RunWith(Parameterized.class)
public class LinkPreviewUtilTest_isLegal {
private final String input;
private final boolean output;
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{ "google.com", true },
{ "foo.google.com", true },
{ "https://foo.google.com", true },
{ "https://foo.google.com/some/path.html", true },
{ "кц.рф", true },
{ "https://кц.рф/some/path", true },
{ "http://кц.com", false },
{ "кц.com", false },
{ "http://asĸ.com", false },
{ "http://foo.кц.рф", false },
{ "", false }
});
}
public LinkPreviewUtilTest_isLegal(String input, boolean output) {
this.input = input;
this.output = output;
}
@Test
public void isLegal() {
assertEquals(output, LinkPreviewUtil.isLegalUrl(input));
}
}

View File

@@ -0,0 +1,108 @@
package org.thoughtcrime.securesms.linkpreview;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.whispersystems.libsignal.util.guava.Optional;
import java.util.Arrays;
import java.util.Collection;
import static junit.framework.TestCase.assertEquals;
@RunWith(Parameterized.class)
public class LinkPreviewUtilTest_parseOpenGraphFields {
private final String html;
private final String title;
private final String imageUrl;
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
// Normal
{ "<meta content=\"Daily Bugle\" property=\"og:title\">\n" +
"<meta content=\"https://images.com/my-image.jpg\" property=\"og:image\">",
"Daily Bugle",
"https://images.com/my-image.jpg"},
// Swap property orders
{ "<meta property=\"og:title\" content=\"Daily Bugle\">\n" +
"<meta property=\"og:image\" content=\"https://images.com/my-image.jpg\">",
"Daily Bugle",
"https://images.com/my-image.jpg"},
// Funny spacing
{ "< meta property = \"og:title\" content = \"Daily Bugle\" >\n\n" +
"< meta property = \"og:image\" content =\"https://images.com/my-image.jpg\" >",
"Daily Bugle",
"https://images.com/my-image.jpg"},
// Garbage in various places
{ "<meta property=\"og:title\" content=\"Daily Bugle\">\n" +
"asdfjkl\n" +
"<body>idk</body>\n" +
"<script type=\"text/javascript\">var a = </script>\n" +
"<meta property=\"og:image\" content=\"https://images.com/my-image.jpg\">",
"Daily Bugle",
"https://images.com/my-image.jpg"},
// Missing image
{ "<meta content=\"Daily Bugle\" property=\"og:title\">",
"Daily Bugle",
null},
// Missing title
{ "<meta content=\"https://images.com/my-image.jpg\" property=\"og:image\">",
null,
"https://images.com/my-image.jpg"},
// Has everything
{ "<meta property=\"og:title\" content = \"Daily Bugle\">\n" +
"<title>Daily Bugle HTML</title>\n" +
"<meta property=\"og:image\" content=\"https://images.com/my-image.jpg\">\n" +
"<link rel=\"icon\" href=\"https://images.com/favicon.png\" />",
"Daily Bugle",
"https://images.com/my-image.jpg"},
// Fallback to HTML title
{ "<title>Daily Bugle HTML</title>\n" +
"<meta property=\"og:image\" content=\"https://images.com/my-image.jpg\">\n" +
"<link rel=\"icon\" href=\"https://images.com/favicon.png\" />",
"Daily Bugle HTML",
"https://images.com/my-image.jpg"},
// Fallback to favicon
{ "<meta property=\"og:title\" content = \"Daily Bugle\">\n" +
"<title>Daily Bugle HTML</title>\n" +
"<link rel=\"icon\" href=\"https://images.com/favicon.png\" />",
"Daily Bugle",
"https://images.com/favicon.png"},
// Fallback to HTML title and favicon
{ "<title>Daily Bugle HTML</title>\n" +
"<link rel=\"icon\" href=\"https://images.com/favicon.png\" />",
"Daily Bugle HTML",
"https://images.com/favicon.png"},
// Different favicon formatting
{ "<title>Daily Bugle HTML</title>\n" +
"<link rel=\"shortcut icon\" href=\"https://images.com/favicon.png\" />",
"Daily Bugle HTML",
"https://images.com/favicon.png"},
});
}
public LinkPreviewUtilTest_parseOpenGraphFields(String html, String title, String imageUrl) {
this.html = html;
this.title = title;
this.imageUrl = imageUrl;
}
@Test
public void parseOpenGraphFields() {
LinkPreviewUtil.OpenGraph openGraph = LinkPreviewUtil.parseOpenGraphFields(html, html -> html);
assertEquals(Optional.fromNullable(title), openGraph.getTitle());
assertEquals(Optional.fromNullable(imageUrl), openGraph.getImageUrl());
}
}