Merge branch 'charlesmchen/pinterestLinkPreviews' into release/2.39.0

This commit is contained in:
Matthew Chen 2019-04-22 16:39:28 -04:00
commit 91efe8d3d6
3 changed files with 39 additions and 5 deletions

View file

@ -2166,7 +2166,7 @@
"SETTINGS_LINK_PREVIEWS" = "Send Link Previews";
/* Footer for setting for enabling & disabling link previews. */
"SETTINGS_LINK_PREVIEWS_FOOTER" = "Previews are supported for Imgur, Instagram, Reddit, and YouTube links.";
"SETTINGS_LINK_PREVIEWS_FOOTER" = "Previews are supported for Imgur, Instagram, Pinterest, Reddit, and YouTube links.";
/* Header for setting for enabling & disabling link previews. */
"SETTINGS_LINK_PREVIEWS_HEADER" = "Link Previews";

View file

@ -311,7 +311,12 @@ public class OWSLinkPreview: MTLModel {
// Instagram
"instagram.com",
"www.instagram.com",
"m.instagram.com"
"m.instagram.com",
// Pinterest
"pinterest.com",
"www.pinterest.com",
"pin.it"
]
// For media domains, we DO NOT require an exact match - subdomains are allowed.
@ -327,7 +332,10 @@ public class OWSLinkPreview: MTLModel {
// Instagram
"cdninstagram.com",
"fbcdn.net"
"fbcdn.net",
// Pinterest
"pinimg.com"
]
private static let protocolWhitelist = [
@ -780,7 +788,7 @@ public class OWSLinkPreview: MTLModel {
}
var title: String?
if let rawTitle = NSRegularExpression.parseFirstMatch(pattern: "<meta\\s+property\\s*=\\s*\"og:title\"\\s+content\\s*=\\s*\"(.*?)\"\\s*/?>",
if let rawTitle = NSRegularExpression.parseFirstMatch(pattern: "<meta\\s+property\\s*=\\s*\"og:title\"\\s+[^>]*content\\s*=\\s*\"(.*?)\"\\s*[^>]*/?>",
text: linkText,
options: .dotMatchesLineSeparators) {
if let decodedTitle = decodeHTMLEntities(inString: rawTitle) {
@ -793,7 +801,7 @@ public class OWSLinkPreview: MTLModel {
Logger.verbose("title: \(String(describing: title))")
guard let rawImageUrlString = NSRegularExpression.parseFirstMatch(pattern: "<meta\\s+property\\s*=\\s*\"og:image\"\\s+content\\s*=\\s*\"(.*?)\"\\s*/?>", text: linkText) else {
guard let rawImageUrlString = NSRegularExpression.parseFirstMatch(pattern: "<meta\\s+property\\s*=\\s*\"og:image\"\\s+[^>]*content\\s*=\\s*\"(.*?)\"[^>]*/?>", text: linkText) else {
return OWSLinkPreviewContents(title: title)
}
guard let imageUrlString = decodeHTMLEntities(inString: rawImageUrlString)?.ows_stripped() else {

View file

@ -130,6 +130,10 @@ class OWSLinkPreviewTest: SSKBaseTestSwift {
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_web_button_share_sheet"))
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.instagram.com/p/BrgpsUjF9Jo/?utm_source=ig_share_sheet&igshid=94c7ihqjfmbm"))
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/gallery/igHOwDM"))
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://pinterest.com/something"))
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.pinterest.com/something"))
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://pin.it/something"))
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://www.pinterest.com/ohjoy/recipes/"))
// Strip trailing commas.
XCTAssertTrue(OWSLinkPreview.isValidLinkUrl("https://imgur.com/gallery/igHOwDM,"))
@ -171,6 +175,7 @@ class OWSLinkPreviewTest: SSKBaseTestSwift {
XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://scontent-mia3-2.cdninstagram.com/vp/9035a7d6b32e6f840856661e4a11e3cf/5CFC285B/t51.2885-15/e35/47690175_2275988962411653_1145978227188801192_n.jpg?_nc_ht=scontent-mia3-2.cdninstagram.com"))
XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://scontent-mia3-2.cdninstagram.com/vp/9035a7d6b32e6f840856661e4a11e3cf/5CFC285B/t51.2885-15/e35/47690175_2275988962411653_1145978227188801192_n.jpg?_nc_ht=scontent-mia3-2.cdninstagram.com"))
XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://i.imgur.com/PYiyLv1.jpg?fbplay"))
XCTAssertTrue(OWSLinkPreview.isValidMediaUrl("https://pinimg.com/something"))
}
func testPreviewUrlForMessageBodyText() {
@ -452,6 +457,27 @@ class OWSLinkPreviewTest: SSKBaseTestSwift {
self.waitForExpectations(timeout: 5.0, handler: nil)
}
func testLinkParsingWithRealData10() {
let expectation = self.expectation(description: "link download and parsing")
OWSLinkPreview.downloadLink(url: "https://www.pinterest.com/ohjoy/recipes/")
.done { (linkData) in
let content = try! OWSLinkPreview.parse(linkData: linkData)
XCTAssertNotNil(content)
XCTAssertEqual(content.title, "Recipes")
XCTAssertEqual(content.imageUrl, "https://i.pinimg.com/200x150/76/ae/9d/76ae9d3056dbcb295924fdd5db6951c6.jpg")
expectation.fulfill()
}.catch { (error) in
Logger.error("error: \(error)")
XCTFail("Unexpected error: \(error)")
expectation.fulfill()
}.retainUntilComplete()
self.waitForExpectations(timeout: 5.0, handler: nil)
}
// When using regular expressions to parse link titles, we need to use
// String.utf16.count, not String.count in the range.
func testRegexRanges() {