blob: 679838b06b63825f2332f4d1c7a4dac80583ed35 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/loader/chrome_navigation_data.h"
#include "base/memory/ptr_util.h"
#include "base/supports_user_data.h"
#include "net/url_request/url_request.h"
const void* const kChromeNavigationDataUserDataKey =
&kChromeNavigationDataUserDataKey;
namespace {
// UserData object that owns ChromeNavigationData. This is used rather than
// having ChromeNavigationData directly extend base::SupportsUserData::Data to
// avoid naming conflicts between Data::Clone() and
// content::NavigationData::Clone().
class NavigationDataOwner : public base::SupportsUserData::Data {
public:
NavigationDataOwner() = default;
~NavigationDataOwner() override = default;
ChromeNavigationData* data() { return &data_; }
private:
ChromeNavigationData data_;
DISALLOW_COPY_AND_ASSIGN(NavigationDataOwner);
};
} // namespace
ChromeNavigationData::ChromeNavigationData() {}
ChromeNavigationData::~ChromeNavigationData() {}
// static
ChromeNavigationData* ChromeNavigationData::GetDataAndCreateIfNecessary(
net::URLRequest* request) {
if (!request)
return nullptr;
NavigationDataOwner* data_owner_ptr = static_cast<NavigationDataOwner*>(
request->GetUserData(kChromeNavigationDataUserDataKey));
if (data_owner_ptr)
return data_owner_ptr->data();
std::unique_ptr<NavigationDataOwner> data_owner =
std::make_unique<NavigationDataOwner>();
data_owner_ptr = data_owner.get();
request->SetUserData(kChromeNavigationDataUserDataKey, std::move(data_owner));
return data_owner_ptr->data();
}
std::unique_ptr<content::NavigationData> ChromeNavigationData::Clone() {
std::unique_ptr<ChromeNavigationData> copy(new ChromeNavigationData());
if (data_reduction_proxy_data_)
copy->SetDataReductionProxyData(data_reduction_proxy_data_->DeepCopy());
return std::move(copy);
}