// 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_PUBLIC_BROWSER_NAVIGATION_HANDLE_USER_DATA_H_ #define CONTENT_PUBLIC_BROWSER_NAVIGATION_HANDLE_USER_DATA_H_ #include "base/memory/ptr_util.h" #include "base/supports_user_data.h" #include "content/public/browser/navigation_handle.h" namespace content { // This class can be used to store data for an in-progress navigation. // NavigationHandleUserData is created when a user of an API inherits this class // and calls CreateForCurrentNavigation. // // NavigationHandleUserData is cleared when either: // - NavigationHandle is deleted, or // - DeleteForCurrentNavigation is called. // // This is similar to DocumentUserData but attached to a navigation // instead. This class can be used before there's a document assigned for this // navigation. Example usage of NavigationHandleUserData: // // --- in foo_data.h --- // class FooData : public content::NavigationHandleUserData<FooData> { // public: // ~FooData() override; // // // ... more public stuff here ... // // private: // explicit FooData(content::NavigationHandle& navigation_handle); // // friend NavigationHandleUserData; // NAVIGATION_HANDLE_USER_DATA_KEY_DECL(); // // // ... more private stuff here ... // }; // // --- in foo_data.cc --- // NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(FooData) template <typename T> class NavigationHandleUserData : public base::SupportsUserData::Data { … }; // Users won't be able to instantiate the template if they miss declaring the // user data key. // This macro declares a static variable inside the class that inherits from // NavigationHandleUserData. The address of this static variable is used as // the key to store/retrieve an instance of the class. #define NAVIGATION_HANDLE_USER_DATA_KEY_DECL() … // This macro instantiates the static variable declared by the previous macro. // It must live in a .cc file to ensure that there is only one instantiation // of the static variable. #define NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(Type) … } // namespace content #endif // CONTENT_PUBLIC_BROWSER_NAVIGATION_HANDLE_USER_DATA_H_