Skip to content

Commit e0f67a1

Browse files
authored
Merge pull request #4221 from brave/pr4215_twitter-inline_1.2.x
Fixes inline tip for twitter (uplift to 1.2.x)
2 parents 3709abe + 9114033 commit e0f67a1

File tree

3 files changed

+70
-26
lines changed

3 files changed

+70
-26
lines changed

components/brave_rewards/resources/extension/brave_rewards/background.ts

+35
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,29 @@ const tipRedditMedia = (mediaMetaData: RewardsTip.MediaMetaData) => {
9999
})
100100
}
101101

102+
const makeTwitterRequest = (url: string, credentialHeaders: {}, sendResponse: any) => {
103+
fetch(url, {
104+
credentials: 'include',
105+
headers: {
106+
...credentialHeaders
107+
},
108+
referrerPolicy: 'no-referrer-when-downgrade',
109+
method: 'GET',
110+
redirect: 'follow'
111+
})
112+
.then(response => {
113+
if (!response.ok) {
114+
throw new Error(`Twitter API request failed: ${response.statusText} (${response.status})`)
115+
}
116+
117+
return response.json()
118+
})
119+
.then(data => sendResponse(data))
120+
.catch(error => {
121+
sendResponse(error)
122+
})
123+
}
124+
102125
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
103126
const action = typeof msg === 'string' ? msg : msg.type
104127
switch (action) {
@@ -132,6 +155,18 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
132155
// Must return true for asynchronous calls to sendResponse
133156
return true
134157
}
158+
case 'twitterGetTweetDetails': {
159+
const url = new URL('https://api.twitter.com/1.1/statuses/show.json')
160+
url.searchParams.append('id', msg.tweetId)
161+
makeTwitterRequest(url.toString(), msg.credentialHeaders, sendResponse)
162+
return true
163+
}
164+
case 'twitterGetUserDetails': {
165+
const url = new URL('https://api.twitter.com/1.1/users/show.json')
166+
url.searchParams.append('screen_name', msg.screenName)
167+
makeTwitterRequest(url.toString(), msg.credentialHeaders, sendResponse)
168+
return true
169+
}
135170
default:
136171
return false
137172
}

components/brave_rewards/resources/extension/brave_rewards/content_scripts/twitter.ts

+34-25
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@
55
// Utils
66
import { getMessage } from '../background/api/locale_api'
77

8+
interface TweetResonse {
9+
text: string,
10+
user: {
11+
name: string,
12+
screen_name: string,
13+
id_str: string
14+
},
15+
created_at: string
16+
}
17+
18+
interface UserResonse {
19+
id_str: string
20+
}
21+
822
let timeout: any = null
923
let newTwitter = true
1024

@@ -13,37 +27,32 @@ const getTwitterAPICredentials = () => {
1327
return new Promise(resolve => chrome.runtime.sendMessage(msg, resolve))
1428
}
1529

16-
const makeTwitterRequest = async (url: string) => {
30+
const getTweetDetails = async (tweetId: string) => {
1731
const credentialHeaders = await getTwitterAPICredentials()
1832
if (Object.keys(credentialHeaders).length === 0) {
1933
throw new Error(`Unable to make Twitter API request: no credential headers`)
2034
}
21-
const response = await fetch(url, {
22-
credentials: 'include',
23-
headers: {
24-
...credentialHeaders
25-
},
26-
referrerPolicy: 'no-referrer-when-downgrade',
27-
method: 'GET',
28-
mode: 'cors',
29-
redirect: 'follow'
30-
})
31-
if (!response.ok) {
32-
throw new Error(`Twitter API request failed: ${response.statusText} (${response.status})`)
33-
}
34-
return response.json()
35-
}
3635

37-
const getTweetDetails = async (tweetId: string) => {
38-
const url = new URL('https://api.twitter.com/1.1/statuses/show.json')
39-
url.searchParams.append('id', tweetId)
40-
return makeTwitterRequest(url.toString())
36+
const msg = {
37+
type: 'twitterGetTweetDetails',
38+
tweetId,
39+
credentialHeaders
40+
}
41+
return new Promise(resolve => chrome.runtime.sendMessage(msg, resolve))
4142
}
4243

4344
const getUserDetails = async (screenName: string) => {
44-
const url = new URL('https://api.twitter.com/1.1/users/show.json')
45-
url.searchParams.append('screen_name', screenName)
46-
return makeTwitterRequest(url.toString())
45+
const credentialHeaders = await getTwitterAPICredentials()
46+
if (Object.keys(credentialHeaders).length === 0) {
47+
throw new Error(`Unable to make Twitter API request: no credential headers`)
48+
}
49+
50+
const msg = {
51+
type: 'twitterGetUserDetails',
52+
screenName,
53+
credentialHeaders
54+
}
55+
return new Promise(resolve => chrome.runtime.sendMessage(msg, resolve))
4756
}
4857

4958
function getTweetId (tweet: Element) {
@@ -67,7 +76,7 @@ const getTweetMetaData = (tweet: Element, tweetId: string): Promise<RewardsTip.M
6776
}
6877

6978
return getTweetDetails(tweetId)
70-
.then(tweetDetails => {
79+
.then((tweetDetails: TweetResonse) => {
7180
const mediaMetadata: RewardsTip.MediaMetaData = {
7281
mediaType: 'twitter',
7382
twitterName: tweetDetails.user.name,
@@ -317,7 +326,7 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
317326
const screenName = msg.screenName
318327
if (newTwitter) {
319328
getUserDetails(screenName)
320-
.then(userDetails => {
329+
.then((userDetails: UserResonse) => {
321330
const userId = userDetails.id_str
322331
const profileUrl = `https://twitter.com/intent/user?user_id=${userId}&screen_name=${screenName}`
323332
sendResponse({ profileUrl })

components/brave_rewards/resources/extension/brave_rewards/manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,6 @@
6262
"128": "img/bat-128.png",
6363
"256": "img/bat-256.png"
6464
},
65-
"content_security_policy": "default-src 'self'; img-src 'self' chrome: data:; style-src 'self' 'unsafe-inline';font-src 'self' data:;",
65+
"content_security_policy": "default-src 'self'; img-src 'self' chrome: data:; style-src 'self' 'unsafe-inline';font-src 'self' data:; connect-src https://api.twitter.com 'self';",
6666
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmqLJHCRq1BdVqkYZuPiH3UxlEnF6ZZGq2ba8IOIuuAjGd3xFjA1yxKhuJWt17mCUonB04jG+BmxDQNj29gHhBHKwV20Zw4HNQeyXsThx6op4lfL0ypiZX727Dvcd2zn48eP+0hT/2oP3szHvsPDHrZUPwXcL6ButcJYWsO18OlIMPK4L3B/l37nOeAs2OVlSrrKFu7uiAfGj70kJYvAQdHEtCsuTsWX3ApZ6MM49XTYD5TyKvXJXHagsiDmqeAZPAgPrk32ES43deqZYWorWOCFHuRzjJUwNRJBJn59IP4DK5X1Y+Uc7VjZDk9EUft+BI8UT6M+Ok8EDaDZZI57c5QIDAQAB"
6767
}

0 commit comments

Comments
 (0)