Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(182)

Unified Diff: components/dom_distiller/content/distiller_page_web_contents_browsertest.cc

Issue 266073003: Add support for distilling current WebContents (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed compile on Windows and rebased to ensure mac build works too Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 72b572f4ff3ac1aed703e71f1193757bdaf8c339..0e7226d593b82087c345577a86c255f9a46e7765 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:
@@ -65,18 +71,110 @@ class DistillerPageWebContentsTest : public ContentBrowserTest {
}
protected:
+ void RunUseCurrentWebContentsTest(const std::string& url,
+ bool use_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 use_new_web_contents)
+ : DistillerPageWebContents(browser_context,
+ optional_web_contents_handle.Pass()),
+ use_new_web_contents_(use_new_web_contents),
+ new_web_contents_created_(false) {}
+
+ virtual void CreateNewWebContents(const GURL& url) OVERRIDE {
+ EXPECT_EQ(true, use_new_web_contents_);
Yaron 2014/05/22 18:25:02 ASSERT_EQ? I think a lot's going to go south if yo
nyquist 2014/05/22 23:00:54 Done.
+ new_web_contents_created_ = true;
+ if (use_new_web_contents_) {
Yaron 2014/05/22 18:25:02 remove this
nyquist 2014/05/22 23:00:54 Done.
+ // 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 (!use_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 use_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);
@@ -88,11 +186,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.
@@ -104,11 +203,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.
@@ -120,7 +220,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
@@ -141,4 +242,93 @@ IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest, VisibilityDetection) {
}
}
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest,
+ UsingCurrentWebContentsWrongUrl) {
+ std::string url("about:blank");
+ bool use_new_web_contents = true;
+ bool setup_main_frame_observer = true;
+ bool wait_for_document_loaded = true;
+ RunUseCurrentWebContentsTest(url,
+ use_new_web_contents,
+ setup_main_frame_observer,
+ wait_for_document_loaded);
+}
+
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest,
+ UsingCurrentWebContentsNoMainFrameObserver) {
+ std::string url(kSimpleArticlePath);
+ bool use_new_web_contents = true;
+ bool setup_main_frame_observer = false;
+ bool wait_for_document_loaded = true;
+ RunUseCurrentWebContentsTest(url,
+ use_new_web_contents,
+ setup_main_frame_observer,
+ wait_for_document_loaded);
+}
+
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest,
+ UsingCurrentWebContentsNotFinishedLoadingYet) {
+ std::string url(kSimpleArticlePath);
+ bool use_new_web_contents = false;
+ bool setup_main_frame_observer = true;
+ bool wait_for_document_loaded = false;
+ RunUseCurrentWebContentsTest(url,
+ use_new_web_contents,
+ setup_main_frame_observer,
+ wait_for_document_loaded);
+}
+
+IN_PROC_BROWSER_TEST_F(DistillerPageWebContentsTest,
+ UsingCurrentWebContentsReadyForDistillation) {
+ std::string url(kSimpleArticlePath);
+ bool use_new_web_contents = false;
+ bool setup_main_frame_observer = true;
+ bool wait_for_document_loaded = true;
+ RunUseCurrentWebContentsTest(url,
+ use_new_web_contents,
+ setup_main_frame_observer,
+ wait_for_document_loaded);
+}
+
+void DistillerPageWebContentsTest::RunUseCurrentWebContentsTest(
+ const std::string& url,
+ bool use_new_web_contents,
Yaron 2014/05/22 18:25:02 nit: expect_new_web_contents throughout as this is
nyquist 2014/05/22 23:00:54 Done.
+ 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;
+ scoped_ptr<WebContentsMainFrameHelper> main_frame_loaded(
Yaron 2014/05/22 18:25:02 why scoped_ptr?
nyquist 2014/05/22 23:00:54 Done.
+ new WebContentsMainFrameHelper(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(),
+ use_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(use_new_web_contents, distiller_page.new_web_contents_created());
+ EXPECT_EQ("Test Page Title", page_info_.get()->title);
+}
+
} // namespace dom_distiller

Powered by Google App Engine
This is Rietveld 408576698