diff options
author | rohitrao <rohitrao@chromium.org> | 2014-10-24 08:55:40 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-24 15:55:58 +0000 |
commit | 995246d92aea4f343797fa869d3aef4d94fd5450 (patch) | |
tree | d7e7be5da7fc75788bb8341dd3ab16ec8652c486 | |
parent | 1f909ee8c8ae5cbc92416482374d2228f087684c (diff) | |
download | chromium_src-995246d92aea4f343797fa869d3aef4d94fd5450.zip chromium_src-995246d92aea4f343797fa869d3aef4d94fd5450.tar.gz chromium_src-995246d92aea4f343797fa869d3aef4d94fd5450.tar.bz2 |
Adds web::NavigationItemImpl.
This is the concrete implementation of the web::NavigationItem interface.
BUG=422033
TEST=None
Review URL: https://codereview.chromium.org/678483003
Cr-Commit-Position: refs/heads/master@{#301109}
-rw-r--r-- | ios/ios_tests_unit.gyp | 2 | ||||
-rw-r--r-- | ios/web/ios_web.gyp | 5 | ||||
-rw-r--r-- | ios/web/navigation/navigation_item_impl.h | 70 | ||||
-rw-r--r-- | ios/web/navigation/navigation_item_impl.mm | 151 | ||||
-rw-r--r-- | ios/web/navigation/navigation_item_impl_unittest.mm | 33 | ||||
-rw-r--r-- | ios/web/public/navigation_item.h | 4 |
6 files changed, 265 insertions, 0 deletions
diff --git a/ios/ios_tests_unit.gyp b/ios/ios_tests_unit.gyp index 5b76f89..a9549aa 100644 --- a/ios/ios_tests_unit.gyp +++ b/ios/ios_tests_unit.gyp @@ -16,9 +16,11 @@ '../testing/gmock.gyp:gmock', '../testing/gtest.gyp:gtest', 'ios_base.gyp:ios_consumer_base', + 'web/ios_web.gyp:ios_web', ], 'sources': [ 'consumer/base/supports_user_data_unittest.cc', + 'web/navigation/navigation_item_impl_unittest.mm', ], }, ], diff --git a/ios/web/ios_web.gyp b/ios/web/ios_web.gyp index c092fd2..7522981 100644 --- a/ios/web/ios_web.gyp +++ b/ios/web/ios_web.gyp @@ -15,8 +15,13 @@ ], 'dependencies': [ '../../base/base.gyp:base', + '../../net/net.gyp:net', + '../../ui/base/ui_base.gyp:ui_base', + '../../ui/gfx/gfx.gyp:gfx', ], 'sources': [ + 'navigation/navigation_item_impl.h', + 'navigation/navigation_item_impl.mm', 'public/favicon_status.cc', 'public/favicon_status.h', 'public/navigation_item.h', diff --git a/ios/web/navigation/navigation_item_impl.h b/ios/web/navigation/navigation_item_impl.h new file mode 100644 index 0000000..1e4707f --- /dev/null +++ b/ios/web/navigation/navigation_item_impl.h @@ -0,0 +1,70 @@ +// 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 IOS_WEB_NAVIGATION_NAVIGATION_ITEM_IMPL_H_ +#define IOS_WEB_NAVIGATION_NAVIGATION_ITEM_IMPL_H_ + +#include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" +#include "base/strings/string16.h" +#include "ios/web/public/favicon_status.h" +#include "ios/web/public/navigation_item.h" +#include "ios/web/public/referrer.h" +#include "ios/web/public/ssl_status.h" +#include "url/gurl.h" + +namespace web { + +// Implementation of NavigationItem. +class NavigationItemImpl : public web::NavigationItem { + public: + // Creates a default NavigationItemImpl. + NavigationItemImpl(); + virtual ~NavigationItemImpl(); + + // NavigationItem implementation: + virtual int GetUniqueID() const override; + virtual void SetURL(const GURL& url) override; + virtual const GURL& GetURL() const override; + virtual void SetReferrer(const web::Referrer& referrer) override; + virtual const web::Referrer& GetReferrer() const override; + virtual void SetVirtualURL(const GURL& url) override; + virtual const GURL& GetVirtualURL() const override; + virtual void SetTitle(const base::string16& title) override; + virtual const base::string16& GetTitle() const override; + virtual void SetPageID(int page_id) override; + virtual int32 GetPageID() const override; + virtual const base::string16& GetTitleForDisplay( + const std::string& languages) const override; + virtual void SetTransitionType(ui::PageTransition transition_type) override; + virtual ui::PageTransition GetTransitionType() const override; + virtual const FaviconStatus& GetFavicon() const override; + virtual FaviconStatus& GetFavicon() override; + virtual const SSLStatus& GetSSL() const override; + virtual SSLStatus& GetSSL() override; + virtual void SetTimestamp(base::Time timestamp) override; + virtual base::Time GetTimestamp() const override; + + private: + int unique_id_; + GURL url_; + Referrer referrer_; + GURL virtual_url_; + base::string16 title_; + int32 page_id_; + ui::PageTransition transition_type_; + FaviconStatus favicon_; + SSLStatus ssl_; + base::Time timestamp_; + + // This is a cached version of the result of GetTitleForDisplay. When the URL, + // virtual URL, or title is set, this should be cleared to force a refresh. + mutable base::string16 cached_display_title_; + + // Copy and assignment is explicitly allowed for this class. +}; + +} // namespace web + +#endif // IOS_WEB_NAVIGATION_NAVIGATION_ITEM_IMPL_H_ diff --git a/ios/web/navigation/navigation_item_impl.mm b/ios/web/navigation/navigation_item_impl.mm new file mode 100644 index 0000000..1f86d72 --- /dev/null +++ b/ios/web/navigation/navigation_item_impl.mm @@ -0,0 +1,151 @@ +// 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 "ios/web/navigation/navigation_item_impl.h" + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "net/base/net_util.h" +#include "ui/base/page_transition_types.h" +#include "ui/gfx/text_elider.h" + +namespace { + +// Returns a new unique ID for use in NavigationItem during construction. The +// returned ID is guaranteed to be nonzero (which is the "no ID" indicator). +static int GetUniqueIDInConstructor() { + static int unique_id_counter = 0; + return ++unique_id_counter; +} + +} // namespace + +namespace web { + +// static +scoped_ptr<NavigationItem> NavigationItem::Create() { + return scoped_ptr<NavigationItem>(new NavigationItemImpl()); +} + +NavigationItemImpl::NavigationItemImpl() + : unique_id_(GetUniqueIDInConstructor()), + page_id_(-1), + transition_type_(ui::PAGE_TRANSITION_LINK) { +} + +NavigationItemImpl::~NavigationItemImpl() { +} + +int NavigationItemImpl::GetUniqueID() const { + return unique_id_; +} + +void NavigationItemImpl::SetURL(const GURL& url) { + url_ = url; + cached_display_title_.clear(); +} + +const GURL& NavigationItemImpl::GetURL() const { + return url_; +} + +void NavigationItemImpl::SetReferrer(const web::Referrer& referrer) { + referrer_ = referrer; +} + +const web::Referrer& NavigationItemImpl::GetReferrer() const { + return referrer_; +} + +void NavigationItemImpl::SetVirtualURL(const GURL& url) { + virtual_url_ = (url == url_) ? GURL() : url; + cached_display_title_.clear(); +} + +const GURL& NavigationItemImpl::GetVirtualURL() const { + return virtual_url_.is_empty() ? url_ : virtual_url_; +} + +void NavigationItemImpl::SetTitle(const base::string16& title) { + title_ = title; + cached_display_title_.clear(); +} + +const base::string16& NavigationItemImpl::GetTitle() const { + return title_; +} + +void NavigationItemImpl::SetPageID(int page_id) { + page_id_ = page_id; +} + +int32 NavigationItemImpl::GetPageID() const { + return page_id_; +} + +const base::string16& NavigationItemImpl::GetTitleForDisplay( + const std::string& languages) const { + // Most pages have real titles. Don't even bother caching anything if this is + // the case. + if (!title_.empty()) + return title_; + + // More complicated cases will use the URLs as the title. This result we will + // cache since it's more complicated to compute. + if (!cached_display_title_.empty()) + return cached_display_title_; + + // Use the virtual URL first if any, and fall back on using the real URL. + base::string16 title; + if (!virtual_url_.is_empty()) { + title = net::FormatUrl(virtual_url_, languages); + } else if (!url_.is_empty()) { + title = net::FormatUrl(url_, languages); + } + + // For file:// URLs use the filename as the title, not the full path. + if (url_.SchemeIsFile()) { + base::string16::size_type slashpos = title.rfind('/'); + if (slashpos != base::string16::npos) + title = title.substr(slashpos + 1); + } + + const int kMaxTitleChars = 4 * 1024; + gfx::ElideString(title, kMaxTitleChars, &cached_display_title_); + return cached_display_title_; +} + +void NavigationItemImpl::SetTransitionType(ui::PageTransition transition_type) { + transition_type_ = transition_type; +} + +ui::PageTransition NavigationItemImpl::GetTransitionType() const { + return transition_type_; +} + +const FaviconStatus& NavigationItemImpl::GetFavicon() const { + return favicon_; +} + +FaviconStatus& NavigationItemImpl::GetFavicon() { + return favicon_; +} + +const SSLStatus& NavigationItemImpl::GetSSL() const { + return ssl_; +} + +SSLStatus& NavigationItemImpl::GetSSL() { + return ssl_; +} + +void NavigationItemImpl::SetTimestamp(base::Time timestamp) { + timestamp_ = timestamp; +} + +base::Time NavigationItemImpl::GetTimestamp() const { + return timestamp_; +} + +} // namespace web diff --git a/ios/web/navigation/navigation_item_impl_unittest.mm b/ios/web/navigation/navigation_item_impl_unittest.mm new file mode 100644 index 0000000..4c64221 --- /dev/null +++ b/ios/web/navigation/navigation_item_impl_unittest.mm @@ -0,0 +1,33 @@ +// 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 "base/logging.h" +#include "base/mac/scoped_nsobject.h" +#include "base/memory/scoped_ptr.h" +#include "ios/web/navigation/navigation_item_impl.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" + +namespace web { +namespace { + +class NavigationItemTest : public PlatformTest { + protected: + virtual void SetUp() { + item_.reset(new NavigationItemImpl()); + } + + scoped_ptr<NavigationItemImpl> item_; +}; + +// TODO(rohitrao): Add and adapt tests from NavigationEntryImpl. +TEST_F(NavigationItemTest, Dummy) { + const GURL url("http://init.test"); + item_->SetURL(url); + EXPECT_TRUE(item_->GetURL().is_valid()); +} + +} // namespace +} // namespace web diff --git a/ios/web/public/navigation_item.h b/ios/web/public/navigation_item.h index 8b2af55..a17a7e4 100644 --- a/ios/web/public/navigation_item.h +++ b/ios/web/public/navigation_item.h @@ -5,6 +5,7 @@ #ifndef IOS_WEB_PUBLIC_NAVIGATION_ITEM_H_ #define IOS_WEB_PUBLIC_NAVIGATION_ITEM_H_ +#include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "base/time/time.h" #include "ui/base/page_transition_types.h" @@ -23,6 +24,9 @@ class NavigationItem { public: virtual ~NavigationItem() {} + // Creates a new NavigationItem. + static scoped_ptr<NavigationItem> Create(); + // Page-related stuff -------------------------------------------------------- // A unique ID is preserved across commits and redirects, which means that |