blob: 6f8e46e4fb837020d564975e5a18a83c888b6818 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web/public/web_state.h"
#import <string_view>
#import "ios/web/public/web_client.h"
#import "ios/web/public/web_state_observer.h"
namespace web {
WebState::CreateParams::CreateParams(web::BrowserState* browser_state)
: browser_state(browser_state), created_with_opener(false) {}
WebState::CreateParams::~CreateParams() {}
WebState::OpenURLParams::OpenURLParams(const GURL& url,
const GURL& virtual_url,
const Referrer& referrer,
WindowOpenDisposition disposition,
ui::PageTransition transition,
bool is_renderer_initiated)
: url(url),
virtual_url(virtual_url),
referrer(referrer),
disposition(disposition),
transition(transition),
is_renderer_initiated(is_renderer_initiated) {}
WebState::OpenURLParams::OpenURLParams(const GURL& url,
const Referrer& referrer,
WindowOpenDisposition disposition,
ui::PageTransition transition,
bool is_renderer_initiated)
: OpenURLParams(url,
GURL(),
referrer,
disposition,
transition,
is_renderer_initiated) {}
WebState::OpenURLParams::OpenURLParams(const OpenURLParams& params) = default;
WebState::OpenURLParams& WebState::OpenURLParams::operator=(
const OpenURLParams& params) = default;
WebState::OpenURLParams::OpenURLParams(OpenURLParams&& params) = default;
WebState::OpenURLParams& WebState::OpenURLParams::operator=(
OpenURLParams&& params) = default;
WebState::OpenURLParams::~OpenURLParams() {}
WebState::InterfaceBinder::InterfaceBinder(WebState* web_state)
: web_state_(web_state) {}
WebState::InterfaceBinder::~InterfaceBinder() = default;
WebState::ScopedWebContentCoverer::ScopedWebContentCoverer(
WebState* web_state) {
if (web_state) {
web_state_ = web_state->GetWeakPtr();
web_state->DidCoverWebContent();
}
}
WebState::ScopedWebContentCoverer::~ScopedWebContentCoverer() {
if (web_state_) {
web_state_->DidRevealWebContent();
}
}
void WebState::InterfaceBinder::AddInterface(std::string_view interface_name,
Callback callback) {
callbacks_.emplace(std::string(interface_name), std::move(callback));
}
void WebState::InterfaceBinder::RemoveInterface(
std::string_view interface_name) {
callbacks_.erase(std::string(interface_name));
}
void WebState::InterfaceBinder::BindInterface(
mojo::GenericPendingReceiver receiver) {
DCHECK(receiver.is_valid());
auto it = callbacks_.find(*receiver.interface_name());
if (it != callbacks_.end()) {
it->second.Run(&receiver);
}
GetWebClient()->BindInterfaceReceiverFromMainFrame(web_state_,
std::move(receiver));
}
WebState::InterfaceBinder* WebState::GetInterfaceBinderForMainFrame() {
return nullptr;
}
WebState* WebState::ForceRealized() {
return ForceRealizedWithPolicy(RealizationPolicy::kDefault);
}
void WebState::NotifyWebStateRealized(WebStateObserverList& observers) {
DCHECK(IsRealized());
// base::ObserverList does not provide an easy way to iterate only on
// the currently registered observers on a per-call basis (the policy
// is only for the whole list).
//
// Emulate this by creating an iterator that is considered at the end
// of the base::ObserverList by successive increment. This relies on
// implementation details of base::ObserverList (the fact that while
// there is any living iterator, the list won't be compacted even if
// an observer is removed, and that all registered observers will be
// added at the end of the list).
auto end = observers.begin();
while (end != observers.end()) {
++end;
}
// Iterate again, this time calling WebStateRealized(this) on all the
// pre-existing iterator. If any new observers are registered they will
// be added after `end` and the iteration won't reach them.
for (auto iter = observers.begin(); iter != end; ++iter) {
iter->WebStateRealized(this);
}
}
} // namespace web