Commit b39b70ca authored by Yi Gu's avatar Yi Gu Committed by Chromium LUCI CQ

[CodeHealth] Convert components/permissions/ from base::Bind and base::Callback to Once/Repeating

Bug: 1152263
Change-Id: Iea5a9ae4af34b34267f4c4a04b85ea4c3c715b5f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2585640
Commit-Queue: Balazs Engedy <engedy@chromium.org>
Reviewed-by: default avatarBalazs Engedy <engedy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#836571}
parent fd82cbf8
......@@ -72,8 +72,7 @@ class TestPermissionContext : public PermissionContextBase {
// Null check required here as the quit_closure_ can also be run and reset
// first from within DecidePermission.
if (quit_closure_) {
quit_closure_.Run();
quit_closure_.Reset();
std::move(quit_closure_).Run();
}
}
......@@ -107,21 +106,19 @@ class TestPermissionContext : public PermissionContextBase {
embedding_origin, user_gesture,
std::move(callback));
if (respond_permission_) {
respond_permission_.Run();
respond_permission_.Reset();
std::move(respond_permission_).Run();
} else {
// Stop the run loop from spinning indefinitely if no response callback
// has been set, as is the case with TestParallelRequests.
quit_closure_.Run();
quit_closure_.Reset();
std::move(quit_closure_).Run();
}
}
// Set the callback to run if the permission is being responded to in the
// test. This is left empty where no response is needed, such as in parallel
// requests, invalid origin, and killswitch.
void SetRespondPermissionCallback(base::Closure callback) {
respond_permission_ = callback;
void SetRespondPermissionCallback(base::OnceClosure callback) {
respond_permission_ = std::move(callback);
}
protected:
......@@ -136,10 +133,10 @@ class TestPermissionContext : public PermissionContextBase {
private:
std::vector<ContentSetting> decisions_;
bool tab_context_updated_;
base::Closure quit_closure_;
base::OnceClosure quit_closure_;
// Callback for responding to a permission once the request has been completed
// (valid URL, kill switch disabled)
base::Closure respond_permission_;
base::OnceClosure respond_permission_;
DISALLOW_COPY_AND_ASSIGN(TestPermissionContext);
};
......@@ -222,12 +219,12 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
const PermissionRequestID id(
web_contents()->GetMainFrame()->GetProcess()->GetID(),
web_contents()->GetMainFrame()->GetRoutingID(), -1);
permission_context.SetRespondPermissionCallback(base::Bind(
permission_context.SetRespondPermissionCallback(base::BindOnce(
&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id, url, decision));
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
ASSERT_EQ(1u, permission_context.decisions().size());
EXPECT_EQ(decision, permission_context.decisions()[0]);
......@@ -323,13 +320,13 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
web_contents()->GetMainFrame()->GetRoutingID(), i);
permission_context.SetRespondPermissionCallback(
base::Bind(&PermissionContextBaseTests::RespondToPermission,
base::BindOnce(&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id, url,
CONTENT_SETTING_ASK));
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
histograms.ExpectTotalCount(
"Permissions.Prompt.Dismissed.PriorDismissCount2." +
......@@ -375,13 +372,13 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
web_contents()->GetMainFrame()->GetRoutingID(), -1);
permission_context.SetRespondPermissionCallback(
base::Bind(&PermissionContextBaseTests::RespondToPermission,
base::BindOnce(&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id, url,
CONTENT_SETTING_ASK));
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
PermissionResult result = permission_context.GetPermissionStatus(
......@@ -414,12 +411,12 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
web_contents()->GetMainFrame()->GetRoutingID(), i);
permission_context.SetRespondPermissionCallback(
base::Bind(&PermissionContextBaseTests::RespondToPermission,
base::BindOnce(&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id, url,
CONTENT_SETTING_ASK));
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
histograms.ExpectTotalCount(
"Permissions.Prompt.Dismissed.PriorDismissCount2.Geolocation",
......@@ -490,12 +487,12 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
web_contents()->GetMainFrame()->GetProcess()->GetID(),
web_contents()->GetMainFrame()->GetRoutingID(), i);
permission_context.SetRespondPermissionCallback(
base::Bind(&PermissionContextBaseTests::RespondToPermission,
base::BindOnce(&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id, url,
CONTENT_SETTING_ASK));
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
EXPECT_EQ(1u, permission_context.decisions().size());
......@@ -552,7 +549,7 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
web_contents()->GetMainFrame()->GetRoutingID(), -1);
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
ASSERT_EQ(1u, permission_context.decisions().size());
......@@ -575,13 +572,13 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
web_contents()->GetMainFrame()->GetProcess()->GetID(),
web_contents()->GetMainFrame()->GetRoutingID(), -1);
permission_context.SetRespondPermissionCallback(
base::Bind(&PermissionContextBaseTests::RespondToPermission,
base::BindOnce(&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id, url,
CONTENT_SETTING_ALLOW));
permission_context.RequestPermission(
web_contents(), id, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
ASSERT_EQ(1u, permission_context.decisions().size());
......@@ -662,18 +659,18 @@ class PermissionContextBaseTests : public content::RenderViewHostTestHarness {
// Request a permission without setting the callback to DecidePermission.
permission_context.RequestPermission(
web_contents(), id0, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
EXPECT_EQ(0u, permission_context.decisions().size());
// Set the callback, and make a second permission request.
permission_context.SetRespondPermissionCallback(base::Bind(
permission_context.SetRespondPermissionCallback(base::BindOnce(
&PermissionContextBaseTests::RespondToPermission,
base::Unretained(this), &permission_context, id0, url, response));
permission_context.RequestPermission(
web_contents(), id1, url, true /* user_gesture */,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::BindOnce(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
ASSERT_EQ(2u, permission_context.decisions().size());
......
......@@ -406,7 +406,7 @@ void PermissionDecisionAutoBlocker::RemoveEmbargoAndResetCounts(
}
void PermissionDecisionAutoBlocker::RemoveEmbargoAndResetCounts(
base::Callback<bool(const GURL& url)> filter) {
base::RepeatingCallback<bool(const GURL& url)> filter) {
std::unique_ptr<ContentSettingsForOneType> settings(
new ContentSettingsForOneType);
settings_map_->GetSettingsForOneType(
......
......@@ -113,7 +113,7 @@ class PermissionDecisionAutoBlocker : public KeyedService {
// Same as above, but cleans the slate for all permissions and for all URLs
// matching |filter|.
void RemoveEmbargoAndResetCounts(
base::Callback<bool(const GURL& url)> filter);
base::RepeatingCallback<bool(const GURL& url)> filter);
static const char* GetPromptDismissCountKeyForTesting();
......
......@@ -48,12 +48,11 @@ class PermissionDecisionAutoBlockerUnitTest : public testing::Test {
&browser_context_);
}
void SetLastEmbargoStatus(base::Closure quit_closure, bool status) {
void SetLastEmbargoStatus(base::OnceClosure quit_closure, bool status) {
callback_was_run_ = true;
last_embargoed_status_ = status;
if (quit_closure) {
quit_closure.Run();
quit_closure.Reset();
std::move(quit_closure).Run();
}
}
......@@ -307,7 +306,8 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, RemoveEmbargoAndResetCounts_All) {
EXPECT_EQ(
2, autoblocker()->GetIgnoreCount(url2, ContentSettingsType::GEOLOCATION));
autoblocker()->RemoveEmbargoAndResetCounts(base::Bind(&FilterGoogle));
autoblocker()->RemoveEmbargoAndResetCounts(
base::BindRepeating(&FilterGoogle));
// Expect that url1's actions are gone, but url2's remain.
EXPECT_EQ(0, autoblocker()->GetDismissCount(
......@@ -358,7 +358,7 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, RemoveEmbargoAndResetCounts_All) {
1, autoblocker()->GetIgnoreCount(url2, ContentSettingsType::MIDI_SYSEX));
// Remove everything and expect that it's all gone.
autoblocker()->RemoveEmbargoAndResetCounts(base::Bind(&FilterAll));
autoblocker()->RemoveEmbargoAndResetCounts(base::BindRepeating(&FilterAll));
EXPECT_EQ(0, autoblocker()->GetDismissCount(
url1, ContentSettingsType::GEOLOCATION));
......@@ -609,7 +609,8 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, CheckEmbargoStartTime) {
// Remove records of dismiss and ignore embargoes and confirm start time
// reverts to default.
autoblocker()->RemoveEmbargoAndResetCounts(base::Bind(&FilterGoogle));
autoblocker()->RemoveEmbargoAndResetCounts(
base::BindRepeating(&FilterGoogle));
embargo_start_time =
autoblocker()->GetEmbargoStartTime(url, ContentSettingsType::GEOLOCATION);
EXPECT_EQ(base::Time(), embargo_start_time);
......
......@@ -125,7 +125,7 @@ class PermissionManagerTest : public content::RenderViewHostTestHarness {
public:
void OnPermissionChange(PermissionStatus permission) {
if (!quit_closure_.is_null())
quit_closure_.Run();
std::move(quit_closure_).Run();
callback_called_ = true;
callback_result_ = permission;
}
......@@ -173,7 +173,7 @@ class PermissionManagerTest : public content::RenderViewHostTestHarness {
quit_closure_ = loop.QuitClosure();
int result = GetPermissionControllerDelegate()->RequestPermission(
type, rfh, origin, true,
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindOnce(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
loop.Run();
return result;
......@@ -261,7 +261,7 @@ class PermissionManagerTest : public content::RenderViewHostTestHarness {
const GURL other_url_;
bool callback_called_;
PermissionStatus callback_result_;
base::Closure quit_closure_;
base::OnceClosure quit_closure_;
std::unique_ptr<content::TestBrowserContext> browser_context_;
TestPermissionsClient client_;
};
......@@ -337,7 +337,7 @@ TEST_F(PermissionManagerTest, SubscriptionDestroyedCleanlyWithoutUnsubscribe) {
// haven't been removed, crbug.com/720071.
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
}
......@@ -345,7 +345,7 @@ TEST_F(PermissionManagerTest, SubscribeUnsubscribeAfterShutdown) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
// Simulate Keyed Services shutdown pass. Note: Shutdown will be called second
......@@ -360,7 +360,7 @@ TEST_F(PermissionManagerTest, SubscribeUnsubscribeAfterShutdown) {
int subscription2_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetPermissionControllerDelegate()->UnsubscribePermissionStatusChange(
......@@ -371,7 +371,7 @@ TEST_F(PermissionManagerTest, SameTypeChangeNotifies) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -388,7 +388,7 @@ TEST_F(PermissionManagerTest, DifferentTypeChangeDoesNotNotify) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -404,7 +404,7 @@ TEST_F(PermissionManagerTest, ChangeAfterUnsubscribeDoesNotNotify) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetPermissionControllerDelegate()->UnsubscribePermissionStatusChange(
......@@ -420,7 +420,7 @@ TEST_F(PermissionManagerTest, DifferentPrimaryUrlDoesNotNotify) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -437,7 +437,7 @@ TEST_F(PermissionManagerTest, DifferentSecondaryUrlDoesNotNotify) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::STORAGE_ACCESS_GRANT, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -454,7 +454,7 @@ TEST_F(PermissionManagerTest, WildCardPatternNotifies) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetDefaultContentSetting(
......@@ -474,7 +474,7 @@ TEST_F(PermissionManagerTest, ClearSettingsNotifies) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->ClearSettingsForOneType(
......@@ -491,7 +491,7 @@ TEST_F(PermissionManagerTest, NewValueCorrectlyPassed) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -511,7 +511,7 @@ TEST_F(PermissionManagerTest, ChangeWithoutPermissionChangeDoesNotNotify) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -530,7 +530,7 @@ TEST_F(PermissionManagerTest, ChangesBackAndForth) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -558,7 +558,7 @@ TEST_F(PermissionManagerTest, ChangesBackAndForthWorker) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, nullptr, url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
GetHostContentSettingsMap()->SetContentSettingDefaultScope(
......@@ -583,7 +583,7 @@ TEST_F(PermissionManagerTest, SubscribeMIDIPermission) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::MIDI, main_rfh(), url(),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
CheckPermissionStatus(PermissionType::GEOLOCATION, PermissionStatus::ASK);
......@@ -608,7 +608,7 @@ TEST_F(PermissionManagerTest, PermissionIgnoredCleanup) {
GetPermissionControllerDelegate()->RequestPermission(
PermissionType::GEOLOCATION, main_rfh(), url(), /*user_gesture=*/true,
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindOnce(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
EXPECT_FALSE(PendingRequestsEmpty());
......@@ -794,7 +794,7 @@ TEST_F(PermissionManagerTest, SubscribeWithPermissionDelegation) {
int subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, child, GURL(kOrigin2),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
EXPECT_FALSE(callback_called());
......@@ -831,7 +831,7 @@ TEST_F(PermissionManagerTest, SubscribeWithPermissionDelegation) {
subscription_id =
GetPermissionControllerDelegate()->SubscribePermissionStatusChange(
PermissionType::GEOLOCATION, child, GURL(kOrigin2),
base::Bind(&PermissionManagerTest::OnPermissionChange,
base::BindRepeating(&PermissionManagerTest::OnPermissionChange,
base::Unretained(this)));
EXPECT_FALSE(callback_called());
......
......@@ -67,7 +67,7 @@ class PermissionPrompt {
virtual bool WasCurrentRequestAlreadyDisplayed() = 0;
};
typedef base::Callback<
typedef base::RepeatingCallback<
std::unique_ptr<PermissionPrompt>(content::WebContents*, Delegate*)>
Factory;
......
......@@ -445,7 +445,7 @@ bool PermissionRequestManager::WasCurrentRequestAlreadyDisplayed() {
PermissionRequestManager::PermissionRequestManager(
content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
view_factory_(base::Bind(&PermissionPrompt::Create)),
view_factory_(base::BindRepeating(&PermissionPrompt::Create)),
view_(nullptr),
tab_is_hidden_(web_contents->GetVisibility() ==
content::Visibility::HIDDEN),
......
......@@ -20,13 +20,13 @@ MockPermissionPromptFactory::MockPermissionPromptFactory(
requests_count_(0),
response_type_(PermissionRequestManager::NONE),
manager_(manager) {
manager->set_view_factory_for_testing(
base::Bind(&MockPermissionPromptFactory::Create, base::Unretained(this)));
manager->set_view_factory_for_testing(base::BindRepeating(
&MockPermissionPromptFactory::Create, base::Unretained(this)));
}
MockPermissionPromptFactory::~MockPermissionPromptFactory() {
manager_->set_view_factory_for_testing(
base::Bind(&MockPermissionPromptFactory::DoNotCreate));
base::BindRepeating(&MockPermissionPromptFactory::DoNotCreate));
for (auto* prompt : prompts_)
prompt->factory_ = nullptr;
prompts_.clear();
......@@ -86,7 +86,7 @@ void MockPermissionPromptFactory::WaitForPermissionBubble() {
base::RunLoop loop;
show_bubble_quit_closure_ = loop.QuitClosure();
loop.Run();
show_bubble_quit_closure_ = base::Closure();
show_bubble_quit_closure_ = base::RepeatingClosure();
}
// static
......
......@@ -81,7 +81,7 @@ class MockPermissionPromptFactory {
std::vector<MockPermissionPrompt*> prompts_;
PermissionRequestManager::AutoResponseType response_type_;
base::Closure show_bubble_quit_closure_;
base::RepeatingClosure show_bubble_quit_closure_;
// The bubble manager that will be associated with this factory.
PermissionRequestManager* manager_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment