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

Side by Side Diff: content/browser/renderer_host/intercept_navigation_resource_throttle_impl.cc

Issue 10310124: Implement a ResourceThrottle for URL overriding in Chrome on Android. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: fixed chromeos build issue + rebase Created 8 years, 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/intercept_navigation_resource_throttle_i mpl.h"
6
7 #include "base/callback.h"
8 #include "content/public/browser/browser_thread.h"
9 #include "content/public/browser/child_process_security_policy.h"
10 #include "content/public/browser/render_view_host.h"
11 #include "content/public/browser/render_process_host.h"
12 #include "content/public/browser/resource_request_info.h"
13 #include "content/public/browser/resource_throttle_controller.h"
14 #include "content/public/browser/web_contents.h"
15 #include "content/public/browser/web_contents_delegate.h"
16 #include "content/public/common/referrer.h"
17 #include "net/url_request/url_request.h"
18
19 using content::BrowserThread;
20 using content::ChildProcessSecurityPolicy;
21 using content::InterceptNavigationResourceThrottle;
22 using content::Referrer;
23 using content::RenderViewHost;
24 using content::ResourceRequestInfo;
25 using content::WebContents;
26 using content::WebContentsDelegate;
27
28 namespace {
29
30 void CheckShouldIgnoreNavigationOnUIThread(
31 int render_process_id,
32 int render_view_id,
33 const GURL& url,
34 const Referrer& referrer,
35 bool is_content_initiated,
36 base::Callback<void(bool)> callback) {
37
38 RenderViewHost* rvh =
39 RenderViewHost::FromID(render_process_id, render_view_id);
40 WebContents* web_contents =
41 rvh ? WebContents::FromRenderViewHost(rvh) : NULL;
42 WebContentsDelegate* web_contents_delegate =
43 web_contents ? web_contents->GetDelegate() : NULL;
44
45 GURL validated_url(url);
46 RenderViewHost::FilterURL(
47 rvh->GetProcess()->GetID(),
48 false,
49 &validated_url);
50
51 bool should_ignore_navigation = false;
52 if (web_contents_delegate) {
53 should_ignore_navigation = web_contents_delegate->ShouldIgnoreNavigation(
54 web_contents, validated_url, referrer, is_content_initiated);
55 }
56
57 BrowserThread::PostTask(
58 BrowserThread::IO,
59 FROM_HERE,
60 base::Bind(callback, should_ignore_navigation));
61 }
62
63 } // namespace
64
65 ///////////////////////////////////////////////////////////////////////////////
66 // InterceptNavigationResourceThrottle, public:
67
68 // static
69 InterceptNavigationResourceThrottle*
70 InterceptNavigationResourceThrottle::Create(net::URLRequest* request) {
71 return new InterceptNavigationResourceThrottleImpl(request);
72 }
73
74 ///////////////////////////////////////////////////////////////////////////////
75
76 InterceptNavigationResourceThrottleImpl::
77 InterceptNavigationResourceThrottleImpl(net::URLRequest* request)
78 : request_(request),
79 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
80 }
81
82 InterceptNavigationResourceThrottleImpl::
83 ~InterceptNavigationResourceThrottleImpl() {
84 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
85 }
86
87 void InterceptNavigationResourceThrottleImpl::WillStartRequest(bool* defer) {
88 *defer = ShouldDeferRequestForURL(request_->url());
89 }
90
91 void InterceptNavigationResourceThrottleImpl::WillRedirectRequest(
92 const GURL& new_url,
93 bool* defer) {
94 *defer = ShouldDeferRequestForURL(new_url);
95 }
96
97 bool InterceptNavigationResourceThrottleImpl::ShouldDeferRequestForURL(
98 const GURL& url) {
99 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request_);
100 if (!info)
101 return false;
102
103 int render_process_id, render_view_id;
104 if (!info->GetAssociatedRenderView(&render_process_id, &render_view_id)) {
105 return false;
106 }
107
108 // This class should only be instantiated for top level frame requests.
109 DCHECK(info->IsMainFrame());
110
111 BrowserThread::PostTask(
112 BrowserThread::UI,
113 FROM_HERE,
114 base::Bind(
115 &CheckShouldIgnoreNavigationOnUIThread,
116 render_process_id,
117 render_view_id,
118 url,
119 Referrer(GURL(request_->referrer()), info->GetReferrerPolicy()),
120 info->HasUserGesture(),
121 base::Bind(
122 &InterceptNavigationResourceThrottleImpl::OnResultObtained,
123 weak_ptr_factory_.GetWeakPtr())));
124 return true;
joth 2012/06/13 22:32:49 maybe: // Defer request, while we wait for the UI
mkosiba (inactive) 2012/06/15 11:05:36 Done.
125 }
126
127 void InterceptNavigationResourceThrottleImpl::OnResultObtained(
128 bool should_ignore_navigation) {
129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
130
131 if (should_ignore_navigation) {
132 // TODO: Cancel() results in a CANCELLED status but what we really want is
joth 2012/06/13 22:32:49 TODO(mkosiba)
mkosiba (inactive) 2012/06/15 11:05:36 Done.
133 // a HANDLED_EXTERNALLY status.
134 controller()->Cancel();
135 } else {
136 controller()->Resume();
137 }
138 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698