1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef IOS_PUBLIC_PROVIDER_WEB_WEB_STATE_USER_DATA_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define IOS_PUBLIC_PROVIDER_WEB_WEB_STATE_USER_DATA_H_ 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ios/public/consumer/base/supports_user_data.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ios/public/provider/web/web_state.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ios { 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// A base class for classes attached to, and scoped to, the lifetime of a 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// WebState. For example: 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// --- in foo.h --- 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// class Foo : public ios::WebStateUserData<Foo> { 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// public: 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// virtual ~Foo(); 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// // ... more public stuff here ... 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// private: 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// explicit Foo(ios::WebState* web_state); 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// friend class ios::WebStateUserData<Foo>; 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// // ... more private stuff here ... 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// } 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// --- in foo.cc --- 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// DEFINE_WEB_CONTENTS_USER_DATA_KEY(Foo); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <typename T> 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebStateUserData : public ios::SupportsUserData::Data { 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Creates an object of type T, and attaches it to the specified WebState. 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If an instance is already attached, does nothing. 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static void CreateForWebState(WebState* web_state) { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!FromWebState(web_state)) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_state->SetUserData(UserDataKey(), new T(web_state)); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Retrieves the instance of type T that was attached to the specified 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // WebState (via CreateForWebState above) and returns it. If no instance 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // of the type was attached, returns NULL. 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static T* FromWebState(WebState* web_state) { 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return static_cast<T*>(web_state->GetUserData(UserDataKey())); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static const T* FromWebState(const WebState* web_state) { 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return static_cast<const T*>(web_state->GetUserData(UserDataKey())); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static inline void* UserDataKey() { 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return &kLocatorKey; 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The user data key. 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static int kLocatorKey; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The macro to define the locator key. This key should be defined in the .cc 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// file of the derived class. 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The "= 0" is surprising, but is required to effect a definition rather than 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// a declaration. Without it, this would be merely a declaration of a template 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// specialization. (C++98: 14.7.3.15; C++11: 14.7.3.13) 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define DEFINE_WEB_STATE_USER_DATA_KEY(TYPE) \ 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate<> \ 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ios::WebStateUserData<TYPE>::kLocatorKey = 0 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace ios 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // IOS_PUBLIC_PROVIDER_WEB_WEB_STATE_USER_DATA_H_ 73