Commit e296c1ed authored by Sylvain Defresne's avatar Sylvain Defresne Committed by Commit Bot

Allow WebStateObserver to observe N WebStates [39/N].

Convert TestRedirectObserver to directly track the
registration with the observed WebState instead of
relying on the deprecated code in WebStateObserver.

Also remove TestRedirectObserverUserDataWrapper by
using WebStateUserData.

Bug: 775684
Change-Id: I85e965e8c99dd5dd848082c305619aaff5b6a5ca
Cq-Include-Trybots: master.tryserver.chromium.mac:ios-simulator-cronet;master.tryserver.chromium.mac:ios-simulator-full-configs
Reviewed-on: https://chromium-review.googlesource.com/771690
Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517815}
parent e6aa1d18
......@@ -8,7 +8,9 @@
#include <map>
#include <set>
#include "base/macros.h"
#include "ios/web/public/web_state/web_state_observer.h"
#import "ios/web/public/web_state/web_state_user_data.h"
#include "url/gurl.h"
namespace web {
......@@ -17,12 +19,10 @@ class NavigationItem;
// A utility class that is used to track redirects during tests to enable URL
// verification for redirected page loads.
class TestRedirectObserver : public web::WebStateObserver {
class TestRedirectObserver
: public web::WebStateObserver,
public web::WebStateUserData<TestRedirectObserver> {
public:
// Getter that lazily instantiates a TestRedirectObserver that is stored in
// |web_state|'s user data.
static TestRedirectObserver* FromWebState(WebState* web_state);
// Notifies the observer that |url| is about to be loaded by the associated
// WebState, triggering the TestRedirectObserver to start observing redirects.
void BeginObservingRedirectsForUrl(const GURL& url);
......@@ -31,15 +31,13 @@ class TestRedirectObserver : public web::WebStateObserver {
GURL GetFinalUrlForUrl(const GURL& url);
private:
// TestRedirectObservers must be instantiated using |FromWebState()|.
friend class TestRedirectObserverUserDataWrapper;
TestRedirectObserver();
TestRedirectObserver(WebState* web_state);
~TestRedirectObserver() final;
// WebStateObserver:
void DidStartNavigation(web::WebState* web_state,
NavigationContext* navigation_context) override;
void WebStateDestroyed(web::WebState* web_state) override;
// RedirectChains store the original and final redirect URLs for a given page
// load.
......@@ -55,6 +53,8 @@ class TestRedirectObserver : public web::WebStateObserver {
// be removed and the redirect chain originating from that URL will be stored
// in |redirect_chains_|.
std::set<GURL> expected_urls_;
DISALLOW_COPY_AND_ASSIGN(TestRedirectObserver);
};
} // namespace web
......
......@@ -4,8 +4,6 @@
#include "ios/web/public/test/test_redirect_observer.h"
#include "base/memory/ptr_util.h"
#include "base/supports_user_data.h"
#import "ios/web/public/navigation_item.h"
#import "ios/web/public/navigation_manager.h"
#include "ios/web/public/web_state/navigation_context.h"
......@@ -15,57 +13,18 @@
#error "This file requires ARC support."
#endif
namespace {
// The key under which TestRedirectObservers are stored in a WebState's user
// data.
const void* const kTestRedirectObserverKey = &kTestRedirectObserverKey;
} // namespace
namespace web {
#pragma mark - TestRedirectObserverUserDataWrapper
// Wrapper class used to associated TestRedirectObservers with their WebStates.
class TestRedirectObserverUserDataWrapper
: public base::SupportsUserData::Data {
public:
static TestRedirectObserverUserDataWrapper* FromWebState(
web::WebState* web_state) {
DCHECK(web_state);
TestRedirectObserverUserDataWrapper* wrapper =
static_cast<TestRedirectObserverUserDataWrapper*>(
web_state->GetUserData(kTestRedirectObserverKey));
if (!wrapper)
wrapper = new TestRedirectObserverUserDataWrapper(web_state);
return wrapper;
}
explicit TestRedirectObserverUserDataWrapper(web::WebState* web_state)
: redirect_observer_(web_state) {
DCHECK(web_state);
web_state->SetUserData(kTestRedirectObserverKey, base::WrapUnique(this));
}
web::TestRedirectObserver* redirect_observer() { return &redirect_observer_; }
private:
web::TestRedirectObserver redirect_observer_;
};
DEFINE_WEB_STATE_USER_DATA_KEY(TestRedirectObserver);
#pragma mark - TestRedirectObserver
TestRedirectObserver::TestRedirectObserver(WebState* web_state)
: WebStateObserver(web_state) {}
TestRedirectObserver::TestRedirectObserver(WebState* web_state) {
web_state->AddObserver(this);
}
TestRedirectObserver::~TestRedirectObserver() {}
// static
TestRedirectObserver* TestRedirectObserver::FromWebState(
web::WebState* web_state) {
return TestRedirectObserverUserDataWrapper::FromWebState(web_state)
->redirect_observer();
}
void TestRedirectObserver::BeginObservingRedirectsForUrl(const GURL& url) {
expected_urls_.insert(url);
}
......@@ -101,4 +60,8 @@ void TestRedirectObserver::DidStartNavigation(web::WebState* web_state,
}
}
void TestRedirectObserver::WebStateDestroyed(web::WebState* web_state) {
web_state->RemoveObserver(this);
}
} // namespace web
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