| // Copyright 2017 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/navigation/serializable_user_data_manager_impl.h" |
| |
| #import "base/apple/foundation_util.h" |
| #import "ios/web/public/session/crw_session_user_data.h" |
| #import "ios/web/public/web_state.h" |
| |
| namespace web { |
| namespace { |
| // The key under which SerializableUserDataManagerWrapper are stored in the |
| // WebState's user data. |
| const void* const kSerializableUserDataManagerKey = |
| &kSerializableUserDataManagerKey; |
| |
| // Wrapper class used to associate SerializableUserDataManagerImpls with its |
| // associated WebState. |
| class SerializableUserDataManagerWrapper : public base::SupportsUserData::Data { |
| public: |
| // Returns the SerializableUserDataManagerWrapper associated with `web_state`, |
| // creating one if necessary. |
| static SerializableUserDataManagerWrapper* FromWebState(WebState* web_state) { |
| DCHECK(web_state); |
| SerializableUserDataManagerWrapper* wrapper = |
| static_cast<SerializableUserDataManagerWrapper*>( |
| web_state->GetUserData(kSerializableUserDataManagerKey)); |
| if (wrapper) { |
| return wrapper; |
| } |
| |
| web_state->SetUserData( |
| kSerializableUserDataManagerKey, |
| std::make_unique<SerializableUserDataManagerWrapper>()); |
| return static_cast<SerializableUserDataManagerWrapper*>( |
| web_state->GetUserData(kSerializableUserDataManagerKey)); |
| } |
| |
| static const SerializableUserDataManagerWrapper* FromWebState( |
| const WebState* web_state) { |
| DCHECK(web_state); |
| const SerializableUserDataManagerWrapper* wrapper = |
| static_cast<const SerializableUserDataManagerWrapper*>( |
| web_state->GetUserData(kSerializableUserDataManagerKey)); |
| return wrapper; |
| } |
| |
| // Returns the manager owned by this wrapper. |
| SerializableUserDataManagerImpl* manager() { return &manager_; } |
| const SerializableUserDataManagerImpl* manager() const { return &manager_; } |
| |
| private: |
| // The SerializableUserDataManagerWrapper owned by this object. |
| SerializableUserDataManagerImpl manager_; |
| }; |
| } // namespace |
| |
| // static |
| SerializableUserDataManager* SerializableUserDataManager::FromWebState( |
| WebState* web_state) { |
| DCHECK(web_state); |
| return SerializableUserDataManagerWrapper::FromWebState(web_state)->manager(); |
| } |
| |
| // static |
| const SerializableUserDataManager* SerializableUserDataManager::FromWebState( |
| const WebState* web_state) { |
| DCHECK(web_state); |
| const SerializableUserDataManagerWrapper* wrapper = |
| SerializableUserDataManagerWrapper::FromWebState(web_state); |
| return wrapper ? wrapper->manager() : nullptr; |
| } |
| |
| SerializableUserDataManagerImpl::SerializableUserDataManagerImpl() |
| : data_([[CRWSessionUserData alloc] init]) {} |
| |
| SerializableUserDataManagerImpl::~SerializableUserDataManagerImpl() {} |
| |
| void SerializableUserDataManagerImpl::AddSerializableData(id<NSCoding> data, |
| NSString* key) { |
| DCHECK(data); |
| DCHECK(key.length); |
| [data_ setObject:data forKey:key]; |
| } |
| |
| id<NSCoding> SerializableUserDataManagerImpl::GetValueForSerializationKey( |
| NSString* key) { |
| return [data_ objectForKey:key]; |
| } |
| |
| CRWSessionUserData* SerializableUserDataManagerImpl::GetUserDataForSession() |
| const { |
| return data_; |
| } |
| |
| void SerializableUserDataManagerImpl::SetUserDataFromSession( |
| CRWSessionUserData* data) { |
| if (data) { |
| data_ = data; |
| } else { |
| data = [[CRWSessionUserData alloc] init]; |
| } |
| } |
| |
| } // namespace web |