Index: components/dom_distiller/content/distiller_page_web_contents_browsertest.cc |
diff --git a/components/dom_distiller/content/distiller_page_web_contents_browsertest.cc b/components/dom_distiller/content/distiller_page_web_contents_browsertest.cc |
index 5d1cd2ae1806948155f2bd49d67695a961ea720f..e319097bd4196c2b155d0242da97e72e93166e9e 100644 |
--- a/components/dom_distiller/content/distiller_page_web_contents_browsertest.cc |
+++ b/components/dom_distiller/content/distiller_page_web_contents_browsertest.cc |
@@ -7,8 +7,12 @@ |
#include "base/run_loop.h" |
#include "base/values.h" |
#include "components/dom_distiller/content/distiller_page_web_contents.h" |
+#include "components/dom_distiller/content/web_contents_main_frame_observer.h" |
#include "components/dom_distiller/core/distiller_page.h" |
#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/navigation_controller.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/web_contents_observer.h" |
#include "content/public/test/content_browser_test.h" |
#include "content/shell/browser/shell.h" |
#include "grit/component_resources.h" |
@@ -23,6 +27,8 @@ using testing::Not; |
namespace dom_distiller { |
+const char* kSimpleArticlePath = "/simple_article.html"; |
+ |
class DistillerPageWebContentsTest : public ContentBrowserTest { |
public: |
// ContentBrowserTest: |
@@ -66,18 +72,108 @@ class DistillerPageWebContentsTest : public ContentBrowserTest { |
} |
protected: |
+ void RunUseCurrentWebContentsTest(const std::string& url, |
+ bool expect_new_web_contents, |
+ bool setup_main_frame_observer, |
+ bool wait_for_document_loaded); |
+ |
DistillerPageWebContents* distiller_page_; |
base::Closure quit_closure_; |
scoped_ptr<DistilledPageInfo> page_info_; |
}; |
+// Use this class to be able to leak the WebContents, which is needed for when |
+// the current WebContents is used for distillation. |
+class TestDistillerPageWebContents : public DistillerPageWebContents { |
+ public: |
+ TestDistillerPageWebContents( |
+ content::BrowserContext* browser_context, |
+ scoped_ptr<SourcePageHandleWebContents> optional_web_contents_handle, |
+ bool expect_new_web_contents) |
+ : DistillerPageWebContents(browser_context, |
+ optional_web_contents_handle.Pass()), |
+ expect_new_web_contents_(expect_new_web_contents), |
+ new_web_contents_created_(false) {} |
+ |
+ virtual void CreateNewWebContents(const GURL& url) OVERRIDE { |
+ ASSERT_EQ(true, expect_new_web_contents_); |
+ new_web_contents_created_ = true; |
+ // DistillerPageWebContents::CreateNewWebContents resets the scoped_ptr to |
+ // the WebContents, so intentionally leak WebContents here, since it is |
+ // owned by the shell. |
+ content::WebContents* web_contents = web_contents_.release(); |
+ web_contents->GetLastCommittedURL(); |
+ DistillerPageWebContents::CreateNewWebContents(url); |
+ } |
+ |
+ virtual ~TestDistillerPageWebContents() { |
+ if (!expect_new_web_contents_) { |
+ // Intentionally leaking WebContents, since it is owned by the shell. |
+ content::WebContents* web_contents = web_contents_.release(); |
+ web_contents->GetLastCommittedURL(); |
+ } |
+ } |
+ |
+ bool new_web_contents_created() { return new_web_contents_created_; } |
+ |
+ private: |
+ bool expect_new_web_contents_; |
+ bool new_web_contents_created_; |
+}; |
+ |
+// Helper class to know how far in the loading process the current WebContents |
+// has come. It will call the callback either after |
+// DidCommitProvisionalLoadForFrame or DocumentLoadedInFrame is called for the |
+// main frame, based on the value of |wait_for_document_loaded|. |
+class WebContentsMainFrameHelper : public content::WebContentsObserver { |
+ public: |
+ WebContentsMainFrameHelper(content::WebContents* web_contents, |
+ const base::Closure& callback, |
+ bool wait_for_document_loaded) |
+ : web_contents_(web_contents), |
+ callback_(callback), |
+ wait_for_document_loaded_(wait_for_document_loaded) { |
+ content::WebContentsObserver::Observe(web_contents); |
+ } |
+ |
+ virtual void DidCommitProvisionalLoadForFrame( |
+ int64 frame_id, |
+ const base::string16& frame_unique_name, |
+ bool is_main_frame, |
+ const GURL& url, |
+ content::PageTransition transition_type, |
+ content::RenderViewHost* render_view_host) OVERRIDE { |
+ if (wait_for_document_loaded_) |
+ return; |
+ if (is_main_frame) |
+ callback_.Run(); |
+ } |
+ |
+ virtual void DocumentLoadedInFrame( |
+ int64 frame_id, |
+ content::RenderViewHost* render_view_host) OVERRIDE { |
+ if (wait_for_document_loaded_) { |
+ if (web_contents_ && |
+ frame_id == web_contents_->GetMainFrame()->GetRoutingID()) { |
+ callback_.Run(); |
+ } |
+ } |
+ } |
+ |
+ private: |
+ content::WebContents* web_contents_; |
+ base::Closure callback_; |
+ bool wait_for_document_loaded_; |
+}; |
+ |
IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, BasicDistillationWorks) { |
DistillerPageWebContents distiller_page( |
- shell()->web_contents()->GetBrowserContext()); |
+ shell()->web_contents()->GetBrowserContext(), |
+ scoped_ptr<SourcePageHandleWebContents>()); |
distiller_page_ = &distiller_page; |
base::RunLoop run_loop; |
- DistillPage(run_loop.QuitClosure(), "/simple_article.html"); |
+ DistillPage(run_loop.QuitClosure(), kSimpleArticlePath); |
run_loop.Run(); |
EXPECT_EQ("Test Page Title", page_info_.get()->title); |
@@ -89,11 +185,12 @@ IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, BasicDistillationWorks) { |
IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, HandlesRelativeLinks) { |
DistillerPageWebContents distiller_page( |
- shell()->web_contents()->GetBrowserContext()); |
+ shell()->web_contents()->GetBrowserContext(), |
+ scoped_ptr<SourcePageHandleWebContents>()); |
distiller_page_ = &distiller_page; |
base::RunLoop run_loop; |
- DistillPage(run_loop.QuitClosure(), "/simple_article.html"); |
+ DistillPage(run_loop.QuitClosure(), kSimpleArticlePath); |
run_loop.Run(); |
// A relative link should've been updated. |
@@ -105,11 +202,12 @@ IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, HandlesRelativeLinks) { |
IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, HandlesRelativeImages) { |
DistillerPageWebContents distiller_page( |
- shell()->web_contents()->GetBrowserContext()); |
+ shell()->web_contents()->GetBrowserContext(), |
+ scoped_ptr<SourcePageHandleWebContents>()); |
distiller_page_ = &distiller_page; |
base::RunLoop run_loop; |
- DistillPage(run_loop.QuitClosure(), "/simple_article.html"); |
+ DistillPage(run_loop.QuitClosure(), kSimpleArticlePath); |
run_loop.Run(); |
// A relative link should've been updated. |
@@ -121,7 +219,8 @@ IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, HandlesRelativeImages) { |
IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, VisibilityDetection) { |
DistillerPageWebContents distiller_page( |
- shell()->web_contents()->GetBrowserContext()); |
+ shell()->web_contents()->GetBrowserContext(), |
+ scoped_ptr<SourcePageHandleWebContents>()); |
distiller_page_ = &distiller_page; |
// visble_style.html and invisible_style.html only differ by the visibility |
@@ -142,4 +241,92 @@ IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, VisibilityDetection) { |
} |
} |
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, |
+ UsingCurrentWebContentsWrongUrl) { |
+ std::string url("/bogus"); |
+ bool expect_new_web_contents = true; |
+ bool setup_main_frame_observer = true; |
+ bool wait_for_document_loaded = true; |
+ RunUseCurrentWebContentsTest(url, |
+ expect_new_web_contents, |
+ setup_main_frame_observer, |
+ wait_for_document_loaded); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, |
+ UsingCurrentWebContentsNoMainFrameObserver) { |
+ std::string url(kSimpleArticlePath); |
+ bool expect_new_web_contents = true; |
+ bool setup_main_frame_observer = false; |
+ bool wait_for_document_loaded = true; |
+ RunUseCurrentWebContentsTest(url, |
+ expect_new_web_contents, |
+ setup_main_frame_observer, |
+ wait_for_document_loaded); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, |
+ UsingCurrentWebContentsNotFinishedLoadingYet) { |
+ std::string url(kSimpleArticlePath); |
+ bool expect_new_web_contents = false; |
+ bool setup_main_frame_observer = true; |
+ bool wait_for_document_loaded = false; |
+ RunUseCurrentWebContentsTest(url, |
+ expect_new_web_contents, |
+ setup_main_frame_observer, |
+ wait_for_document_loaded); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, |
+ UsingCurrentWebContentsReadyForDistillation) { |
+ std::string url(kSimpleArticlePath); |
+ bool expect_new_web_contents = false; |
+ bool setup_main_frame_observer = true; |
+ bool wait_for_document_loaded = true; |
+ RunUseCurrentWebContentsTest(url, |
+ expect_new_web_contents, |
+ setup_main_frame_observer, |
+ wait_for_document_loaded); |
+} |
+ |
+void DistillerPageWebContentsTest::RunUseCurrentWebContentsTest( |
+ const std::string& url, |
+ bool expect_new_web_contents, |
+ bool setup_main_frame_observer, |
+ bool wait_for_document_loaded) { |
+ content::WebContents* current_web_contents = shell()->web_contents(); |
+ if (setup_main_frame_observer) { |
+ dom_distiller::WebContentsMainFrameObserver::CreateForWebContents( |
+ current_web_contents); |
+ } |
+ base::RunLoop url_loaded_runner; |
+ WebContentsMainFrameHelper main_frame_loaded(current_web_contents, |
+ url_loaded_runner.QuitClosure(), |
+ wait_for_document_loaded); |
+ current_web_contents->GetController().LoadURL( |
+ embedded_test_server()->GetURL(url), |
+ content::Referrer(), |
+ content::PAGE_TRANSITION_TYPED, |
+ std::string()); |
+ url_loaded_runner.Run(); |
+ |
+ scoped_ptr<content::WebContents> old_web_contents_sptr(current_web_contents); |
+ scoped_ptr<SourcePageHandleWebContents> source_page_handle( |
+ new SourcePageHandleWebContents(old_web_contents_sptr.Pass())); |
+ |
+ TestDistillerPageWebContents distiller_page( |
+ shell()->web_contents()->GetBrowserContext(), |
+ source_page_handle.Pass(), |
+ expect_new_web_contents); |
+ distiller_page_ = &distiller_page; |
+ |
+ base::RunLoop run_loop; |
+ DistillPage(run_loop.QuitClosure(), kSimpleArticlePath); |
+ run_loop.Run(); |
+ |
+ // Sanity check of distillation process. |
+ EXPECT_EQ(expect_new_web_contents, distiller_page.new_web_contents_created()); |
+ EXPECT_EQ("Test Page Title", page_info_.get()->title); |
+} |
+ |
} // namespace dom_distiller |