summaryrefslogtreecommitdiffstats
path: root/ios/web
diff options
context:
space:
mode:
authorrohitrao <rohitrao@chromium.org>2014-10-24 08:55:40 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-24 15:55:58 +0000
commit995246d92aea4f343797fa869d3aef4d94fd5450 (patch)
treed7e7be5da7fc75788bb8341dd3ab16ec8652c486 /ios/web
parent1f909ee8c8ae5cbc92416482374d2228f087684c (diff)
downloadchromium_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}
Diffstat (limited to 'ios/web')
-rw-r--r--ios/web/ios_web.gyp5
-rw-r--r--ios/web/navigation/navigation_item_impl.h70
-rw-r--r--ios/web/navigation/navigation_item_impl.mm151
-rw-r--r--ios/web/navigation/navigation_item_impl_unittest.mm33
-rw-r--r--ios/web/public/navigation_item.h4
5 files changed, 263 insertions, 0 deletions
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