// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_RENDERER_HOST_COMMIT_DEFERRING_CONDITION_RUNNER_H_ #define CONTENT_BROWSER_RENDERER_HOST_COMMIT_DEFERRING_CONDITION_RUNNER_H_ #include <map> #include <memory> #include <vector> #include "base/memory/ptr_util.h" #include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" #include "content/browser/preloading/prerender/prerender_commit_deferring_condition.h" #include "content/common/content_export.h" namespace content { class NavigationRequest; // Helper class used to defer an otherwise fully-prepared navigation (i.e. // followed all redirects, passed all NavigationThrottle checks) from // proceeding until all preconditions are met. // // Clients subclass the CommitDeferringCondition class to wait on a commit // blocking condition to be resolved and invoke the callback when it's ready. // The client should register their subclass class in // RegisterDeferringConditions(). Each condition is run in order, waiting on // that condition to call Resume() before starting the next one. Once the final // condition is completed, the navigation is resumed to commit. // // This mechanism is not applied to about:blank or same-document navigations. // // CommitDeferringCondition vs. NavigationThrottle: At first glance this // mechanism may seem redundant to using a NavigationThrottle (and deferring in // WillProcessResponse). However, the behavior will differ on pages initially // loaded into a non-primary FrameTree (e.g. prerendering or BFCached page). // In these cases NavigationThrottles will run only when the page was loading, // they will not get a chance to intervene when it is being activated to the // primary FrameTree (i.e. user navigates to a prerendered page). If the // navigation needs to be deferred during such activations, a // CommitDeferringCondition must be used. It runs both when the navigation is // loading and when a navigation activates into the primary FrameTree. class CONTENT_EXPORT CommitDeferringConditionRunner { … }; } // namespace content #endif // CONTENT_BROWSER_RENDERER_HOST_COMMIT_DEFERRING_CONDITION_RUNNER_H_