Skip to content

Commit

Permalink
Remove ProtocolFactory/Interceptor uses in GViewRequestInterceptor.
Browse files Browse the repository at this point in the history
Gets rid of more use of net/ globals, replacing with URLRequestJobFactory uses. Helps make net/ more thread-compatible.

BUG=81979
TEST=none

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=86802

Review URL: http://codereview.chromium.org/7019030

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86804 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
willchan@chromium.org committed May 26, 2011
1 parent abc2056 commit a1f7bba
Show file tree
Hide file tree
Showing 9 changed files with 152 additions and 74 deletions.
28 changes: 13 additions & 15 deletions chrome/browser/chromeos/gview_request_interceptor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@
#include "chrome/browser/chromeos/gview_request_interceptor.h"

#include "base/file_path.h"
#include "base/memory/singleton.h"
#include "base/path_service.h"
#include "chrome/common/chrome_paths.h"
#include "googleurl/src/gurl.h"
#include "net/base/escape.h"
#include "net/base/load_flags.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_job.h"
#include "net/url_request/url_request_redirect_job.h"
#include "webkit/glue/plugins/plugin_list.h"

Expand All @@ -21,37 +19,41 @@ namespace chromeos {
// The PDF mime type is treated special if the browser has a built-in
// PDF viewer plug-in installed - we want to intercept only if we're
// told to.
static const char* const kPdfMimeType = "application/pdf";
static const char kPdfMimeType[] = "application/pdf";

// This is the list of mime types currently supported by the Google
// Document Viewer.
static const char* const supported_mime_type_list[] = {
static const char* const kSupportedMimeTypeList[] = {
kPdfMimeType,
"application/vnd.ms-powerpoint"
};

static const char* const kGViewUrlPrefix = "http://docs.google.com/gview?url=";
static const char kGViewUrlPrefix[] = "http://docs.google.com/gview?url=";

GViewRequestInterceptor::GViewRequestInterceptor() {
net::URLRequest::RegisterRequestInterceptor(this);
for (size_t i = 0; i < arraysize(supported_mime_type_list); ++i) {
supported_mime_types_.insert(supported_mime_type_list[i]);
for (size_t i = 0; i < arraysize(kSupportedMimeTypeList); ++i) {
supported_mime_types_.insert(kSupportedMimeTypeList[i]);
}
}

GViewRequestInterceptor::~GViewRequestInterceptor() {
net::URLRequest::UnregisterRequestInterceptor(this);
}

net::URLRequestJob* GViewRequestInterceptor::MaybeIntercept(
net::URLRequest* request) {
net::URLRequest* request) const {
// Don't attempt to intercept here as we want to wait until the mime
// type is fully determined.
return NULL;
}

net::URLRequestJob* GViewRequestInterceptor::MaybeInterceptRedirect(
const GURL& location,
net::URLRequest* request) const {
return NULL;
}

net::URLRequestJob* GViewRequestInterceptor::MaybeInterceptResponse(
net::URLRequest* request) {
net::URLRequest* request) const {
// Do not intercept this request if it is a download.
if (request->load_flags() & net::LOAD_IS_DOWNLOAD) {
return NULL;
Expand Down Expand Up @@ -81,8 +83,4 @@ net::URLRequestJob* GViewRequestInterceptor::MaybeInterceptResponse(
return NULL;
}

GViewRequestInterceptor* GViewRequestInterceptor::GetInstance() {
return Singleton<GViewRequestInterceptor>::get();
}

} // namespace chromeos
29 changes: 14 additions & 15 deletions chrome/browser/chromeos/gview_request_interceptor.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Expand All @@ -8,9 +8,7 @@

#include <string>
#include "base/hash_tables.h"
#include "net/url_request/url_request.h"

template <typename T> struct DefaultSingletonTraits;
#include "net/url_request/url_request_job_factory.h"

namespace chromeos {

Expand All @@ -20,26 +18,27 @@ namespace chromeos {
// document types (such as PDF) and redirect the request to the Google
// Document Viewer, including the document's original URL as a
// parameter.
class GViewRequestInterceptor : public net::URLRequest::Interceptor {
class GViewRequestInterceptor : public net::URLRequestJobFactory::Interceptor {
public:
GViewRequestInterceptor();
virtual ~GViewRequestInterceptor();

// Always returns NULL because we don't want to attempt a redirect
// before seeing the detected mime type of the request.
virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request);
virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request) const;

// Always returns NULL.
virtual net::URLRequestJob* MaybeInterceptRedirect(
const GURL& location,
net::URLRequest* request) const;

// Determines if the requested document can be viewed by the Google
// Document Viewer. If it can, returns a net::URLRequestJob that
// redirects the browser to the view URL.
virtual net::URLRequestJob* MaybeInterceptResponse(net::URLRequest* request);

// Singleton accessor.
static GViewRequestInterceptor* GetInstance();
virtual net::URLRequestJob* MaybeInterceptResponse(
net::URLRequest* request) const;

private:
friend struct DefaultSingletonTraits<GViewRequestInterceptor>;

GViewRequestInterceptor();
virtual ~GViewRequestInterceptor();

// The list of supported mime types.
base::hash_set<std::string> supported_mime_types_;
};
Expand Down
42 changes: 28 additions & 14 deletions chrome/browser/chromeos/gview_request_interceptor_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
#include "net/base/load_flags.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_job.h"
#include "net/url_request/url_request_job_factory.h"
#include "net/url_request/url_request_test_job.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/glue/plugins/plugin_list.h"

namespace chromeos {

namespace {

class GViewURLRequestTestJob : public net::URLRequestTestJob {
public:
explicit GViewURLRequestTestJob(net::URLRequest* request)
Expand Down Expand Up @@ -47,23 +50,25 @@ class GViewURLRequestTestJob : public net::URLRequestTestJob {
~GViewURLRequestTestJob() {}
};

class GViewRequestInterceptorTest : public testing::Test {
class GViewRequestProtocolFactory
: public net::URLRequestJobFactory::ProtocolHandler {
public:
virtual void SetUp() {
net::URLRequest::RegisterProtocolFactory("http",
&GViewRequestInterceptorTest::Factory);
interceptor_ = GViewRequestInterceptor::GetInstance();
ASSERT_TRUE(PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path_));
}
GViewRequestProtocolFactory() {}
virtual ~GViewRequestProtocolFactory() {}

virtual void TearDown() {
net::URLRequest::RegisterProtocolFactory("http", NULL);
message_loop_.RunAllPending();
virtual net::URLRequestJob* MaybeCreateJob(net::URLRequest* request) const {
return new GViewURLRequestTestJob(request);
}
};

static net::URLRequestJob* Factory(net::URLRequest* request,
const std::string& scheme) {
return new GViewURLRequestTestJob(request);
class GViewRequestInterceptorTest : public testing::Test {
public:
virtual void SetUp() {
job_factory_.SetProtocolHandler("http", new GViewRequestProtocolFactory);
job_factory_.AddInterceptor(new GViewRequestInterceptor);
request_context_ = new TestURLRequestContext;
request_context_->set_job_factory(&job_factory_);
ASSERT_TRUE(PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path_));
}

void RegisterPDFPlugin() {
Expand Down Expand Up @@ -102,13 +107,15 @@ class GViewRequestInterceptorTest : public testing::Test {

protected:
MessageLoopForIO message_loop_;
net::URLRequestJobFactory job_factory_;
scoped_refptr<TestURLRequestContext> request_context_;
TestDelegate test_delegate_;
net::URLRequest::Interceptor* interceptor_;
FilePath pdf_path_;
};

TEST_F(GViewRequestInterceptorTest, DoNotInterceptHtml) {
net::URLRequest request(GURL("http://foo.com/index.html"), &test_delegate_);
request.set_context(request_context_);
request.Start();
MessageLoop::current()->Run();
EXPECT_EQ(0, test_delegate_.received_redirect_count());
Expand All @@ -117,6 +124,7 @@ TEST_F(GViewRequestInterceptorTest, DoNotInterceptHtml) {

TEST_F(GViewRequestInterceptorTest, DoNotInterceptDownload) {
net::URLRequest request(GURL("http://foo.com/file.pdf"), &test_delegate_);
request.set_context(request_context_);
request.set_load_flags(net::LOAD_IS_DOWNLOAD);
request.Start();
MessageLoop::current()->Run();
Expand All @@ -135,6 +143,7 @@ TEST_F(GViewRequestInterceptorTest, DoNotInterceptPdfWhenEnabled) {
}

net::URLRequest request(GURL("http://foo.com/file.pdf"), &test_delegate_);
request.set_context(request_context_);
request.Start();
MessageLoop::current()->Run();
EXPECT_EQ(0, test_delegate_.received_redirect_count());
Expand All @@ -152,6 +161,7 @@ TEST_F(GViewRequestInterceptorTest, InterceptPdfWhenDisabled) {
}

net::URLRequest request(GURL("http://foo.com/file.pdf"), &test_delegate_);
request.set_context(request_context_);
request.Start();
MessageLoop::current()->Run();
EXPECT_EQ(1, test_delegate_.received_redirect_count());
Expand All @@ -165,6 +175,7 @@ TEST_F(GViewRequestInterceptorTest, InterceptPdfWithNoPlugin) {
SetPDFPluginLoadedState(false, &enabled);

net::URLRequest request(GURL("http://foo.com/file.pdf"), &test_delegate_);
request.set_context(request_context_);
request.Start();
MessageLoop::current()->Run();
EXPECT_EQ(1, test_delegate_.received_redirect_count());
Expand All @@ -174,11 +185,14 @@ TEST_F(GViewRequestInterceptorTest, InterceptPdfWithNoPlugin) {

TEST_F(GViewRequestInterceptorTest, InterceptPowerpoint) {
net::URLRequest request(GURL("http://foo.com/file.ppt"), &test_delegate_);
request.set_context(request_context_);
request.Start();
MessageLoop::current()->Run();
EXPECT_EQ(1, test_delegate_.received_redirect_count());
EXPECT_EQ(GURL("http://docs.google.com/gview?url=http%3A//foo.com/file.ppt"),
request.url());
}

} // namespace

} // namespace chromeos
11 changes: 11 additions & 0 deletions chrome/browser/profiles/profile_io_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@
#include "webkit/database/database_tracker.h"
#include "webkit/quota/quota_manager.h"

#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/gview_request_interceptor.h"
#endif // defined(OS_CHROMEOS)

namespace {

// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -457,6 +461,13 @@ void ProfileIOData::LazyInitialize() const {
profile_params_->file_system_context,
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)));
DCHECK(set_protocol);
#if defined(OS_CHROMEOS)
// Install the GView request interceptor that will redirect requests
// of compatible documents (PDF, etc) to the GView document viewer.
const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
if (parsed_command_line.HasSwitch(switches::kEnableGView))
job_factory_->AddInterceptor(new chromeos::GViewRequestInterceptor);
#endif // defined(OS_CHROMEOS)

// Take ownership over these parameters.
database_tracker_ = profile_params_->database_tracker;
Expand Down
6 changes: 0 additions & 6 deletions chrome/browser/ui/browser_init.cc
Original file line number Diff line number Diff line change
Expand Up @@ -555,12 +555,6 @@ bool BrowserInit::LaunchBrowser(const CommandLine& command_line,
// of what window has focus.
chromeos::WmMessageListener::GetInstance();

// Install the GView request interceptor that will redirect requests
// of compatible documents (PDF, etc) to the GView document viewer.
const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
if (parsed_command_line.HasSwitch(switches::kEnableGView)) {
chromeos::GViewRequestInterceptor::GetInstance();
}
if (process_startup) {
// This observer is a singleton. It is never deleted but the pointer is kept
// in a static so that it isn't reported as a leak.
Expand Down
33 changes: 33 additions & 0 deletions net/url_request/url_request_job_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,39 @@ URLRequestJob* URLRequestJobFactory::MaybeCreateJobWithProtocolHandler(
return it->second->MaybeCreateJob(request);
}

URLRequestJob* URLRequestJobFactory::MaybeInterceptRedirect(
const GURL& location,
URLRequest* request) const {
DCHECK(CalledOnValidThread());
URLRequestJob* job = NULL;

if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) {
InterceptorList::const_iterator i;
for (i = interceptors_.begin(); i != interceptors_.end(); ++i) {
job = (*i)->MaybeInterceptRedirect(location, request);
if (job)
return job;
}
}
return NULL;
}

URLRequestJob* URLRequestJobFactory::MaybeInterceptResponse(
URLRequest* request) const {
DCHECK(CalledOnValidThread());
URLRequestJob* job = NULL;

if (!(request->load_flags() & LOAD_DISABLE_INTERCEPT)) {
InterceptorList::const_iterator i;
for (i = interceptors_.begin(); i != interceptors_.end(); ++i) {
job = (*i)->MaybeInterceptResponse(request);
if (job)
return job;
}
}
return NULL;
}

bool URLRequestJobFactory::IsHandledProtocol(const std::string& scheme) const {
DCHECK(CalledOnValidThread());
InterceptorList::const_iterator i;
Expand Down
5 changes: 5 additions & 0 deletions net/url_request/url_request_job_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ class NET_TEST URLRequestJobFactory
URLRequestJob* MaybeCreateJobWithProtocolHandler(const std::string& scheme,
URLRequest* request) const;

URLRequestJob* MaybeInterceptRedirect(const GURL& location,
URLRequest* request) const;

URLRequestJob* MaybeInterceptResponse(URLRequest* request) const;

bool IsHandledProtocol(const std::string& scheme) const;

bool IsHandledURL(const GURL& url) const;
Expand Down
Loading

0 comments on commit a1f7bba

Please sign in to comment.