Skip to content

Commit

Permalink
Inline Tipping support for GitHub
Browse files Browse the repository at this point in the history
  • Loading branch information
brave-browser-releases authored and jdkuki committed Jul 2, 2019
1 parent 54d8cca commit 2347351
Show file tree
Hide file tree
Showing 29 changed files with 946 additions and 52 deletions.
135 changes: 108 additions & 27 deletions browser/extensions/api/brave_rewards_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,50 @@ ExtensionFunction::ResponseAction BraveRewardsTipRedditUserFunction::Run() {
return RespondNow(NoArguments());
}

void BraveRewardsTipRedditUserFunction::OnRedditPublisherInfoSaved(
std::unique_ptr<::brave_rewards::ContentSite> publisher_info) {
std::unique_ptr<brave_rewards::TipRedditUser::Params> params(
brave_rewards::TipRedditUser::Params::Create(*args_));

if (!publisher_info) {
Release();
return;
}

content::WebContents* contents = nullptr;
if (!ExtensionTabUtil::GetTabById(
params->tab_id,
Profile::FromBrowserContext(browser_context()),
false,
nullptr,
nullptr,
&contents,
nullptr)) {
return;
}

std::unique_ptr<base::DictionaryValue> params_dict =
std::make_unique<base::DictionaryValue>();
params_dict->SetStringKey("publisherKey", publisher_info->id);
params_dict->SetStringKey("url", publisher_info->url);

base::Value reddit_meta_data_dict(base::Value::Type::DICTIONARY);
reddit_meta_data_dict.SetStringKey("name", publisher_info->name);
reddit_meta_data_dict.SetStringKey(
"userName", params->reddit_meta_data.user_name);
reddit_meta_data_dict.SetStringKey(
"postText", params->reddit_meta_data.post_text);
reddit_meta_data_dict.SetStringKey(
"postRelDate", params->reddit_meta_data.post_rel_date);
params_dict->SetPath(
"redditMetaData", std::move(reddit_meta_data_dict));

::brave_rewards::OpenTipDialog(
contents, std::move(params_dict));

Release();
}

void BraveRewardsTipTwitterUserFunction::OnTwitterPublisherInfoSaved(
std::unique_ptr<::brave_rewards::ContentSite> publisher_info) {
std::unique_ptr<brave_rewards::TipTwitterUser::Params> params(
Expand Down Expand Up @@ -200,50 +244,87 @@ void BraveRewardsTipTwitterUserFunction::OnTwitterPublisherInfoSaved(

Release();
}
///////////////////////////////////////////////////
BraveRewardsTipGitHubUserFunction::BraveRewardsTipGitHubUserFunction()
: weak_factory_(this) {
}

void BraveRewardsTipRedditUserFunction::OnRedditPublisherInfoSaved(
BraveRewardsTipGitHubUserFunction::~BraveRewardsTipGitHubUserFunction() {
}

ExtensionFunction::ResponseAction
BraveRewardsTipGitHubUserFunction::Run() {
std::unique_ptr<brave_rewards::TipGitHubUser::Params> params(
brave_rewards::TipGitHubUser::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());

// Sanity check: don't allow tips in private / tor contexts,
// although the command should not have been enabled in the first place.
Profile* profile = Profile::FromBrowserContext(browser_context());
if (profile->IsOffTheRecord()) {
return RespondNow(
Error("Cannot tip Twitter user in a private context"));
}

auto* rewards_service = RewardsServiceFactory::GetForProfile(profile);
if (rewards_service) {
AddRef();
std::map<std::string, std::string> args;
args["user_name"] = params->github_meta_data.user_name;
if (args["user_name"].empty()) {
LOG(ERROR) << "Cannot tip user without username";
} else {
rewards_service->SaveGitHubPublisherInfo(
args,
base::Bind(&BraveRewardsTipGitHubUserFunction::
OnGitHubPublisherInfoSaved,
weak_factory_.GetWeakPtr()));
}
}
return RespondNow(NoArguments());
}


void BraveRewardsTipGitHubUserFunction::OnGitHubPublisherInfoSaved(
std::unique_ptr<::brave_rewards::ContentSite> publisher_info) {
std::unique_ptr<brave_rewards::TipRedditUser::Params> params(
brave_rewards::TipRedditUser::Params::Create(*args_));
std::unique_ptr<brave_rewards::TipGitHubUser::Params> params(
brave_rewards::TipGitHubUser::Params::Create(*args_));

if (!publisher_info) {
// TODO(nejczdovc): what should we do in this case?
Release();
return;
}

// Get web contents for this tab
content::WebContents* contents = nullptr;
if (!ExtensionTabUtil::GetTabById(
params->tab_id,
Profile::FromBrowserContext(browser_context()),
false,
nullptr,
nullptr,
&contents,
nullptr)) {
return;
params->tab_id,
Profile::FromBrowserContext(browser_context()),
false,
nullptr,
nullptr,
&contents,
nullptr)) {
return;
}

std::unique_ptr<base::DictionaryValue> params_dict =
std::make_unique<base::DictionaryValue>();
params_dict->SetStringKey("publisherKey", publisher_info->id);
params_dict->SetStringKey("url", publisher_info->url);
auto params_dict = std::make_unique<base::DictionaryValue>();
params_dict->SetString("publisherKey", publisher_info->id);
params_dict->SetString("url", publisher_info->url);

base::Value reddit_meta_data_dict(base::Value::Type::DICTIONARY);
reddit_meta_data_dict.SetStringKey("name", publisher_info->name);
reddit_meta_data_dict.SetStringKey(
"userName", params->reddit_meta_data.user_name);
reddit_meta_data_dict.SetStringKey(
"postText", params->reddit_meta_data.post_text);
reddit_meta_data_dict.SetStringKey(
"postRelDate", params->reddit_meta_data.post_rel_date);
params_dict->SetPath(
"redditMetaData", std::move(reddit_meta_data_dict));
auto github_meta_data_dict = std::make_unique<base::DictionaryValue>();
github_meta_data_dict->SetString("name", publisher_info->name);
github_meta_data_dict->SetString("userName",
params->github_meta_data.user_name);
params_dict->SetDictionary("githubMetaData",
std::move(github_meta_data_dict));

::brave_rewards::OpenTipDialog(
contents, std::move(params_dict));
::brave_rewards::OpenTipDialog(contents, std::move(params_dict));

Release();
}
//////////////////

BraveRewardsGetPublisherDataFunction::~BraveRewardsGetPublisherDataFunction() {
}
Expand Down
17 changes: 16 additions & 1 deletion browser/extensions/api/brave_rewards_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,22 @@ class BraveRewardsTipTwitterUserFunction
std::unique_ptr<brave_rewards::ContentSite> publisher_info);
};

class BraveRewardsTipGitHubUserFunction
: public UIThreadExtensionFunction {
public:
BraveRewardsTipGitHubUserFunction();
DECLARE_EXTENSION_FUNCTION("braveRewards.tipGitHubUser", UNKNOWN)

protected:
~BraveRewardsTipGitHubUserFunction() override;

ResponseAction Run() override;
private:
base::WeakPtrFactory<BraveRewardsTipGitHubUserFunction> weak_factory_;
void OnGitHubPublisherInfoSaved(
std::unique_ptr<brave_rewards::ContentSite> publisher_info);
};

class BraveRewardsTipRedditUserFunction : public UIThreadExtensionFunction {
public:
BraveRewardsTipRedditUserFunction();
Expand All @@ -64,7 +80,6 @@ class BraveRewardsTipRedditUserFunction : public UIThreadExtensionFunction {
~BraveRewardsTipRedditUserFunction() override;

ResponseAction Run() override;

private:
base::WeakPtrFactory<BraveRewardsTipRedditUserFunction> weak_factory_;
void OnRedditPublisherInfoSaved(
Expand Down
3 changes: 3 additions & 0 deletions browser/ui/webui/brave_webui_source.cc
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ void CustomizeWebUIHTMLSource(const std::string &name,
{ "donationAbilityYT", IDS_BRAVE_REWARDS_LOCAL_DONAT_ABILITY_YT },
{ "donationAbilityReddit", IDS_BRAVE_REWARDS_LOCAL_DONAT_ABILITY_REDT},
{ "donationAbilityTwitter", IDS_BRAVE_REWARDS_LOCAL_DONAT_ABILITY_TW },
{ "donationAbilityGitHub", IDS_BRAVE_REWARDS_LOCAL_DONAT_ABILITY_GH },
{ "donationDisabledText1", IDS_BRAVE_REWARDS_LOCAL_DONAT_DISABLED_TEXT1 }, // NOLINT
{ "donationDisabledText2", IDS_BRAVE_REWARDS_LOCAL_DONAT_DISABLED_TEXT2 }, // NOLINT
{ "donationNextDate", IDS_BRAVE_REWARDS_LOCAL_DONAT_NEXT_DATE },
Expand Down Expand Up @@ -592,6 +593,8 @@ void CustomizeWebUIHTMLSource(const std::string &name,
{ "monthlyText", IDS_BRAVE_UI_MONTHLY_TEXT },
{ "redditTipTitle", IDS_BRAVE_UI_REDDIT_TIP_TITLE },
{ "redditTipTitleEmpty", IDS_BRAVE_UI_REDDIT_TIP_TITLE_EMPTY },
{ "githubTipTitle", IDS_BRAVE_UI_GITHUB_TIP_TITLE },
{ "githubTipTitleEmpty", IDS_BRAVE_UI_GITHUB_TIP_TITLE_EMPTY },
{ "rewardsBannerText1", IDS_BRAVE_UI_REWARDS_BANNER_TEXT1 },
{ "rewardsBannerText2", IDS_BRAVE_UI_REWARDS_BANNER_TEXT2 },
{ "sendDonation", IDS_BRAVE_UI_SEND_DONATION },
Expand Down
21 changes: 21 additions & 0 deletions common/extensions/api/brave_rewards.json
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,27 @@
}
]
},
{
"name": "tipGitHubUser",
"type": "function",
"description": "Allow the user to perform a donation to a Twitter user",
"parameters": [
{
"name": "tabID",
"type": "integer"
},
{
"name": "githubMetaData",
"type": "object",
"properties": {
"userName": {
"type": "string",
"description": "Username of the GitHub author"
}
}
}
]
},
{
"name": "getPublisherData",
"type": "function",
Expand Down
3 changes: 3 additions & 0 deletions components/brave_ads/browser/ads_service_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ class MockRewardsService : public RewardsService {
MOCK_METHOD2(SaveRedditPublisherInfo,
void(const std::map<std::string, std::string>&,
brave_rewards::SaveMediaInfoCallback));
MOCK_METHOD2(SaveGitHubPublisherInfo,
void(const std::map<std::string, std::string>&,
brave_rewards::SaveMediaInfoCallback));
};

class AdsServiceTest : public testing::Test {
Expand Down
4 changes: 4 additions & 0 deletions components/brave_rewards/browser/rewards_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@ class RewardsService : public KeyedService {
const std::map<std::string, std::string>& args,
SaveMediaInfoCallback callback) = 0;

virtual void SaveGitHubPublisherInfo(
const std::map<std::string, std::string>& args,
SaveMediaInfoCallback callback) = 0;

virtual void SetInlineTipSetting(const std::string& key, bool enabled) = 0;

virtual void GetInlineTipSetting(
Expand Down
56 changes: 56 additions & 0 deletions components/brave_rewards/browser/rewards_service_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,17 @@ std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
" </div>"
" </body>"
"</html>");
} else if (request.relative_url == "/github") {
http_response->set_content(
"<html>"
" <head></head>"
" <body>"
" <div class='timeline-comment-actions'>"
" <div>GitHubCommentReactsButton</div>"
" <div>GitHubCommentElipsesButton</div>"
" </div>"
" </body>"
"</html>");
} else {
http_response->set_content(
"<html>"
Expand Down Expand Up @@ -1776,6 +1787,51 @@ IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest,
EXPECT_FALSE(IsMediaTipsInjected());
}

// Brave tip icon is injected when visiting GitHub
IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest, GitHubTipsInjectedOnGitHub) {
// Enable Rewards
EnableRewards();

// Navigate to GitHub in a new tab
GURL url = https_server()->GetURL("github.com", "/github");
ui_test_utils::NavigateToURLWithDisposition(
browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);

// Ensure that Media Tips injection is active
EXPECT_TRUE(IsMediaTipsInjected());
}

// Brave tip icon is not injected when visiting GitHub while Brave
// Rewards is disabled
IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest,
GitHubTipsNotInjectedWhenRewardsDisabled) {
// Navigate to GitHub in a new tab
GURL url = https_server()->GetURL("github.com", "/github");
ui_test_utils::NavigateToURLWithDisposition(
browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);

// Ensure that Media Tips injection is not active
EXPECT_FALSE(IsMediaTipsInjected());
}

// Brave tip icon is not injected when not visiting GitHub
IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest,
GitHubTipsNotInjectedOnNonGitHub) {
// Enable Rewards
EnableRewards();

// Navigate to GitHub in a new tab
GURL url = https_server()->GetURL("brave.com", "/github");
ui_test_utils::NavigateToURLWithDisposition(
browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);

// Ensure that Media Tips injection is not active
EXPECT_FALSE(IsMediaTipsInjected());
}

// Check pending contributions
IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest,
PendingContributionTip) {
Expand Down
32 changes: 32 additions & 0 deletions components/brave_rewards/browser/rewards_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2246,6 +2246,38 @@ void RewardsServiceImpl::SaveTwitterPublisherInfo(
std::move(callback)));
}

void RewardsServiceImpl::OnGitHubPublisherInfoSaved(
SaveMediaInfoCallback callback,
int32_t result,
ledger::PublisherInfoPtr publisher) {
if (!Connected()) {
std::move(callback).Run(nullptr);
return;
}
if (Connected()) {
ledger::Result result_converted = static_cast<ledger::Result>(result);
std::unique_ptr<brave_rewards::ContentSite> site;

if (result_converted == ledger::Result::LEDGER_OK) {
site = std::make_unique<brave_rewards::ContentSite>(
PublisherInfoToContentSite(*publisher));
}

std::move(callback).Run(std::move(site));
}
}

void RewardsServiceImpl::SaveGitHubPublisherInfo(
const std::map<std::string, std::string>& args,
SaveMediaInfoCallback callback) {
bat_ledger_->SaveMediaInfo(
"github",
mojo::MapToFlatMap(args),
base::BindOnce(&RewardsServiceImpl::OnGitHubPublisherInfoSaved,
AsWeakPtr(),
std::move(callback)));
}

void RewardsServiceImpl::OnRedditPublisherInfoSaved(
SaveMediaInfoCallback callback,
int32_t result,
Expand Down
7 changes: 7 additions & 0 deletions components/brave_rewards/browser/rewards_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,10 @@ class RewardsServiceImpl : public RewardsService,
const std::map<std::string, std::string>& args,
SaveMediaInfoCallback callback) override;

void SaveGitHubPublisherInfo(
const std::map<std::string, std::string>& args,
SaveMediaInfoCallback callback) override;

void SaveRedditPublisherInfo(
const std::map<std::string, std::string>& args,
SaveMediaInfoCallback callback) override;
Expand Down Expand Up @@ -569,6 +573,9 @@ class RewardsServiceImpl : public RewardsService,
SaveMediaInfoCallback callback,
int32_t result,
ledger::PublisherInfoPtr publisher);
void OnGitHubPublisherInfoSaved(SaveMediaInfoCallback callback,
int32_t result,
ledger::PublisherInfoPtr publisher);
void GetCountryCodes(
const std::vector<std::string>& countries,
ledger::GetCountryCodesCallback callback) override;
Expand Down
Loading

0 comments on commit 2347351

Please sign in to comment.