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

Unified Diff: chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc

Issue 260073009: [dom_distiller] Add support for incremental viewer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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: chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
diff --git a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
index 98a0a69587a27807e320a7e4a9f30e7919d0e5ba..ae6e19e7aa3ea47381fea5ed5fa3a5c7b26a61de 100644
--- a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
+++ b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
@@ -6,6 +6,8 @@
#include "base/command_line.h"
#include "base/guid.h"
+#include "base/path_service.h"
+#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
@@ -21,23 +23,39 @@
#include "components/dom_distiller/core/dom_distiller_test_util.h"
#include "components/dom_distiller/core/fake_db.h"
#include "components/dom_distiller/core/fake_distiller.h"
+#include "components/dom_distiller/core/fake_distiller_page.h"
#include "components/dom_distiller/core/task_tracker.h"
+#include "components/dom_distiller/core/url_constants.h"
#include "components/dom_distiller/core/url_utils.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/browser_test_utils.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace dom_distiller {
using test::FakeDB;
using test::FakeDistiller;
+using test::MockDistillerPage;
using test::MockDistillerFactory;
+using test::MockDistillerPageFactory;
using test::util::CreateStoreWithFakeDB;
+using testing::HasSubstr;
+using testing::Not;
namespace {
+const char kGetLoadIndicatorClassName[] =
+ "window.domAutomationController.send("
+ "document.getElementById('loadingIndicator').className)";
+
+const char kGetContent[] =
+ "window.domAutomationController.send("
+ "document.getElementById('content').innerHTML)";
+
void AddEntry(const ArticleEntry& e, FakeDB::EntryMap* map) {
(*map)[e.entry_id()] = e;
}
@@ -122,34 +140,41 @@ class DomDistillerViewerSourceBrowserTest : public InProcessBrowserTest {
static KeyedService* Build(content::BrowserContext* context) {
FakeDB* fake_db = new FakeDB(database_model_);
- MockDistillerFactory* factory = new MockDistillerFactory();
+ distiller_factory_ = new MockDistillerFactory();
+ MockDistillerPageFactory* distiller_page_factory_ =
+ new MockDistillerPageFactory();
DomDistillerContextKeyedService* service =
new DomDistillerContextKeyedService(
scoped_ptr<DomDistillerStoreInterface>(
CreateStoreWithFakeDB(fake_db, FakeDB::EntryMap())),
- scoped_ptr<DistillerFactory>(factory),
- scoped_ptr<DistillerPageFactory>());
+ scoped_ptr<DistillerFactory>(distiller_factory_),
+ scoped_ptr<DistillerPageFactory>(distiller_page_factory_));
+ MockDistillerPage* distiller_page = new MockDistillerPage();
+ EXPECT_CALL(*distiller_page_factory_, CreateDistillerPageImpl())
+ .WillOnce(testing::Return(distiller_page));
fake_db->InitCallback(true);
fake_db->LoadCallback(true);
if (expect_distillation_) {
// There will only be destillation of an article if the database contains
// the article.
FakeDistiller* distiller = new FakeDistiller(true);
- EXPECT_CALL(*factory, CreateDistillerImpl())
+ EXPECT_CALL(*distiller_factory_, CreateDistillerImpl())
.WillOnce(testing::Return(distiller));
}
return service;
}
void ViewSingleDistilledPage(const GURL& url);
-
// Database entries.
static FakeDB::EntryMap* database_model_;
static bool expect_distillation_;
+ static MockDistillerFactory* distiller_factory_;
};
FakeDB::EntryMap* DomDistillerViewerSourceBrowserTest::database_model_;
bool DomDistillerViewerSourceBrowserTest::expect_distillation_ = false;
+MockDistillerFactory* DomDistillerViewerSourceBrowserTest::distiller_factory_ =
+ NULL;
// The DomDistillerViewerSource renders untrusted content, so ensure no bindings
// are enabled when the article exists in the database.
@@ -226,7 +251,7 @@ IN_PROC_BROWSER_TEST_F(DomDistillerViewerSourceBrowserTest,
LoadSuccessObserver observer(contents);
// Navigate to a URL which the source should respond to with CSS.
- std::string url_without_scheme = "://foobar/readability.css";
+ std::string url_without_scheme = std::string("://foobar/") + kViewerCssPath;
GURL url(chrome::kDomDistillerScheme + url_without_scheme);
ui_test_utils::NavigateToURL(browser(), url);
@@ -241,4 +266,102 @@ IN_PROC_BROWSER_TEST_F(DomDistillerViewerSourceBrowserTest,
EXPECT_EQ("text/css", observer.web_contents()->GetContentsMimeType());
}
+
+IN_PROC_BROWSER_TEST_F(DomDistillerViewerSourceBrowserTest,
+ MultiPageArticle) {
+ expect_distillation_ = false;
+ dom_distiller::DomDistillerServiceFactory::GetInstance()
+ ->SetTestingFactoryAndUse(browser()->profile(), &Build);
+
+ scoped_refptr<content::MessageLoopRunner> distillation_done_runner =
+ new content::MessageLoopRunner;
+
+ FakeDistiller* distiller = new FakeDistiller(
+ false,
+ distillation_done_runner->QuitClosure());
+ EXPECT_CALL(*distiller_factory_, CreateDistillerImpl())
+ .WillOnce(testing::Return(distiller));
+
+ // Setup observer to inspect the RenderViewHost after committed navigation.
+ content::WebContents* contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ LoadSuccessObserver observer(contents);
+
+ // Navigate to a URL and wait for the distiller to flush contents to the page.
+ GURL url(dom_distiller::url_utils::GetDistillerViewUrlFromUrl(
+ chrome::kDomDistillerScheme, GURL("http://urlthatlooksvalid.com")));
+ chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED);
+ chrome::Navigate(&params);
+ distillation_done_runner->Run();
+
+ // Fake a multi-page response from distiller.
+
+ std::vector<scoped_refptr<ArticleDistillationUpdate::RefCountedPageProto> >
+ update_pages;
+ scoped_ptr<DistilledArticleProto> article(new DistilledArticleProto());
+
+ // Flush page 1.
+ {
+ scoped_refptr<base::RefCountedData<DistilledPageProto> > page_proto =
+ new base::RefCountedData<DistilledPageProto>();
+ page_proto->data.set_url("http://foobar.1.html");
+ page_proto->data.set_html("<div>Page 1 content</div>");
+ update_pages.push_back(page_proto);
+ *(article->add_pages()) = page_proto->data;
+
+ ArticleDistillationUpdate update(update_pages, true, false);
+ distiller->RunDistillerUpdateCallback(update);
+
+ // Wait for the page load to complete as the first page completes the root
+ // document.
+ content::WaitForLoadStop(contents);
+
+ std::string result;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ contents, kGetLoadIndicatorClassName , &result));
+ EXPECT_EQ("visible", result);
+
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ contents, kGetContent , &result));
+ EXPECT_THAT(result, HasSubstr("Page 1 content"));
+ EXPECT_THAT(result, Not(HasSubstr("Page 2 content")));
+ }
+
+ // Flush page 2.
+ {
+ scoped_refptr<base::RefCountedData<DistilledPageProto> > page_proto =
+ new base::RefCountedData<DistilledPageProto>();
+ page_proto->data.set_url("http://foobar.2.html");
+ page_proto->data.set_html("<div>Page 2 content</div>");
+ update_pages.push_back(page_proto);
+ *(article->add_pages()) = page_proto->data;
+
+ ArticleDistillationUpdate update(update_pages, false, false);
+ distiller->RunDistillerUpdateCallback(update);
+
+ std::string result;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ contents, kGetLoadIndicatorClassName , &result));
+ EXPECT_EQ("visible", result);
+
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ contents, kGetContent , &result));
+ EXPECT_THAT(result, HasSubstr("Page 1 content"));
+ EXPECT_THAT(result, HasSubstr("Page 2 content"));
+ }
+
+ // Complete the load.
+ distiller->RunDistillerCallback(article.Pass());
+ base::RunLoop().RunUntilIdle();
+
+ std::string result;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ contents, kGetLoadIndicatorClassName, &result));
+ EXPECT_EQ("hidden", result);
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ contents, kGetContent , &result));
+ EXPECT_THAT(result, HasSubstr("Page 1 content"));
+ EXPECT_THAT(result, HasSubstr("Page 2 content"));
+}
+
} // namespace dom_distiller

Powered by Google App Engine
This is Rietveld 408576698