Commit ab1e2a2f authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Create InfobarOverlayRequestCancelHandler.

This is provided alongside OverlayRequests added to request queues and
manages cancelling the request if its corresponding InfoBar is removed
from its InfoBarManager.

Bug: 1030357
Change-Id: Ic6644864cb7a5f6a89cca7b84baa090258415dea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1951723
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#722637}
parent 4a47c607
...@@ -40,6 +40,8 @@ source_set("overlays") { ...@@ -40,6 +40,8 @@ source_set("overlays") {
"infobar_banner_overlay_request_factory.h", "infobar_banner_overlay_request_factory.h",
"infobar_banner_overlay_request_factory_impl.h", "infobar_banner_overlay_request_factory_impl.h",
"infobar_banner_overlay_request_factory_impl.mm", "infobar_banner_overlay_request_factory_impl.mm",
"infobar_overlay_request_cancel_handler.h",
"infobar_overlay_request_cancel_handler.mm",
"infobar_overlay_tab_helper.h", "infobar_overlay_tab_helper.h",
"infobar_overlay_tab_helper.mm", "infobar_overlay_tab_helper.mm",
] ]
...@@ -105,6 +107,7 @@ source_set("unit_tests") { ...@@ -105,6 +107,7 @@ source_set("unit_tests") {
testonly = true testonly = true
sources = [ sources = [
"infobar_badge_tab_helper_unittest.mm", "infobar_badge_tab_helper_unittest.mm",
"infobar_overlay_request_cancel_handler_unittest.mm",
"infobar_overlay_tab_helper_unittest.mm", "infobar_overlay_tab_helper_unittest.mm",
] ]
deps = [ deps = [
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_INFOBARS_INFOBAR_OVERLAY_REQUEST_CANCEL_HANDLER_H_
#define IOS_CHROME_BROWSER_INFOBARS_INFOBAR_OVERLAY_REQUEST_CANCEL_HANDLER_H_
#include "base/scoped_observer.h"
#include "components/infobars/core/infobar_manager.h"
#import "ios/chrome/browser/overlays/public/overlay_request_cancel_handler.h"
// OverlayRequestCancelHandler that cancels its OverlayRequest when its InfoBar
// is removed from its InfoBarManager.
class InfobarOverlayRequestCancelHandler : public OverlayRequestCancelHandler {
public:
InfobarOverlayRequestCancelHandler(OverlayRequest* request,
OverlayRequestQueue* queue,
infobars::InfoBar* infobar);
~InfobarOverlayRequestCancelHandler() override;
private:
// Cancels the request for InfoBar removal.
void Cancel();
// Helper object that triggers cancellation when its InfoBar is removed from
// its InfoBarManager.
class RemovalObserver : public infobars::InfoBarManager::Observer {
public:
RemovalObserver(infobars::InfoBar* infobar,
InfobarOverlayRequestCancelHandler* cancel_handler);
~RemovalObserver() override;
private:
// infobars::InfoBarManager::Observer:
void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override;
void OnManagerShuttingDown(infobars::InfoBarManager* manager) override;
private:
infobars::InfoBar* infobar_ = nullptr;
InfobarOverlayRequestCancelHandler* cancel_handler_ = nullptr;
ScopedObserver<infobars::InfoBarManager, infobars::InfoBarManager::Observer>
scoped_observer_;
};
RemovalObserver removal_observer_;
};
#endif // IOS_CHROME_BROWSER_INFOBARS_INFOBAR_OVERLAY_REQUEST_CANCEL_HANDLER_H_
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/infobars/infobar_overlay_request_cancel_handler.h"
#include "base/logging.h"
#include "components/infobars/core/infobar.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using infobars::InfoBar;
using infobars::InfoBarManager;
#pragma mark - InfobarOverlayRequestCancelHandler
InfobarOverlayRequestCancelHandler::InfobarOverlayRequestCancelHandler(
OverlayRequest* request,
OverlayRequestQueue* queue,
InfoBar* infobar)
: OverlayRequestCancelHandler(request, queue),
removal_observer_(infobar, this) {}
InfobarOverlayRequestCancelHandler::~InfobarOverlayRequestCancelHandler() =
default;
void InfobarOverlayRequestCancelHandler::Cancel() {
CancelRequest();
}
#pragma mark - InfobarOverlayRequestCancelHandler::RemovalObserver
InfobarOverlayRequestCancelHandler::RemovalObserver::RemovalObserver(
InfoBar* infobar,
InfobarOverlayRequestCancelHandler* cancel_handler)
: infobar_(infobar),
cancel_handler_(cancel_handler),
scoped_observer_(this) {
DCHECK(infobar_);
DCHECK(cancel_handler_);
InfoBarManager* manager = infobar_->owner();
DCHECK(manager);
scoped_observer_.Add(manager);
}
InfobarOverlayRequestCancelHandler::RemovalObserver::~RemovalObserver() =
default;
void InfobarOverlayRequestCancelHandler::RemovalObserver::OnInfoBarRemoved(
infobars::InfoBar* infobar,
bool animate) {
if (infobar_ == infobar)
cancel_handler_->Cancel();
}
void InfobarOverlayRequestCancelHandler::RemovalObserver::OnManagerShuttingDown(
infobars::InfoBarManager* manager) {
cancel_handler_->Cancel();
scoped_observer_.Remove(manager);
}
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/infobars/infobar_overlay_request_cancel_handler.h"
#include "components/infobars/core/infobar.h"
#include "ios/chrome/browser/infobars/infobar_manager_impl.h"
#include "ios/chrome/browser/overlays/public/overlay_request.h"
#include "ios/chrome/browser/overlays/public/overlay_request_queue.h"
#include "ios/chrome/browser/overlays/test/fake_overlay_user_data.h"
#import "ios/chrome/browser/ui/infobars/test_infobar_delegate.h"
#import "ios/web/public/test/fakes/test_navigation_manager.h"
#import "ios/web/public/test/fakes/test_web_state.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using infobars::InfoBar;
using infobars::InfoBarDelegate;
using infobars::InfoBarManager;
// Test fixture for InfobarOverlayRequestCancelHandler.
class InfobarOverlayRequestCancelHandlerTest : public PlatformTest {
public:
InfobarOverlayRequestCancelHandlerTest() : PlatformTest() {
// Set up WebState and InfoBarManager.
web_state_.SetNavigationManager(
std::make_unique<web::TestNavigationManager>());
InfoBarManagerImpl::CreateForWebState(&web_state_);
// Create a test InfoBar and add it to the manager.
std::unique_ptr<InfoBarDelegate> delegate =
std::make_unique<TestInfoBarDelegate>(nil);
std::unique_ptr<InfoBar> infobar =
std::make_unique<InfoBar>(std::move(delegate));
infobar_ = infobar.get();
manager()->AddInfoBar(std::move(infobar));
// Create a fake OverlayRequest and add it to the infobar banner queue using
// an infobar cancel handler.
std::unique_ptr<OverlayRequest> request =
OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr);
std::unique_ptr<OverlayRequestCancelHandler> cancel_handler =
std::make_unique<InfobarOverlayRequestCancelHandler>(request.get(),
queue(), infobar_);
queue()->AddRequest(std::move(request), std::move(cancel_handler));
}
OverlayRequestQueue* queue() {
return OverlayRequestQueue::FromWebState(&web_state_,
OverlayModality::kInfobarBanner);
}
InfoBarManager* manager() {
return InfoBarManagerImpl::FromWebState(&web_state_);
}
InfoBar* infobar() { return infobar_; }
private:
web::TestWebState web_state_;
InfoBar* infobar_ = nullptr;
};
// Tests that the request is cancelled when its corresponding InfoBar is removed
// from its InfoBarManager.
TEST_F(InfobarOverlayRequestCancelHandlerTest, CancelForInfobarRemoval) {
ASSERT_TRUE(queue()->front_request());
// Remove the InfoBar and verify that the request has been removed from the
// queue.
manager()->RemoveInfoBar(infobar());
EXPECT_FALSE(queue()->front_request());
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/logging.h" #include "base/logging.h"
#import "ios/chrome/browser/infobars/infobar_banner_overlay_request_factory.h" #import "ios/chrome/browser/infobars/infobar_banner_overlay_request_factory.h"
#include "ios/chrome/browser/infobars/infobar_manager_impl.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
#import "ios/chrome/browser/infobars/infobar_overlay_request_cancel_handler.h"
#include "ios/chrome/browser/overlays/public/overlay_request.h" #include "ios/chrome/browser/overlays/public/overlay_request.h"
#import "ios/chrome/browser/overlays/public/overlay_request_queue.h" #import "ios/chrome/browser/overlays/public/overlay_request_queue.h"
...@@ -50,7 +51,6 @@ InfobarOverlayTabHelper::OverlayRequestScheduler::OverlayRequestScheduler( ...@@ -50,7 +51,6 @@ InfobarOverlayTabHelper::OverlayRequestScheduler::OverlayRequestScheduler(
OverlayModality::kInfobarBanner)), OverlayModality::kInfobarBanner)),
request_factory_(std::move(request_factory)), request_factory_(std::move(request_factory)),
scoped_observer_(this) { scoped_observer_(this) {
DCHECK(web_state);
DCHECK(queue_); DCHECK(queue_);
DCHECK(request_factory_); DCHECK(request_factory_);
InfoBarManager* manager = InfoBarManagerImpl::FromWebState(web_state); InfoBarManager* manager = InfoBarManagerImpl::FromWebState(web_state);
...@@ -66,7 +66,10 @@ void InfobarOverlayTabHelper::OverlayRequestScheduler::OnInfoBarAdded( ...@@ -66,7 +66,10 @@ void InfobarOverlayTabHelper::OverlayRequestScheduler::OnInfoBarAdded(
std::unique_ptr<OverlayRequest> request = std::unique_ptr<OverlayRequest> request =
request_factory_->CreateBannerRequest(infobar); request_factory_->CreateBannerRequest(infobar);
DCHECK(request); DCHECK(request);
queue_->AddRequest(std::move(request)); std::unique_ptr<OverlayRequestCancelHandler> cancel_handler =
std::make_unique<InfobarOverlayRequestCancelHandler>(request.get(),
queue_, infobar);
queue_->AddRequest(std::move(request), std::move(cancel_handler));
} }
void InfobarOverlayTabHelper::OverlayRequestScheduler::OnManagerShuttingDown( void InfobarOverlayTabHelper::OverlayRequestScheduler::OnManagerShuttingDown(
......
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