Commit 2baad015 authored by Timothy Loh's avatar Timothy Loh Committed by Commit Bot

Clean up interface to PermissionPrompt and subclasses

Following https://crrev.com/c/567940, this patch greatly simplifies the
interface to PermissionPrompt as follows:
- Object creation and showing a prompt are now tied. Move Show() and
  SetDelegate() logic into the ctor.
- Hiding only happens by object destruction. Remove HidesAutomatically()
  and move Hide() logic ino the dtor.

This patch also cleans up MockPermissionPrompt{,Factory} accordingly,
moving some logic previously from MockPermissionPrompt::Show() to the
factory.

Change-Id: I7868d645df6dbba8ea5706a8d9e7e59cfe1b157f
Reviewed-on: https://chromium-review.googlesource.com/572894
Commit-Queue: Timothy Loh <timloh@chromium.org>
Reviewed-by: default avatarRaymes Khoury <raymes@chromium.org>
Reviewed-by: default avatarTrent Apted <tapted@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487421}
parent 83bc18b1
...@@ -18,21 +18,14 @@ ...@@ -18,21 +18,14 @@
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
PermissionPromptAndroid::PermissionPromptAndroid( PermissionPromptAndroid::PermissionPromptAndroid(
content::WebContents* web_contents) content::WebContents* web_contents,
Delegate* delegate)
: web_contents_(web_contents), : web_contents_(web_contents),
delegate_(nullptr), delegate_(delegate),
persist_(true), persist_(true),
weak_factory_(this) { weak_factory_(this) {
DCHECK(web_contents); DCHECK(web_contents);
}
PermissionPromptAndroid::~PermissionPromptAndroid() {}
void PermissionPromptAndroid::SetDelegate(Delegate* delegate) {
delegate_ = delegate;
}
void PermissionPromptAndroid::Show() {
bool has_gesture = true; bool has_gesture = true;
for (const PermissionRequest* request : delegate_->Requests()) { for (const PermissionRequest* request : delegate_->Requests()) {
has_gesture &= has_gesture &=
...@@ -53,20 +46,12 @@ void PermissionPromptAndroid::Show() { ...@@ -53,20 +46,12 @@ void PermissionPromptAndroid::Show() {
delegate_->Requests()[0]->GetOrigin()); delegate_->Requests()[0]->GetOrigin());
} }
PermissionPromptAndroid::~PermissionPromptAndroid() {}
bool PermissionPromptAndroid::CanAcceptRequestUpdate() { bool PermissionPromptAndroid::CanAcceptRequestUpdate() {
return false; return false;
} }
bool PermissionPromptAndroid::HidesAutomatically() {
return true;
}
void PermissionPromptAndroid::Hide() {
// Hide() is only called if HidesAutomatically() returns false or
// CanAcceptRequestUpdate() return true.
NOTREACHED();
}
void PermissionPromptAndroid::UpdateAnchorPosition() { void PermissionPromptAndroid::UpdateAnchorPosition() {
NOTREACHED() << "UpdateAnchorPosition is not implemented"; NOTREACHED() << "UpdateAnchorPosition is not implemented";
} }
...@@ -77,18 +62,15 @@ gfx::NativeWindow PermissionPromptAndroid::GetNativeWindow() { ...@@ -77,18 +62,15 @@ gfx::NativeWindow PermissionPromptAndroid::GetNativeWindow() {
} }
void PermissionPromptAndroid::Closing() { void PermissionPromptAndroid::Closing() {
if (delegate_)
delegate_->Closing(); delegate_->Closing();
} }
void PermissionPromptAndroid::TogglePersist(bool value) { void PermissionPromptAndroid::TogglePersist(bool value) {
persist_ = value; persist_ = value;
if (delegate_)
delegate_->TogglePersist(value); delegate_->TogglePersist(value);
} }
void PermissionPromptAndroid::Accept() { void PermissionPromptAndroid::Accept() {
if (delegate_) {
if (ShouldShowPersistenceToggle()) { if (ShouldShowPersistenceToggle()) {
for (const PermissionRequest* request : delegate_->Requests()) { for (const PermissionRequest* request : delegate_->Requests()) {
PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle( PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle(
...@@ -96,11 +78,9 @@ void PermissionPromptAndroid::Accept() { ...@@ -96,11 +78,9 @@ void PermissionPromptAndroid::Accept() {
} }
} }
delegate_->Accept(); delegate_->Accept();
}
} }
void PermissionPromptAndroid::Deny() { void PermissionPromptAndroid::Deny() {
if (delegate_) {
if (ShouldShowPersistenceToggle()) { if (ShouldShowPersistenceToggle()) {
for (const PermissionRequest* request : delegate_->Requests()) { for (const PermissionRequest* request : delegate_->Requests()) {
PermissionUmaUtil::PermissionPromptDeniedWithPersistenceToggle( PermissionUmaUtil::PermissionPromptDeniedWithPersistenceToggle(
...@@ -108,7 +88,6 @@ void PermissionPromptAndroid::Deny() { ...@@ -108,7 +88,6 @@ void PermissionPromptAndroid::Deny() {
} }
} }
delegate_->Deny(); delegate_->Deny();
}
} }
size_t PermissionPromptAndroid::PermissionCount() const { size_t PermissionPromptAndroid::PermissionCount() const {
...@@ -183,6 +162,7 @@ GURL PermissionPromptAndroid::GetLinkURL() const { ...@@ -183,6 +162,7 @@ GURL PermissionPromptAndroid::GetLinkURL() const {
// static // static
std::unique_ptr<PermissionPrompt> PermissionPrompt::Create( std::unique_ptr<PermissionPrompt> PermissionPrompt::Create(
content::WebContents* web_contents) { content::WebContents* web_contents,
return base::MakeUnique<PermissionPromptAndroid>(web_contents); Delegate* delegate) {
return base::MakeUnique<PermissionPromptAndroid>(web_contents, delegate);
} }
...@@ -19,15 +19,12 @@ class WebContents; ...@@ -19,15 +19,12 @@ class WebContents;
class PermissionPromptAndroid : public PermissionPrompt { class PermissionPromptAndroid : public PermissionPrompt {
public: public:
explicit PermissionPromptAndroid(content::WebContents* web_contents); PermissionPromptAndroid(content::WebContents* web_contents,
Delegate* delegate);
~PermissionPromptAndroid() override; ~PermissionPromptAndroid() override;
// PermissionPrompt: // PermissionPrompt:
void SetDelegate(Delegate* delegate) override;
void Show() override;
bool CanAcceptRequestUpdate() override; bool CanAcceptRequestUpdate() override;
bool HidesAutomatically() override;
void Hide() override;
void UpdateAnchorPosition() override; void UpdateAnchorPosition() override;
gfx::NativeWindow GetNativeWindow() override; gfx::NativeWindow GetNativeWindow() override;
......
...@@ -404,9 +404,7 @@ void PermissionRequestManager::ShowBubble() { ...@@ -404,9 +404,7 @@ void PermissionRequestManager::ShowBubble() {
DCHECK(main_frame_has_fully_loaded_); DCHECK(main_frame_has_fully_loaded_);
DCHECK(tab_can_show_prompts_); DCHECK(tab_can_show_prompts_);
view_ = view_factory_.Run(web_contents()); view_ = view_factory_.Run(web_contents(), this);
view_->SetDelegate(this);
view_->Show();
PermissionUmaUtil::PermissionPromptShown(requests_); PermissionUmaUtil::PermissionPromptShown(requests_);
NotifyBubbleAdded(); NotifyBubbleAdded();
...@@ -417,9 +415,6 @@ void PermissionRequestManager::ShowBubble() { ...@@ -417,9 +415,6 @@ void PermissionRequestManager::ShowBubble() {
void PermissionRequestManager::DeleteBubble() { void PermissionRequestManager::DeleteBubble() {
DCHECK(view_); DCHECK(view_);
if (!view_->HidesAutomatically())
view_->Hide();
view_->SetDelegate(nullptr);
view_.reset(); view_.reset();
} }
......
...@@ -118,7 +118,6 @@ class PermissionRequestManager ...@@ -118,7 +118,6 @@ class PermissionRequestManager
// lot of friends. // lot of friends.
friend class GeolocationBrowserTest; friend class GeolocationBrowserTest;
friend class GeolocationPermissionContextTests; friend class GeolocationPermissionContextTests;
friend class MockPermissionPrompt;
friend class MockPermissionPromptFactory; friend class MockPermissionPromptFactory;
friend class PermissionContextBaseTests; friend class PermissionContextBaseTests;
friend class PermissionRequestManagerTest; friend class PermissionRequestManagerTest;
......
...@@ -20,15 +20,11 @@ class Browser; ...@@ -20,15 +20,11 @@ class Browser;
class PermissionBubbleCocoa : public PermissionPrompt { class PermissionBubbleCocoa : public PermissionPrompt {
public: public:
explicit PermissionBubbleCocoa(Browser* browser); PermissionBubbleCocoa(Browser* browser, Delegate* delegate);
~PermissionBubbleCocoa() override; ~PermissionBubbleCocoa() override;
// PermissionPrompt: // PermissionPrompt:
void Show() override;
void Hide() override;
void SetDelegate(Delegate* delegate) override;
bool CanAcceptRequestUpdate() override; bool CanAcceptRequestUpdate() override;
bool HidesAutomatically() override;
void UpdateAnchorPosition() override; void UpdateAnchorPosition() override;
gfx::NativeWindow GetNativeWindow() override; gfx::NativeWindow GetNativeWindow() override;
......
...@@ -11,13 +11,9 @@ ...@@ -11,13 +11,9 @@
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#import "ui/base/cocoa/nsview_additions.h" #import "ui/base/cocoa/nsview_additions.h"
PermissionBubbleCocoa::PermissionBubbleCocoa(Browser* browser) PermissionBubbleCocoa::PermissionBubbleCocoa(Browser* browser,
: browser_(browser), delegate_(nullptr), bubbleController_(nil) {} Delegate* delegate)
: browser_(browser), delegate_(delegate), bubbleController_(nil) {
PermissionBubbleCocoa::~PermissionBubbleCocoa() {
}
void PermissionBubbleCocoa::Show() {
DCHECK(browser_); DCHECK(browser_);
if (!bubbleController_) { if (!bubbleController_) {
...@@ -29,24 +25,14 @@ void PermissionBubbleCocoa::Show() { ...@@ -29,24 +25,14 @@ void PermissionBubbleCocoa::Show() {
[bubbleController_ showWithDelegate:delegate_]; [bubbleController_ showWithDelegate:delegate_];
} }
void PermissionBubbleCocoa::Hide() { PermissionBubbleCocoa::~PermissionBubbleCocoa() {
[bubbleController_ close]; [bubbleController_ close];
} }
void PermissionBubbleCocoa::SetDelegate(Delegate* delegate) {
if (delegate_ == delegate)
return;
delegate_ = delegate;
}
bool PermissionBubbleCocoa::CanAcceptRequestUpdate() { bool PermissionBubbleCocoa::CanAcceptRequestUpdate() {
return ![[[bubbleController_ window] contentView] cr_isMouseInView]; return ![[[bubbleController_ window] contentView] cr_isMouseInView];
} }
bool PermissionBubbleCocoa::HidesAutomatically() {
return false;
}
void PermissionBubbleCocoa::UpdateAnchorPosition() { void PermissionBubbleCocoa::UpdateAnchorPosition() {
[bubbleController_ updateAnchorPosition]; [bubbleController_ updateAnchorPosition];
} }
......
...@@ -15,20 +15,15 @@ ...@@ -15,20 +15,15 @@
#include "ui/base/test/scoped_fake_nswindow_fullscreen.h" #include "ui/base/test/scoped_fake_nswindow_fullscreen.h"
IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, HasLocationBarByDefault) { IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, HasLocationBarByDefault) {
PermissionBubbleCocoa bubble(browser()); PermissionBubbleCocoa bubble(browser(), test_delegate());
bubble.SetDelegate(test_delegate());
bubble.Show();
EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]);
bubble.Hide();
} }
IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest,
BrowserFullscreenHasLocationBar) { BrowserFullscreenHasLocationBar) {
ui::test::ScopedFakeNSWindowFullscreen faker; ui::test::ScopedFakeNSWindowFullscreen faker;
PermissionBubbleCocoa bubble(browser()); PermissionBubbleCocoa bubble(browser(), test_delegate());
bubble.SetDelegate(test_delegate());
bubble.Show();
EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]);
FullscreenController* controller = FullscreenController* controller =
...@@ -52,16 +47,13 @@ IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, ...@@ -52,16 +47,13 @@ IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest,
faker.FinishTransition(); faker.FinishTransition();
EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]);
bubble.Hide();
} }
IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest,
TabFullscreenHasLocationBar) { TabFullscreenHasLocationBar) {
ui::test::ScopedFakeNSWindowFullscreen faker; ui::test::ScopedFakeNSWindowFullscreen faker;
PermissionBubbleCocoa bubble(browser()); PermissionBubbleCocoa bubble(browser(), test_delegate());
bubble.SetDelegate(test_delegate());
bubble.Show();
EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]);
FullscreenController* controller = FullscreenController* controller =
...@@ -76,25 +68,18 @@ IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, ...@@ -76,25 +68,18 @@ IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest,
faker.FinishTransition(); faker.FinishTransition();
EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_TRUE([bubble.bubbleController_ hasVisibleLocationBar]);
bubble.Hide();
} }
IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, AppHasNoLocationBar) { IN_PROC_BROWSER_TEST_F(PermissionBubbleBrowserTest, AppHasNoLocationBar) {
Browser* app_browser = OpenExtensionAppWindow(); Browser* app_browser = OpenExtensionAppWindow();
PermissionBubbleCocoa bubble(app_browser); PermissionBubbleCocoa bubble(app_browser, test_delegate());
bubble.SetDelegate(test_delegate());
bubble.Show();
EXPECT_FALSE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_FALSE([bubble.bubbleController_ hasVisibleLocationBar]);
bubble.Hide();
} }
// http://crbug.com/470724 // http://crbug.com/470724
// Kiosk mode on Mac has a location bar but it shouldn't. // Kiosk mode on Mac has a location bar but it shouldn't.
IN_PROC_BROWSER_TEST_F(PermissionBubbleKioskBrowserTest, IN_PROC_BROWSER_TEST_F(PermissionBubbleKioskBrowserTest,
DISABLED_KioskHasNoLocationBar) { DISABLED_KioskHasNoLocationBar) {
PermissionBubbleCocoa bubble(browser()); PermissionBubbleCocoa bubble(browser(), test_delegate());
bubble.SetDelegate(test_delegate());
bubble.Show();
EXPECT_FALSE([bubble.bubbleController_ hasVisibleLocationBar]); EXPECT_FALSE([bubble.bubbleController_ hasVisibleLocationBar]);
bubble.Hide();
} }
...@@ -78,8 +78,8 @@ class PermissionBubbleControllerTest : public CocoaProfileTest, ...@@ -78,8 +78,8 @@ class PermissionBubbleControllerTest : public CocoaProfileTest,
void SetUp() override { void SetUp() override {
CocoaProfileTest::SetUp(); CocoaProfileTest::SetUp();
bridge_.reset(new PermissionBubbleCocoa(browser()));
AddRequest(kPermissionA); AddRequest(kPermissionA);
bridge_.reset(new PermissionBubbleCocoa(browser(), this));
controller_ = controller_ =
[[PermissionBubbleController alloc] initWithBrowser:browser() [[PermissionBubbleController alloc] initWithBrowser:browser()
bridge:bridge_.get()]; bridge:bridge_.get()];
......
...@@ -35,11 +35,12 @@ views::BubbleBorder::Arrow PermissionPromptImpl::GetAnchorArrow() { ...@@ -35,11 +35,12 @@ views::BubbleBorder::Arrow PermissionPromptImpl::GetAnchorArrow() {
// static // static
std::unique_ptr<PermissionPrompt> PermissionPrompt::Create( std::unique_ptr<PermissionPrompt> PermissionPrompt::Create(
content::WebContents* web_contents) { content::WebContents* web_contents,
Delegate* delegate) {
if (ui::MaterialDesignController::IsSecondaryUiMaterial()) { if (ui::MaterialDesignController::IsSecondaryUiMaterial()) {
return base::WrapUnique(new PermissionPromptImpl( return base::WrapUnique(new PermissionPromptImpl(
chrome::FindBrowserWithWebContents(web_contents))); chrome::FindBrowserWithWebContents(web_contents), delegate));
} }
return base::MakeUnique<PermissionBubbleCocoa>( return base::MakeUnique<PermissionBubbleCocoa>(
chrome::FindBrowserWithWebContents(web_contents)); chrome::FindBrowserWithWebContents(web_contents), delegate);
} }
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "chrome/browser/permissions/permission_request_manager.h" #include "build/build_config.h"
#include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h" #include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -15,43 +15,14 @@ ...@@ -15,43 +15,14 @@
#endif #endif
MockPermissionPrompt::~MockPermissionPrompt() { MockPermissionPrompt::~MockPermissionPrompt() {
Hide(); if (factory_)
} factory_->HideView(this);
void MockPermissionPrompt::Show() {
factory_->ShowView(this);
factory_->show_count_++;
factory_->requests_count_ = manager_->requests_.size();
for (const PermissionRequest* request : manager_->requests_) {
factory_->request_types_seen_.push_back(
request->GetPermissionRequestType());
// The actual prompt will call these, so test they're sane.
EXPECT_FALSE(request->GetMessageTextFragment().empty());
#if defined(OS_ANDROID)
EXPECT_FALSE(request->GetMessageText().empty());
EXPECT_NE(0, request->GetIconId());
#else
EXPECT_FALSE(request->GetIconId().is_empty());
#endif
}
factory_->UpdateResponseType();
is_visible_ = true;
} }
bool MockPermissionPrompt::CanAcceptRequestUpdate() { bool MockPermissionPrompt::CanAcceptRequestUpdate() {
return can_update_ui_; return can_update_ui_;
} }
bool MockPermissionPrompt::HidesAutomatically() {
return false;
}
void MockPermissionPrompt::Hide() {
if (is_visible_ && factory_)
factory_->HideView(this);
is_visible_ = false;
}
void MockPermissionPrompt::UpdateAnchorPosition() {} void MockPermissionPrompt::UpdateAnchorPosition() {}
gfx::NativeWindow MockPermissionPrompt::GetNativeWindow() { gfx::NativeWindow MockPermissionPrompt::GetNativeWindow() {
...@@ -60,13 +31,18 @@ gfx::NativeWindow MockPermissionPrompt::GetNativeWindow() { ...@@ -60,13 +31,18 @@ gfx::NativeWindow MockPermissionPrompt::GetNativeWindow() {
return nullptr; return nullptr;
} }
bool MockPermissionPrompt::IsVisible() {
return is_visible_;
}
MockPermissionPrompt::MockPermissionPrompt(MockPermissionPromptFactory* factory, MockPermissionPrompt::MockPermissionPrompt(MockPermissionPromptFactory* factory,
PermissionRequestManager* manager) Delegate* delegate,
: factory_(factory), bool can_update_ui)
manager_(manager), : factory_(factory), delegate_(delegate), can_update_ui_(can_update_ui) {
can_update_ui_(true), for (const PermissionRequest* request : delegate_->Requests()) {
is_visible_(false) {} // The actual prompt will call these, so test they're sane.
EXPECT_FALSE(request->GetMessageTextFragment().empty());
#if defined(OS_ANDROID)
EXPECT_FALSE(request->GetMessageText().empty());
EXPECT_NE(0, request->GetIconId());
#else
EXPECT_FALSE(request->GetIconId().is_empty());
#endif
}
}
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "chrome/browser/ui/permission_bubble/permission_prompt.h" #include "chrome/browser/ui/permission_bubble/permission_prompt.h"
class MockPermissionPromptFactory; class MockPermissionPromptFactory;
class PermissionRequestManager;
// Provides a skeleton class for unit and browser testing when trying to test // Provides a skeleton class for unit and browser testing when trying to test
// the request manager logic. Should not be used for anything that requires // the request manager logic. Should not be used for anything that requires
...@@ -19,11 +18,7 @@ class MockPermissionPrompt : public PermissionPrompt { ...@@ -19,11 +18,7 @@ class MockPermissionPrompt : public PermissionPrompt {
~MockPermissionPrompt() override; ~MockPermissionPrompt() override;
// PermissionPrompt: // PermissionPrompt:
void SetDelegate(Delegate* delegate) override {}
void Show() override;
bool CanAcceptRequestUpdate() override; bool CanAcceptRequestUpdate() override;
bool HidesAutomatically() override;
void Hide() override;
void UpdateAnchorPosition() override; void UpdateAnchorPosition() override;
gfx::NativeWindow GetNativeWindow() override; gfx::NativeWindow GetNativeWindow() override;
...@@ -33,12 +28,12 @@ class MockPermissionPrompt : public PermissionPrompt { ...@@ -33,12 +28,12 @@ class MockPermissionPrompt : public PermissionPrompt {
friend class MockPermissionPromptFactory; friend class MockPermissionPromptFactory;
MockPermissionPrompt(MockPermissionPromptFactory* factory, MockPermissionPrompt(MockPermissionPromptFactory* factory,
PermissionRequestManager* manager); Delegate* delegate,
bool can_update_ui);
MockPermissionPromptFactory* factory_; MockPermissionPromptFactory* factory_;
PermissionRequestManager* manager_; Delegate* delegate_;
bool can_update_ui_; bool can_update_ui_;
bool is_visible_;
}; };
#endif // CHROME_BROWSER_UI_PERMISSION_BUBBLE_MOCK_PERMISSION_PROMPT_H_ #endif // CHROME_BROWSER_UI_PERMISSION_BUBBLE_MOCK_PERMISSION_PROMPT_H_
...@@ -32,9 +32,21 @@ MockPermissionPromptFactory::~MockPermissionPromptFactory() { ...@@ -32,9 +32,21 @@ MockPermissionPromptFactory::~MockPermissionPromptFactory() {
} }
std::unique_ptr<PermissionPrompt> MockPermissionPromptFactory::Create( std::unique_ptr<PermissionPrompt> MockPermissionPromptFactory::Create(
content::WebContents* web_contents) { content::WebContents* web_contents,
MockPermissionPrompt* prompt = new MockPermissionPrompt(this, manager_); PermissionPrompt::Delegate* delegate) {
prompt->can_update_ui_ = can_update_ui_; MockPermissionPrompt* prompt =
new MockPermissionPrompt(this, delegate, can_update_ui_);
prompts_.push_back(prompt);
show_count_++;
requests_count_ = delegate->Requests().size();
for (const PermissionRequest* request : delegate->Requests())
request_types_seen_.push_back(request->GetPermissionRequestType());
if (!show_bubble_quit_closure_.is_null())
show_bubble_quit_closure_.Run();
manager_->set_auto_response_for_test(response_type_);
return base::WrapUnique(prompt); return base::WrapUnique(prompt);
} }
...@@ -55,11 +67,7 @@ void MockPermissionPromptFactory::DocumentOnLoadCompletedInMainFrame() { ...@@ -55,11 +67,7 @@ void MockPermissionPromptFactory::DocumentOnLoadCompletedInMainFrame() {
} }
bool MockPermissionPromptFactory::is_visible() { bool MockPermissionPromptFactory::is_visible() {
for (auto* prompt : prompts_) { return !prompts_.empty();
if (prompt->IsVisible())
return true;
}
return false;
} }
int MockPermissionPromptFactory::TotalRequestCount() { int MockPermissionPromptFactory::TotalRequestCount() {
...@@ -82,22 +90,10 @@ void MockPermissionPromptFactory::WaitForPermissionBubble() { ...@@ -82,22 +90,10 @@ void MockPermissionPromptFactory::WaitForPermissionBubble() {
// static // static
std::unique_ptr<PermissionPrompt> MockPermissionPromptFactory::DoNotCreate( std::unique_ptr<PermissionPrompt> MockPermissionPromptFactory::DoNotCreate(
content::WebContents* web_contents) { content::WebContents* web_contents,
PermissionPrompt::Delegate* delegate) {
NOTREACHED(); NOTREACHED();
return base::WrapUnique(new MockPermissionPrompt(nullptr, nullptr)); return base::WrapUnique(new MockPermissionPrompt(nullptr, nullptr, false));
}
void MockPermissionPromptFactory::UpdateResponseType() {
manager_->set_auto_response_for_test(response_type_);
}
void MockPermissionPromptFactory::ShowView(MockPermissionPrompt* prompt) {
if (base::ContainsValue(prompts_, prompt))
return;
prompts_.push_back(prompt);
if (!show_bubble_quit_closure_.is_null())
show_bubble_quit_closure_.Run();
} }
void MockPermissionPromptFactory::HideView(MockPermissionPrompt* prompt) { void MockPermissionPromptFactory::HideView(MockPermissionPrompt* prompt) {
......
...@@ -10,9 +10,9 @@ ...@@ -10,9 +10,9 @@
#include "chrome/browser/permissions/permission_request.h" #include "chrome/browser/permissions/permission_request.h"
#include "chrome/browser/permissions/permission_request_manager.h" #include "chrome/browser/permissions/permission_request_manager.h"
#include "chrome/browser/ui/permission_bubble/permission_prompt.h"
class MockPermissionPrompt; class MockPermissionPrompt;
class PermissionPrompt;
namespace content { namespace content {
class WebContents; class WebContents;
...@@ -29,7 +29,9 @@ class MockPermissionPromptFactory { ...@@ -29,7 +29,9 @@ class MockPermissionPromptFactory {
~MockPermissionPromptFactory(); ~MockPermissionPromptFactory();
// Create method called by the PBM to show a bubble. // Create method called by the PBM to show a bubble.
std::unique_ptr<PermissionPrompt> Create(content::WebContents* web_contents); std::unique_ptr<PermissionPrompt> Create(
content::WebContents* web_contents,
PermissionPrompt::Delegate* delegate);
void SetCanUpdateUi(bool can_update_ui); void SetCanUpdateUi(bool can_update_ui);
...@@ -64,10 +66,9 @@ class MockPermissionPromptFactory { ...@@ -64,10 +66,9 @@ class MockPermissionPromptFactory {
// This shouldn't be called. Is here to fail tests that try to create a bubble // This shouldn't be called. Is here to fail tests that try to create a bubble
// after the factory has been destroyed. // after the factory has been destroyed.
static std::unique_ptr<PermissionPrompt> DoNotCreate( static std::unique_ptr<PermissionPrompt> DoNotCreate(
content::WebContents* web_contents); content::WebContents* web_contents,
PermissionPrompt::Delegate* delegate);
void UpdateResponseType();
void ShowView(MockPermissionPrompt* view);
void HideView(MockPermissionPrompt* view); void HideView(MockPermissionPrompt* view);
bool can_update_ui_; bool can_update_ui_;
......
...@@ -39,34 +39,21 @@ class PermissionPrompt { ...@@ -39,34 +39,21 @@ class PermissionPrompt {
virtual void Closing() = 0; virtual void Closing() = 0;
}; };
typedef base::Callback<std::unique_ptr<PermissionPrompt>( typedef base::Callback<
content::WebContents*)> std::unique_ptr<PermissionPrompt>(content::WebContents*, Delegate*)>
Factory; Factory;
// Create a platform specific instance. // Create and display a platform specific prompt.
static std::unique_ptr<PermissionPrompt> Create( static std::unique_ptr<PermissionPrompt> Create(
content::WebContents* web_contents); content::WebContents* web_contents,
Delegate* delegate);
virtual ~PermissionPrompt() {} virtual ~PermissionPrompt() {}
// Sets the delegate which will receive UI events forwarded from the prompt.
virtual void SetDelegate(Delegate* delegate) = 0;
// Show a prompt with the requests from the delegate. This will only be called
// if there is no prompt showing.
virtual void Show() = 0;
// Returns true if the view can accept a new Show() command to coalesce // Returns true if the view can accept a new Show() command to coalesce
// requests. Currently the policy is that this should return true if the view // requests. Currently the policy is that this should return true if the view
// is being shown and the mouse is not over the view area (!IsMouseHovered). // is being shown and the mouse is not over the view area (!IsMouseHovered).
virtual bool CanAcceptRequestUpdate() = 0; virtual bool CanAcceptRequestUpdate() = 0;
// Returns true if the prompt UI will manage hiding itself when the user
// resolves the prompt, on page navigation/destruction, and on tab switching.
virtual bool HidesAutomatically() = 0;
// Hides the permission prompt.
virtual void Hide() = 0;
// Updates where the prompt should be anchored. ex: fullscreen toggle. // Updates where the prompt should be anchored. ex: fullscreen toggle.
virtual void UpdateAnchorPosition() = 0; virtual void UpdateAnchorPosition() = 0;
......
...@@ -249,68 +249,20 @@ void PermissionsBubbleDialogDelegateView::UpdateAnchor( ...@@ -249,68 +249,20 @@ void PermissionsBubbleDialogDelegateView::UpdateAnchor(
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// PermissionPromptImpl // PermissionPromptImpl
PermissionPromptImpl::PermissionPromptImpl(Browser* browser) PermissionPromptImpl::PermissionPromptImpl(Browser* browser, Delegate* delegate)
: browser_(browser), : browser_(browser), delegate_(delegate), bubble_delegate_(nullptr) {
delegate_(nullptr), Show();
bubble_delegate_(nullptr) {}
PermissionPromptImpl::~PermissionPromptImpl() {
} }
void PermissionPromptImpl::SetDelegate(Delegate* delegate) { PermissionPromptImpl::~PermissionPromptImpl() {
delegate_ = delegate;
}
void PermissionPromptImpl::Show() {
DCHECK(browser_);
DCHECK(browser_->window());
if (bubble_delegate_) if (bubble_delegate_)
bubble_delegate_->CloseBubble(); bubble_delegate_->CloseBubble();
bubble_delegate_ =
new PermissionsBubbleDialogDelegateView(this, delegate_->Requests());
// Set |parent_window| because some valid anchors can become hidden.
bubble_delegate_->set_parent_window(
platform_util::GetViewForWindow(browser_->window()->GetNativeWindow()));
// Compensate for vertical padding in the anchor view's image. Note this is
// ignored whenever the anchor view is null.
bubble_delegate_->set_anchor_view_insets(gfx::Insets(
GetLayoutConstant(LOCATION_BAR_BUBBLE_ANCHOR_VERTICAL_INSET), 0));
views::Widget* widget =
views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_);
// If a browser window (or popup) other than the bubble parent has focus,
// don't take focus.
if (browser_->window()->IsActive())
widget->Show();
else
widget->ShowInactive();
bubble_delegate_->SizeToContents();
bubble_delegate_->UpdateAnchor(GetAnchorView(),
GetAnchorPoint(),
GetAnchorArrow());
} }
bool PermissionPromptImpl::CanAcceptRequestUpdate() { bool PermissionPromptImpl::CanAcceptRequestUpdate() {
return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered()); return !(bubble_delegate_ && bubble_delegate_->IsMouseHovered());
} }
bool PermissionPromptImpl::HidesAutomatically() {
return false;
}
void PermissionPromptImpl::Hide() {
if (bubble_delegate_) {
bubble_delegate_->CloseBubble();
bubble_delegate_ = nullptr;
}
}
void PermissionPromptImpl::UpdateAnchorPosition() { void PermissionPromptImpl::UpdateAnchorPosition() {
DCHECK(browser_); DCHECK(browser_);
DCHECK(browser_->window()); DCHECK(browser_->window());
...@@ -351,3 +303,34 @@ void PermissionPromptImpl::Deny() { ...@@ -351,3 +303,34 @@ void PermissionPromptImpl::Deny() {
if (delegate_) if (delegate_)
delegate_->Deny(); delegate_->Deny();
} }
void PermissionPromptImpl::Show() {
DCHECK(browser_);
DCHECK(browser_->window());
bubble_delegate_ =
new PermissionsBubbleDialogDelegateView(this, delegate_->Requests());
// Set |parent_window| because some valid anchors can become hidden.
bubble_delegate_->set_parent_window(
platform_util::GetViewForWindow(browser_->window()->GetNativeWindow()));
// Compensate for vertical padding in the anchor view's image. Note this is
// ignored whenever the anchor view is null.
bubble_delegate_->set_anchor_view_insets(gfx::Insets(
GetLayoutConstant(LOCATION_BAR_BUBBLE_ANCHOR_VERTICAL_INSET), 0));
views::Widget* widget =
views::BubbleDialogDelegateView::CreateBubble(bubble_delegate_);
// If a browser window (or popup) other than the bubble parent has focus,
// don't take focus.
if (browser_->window()->IsActive())
widget->Show();
else
widget->ShowInactive();
bubble_delegate_->SizeToContents();
bubble_delegate_->UpdateAnchor(GetAnchorView(), GetAnchorPoint(),
GetAnchorArrow());
}
...@@ -23,15 +23,11 @@ class PermissionsBubbleDialogDelegateView; ...@@ -23,15 +23,11 @@ class PermissionsBubbleDialogDelegateView;
class PermissionPromptImpl : public PermissionPrompt { class PermissionPromptImpl : public PermissionPrompt {
public: public:
explicit PermissionPromptImpl(Browser* browser); PermissionPromptImpl(Browser* browser, Delegate* delegate);
~PermissionPromptImpl() override; ~PermissionPromptImpl() override;
// PermissionPrompt: // PermissionPrompt:
void SetDelegate(Delegate* delegate) override;
void Show() override;
bool CanAcceptRequestUpdate() override; bool CanAcceptRequestUpdate() override;
bool HidesAutomatically() override;
void Hide() override;
void UpdateAnchorPosition() override; void UpdateAnchorPosition() override;
gfx::NativeWindow GetNativeWindow() override; gfx::NativeWindow GetNativeWindow() override;
...@@ -41,6 +37,8 @@ class PermissionPromptImpl : public PermissionPrompt { ...@@ -41,6 +37,8 @@ class PermissionPromptImpl : public PermissionPrompt {
void Deny(); void Deny();
private: private:
void Show();
// These three functions have separate implementations for Views-based and // These three functions have separate implementations for Views-based and
// Cocoa-based browsers, to allow this bubble to be used in either. // Cocoa-based browsers, to allow this bubble to be used in either.
......
...@@ -50,7 +50,8 @@ views::BubbleBorder::Arrow PermissionPromptImpl::GetAnchorArrow() { ...@@ -50,7 +50,8 @@ views::BubbleBorder::Arrow PermissionPromptImpl::GetAnchorArrow() {
// static // static
std::unique_ptr<PermissionPrompt> PermissionPrompt::Create( std::unique_ptr<PermissionPrompt> PermissionPrompt::Create(
content::WebContents* web_contents) { content::WebContents* web_contents,
Delegate* delegate) {
return base::WrapUnique(new PermissionPromptImpl( return base::WrapUnique(new PermissionPromptImpl(
chrome::FindBrowserWithWebContents(web_contents))); chrome::FindBrowserWithWebContents(web_contents), delegate));
} }
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