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

[iOS] Create OverlayRequest config for save passwords infobar banner.

This config will be used to trigger the display of the banner UI for
the save passwords infobar.

This CL also introduces CreateAuxilliaryData to the OverlayUserData
template so that OverlayUserData can be shared amongst OverlayRequest
configs.

The SavePasswordsOverlayRequestConfig adds an InfobarOverlayData to
its OverlayRequest exposing the InfoBar pointer.  This can also be used
by other infobar OverlayRequest configs so that their InfoBars can
be accessed as request->GetConfig<InfobarOverlayData>()->infobar().

In addition, this CL also adds IOSChromeSavePasswordInfoBarDelegate::
FromInfobarDelegate(), which allows downcasting to the appropriate type.



Bug: 1030357
Change-Id: I3b89d8516b8b25d8e32576aff200fa10d92a61f2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1951130Reviewed-by: default avatarVasilii Sukhanov <vasilii@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#722590}
parent ac3cf646
...@@ -48,6 +48,8 @@ source_set("overlays") { ...@@ -48,6 +48,8 @@ source_set("overlays") {
"//base", "//base",
"//components/infobars/core", "//components/infobars/core",
"//ios/chrome/browser/overlays", "//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/infobar_banner",
"//ios/chrome/browser/passwords:infobar_delegates",
"//ios/web/public", "//ios/web/public",
] ]
} }
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
#import "ios/chrome/browser/infobars/infobar_banner_overlay_request_factory_impl.h" #import "ios/chrome/browser/infobars/infobar_banner_overlay_request_factory_impl.h"
#include "components/infobars/core/infobar.h"
#include "components/infobars/core/infobar_delegate.h"
#import "ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h"
#include "ios/chrome/browser/overlays/public/overlay_request.h" #include "ios/chrome/browser/overlays/public/overlay_request.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -11,6 +14,7 @@ ...@@ -11,6 +14,7 @@
#endif #endif
using infobars::InfoBar; using infobars::InfoBar;
using infobars::InfoBarDelegate;
InfobarBannerOverlayRequestFactoryImpl:: InfobarBannerOverlayRequestFactoryImpl::
InfobarBannerOverlayRequestFactoryImpl() = default; InfobarBannerOverlayRequestFactoryImpl() = default;
...@@ -20,6 +24,11 @@ InfobarBannerOverlayRequestFactoryImpl:: ...@@ -20,6 +24,11 @@ InfobarBannerOverlayRequestFactoryImpl::
std::unique_ptr<OverlayRequest> std::unique_ptr<OverlayRequest>
InfobarBannerOverlayRequestFactoryImpl::CreateBannerRequest(InfoBar* infobar) { InfobarBannerOverlayRequestFactoryImpl::CreateBannerRequest(InfoBar* infobar) {
// TODO(crbug.com/1030357): Convert InfoBars into OverlayRequests. switch (infobar->delegate()->GetIdentifier()) {
return nullptr; case InfoBarDelegate::SAVE_PASSWORD_INFOBAR_DELEGATE_MOBILE:
return OverlayRequest::CreateWithConfig<
SavePasswordInfobarBannerOverlayRequestConfig>(infobar);
default:
return nullptr;
}
} }
# 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.
source_set("infobars") {
sources = [
"infobar_overlay.h",
"infobar_overlay.mm",
]
configs += [ "//build/config/compiler:enable_arc" ]
deps = [
"//base",
"//components/infobars/core",
"//ios/chrome/browser/overlays",
]
}
// 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_OVERLAYS_PUBLIC_COMMON_INFOBARS_INFOBAR_OVERLAY_H_
#define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_COMMON_INFOBARS_INFOBAR_OVERLAY_H_
#include "ios/chrome/browser/overlays/public/overlay_user_data.h"
namespace infobars {
class InfoBar;
}
// OverlayUserData used to hold a pointer to an InfoBar. Used as auxilliary
// data for OverlayRequests for InfoBars.
class InfobarOverlayData : public OverlayUserData<InfobarOverlayData> {
public:
~InfobarOverlayData() override;
// The InfoBar that triggered this OverlayRequest.
infobars::InfoBar* infobar() const { return infobar_; }
private:
OVERLAY_USER_DATA_SETUP(InfobarOverlayData);
explicit InfobarOverlayData(infobars::InfoBar* infobar);
// The InfoBar causing this overlay.
infobars::InfoBar* infobar_ = nullptr;
};
#endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_COMMON_INFOBARS_INFOBAR_OVERLAY_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/overlays/public/common/infobars/infobar_overlay.h"
#include "base/logging.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using infobars::InfoBar;
OVERLAY_USER_DATA_SETUP_IMPL(InfobarOverlayData);
InfobarOverlayData::InfobarOverlayData(InfoBar* infobar) : infobar_(infobar) {
DCHECK(infobar_);
}
InfobarOverlayData::~InfobarOverlayData() = default;
# 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.
source_set("infobar_banner") {
sources = [
"save_password_infobar_banner_overlay.h",
"save_password_infobar_banner_overlay.mm",
]
configs += [ "//build/config/compiler:enable_arc" ]
deps = [
"//base",
"//components/infobars/core",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/overlays/public/common/infobars",
"//ios/chrome/browser/passwords:infobar_delegates",
]
}
// 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_OVERLAYS_PUBLIC_INFOBAR_BANNER_SAVE_PASSWORD_INFOBAR_BANNER_OVERLAY_H_
#define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_BANNER_SAVE_PASSWORD_INFOBAR_BANNER_OVERLAY_H_
#include "ios/chrome/browser/overlays/public/overlay_user_data.h"
namespace infobars {
class InfoBar;
}
class IOSChromeSavePasswordInfoBarDelegate;
// Configuration object for OverlayRequests for the banner UI for an InfoBar
// with a IOSChromeSavePasswordInfoBarDelegate.
class SavePasswordInfobarBannerOverlayRequestConfig
: public OverlayUserData<SavePasswordInfobarBannerOverlayRequestConfig> {
public:
~SavePasswordInfobarBannerOverlayRequestConfig() override;
// The save password delegate used to configure the banner UI.
IOSChromeSavePasswordInfoBarDelegate* save_password_delegate() const {
return save_password_delegate_;
}
private:
OVERLAY_USER_DATA_SETUP(SavePasswordInfobarBannerOverlayRequestConfig);
explicit SavePasswordInfobarBannerOverlayRequestConfig(
infobars::InfoBar* infobar);
// OverlayUserData:
void CreateAuxilliaryData(base::SupportsUserData* user_data) override;
// The InfoBar causing this banner.
infobars::InfoBar* infobar_ = nullptr;
// The delegate used to configure the save passwords banner.
IOSChromeSavePasswordInfoBarDelegate* save_password_delegate_ = nullptr;
};
#endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_BANNER_SAVE_PASSWORD_INFOBAR_BANNER_OVERLAY_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/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h"
#include "base/logging.h"
#include "components/infobars/core/infobar.h"
#import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay.h"
#import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using infobars::InfoBar;
OVERLAY_USER_DATA_SETUP_IMPL(SavePasswordInfobarBannerOverlayRequestConfig);
SavePasswordInfobarBannerOverlayRequestConfig::
SavePasswordInfobarBannerOverlayRequestConfig(InfoBar* infobar)
: infobar_(infobar),
save_password_delegate_(
IOSChromeSavePasswordInfoBarDelegate::FromInfobarDelegate(
infobar->delegate())) {
DCHECK(infobar_);
DCHECK(save_password_delegate_);
}
SavePasswordInfobarBannerOverlayRequestConfig::
~SavePasswordInfobarBannerOverlayRequestConfig() = default;
void SavePasswordInfobarBannerOverlayRequestConfig::CreateAuxilliaryData(
base::SupportsUserData* user_data) {
InfobarOverlayData::CreateForUserData(user_data, infobar_);
}
...@@ -57,6 +57,7 @@ class OverlayUserData : public base::SupportsUserData::Data { ...@@ -57,6 +57,7 @@ class OverlayUserData : public base::SupportsUserData::Data {
if (!FromUserData(user_data)) { if (!FromUserData(user_data)) {
std::unique_ptr<DataType> data = std::unique_ptr<DataType> data =
base::WrapUnique(new DataType(std::forward<Args>(args)...)); base::WrapUnique(new DataType(std::forward<Args>(args)...));
data->CreateAuxilliaryData(user_data);
user_data->SetUserData(UserDataKey(), std::move(data)); user_data->SetUserData(UserDataKey(), std::move(data));
} }
} }
...@@ -73,6 +74,12 @@ class OverlayUserData : public base::SupportsUserData::Data { ...@@ -73,6 +74,12 @@ class OverlayUserData : public base::SupportsUserData::Data {
// The key under which to store the user data. // The key under which to store the user data.
static const void* UserDataKey() { return &DataType::kUserDataKey; } static const void* UserDataKey() { return &DataType::kUserDataKey; }
protected:
// Adds auxilliary OverlayUserData to |data|. Used to allow multiple
// OverlayUserData templates to share common functionality in a separate data
// stored in |user_data|.
virtual void CreateAuxilliaryData(base::SupportsUserData* user_data) {}
}; };
#endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_OVERLAY_USER_DATA_H_ #endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_OVERLAY_USER_DATA_H_
...@@ -33,6 +33,11 @@ class IOSChromeSavePasswordInfoBarDelegate ...@@ -33,6 +33,11 @@ class IOSChromeSavePasswordInfoBarDelegate
~IOSChromeSavePasswordInfoBarDelegate() override; ~IOSChromeSavePasswordInfoBarDelegate() override;
// Returns |delegate| as an IOSChromeSavePasswordInfoBarDelegate, or nullptr
// if it is of another type.
static IOSChromeSavePasswordInfoBarDelegate* FromInfobarDelegate(
infobars::InfoBarDelegate* delegate);
// InfoBarDelegate implementation // InfoBarDelegate implementation
bool ShouldExpire(const NavigationDetails& details) const override; bool ShouldExpire(const NavigationDetails& details) const override;
......
...@@ -116,6 +116,15 @@ bool IsUpdateInfobar(PasswordInfobarType infobar_type) { ...@@ -116,6 +116,15 @@ bool IsUpdateInfobar(PasswordInfobarType infobar_type) {
using password_manager::PasswordFormManagerForUI; using password_manager::PasswordFormManagerForUI;
// static
IOSChromeSavePasswordInfoBarDelegate*
IOSChromeSavePasswordInfoBarDelegate::FromInfobarDelegate(
infobars::InfoBarDelegate* delegate) {
return delegate->GetIdentifier() == SAVE_PASSWORD_INFOBAR_DELEGATE_MOBILE
? static_cast<IOSChromeSavePasswordInfoBarDelegate*>(delegate)
: nullptr;
}
IOSChromeSavePasswordInfoBarDelegate::IOSChromeSavePasswordInfoBarDelegate( IOSChromeSavePasswordInfoBarDelegate::IOSChromeSavePasswordInfoBarDelegate(
bool is_sync_user, bool is_sync_user,
bool password_update, bool password_update,
......
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