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

Unified Diff: chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc

Issue 1105263004: "Load image" context menu item to reload a LoFi image. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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/renderer_context_menu/render_view_context_menu_browsertest.cc
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index ae93e95b2fda6023f6dea2b59707d92d493beb41..8c1c7bf9b284619b18c8dddb65c7df47f251aaa8 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -4,6 +4,7 @@
#include <string>
+#include "base/bind.h"
#include "base/command_line.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
@@ -34,6 +35,10 @@
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
+#include "net/base/load_flags.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_filter.h"
+#include "net/url_request/url_request_interceptor.h"
#include "third_party/WebKit/public/web/WebContextMenuData.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
@@ -45,7 +50,7 @@ class ContextMenuBrowserTest : public InProcessBrowserTest {
public:
ContextMenuBrowserTest() {}
- TestRenderViewContextMenu* CreateContextMenu(
+ content::ContextMenuParams CreateContextMenuParams(
const GURL& unfiltered_url,
const GURL& url,
blink::WebContextMenuData::MediaType media_type) {
@@ -62,6 +67,11 @@ class ContextMenuBrowserTest : public InProcessBrowserTest {
params.writing_direction_left_to_right = 0;
params.writing_direction_right_to_left = 0;
#endif // OS_MACOSX
+ return params;
+ }
+
+ TestRenderViewContextMenu* CreateContextMenu(
+ content::ContextMenuParams params) {
TestRenderViewContextMenu* menu = new TestRenderViewContextMenu(
browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(),
params);
@@ -72,8 +82,8 @@ class ContextMenuBrowserTest : public InProcessBrowserTest {
TestRenderViewContextMenu* CreateContextMenuMediaTypeNone(
const GURL& unfiltered_url,
const GURL& url) {
- return CreateContextMenu(unfiltered_url, url,
- blink::WebContextMenuData::MediaTypeNone);
+ return CreateContextMenu(CreateContextMenuParams(
+ unfiltered_url, url, blink::WebContextMenuData::MediaTypeNone));
}
};
@@ -308,14 +318,30 @@ IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, ViewPageInfoWithNoEntry) {
menu.ExecuteCommand(IDC_CONTENT_CONTEXT_VIEWPAGEINFO, 0);
}
+IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, DataSaverLoadImage) {
Lei Zhang 2015/05/11 20:16:53 Can this be a unit test instead?
megjablon 2015/05/11 22:58:40 I looked into writing it as a unit test, but the I
Lei Zhang 2015/05/12 21:16:39 It's probably possible, just a pain to set up all
megjablon 2015/05/13 23:36:38 Just found out someone is already doing this work
Lei Zhang 2015/05/13 23:50:19 Yay! Can you add a TODO to convert ContextMenuBrow
megjablon 2015/05/14 19:26:24 Done.
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ command_line->AppendSwitch(
+ data_reduction_proxy::switches::kEnableDataReductionProxyLoFi);
+
+ content::ContextMenuParams params = CreateContextMenuParams(
+ GURL(), GURL("http://url.com/image.png"),
+ blink::WebContextMenuData::MediaTypeImage);
+ params.image_was_fetched_lo_fi = true;
+
+ scoped_ptr<TestRenderViewContextMenu> menu(CreateContextMenu(params));
+
+ ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_RELOAD_ORIGINAL_IMAGE));
+}
+
IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, DataSaverOpenOrigImageInNewTab) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
command_line->AppendSwitch(
data_reduction_proxy::switches::kEnableDataReductionProxy);
scoped_ptr<TestRenderViewContextMenu> menu(
- CreateContextMenu(GURL(), GURL("http://url.com/image.png"),
- blink::WebContextMenuData::MediaTypeImage));
+ CreateContextMenu(CreateContextMenuParams(
+ GURL(), GURL("http://url.com/image.png"),
+ blink::WebContextMenuData::MediaTypeImage)));
ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB));
ASSERT_TRUE(menu->IsItemPresent(
@@ -329,8 +355,9 @@ IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
data_reduction_proxy::switches::kEnableDataReductionProxy);
scoped_ptr<TestRenderViewContextMenu> menu(
- CreateContextMenu(GURL(), GURL("https://url.com/image.png"),
- blink::WebContextMenuData::MediaTypeImage));
+ CreateContextMenu(CreateContextMenuParams(
+ GURL(), GURL("https://url.com/image.png"),
+ blink::WebContextMenuData::MediaTypeImage)));
ASSERT_FALSE(
menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB));
@@ -339,8 +366,9 @@ IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, OpenImageInNewTab) {
scoped_ptr<TestRenderViewContextMenu> menu(
- CreateContextMenu(GURL(), GURL("http://url.com/image.png"),
- blink::WebContextMenuData::MediaTypeImage));
+ CreateContextMenu(CreateContextMenuParams(
+ GURL(), GURL("http://url.com/image.png"),
+ blink::WebContextMenuData::MediaTypeImage)));
ASSERT_FALSE(
menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB));
ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB));
@@ -525,4 +553,128 @@ IN_PROC_BROWSER_TEST_F(SearchByImageBrowserTest, ImageSearchWithCorruptImage) {
EXPECT_EQ(ThumbnailResponseWatcher::THUMBNAIL_RECEIVED, watcher.Wait());
}
+class LoadImageRequestInterceptor : public net::URLRequestInterceptor {
+ public:
+ LoadImageRequestInterceptor() : num_requests_(0),
+ requests_to_wait_for_(-1),
+ weak_factory_(this) {
+ }
+
+ ~LoadImageRequestInterceptor() override {}
+
+ // net::URLRequestInterceptor implementation
+ net::URLRequestJob* MaybeInterceptRequest(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) const override {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
Lei Zhang 2015/05/11 20:16:53 Use DCHECK_CURRENTLY_ON()
megjablon 2015/05/11 22:58:40 Done.
+ EXPECT_TRUE(request->load_flags() & net::LOAD_BYPASS_CACHE);
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI, FROM_HERE,
+ base::Bind(&LoadImageRequestInterceptor::RequestCreated,
+ weak_factory_.GetWeakPtr()));
+ return nullptr;
+ }
+
+ void WaitForRequests(int requests_to_wait_for) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ DCHECK_EQ(-1, requests_to_wait_for_);
+ DCHECK(!run_loop_);
+
+ if (num_requests_ >= requests_to_wait_for)
+ return;
+
+ requests_to_wait_for_ = requests_to_wait_for;
+ run_loop_.reset(new base::RunLoop());
+ run_loop_->Run();
+ run_loop_.reset();
+ requests_to_wait_for_ = -1;
+ EXPECT_EQ(num_requests_, requests_to_wait_for);
+ }
+
+ // It is up to the caller to wait until all relevant requests has been
+ // created, either through calling WaitForRequests or some other manner,
+ // before calling this method.
+ int num_requests() const {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ return num_requests_;
+ }
+
+ private:
+ void RequestCreated() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+
+ num_requests_++;
+ if (num_requests_ == requests_to_wait_for_)
+ run_loop_->Quit();
+ }
+
+ // These are only used on the UI thread.
+ int num_requests_;
+ int requests_to_wait_for_;
+ scoped_ptr<base::RunLoop> run_loop_;
+
+ // This prevents any risk of flake if any test doesn't wait for a request
+ // it sent. Mutable so it can be accessed from a const function.
+ mutable base::WeakPtrFactory<LoadImageRequestInterceptor> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(LoadImageRequestInterceptor);
+};
+
+class LoadImageBrowserTest : public InProcessBrowserTest {
+ protected:
+ void SetupAndLoadImagePage(const std::string& image_path) {
+ // Go to a page with an image in it. The test server doesn't serve the image
+ // with the right MIME type, so use a data URL to make a page containing it.
+ GURL image_url(test_server()->GetURL(image_path));
+ GURL page("data:text/html,<img src='" + image_url.spec() + "'>");
+ ui_test_utils::NavigateToURL(browser(), page);
+ }
+
+ void AddLoadImageInterceptor(const std::string& image_path) {
+ interceptor_ = new LoadImageRequestInterceptor();
+ scoped_ptr<net::URLRequestInterceptor> owned_interceptor(interceptor_);
+ // Ownership of the |interceptor_| is passed to an object the IO thread, but
+ // a pointer is kept in the test fixture. As soon as anything calls
+ // URLRequestFilter::ClearHandlers(), |interceptor_| can become invalid.
Lei Zhang 2015/05/11 20:16:53 I realized this is copied over from another test,
megjablon 2015/05/11 22:58:40 Looks like ClearHandlers is only called by tests a
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO, FROM_HERE,
+ base::Bind(&LoadImageBrowserTest::AddInterceptorForURL,
+ base::Unretained(this),
+ GURL(test_server()->GetURL(image_path).spec()),
+ base::Passed(&owned_interceptor)));
+ }
+
+ void AttemptImageLoad() {
+ // Right-click where the image should be.
+ // |menu_observer_| will cause the load-image menu item to be clicked.
+ menu_observer_.reset(new ContextMenuNotificationObserver(
+ IDC_CONTENT_CONTEXT_RELOAD_ORIGINAL_IMAGE));
+ content::WebContents* tab =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ content::SimulateMouseClickAt(tab, 0, blink::WebMouseEvent::ButtonRight,
+ gfx::Point(15, 15));
+ }
+
+ void AddInterceptorForURL(
+ const GURL& url, scoped_ptr<net::URLRequestInterceptor> handler) {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+ net::URLRequestFilter::GetInstance()->AddUrlInterceptor(
+ url, handler.Pass());
+ }
+
+ LoadImageRequestInterceptor* interceptor_;
+
+ private:
+ scoped_ptr<ContextMenuNotificationObserver> menu_observer_;
+};
+
+IN_PROC_BROWSER_TEST_F(LoadImageBrowserTest, LoadImage) {
+ static const char kValidImage[] = "files/load_image/image.png";
+ SetupAndLoadImagePage(kValidImage);
+ AddLoadImageInterceptor(kValidImage);
+ AttemptImageLoad();
+ interceptor_->WaitForRequests(1);
+ EXPECT_EQ(1, interceptor_->num_requests());
+}
+
} // namespace

Powered by Google App Engine
This is Rietveld 408576698