| Index: chrome/browser/history/history_backend_unittest.cc | 
| =================================================================== | 
| --- chrome/browser/history/history_backend_unittest.cc	(revision 19705) | 
| +++ chrome/browser/history/history_backend_unittest.cc	(working copy) | 
| @@ -70,10 +70,43 @@ | 
| scoped_refptr<history::HistoryAddPageArgs> request( | 
| new history::HistoryAddPageArgs( | 
| redirects.back(), Time::Now(), scope, page_id, GURL(), | 
| -            redirects, PageTransition::LINK)); | 
| +            redirects, PageTransition::LINK, true)); | 
| backend_->AddPage(request); | 
| } | 
|  | 
| +  // Adds CLIENT_REDIRECT page transition. | 
| +  // |url1| is the source URL and |url2| is the destination. | 
| +  // |did_replace| is true if the transition is non-user initiated and the | 
| +  // navigation entry for |url2| has replaced that for |url1|. The possibly | 
| +  // updated transition code of the visit records for |url1| and |url2| is | 
| +  // returned by filling in |*transition1| and |*transition2|, respectively. | 
| +  void  AddClientRedirect(const GURL& url1, const GURL& url2, bool did_replace, | 
| +                          int* transition1, int* transition2) { | 
| +    void* const dummy_scope = reinterpret_cast<void*>(0x87654321); | 
| +    HistoryService::RedirectList redirects; | 
| +    if (url1.is_valid()) | 
| +      redirects.push_back(url1); | 
| +    if (url2.is_valid()) | 
| +      redirects.push_back(url2); | 
| +    scoped_refptr<HistoryAddPageArgs> request( | 
| +        new HistoryAddPageArgs(url2, base::Time(), dummy_scope, 0, url1, | 
| +            redirects, PageTransition::CLIENT_REDIRECT, did_replace)); | 
| +    backend_->AddPage(request); | 
| + | 
| +    *transition1 = getTransition(url1); | 
| +    *transition2 = getTransition(url2); | 
| +  } | 
| + | 
| +  int getTransition(const GURL& url) { | 
| +    if (!url.is_valid()) | 
| +      return 0; | 
| +    URLRow row; | 
| +    URLID id = backend_->db()->GetRowForURL(url, &row); | 
| +    VisitVector visits; | 
| +    EXPECT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); | 
| +    return visits[0].transition; | 
| +  } | 
| + | 
| BookmarkModel bookmark_model_; | 
|  | 
| protected: | 
| @@ -406,7 +439,7 @@ | 
| scoped_refptr<HistoryAddPageArgs> request( | 
| new HistoryAddPageArgs(url, visit_time, NULL, 0, GURL(), | 
| HistoryService::RedirectList(), | 
| -                             PageTransition::KEYWORD_GENERATED)); | 
| +                             PageTransition::KEYWORD_GENERATED, false)); | 
| backend_->AddPage(request); | 
|  | 
| // A row should have been added for the url. | 
| @@ -444,4 +477,28 @@ | 
| ASSERT_EQ(0, backend_->db()->GetRowForURL(url, &row)); | 
| } | 
|  | 
| +TEST_F(HistoryBackendTest, ClientRedirect) { | 
| +  ASSERT_TRUE(backend_.get()); | 
| + | 
| +  int transition1; | 
| +  int transition2; | 
| + | 
| +  // Initial transition to page A. | 
| +  GURL url_a("http://google.com/a"); | 
| +   AddClientRedirect(GURL(), url_a, false, &transition1, &transition2); | 
| +  EXPECT_TRUE(transition2 & PageTransition::CHAIN_END); | 
| + | 
| +  // User initiated redirect to page B. | 
| +  GURL url_b("http://google.com/b"); | 
| +   AddClientRedirect(url_a, url_b, false, &transition1, &transition2); | 
| +  EXPECT_TRUE(transition1 & PageTransition::CHAIN_END); | 
| +  EXPECT_TRUE(transition2 & PageTransition::CHAIN_END); | 
| + | 
| +  // Non-user initiated redirect to page C. | 
| +  GURL url_c("http://google.com/c"); | 
| +   AddClientRedirect(url_b, url_c, true, &transition1, &transition2); | 
| +  EXPECT_FALSE(transition1 & PageTransition::CHAIN_END); | 
| +  EXPECT_TRUE(transition2 & PageTransition::CHAIN_END); | 
| +} | 
| + | 
| }  // namespace history | 
|  |