serializable_user_data_manager_impl.mm 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #import "ios/web/navigation/serializable_user_data_manager_impl.h"
  5. #import "base/mac/foundation_util.h"
  6. #import "ios/web/public/web_state.h"
  7. #import "ios/web/session/crw_session_user_data.h"
  8. #if !defined(__has_feature) || !__has_feature(objc_arc)
  9. #error "This file requires ARC support."
  10. #endif
  11. namespace web {
  12. namespace {
  13. // The key under which SerializableUserDataManagerWrapper are stored in the
  14. // WebState's user data.
  15. const void* const kSerializableUserDataManagerKey =
  16. &kSerializableUserDataManagerKey;
  17. // Wrapper class used to associate SerializableUserDataManagerImpls with its
  18. // associated WebState.
  19. class SerializableUserDataManagerWrapper : public base::SupportsUserData::Data {
  20. public:
  21. // Returns the SerializableUserDataManagerWrapper associated with |web_state|,
  22. // creating one if necessary.
  23. static SerializableUserDataManagerWrapper* FromWebState(WebState* web_state) {
  24. DCHECK(web_state);
  25. SerializableUserDataManagerWrapper* wrapper =
  26. static_cast<SerializableUserDataManagerWrapper*>(
  27. web_state->GetUserData(kSerializableUserDataManagerKey));
  28. if (wrapper)
  29. return wrapper;
  30. web_state->SetUserData(
  31. kSerializableUserDataManagerKey,
  32. std::make_unique<SerializableUserDataManagerWrapper>());
  33. return static_cast<SerializableUserDataManagerWrapper*>(
  34. web_state->GetUserData(kSerializableUserDataManagerKey));
  35. }
  36. static const SerializableUserDataManagerWrapper* FromWebState(
  37. const WebState* web_state) {
  38. DCHECK(web_state);
  39. const SerializableUserDataManagerWrapper* wrapper =
  40. static_cast<const SerializableUserDataManagerWrapper*>(
  41. web_state->GetUserData(kSerializableUserDataManagerKey));
  42. return wrapper;
  43. }
  44. // Returns the manager owned by this wrapper.
  45. SerializableUserDataManagerImpl* manager() { return &manager_; }
  46. const SerializableUserDataManagerImpl* manager() const { return &manager_; }
  47. private:
  48. // The SerializableUserDataManagerWrapper owned by this object.
  49. SerializableUserDataManagerImpl manager_;
  50. };
  51. } // namespace
  52. // static
  53. SerializableUserDataManager* SerializableUserDataManager::FromWebState(
  54. WebState* web_state) {
  55. DCHECK(web_state);
  56. return SerializableUserDataManagerWrapper::FromWebState(web_state)->manager();
  57. }
  58. // static
  59. const SerializableUserDataManager* SerializableUserDataManager::FromWebState(
  60. const WebState* web_state) {
  61. DCHECK(web_state);
  62. const SerializableUserDataManagerWrapper* wrapper =
  63. SerializableUserDataManagerWrapper::FromWebState(web_state);
  64. return wrapper ? wrapper->manager() : nullptr;
  65. }
  66. SerializableUserDataManagerImpl::SerializableUserDataManagerImpl()
  67. : data_([[CRWSessionUserData alloc] init]) {}
  68. SerializableUserDataManagerImpl::~SerializableUserDataManagerImpl() {}
  69. void SerializableUserDataManagerImpl::AddSerializableData(id<NSCoding> data,
  70. NSString* key) {
  71. DCHECK(data);
  72. DCHECK(key.length);
  73. [data_ setObject:data forKey:key];
  74. }
  75. id<NSCoding> SerializableUserDataManagerImpl::GetValueForSerializationKey(
  76. NSString* key) {
  77. return [data_ objectForKey:key];
  78. }
  79. CRWSessionUserData* SerializableUserDataManagerImpl::GetUserDataForSession()
  80. const {
  81. return data_;
  82. }
  83. void SerializableUserDataManagerImpl::SetUserDataFromSession(
  84. CRWSessionUserData* data) {
  85. if (data) {
  86. data_ = data;
  87. } else {
  88. data = [[CRWSessionUserData alloc] init];
  89. }
  90. }
  91. } // namespace web