blob: 825d52f1b133a948af5018ede002479cb7f0dcc7 [file] [log] [blame]
// 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/default_overlay_request_cancel_handler.h"
#include "base/check.h"
#import "ios/web/public/navigation/navigation_context.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
DefaultOverlayRequestCancelHandler::DefaultOverlayRequestCancelHandler(
OverlayRequest* request,
OverlayRequestQueue* queue,
web::WebState* web_state)
: OverlayRequestCancelHandler(request, queue),
navigation_helper_(this, web_state) {}
DefaultOverlayRequestCancelHandler::~DefaultOverlayRequestCancelHandler() =
default;
void DefaultOverlayRequestCancelHandler::Cancel() {
CancelRequest();
}
DefaultOverlayRequestCancelHandler::NavigationHelper::NavigationHelper(
DefaultOverlayRequestCancelHandler* cancel_handler,
web::WebState* web_state)
: cancel_handler_(cancel_handler), scoped_observer_(this) {
DCHECK(cancel_handler);
DCHECK(web_state);
scoped_observer_.Add(web_state);
}
DefaultOverlayRequestCancelHandler::NavigationHelper::~NavigationHelper() =
default;
void DefaultOverlayRequestCancelHandler::NavigationHelper::DidFinishNavigation(
web::WebState* web_state,
web::NavigationContext* navigation_context) {
if (navigation_context->HasCommitted() &&
!navigation_context->IsSameDocument()) {
cancel_handler_->Cancel();
// The cancel handler is destroyed after Cancel(), so no code can be added
// after this call.
}
}
void DefaultOverlayRequestCancelHandler::NavigationHelper::RenderProcessGone(
web::WebState* web_state) {
cancel_handler_->Cancel();
// The cancel handler is destroyed after Cancel(), so no code can be added
// after this call.
}
void DefaultOverlayRequestCancelHandler::NavigationHelper::WebStateDestroyed(
web::WebState* web_state) {
scoped_observer_.RemoveAll();
cancel_handler_->Cancel();
// The cancel handler is destroyed after Cancel(), so no code can be added
// after this call.
}