diff options
author | rohitrao <rohitrao@chromium.org> | 2014-10-24 12:00:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-24 19:00:51 +0000 |
commit | 2975885b004a6de5c3df6b847795bd9d698a2d38 (patch) | |
tree | 020328de11fd04923d23fa31dc66a77a4a4d59ae /components/sessions | |
parent | 20ead2917f581bc315ac40bafb4dd3f563ba7e09 (diff) | |
download | chromium_src-2975885b004a6de5c3df6b847795bd9d698a2d38.zip chromium_src-2975885b004a6de5c3df6b847795bd9d698a2d38.tar.gz chromium_src-2975885b004a6de5c3df6b847795bd9d698a2d38.tar.bz2 |
Adds web implementations for SerializedNavigationEntry.
Also adds ui/base/page_transition_types* to the iOS build.
TBR=dglazkov@chromium.org
BUG=371476
TEST=Tests pass on iOS.
Review URL: https://codereview.chromium.org/676753003
Cr-Commit-Position: refs/heads/master@{#301159}
Diffstat (limited to 'components/sessions')
-rw-r--r-- | components/sessions/BUILD.gn | 42 | ||||
-rw-r--r-- | components/sessions/DEPS | 3 | ||||
-rw-r--r-- | components/sessions/content/DEPS | 5 | ||||
-rw-r--r-- | components/sessions/ios/DEPS | 3 | ||||
-rw-r--r-- | components/sessions/ios/ios_serialized_navigation_builder.cc | 55 | ||||
-rw-r--r-- | components/sessions/ios/ios_serialized_navigation_builder.h | 37 | ||||
-rw-r--r-- | components/sessions/ios/ios_serialized_navigation_builder_unittest.cc | 106 | ||||
-rw-r--r-- | components/sessions/ios/ios_serialized_navigation_driver.cc | 79 | ||||
-rw-r--r-- | components/sessions/ios/ios_serialized_navigation_driver.h | 38 | ||||
-rw-r--r-- | components/sessions/ios/ios_serialized_navigation_driver_unittest.cc | 92 | ||||
-rw-r--r-- | components/sessions/serialized_navigation_entry.cc | 1 | ||||
-rw-r--r-- | components/sessions/serialized_navigation_entry.h | 2 |
12 files changed, 439 insertions, 24 deletions
diff --git a/components/sessions/BUILD.gn b/components/sessions/BUILD.gn index 1b75012..68b84d2 100644 --- a/components/sessions/BUILD.gn +++ b/components/sessions/BUILD.gn @@ -33,26 +33,6 @@ source_set("sessions_core") { } } -component("sessions_content") { - sources = [ - "content/content_serialized_navigation_builder.cc", - "content/content_serialized_navigation_builder.h", - "content/content_serialized_navigation_driver.cc", - "content/content_serialized_navigation_driver.h", - ] - - defines = [ "SESSIONS_IMPLEMENTATION" ] - - deps = [ - ":sessions_core", - "//base", - "//base/third_party/dynamic_annotations", - "//content/public/browser", - "//ui/base", - "//url", - ] -} - static_library("test_support") { testonly = true sources = [ @@ -69,3 +49,25 @@ static_library("test_support") { deps += [ "//sync" ] } } + +if (!is_ios) { + component("sessions_content") { + sources = [ + "content/content_serialized_navigation_builder.cc", + "content/content_serialized_navigation_builder.h", + "content/content_serialized_navigation_driver.cc", + "content/content_serialized_navigation_driver.h", + ] + + defines = [ "SESSIONS_IMPLEMENTATION" ] + + deps = [ + ":sessions_core", + "//base", + "//base/third_party/dynamic_annotations", + "//content/public/browser", + "//ui/base", + "//url", + ] + } +} diff --git a/components/sessions/DEPS b/components/sessions/DEPS index 966369f..9fb0e13 100644 --- a/components/sessions/DEPS +++ b/components/sessions/DEPS @@ -1,7 +1,4 @@ include_rules = [ - "+content/public/browser", - "+content/public/common", "+sync", - "+third_party/WebKit/public/platform", "+ui/base", ] diff --git a/components/sessions/content/DEPS b/components/sessions/content/DEPS new file mode 100644 index 0000000..1187a87 --- /dev/null +++ b/components/sessions/content/DEPS @@ -0,0 +1,5 @@ +include_rules = [ + "+content/public/browser", + "+content/public/common", + "+third_party/WebKit/public/platform", +] diff --git a/components/sessions/ios/DEPS b/components/sessions/ios/DEPS new file mode 100644 index 0000000..0fc0ddd --- /dev/null +++ b/components/sessions/ios/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+ios/web/public", +] diff --git a/components/sessions/ios/ios_serialized_navigation_builder.cc b/components/sessions/ios/ios_serialized_navigation_builder.cc new file mode 100644 index 0000000..135b7d5 --- /dev/null +++ b/components/sessions/ios/ios_serialized_navigation_builder.cc @@ -0,0 +1,55 @@ +// Copyright 2014 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 "components/sessions/ios/ios_serialized_navigation_builder.h" + +#include "components/sessions/serialized_navigation_entry.h" +#include "ios/web/public/favicon_status.h" +#include "ios/web/public/navigation_item.h" +#include "ios/web/public/referrer.h" + +namespace sessions { + +// static +SerializedNavigationEntry +IOSSerializedNavigationBuilder::FromNavigationItem( + int index, const web::NavigationItem& item) { + SerializedNavigationEntry navigation; + navigation.index_ = index; + navigation.unique_id_ = item.GetUniqueID(); + navigation.referrer_url_ = item.GetReferrer().url; + navigation.referrer_policy_ = item.GetReferrer().policy; + navigation.virtual_url_ = item.GetVirtualURL(); + navigation.title_ = item.GetTitle(); + navigation.transition_type_ = item.GetTransitionType(); + navigation.timestamp_ = item.GetTimestamp(); + if (item.GetFavicon().valid) + navigation.favicon_url_ = item.GetFavicon().url; + + return navigation; +} + +// static +scoped_ptr<web::NavigationItem> +IOSSerializedNavigationBuilder::ToNavigationItem( + const SerializedNavigationEntry* navigation, int page_id) { + scoped_ptr<web::NavigationItem> item(web::NavigationItem::Create()); + + item->SetURL(navigation->virtual_url_); + item->SetReferrer(web::Referrer( + navigation->referrer_url_, + static_cast<web::ReferrerPolicy>(navigation->referrer_policy_))); + item->SetTitle(navigation->title_); + item->SetPageID(page_id); + item->SetTransitionType(ui::PAGE_TRANSITION_RELOAD); + item->SetTimestamp(navigation->timestamp_); + + if (navigation->favicon_url_.is_valid()) { + item->GetFavicon().url = navigation->favicon_url_; + } + + return item.Pass(); +} + +} // namespace sessions diff --git a/components/sessions/ios/ios_serialized_navigation_builder.h b/components/sessions/ios/ios_serialized_navigation_builder.h new file mode 100644 index 0000000..73cbfc9 --- /dev/null +++ b/components/sessions/ios/ios_serialized_navigation_builder.h @@ -0,0 +1,37 @@ +// Copyright 2014 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. + +#ifndef COMPONENTS_SESSIONS_IOS_IOS_SERIALIZED_NAVIGATION_BUILDER_H_ +#define COMPONENTS_SESSIONS_IOS_IOS_SERIALIZED_NAVIGATION_BUILDER_H_ + +#include <vector> + +#include "base/memory/scoped_ptr.h" + +namespace web { +class NavigationItem; +} + +namespace sessions { +class SerializedNavigationEntry; + +// Provides methods to convert between SerializedNavigationEntry and //ios/web +// classes. +class IOSSerializedNavigationBuilder { + public: + // Construct a SerializedNavigationEntry for a particular index from the given + // NavigationItem. + static SerializedNavigationEntry FromNavigationItem( + int index, const web::NavigationItem& item); + + // Convert the given SerializedNavigationEntry into a NavigationItem with the + // given page ID. The NavigationItem will have a transition type of + // PAGE_TRANSITION_RELOAD and a new unique ID. + static scoped_ptr<web::NavigationItem> ToNavigationItem( + const SerializedNavigationEntry* navigation, int page_id); +}; + +} // namespace sessions + +#endif // COMPONENTS_SESSIONS_IOS_IOS_SERIALIZED_NAVIGATION_BUILDER_H_ diff --git a/components/sessions/ios/ios_serialized_navigation_builder_unittest.cc b/components/sessions/ios/ios_serialized_navigation_builder_unittest.cc new file mode 100644 index 0000000..a437c3d --- /dev/null +++ b/components/sessions/ios/ios_serialized_navigation_builder_unittest.cc @@ -0,0 +1,106 @@ +// Copyright 2014 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 "components/sessions/ios/ios_serialized_navigation_builder.h" + +#include "components/sessions/serialized_navigation_entry.h" +#include "components/sessions/serialized_navigation_entry_test_helper.h" +#include "ios/web/public/favicon_status.h" +#include "ios/web/public/navigation_item.h" +#include "ios/web/public/referrer.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace sessions { + +namespace { +// Creates a NavigationItem from the test_data constants in +// serialized_navigation_entry_test_helper.h. +scoped_ptr<web::NavigationItem> MakeNavigationItemForTest() { + scoped_ptr<web::NavigationItem> navigation_item( + web::NavigationItem::Create()); + navigation_item->SetReferrer(web::Referrer( + test_data::kReferrerURL, + static_cast<web::ReferrerPolicy>(test_data::kReferrerPolicy))); + navigation_item->SetURL(test_data::kVirtualURL); + navigation_item->SetTitle(test_data::kTitle); + navigation_item->SetTransitionType(test_data::kTransitionType); + navigation_item->SetTimestamp(test_data::kTimestamp); + navigation_item->GetFavicon().valid = true; + navigation_item->GetFavicon().url = test_data::kFaviconURL; + return navigation_item.Pass(); +} + +} // namespace + + +// Create a SerializedNavigationEntry from a NavigationItem. All its fields +// should match the NavigationItem's. +TEST(IOSSerializedNavigationBuilderTest, FromNavigationItem) { + const scoped_ptr<web::NavigationItem> navigation_item( + MakeNavigationItemForTest()); + + const SerializedNavigationEntry& navigation = + IOSSerializedNavigationBuilder::FromNavigationItem( + test_data::kIndex, *navigation_item); + + EXPECT_EQ(test_data::kIndex, navigation.index()); + + EXPECT_EQ(navigation_item->GetUniqueID(), navigation.unique_id()); + EXPECT_EQ(test_data::kReferrerURL, navigation.referrer_url()); + EXPECT_EQ(test_data::kReferrerPolicy, navigation.referrer_policy()); + EXPECT_EQ(test_data::kVirtualURL, navigation.virtual_url()); + EXPECT_EQ(test_data::kTitle, navigation.title()); + EXPECT_EQ(test_data::kTransitionType, navigation.transition_type()); + EXPECT_EQ(test_data::kTimestamp, navigation.timestamp()); + EXPECT_EQ(test_data::kFaviconURL, navigation.favicon_url()); + + // The following fields should be left at their default values. + SerializedNavigationEntry default_navigation; + EXPECT_EQ(default_navigation.encoded_page_state(), + navigation.encoded_page_state()); + EXPECT_EQ(default_navigation.has_post_data(), navigation.has_post_data()); + EXPECT_EQ(default_navigation.post_id(), navigation.post_id()); + EXPECT_EQ(default_navigation.original_request_url(), + navigation.original_request_url()); + EXPECT_EQ(default_navigation.is_overriding_user_agent(), + navigation.is_overriding_user_agent()); + EXPECT_EQ(default_navigation.http_status_code(), + navigation.http_status_code()); + ASSERT_EQ(0U, navigation.redirect_chain().size()); +} + +// Create a NavigationItem, then create another one by converting to +// a SerializedNavigationEntry and back. The new one should match the old one +// except for fields that aren't preserved, which should be set to +// expected values. +TEST(IOSSerializedNavigationBuilderTest, ToNavigationItem) { + const scoped_ptr<web::NavigationItem> old_navigation_item( + MakeNavigationItemForTest()); + + const SerializedNavigationEntry& navigation = + IOSSerializedNavigationBuilder::FromNavigationItem( + test_data::kIndex, *old_navigation_item); + + const scoped_ptr<web::NavigationItem> new_navigation_item( + IOSSerializedNavigationBuilder::ToNavigationItem( + &navigation, test_data::kPageID)); + + EXPECT_EQ(old_navigation_item->GetURL(), + new_navigation_item->GetURL()); + EXPECT_EQ(old_navigation_item->GetReferrer().url, + new_navigation_item->GetReferrer().url); + EXPECT_EQ(old_navigation_item->GetReferrer().policy, + new_navigation_item->GetReferrer().policy); + EXPECT_EQ(old_navigation_item->GetVirtualURL(), + new_navigation_item->GetVirtualURL()); + EXPECT_EQ(old_navigation_item->GetTitle(), + new_navigation_item->GetTitle()); + EXPECT_EQ(test_data::kPageID, new_navigation_item->GetPageID()); + EXPECT_EQ(ui::PAGE_TRANSITION_RELOAD, + new_navigation_item->GetTransitionType()); + EXPECT_EQ(old_navigation_item->GetTimestamp(), + new_navigation_item->GetTimestamp()); +} + +} // namespace sessions diff --git a/components/sessions/ios/ios_serialized_navigation_driver.cc b/components/sessions/ios/ios_serialized_navigation_driver.cc new file mode 100644 index 0000000..f6324ab --- /dev/null +++ b/components/sessions/ios/ios_serialized_navigation_driver.cc @@ -0,0 +1,79 @@ +// Copyright 2014 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 "components/sessions/ios/ios_serialized_navigation_driver.h" + +#include "base/memory/singleton.h" +#include "components/sessions/serialized_navigation_entry.h" +#include "ios/web/public/referrer.h" + +namespace sessions { + +// static +SerializedNavigationDriver* SerializedNavigationDriver::Get() { + return IOSSerializedNavigationDriver::GetInstance(); +} + +// static +IOSSerializedNavigationDriver* +IOSSerializedNavigationDriver::GetInstance() { + return Singleton<IOSSerializedNavigationDriver, + LeakySingletonTraits<IOSSerializedNavigationDriver>>::get(); +} + +IOSSerializedNavigationDriver::IOSSerializedNavigationDriver() { +} + +IOSSerializedNavigationDriver::~IOSSerializedNavigationDriver() { +} + +int IOSSerializedNavigationDriver::GetDefaultReferrerPolicy() const { + return web::ReferrerPolicyDefault; +} + +std::string +IOSSerializedNavigationDriver::GetSanitizedPageStateForPickle( + const SerializedNavigationEntry* navigation) const { + return std::string(); +} + +void IOSSerializedNavigationDriver::Sanitize( + SerializedNavigationEntry* navigation) const { + web::Referrer referrer( + navigation->referrer_url_, + static_cast<web::ReferrerPolicy>(navigation->referrer_policy_)); + + if (!navigation->virtual_url_.SchemeIsHTTPOrHTTPS() || + !referrer.url.SchemeIsHTTPOrHTTPS()) { + referrer.url = GURL(); + } else { + switch (referrer.policy) { + case web::ReferrerPolicyDefault: + if (referrer.url.SchemeIsSecure() && + !navigation->virtual_url_.SchemeIsSecure()) { + referrer.url = GURL(); + } + break; + case web::ReferrerPolicyAlways: + break; + case web::ReferrerPolicyNever: + referrer.url = GURL(); + break; + case web::ReferrerPolicyOrigin: + referrer.url = referrer.url.GetOrigin(); + break; + default: + NOTREACHED(); + break; + } + } + + // Reset the referrer if it has changed. + if (navigation->referrer_url_ != referrer.url) { + navigation->referrer_url_ = GURL(); + navigation->referrer_policy_ = GetDefaultReferrerPolicy(); + } +} + +} // namespace sessions diff --git a/components/sessions/ios/ios_serialized_navigation_driver.h b/components/sessions/ios/ios_serialized_navigation_driver.h new file mode 100644 index 0000000..d5b7f88 --- /dev/null +++ b/components/sessions/ios/ios_serialized_navigation_driver.h @@ -0,0 +1,38 @@ +// Copyright 2014 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. + +#ifndef COMPONENTS_SESSIONS_IOS_IOS_SERIALIZED_NAVIGATION_DRIVER_H_ +#define COMPONENTS_SESSIONS_IOS_IOS_SERIALIZED_NAVIGATION_DRIVER_H_ + +#include "components/sessions/core/serialized_navigation_driver.h" + +template <typename T> struct DefaultSingletonTraits; + +namespace sessions { + +// Provides an iOS implementation of SerializedNavigationDriver that is backed +// by //ios/web classes. +class IOSSerializedNavigationDriver + : public SerializedNavigationDriver { + public: + virtual ~IOSSerializedNavigationDriver(); + + // Returns the singleton IOSSerializedNavigationDriver. Almost all + // callers should use SerializedNavigationDriver::Get() instead. + static IOSSerializedNavigationDriver* GetInstance(); + + // SerializedNavigationDriver implementation. + int GetDefaultReferrerPolicy() const override; + std::string GetSanitizedPageStateForPickle( + const SerializedNavigationEntry* navigation) const override; + void Sanitize(SerializedNavigationEntry* navigation) const override; + + private: + IOSSerializedNavigationDriver(); + friend struct DefaultSingletonTraits<IOSSerializedNavigationDriver>; +}; + +} // namespace sessions + +#endif // COMPONENTS_SESSIONS_IOS_IOS_SERIALIZED_NAVIGATION_DRIVER_H_ diff --git a/components/sessions/ios/ios_serialized_navigation_driver_unittest.cc b/components/sessions/ios/ios_serialized_navigation_driver_unittest.cc new file mode 100644 index 0000000..c9bde7f --- /dev/null +++ b/components/sessions/ios/ios_serialized_navigation_driver_unittest.cc @@ -0,0 +1,92 @@ +// Copyright 2014 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 "components/sessions/ios/ios_serialized_navigation_driver.h" + +#include "components/sessions/serialized_navigation_entry.h" +#include "components/sessions/serialized_navigation_entry_test_helper.h" +#include "ios/web/public/referrer.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace sessions { + +// Tests that PageState data is properly sanitized when post data is present. +TEST(IOSSerializedNavigationDriverTest, PickleSanitization) { + IOSSerializedNavigationDriver* driver = + IOSSerializedNavigationDriver::GetInstance(); + SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + EXPECT_EQ(test_data::kEncodedPageState, navigation.encoded_page_state()); + + // Sanitization always clears the page state. + std::string sanitized_page_state = + driver->GetSanitizedPageStateForPickle(&navigation); + EXPECT_EQ(std::string(), sanitized_page_state); +} + +// Tests that the input data is left unsanitized when the referrer policy is +// Always. +TEST(IOSSerializedNavigationDriverTest, SanitizeWithReferrerPolicyAlways) { + IOSSerializedNavigationDriver* driver = + IOSSerializedNavigationDriver::GetInstance(); + SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + SerializedNavigationEntryTestHelper::SetReferrerPolicy( + web::ReferrerPolicyAlways, &navigation); + + driver->Sanitize(&navigation); + EXPECT_EQ(test_data::kIndex, navigation.index()); + EXPECT_EQ(test_data::kUniqueID, navigation.unique_id()); + EXPECT_EQ(test_data::kReferrerURL, navigation.referrer_url()); + EXPECT_EQ(web::ReferrerPolicyAlways, navigation.referrer_policy()); + EXPECT_EQ(test_data::kVirtualURL, navigation.virtual_url()); + EXPECT_EQ(test_data::kTitle, navigation.title()); + EXPECT_EQ(test_data::kEncodedPageState, navigation.encoded_page_state()); + EXPECT_EQ(test_data::kTransitionType, navigation.transition_type()); + EXPECT_EQ(test_data::kHasPostData, navigation.has_post_data()); + EXPECT_EQ(test_data::kPostID, navigation.post_id()); + EXPECT_EQ(test_data::kOriginalRequestURL, navigation.original_request_url()); + EXPECT_EQ(test_data::kIsOverridingUserAgent, + navigation.is_overriding_user_agent()); + EXPECT_EQ(test_data::kTimestamp, navigation.timestamp()); + EXPECT_EQ(test_data::kSearchTerms, navigation.search_terms()); + EXPECT_EQ(test_data::kFaviconURL, navigation.favicon_url()); + EXPECT_EQ(test_data::kHttpStatusCode, navigation.http_status_code()); +} + +// Tests that the input data is properly sanitized when the referrer policy is +// Never. +TEST(IOSSerializedNavigationDriverTest, SanitizeWithReferrerPolicyNever) { + IOSSerializedNavigationDriver* driver = + IOSSerializedNavigationDriver::GetInstance(); + SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + SerializedNavigationEntryTestHelper::SetReferrerPolicy( + web::ReferrerPolicyNever, &navigation); + + driver->Sanitize(&navigation); + + // Fields that should remain untouched. + EXPECT_EQ(test_data::kIndex, navigation.index()); + EXPECT_EQ(test_data::kUniqueID, navigation.unique_id()); + EXPECT_EQ(test_data::kVirtualURL, navigation.virtual_url()); + EXPECT_EQ(test_data::kTitle, navigation.title()); + EXPECT_EQ(test_data::kEncodedPageState, navigation.encoded_page_state()); + EXPECT_EQ(test_data::kTransitionType, navigation.transition_type()); + EXPECT_EQ(test_data::kHasPostData, navigation.has_post_data()); + EXPECT_EQ(test_data::kPostID, navigation.post_id()); + EXPECT_EQ(test_data::kOriginalRequestURL, navigation.original_request_url()); + EXPECT_EQ(test_data::kIsOverridingUserAgent, + navigation.is_overriding_user_agent()); + EXPECT_EQ(test_data::kTimestamp, navigation.timestamp()); + EXPECT_EQ(test_data::kSearchTerms, navigation.search_terms()); + EXPECT_EQ(test_data::kFaviconURL, navigation.favicon_url()); + EXPECT_EQ(test_data::kHttpStatusCode, navigation.http_status_code()); + + // Fields that were sanitized. + EXPECT_EQ(GURL(), navigation.referrer_url()); + EXPECT_EQ(web::ReferrerPolicyDefault, navigation.referrer_policy()); +} + +} // namespace sessions diff --git a/components/sessions/serialized_navigation_entry.cc b/components/sessions/serialized_navigation_entry.cc index 5135223..8c35828 100644 --- a/components/sessions/serialized_navigation_entry.cc +++ b/components/sessions/serialized_navigation_entry.cc @@ -9,7 +9,6 @@ #include "components/sessions/core/serialized_navigation_driver.h" #include "sync/protocol/session_specifics.pb.h" #include "sync/util/time.h" -#include "third_party/WebKit/public/platform/WebReferrerPolicy.h" namespace sessions { diff --git a/components/sessions/serialized_navigation_entry.h b/components/sessions/serialized_navigation_entry.h index 7db46c0..49ae3dd 100644 --- a/components/sessions/serialized_navigation_entry.h +++ b/components/sessions/serialized_navigation_entry.h @@ -109,6 +109,8 @@ class SESSIONS_EXPORT SerializedNavigationEntry { friend class ContentSerializedNavigationBuilder; friend class ContentSerializedNavigationDriver; friend class SerializedNavigationEntryTestHelper; + friend class IOSSerializedNavigationBuilder; + friend class IOSSerializedNavigationDriver; // Index in the NavigationController. int index_; |