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

Side by Side Diff: trunk/src/chrome/renderer/net/net_error_helper.cc

Issue 235883010: Revert 262846, as the revert has now been merged to M35. (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/net/net_error_helper.h" 5 #include "chrome/renderer/net/net_error_helper.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/i18n/rtl.h"
10 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
11 #include "base/metrics/histogram.h" 12 #include "base/metrics/histogram.h"
12 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
13 #include "base/values.h" 14 #include "base/values.h"
14 #include "chrome/common/chrome_switches.h" 15 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/localized_error.h" 16 #include "chrome/common/localized_error.h"
16 #include "chrome/common/net/net_error_info.h" 17 #include "chrome/common/net/net_error_info.h"
17 #include "chrome/common/render_messages.h" 18 #include "chrome/common/render_messages.h"
18 #include "chrome/renderer/net/error_cache_load.h" 19 #include "chrome/renderer/net/error_cache_load.h"
19 #include "content/public/common/content_client.h" 20 #include "content/public/common/content_client.h"
(...skipping 21 matching lines...) Expand all
41 using base::JSONWriter; 42 using base::JSONWriter;
42 using chrome_common_net::DnsProbeStatus; 43 using chrome_common_net::DnsProbeStatus;
43 using chrome_common_net::DnsProbeStatusToString; 44 using chrome_common_net::DnsProbeStatusToString;
44 using content::RenderFrame; 45 using content::RenderFrame;
45 using content::RenderFrameObserver; 46 using content::RenderFrameObserver;
46 using content::RenderThread; 47 using content::RenderThread;
47 using content::kUnreachableWebDataURL; 48 using content::kUnreachableWebDataURL;
48 49
49 namespace { 50 namespace {
50 51
51 // Number of seconds to wait for the alternate error page server. If it takes 52 // Number of seconds to wait for the navigation correction service to return
52 // too long, just use the local error page. 53 // suggestions. If it takes too long, just use the local error page.
53 static const int kAlterErrorPageFetchTimeoutSec = 3000; 54 static const int kNavigationCorrectionFetchTimeoutSec = 3;
54 55
55 NetErrorHelperCore::PageType GetLoadingPageType(const blink::WebFrame* frame) { 56 NetErrorHelperCore::PageType GetLoadingPageType(const blink::WebFrame* frame) {
56 GURL url = frame->provisionalDataSource()->request().url(); 57 GURL url = frame->provisionalDataSource()->request().url();
57 if (!url.is_valid() || url.spec() != kUnreachableWebDataURL) 58 if (!url.is_valid() || url.spec() != kUnreachableWebDataURL)
58 return NetErrorHelperCore::NON_ERROR_PAGE; 59 return NetErrorHelperCore::NON_ERROR_PAGE;
59 return NetErrorHelperCore::ERROR_PAGE; 60 return NetErrorHelperCore::ERROR_PAGE;
60 } 61 }
61 62
62 NetErrorHelperCore::FrameType GetFrameType(const blink::WebFrame* frame) { 63 NetErrorHelperCore::FrameType GetFrameType(const blink::WebFrame* frame) {
63 if (!frame->parent()) 64 if (!frame->parent())
64 return NetErrorHelperCore::MAIN_FRAME; 65 return NetErrorHelperCore::MAIN_FRAME;
65 return NetErrorHelperCore::SUB_FRAME; 66 return NetErrorHelperCore::SUB_FRAME;
66 } 67 }
67 68
69 // Copied from localized_error.cc.
70 // TODO(mmenke): Share code?
71 bool LocaleIsRTL() {
72 #if defined(TOOLKIT_GTK)
73 // base::i18n::IsRTL() uses the GTK text direction, which doesn't work within
74 // the renderer sandbox.
75 return base::i18n::ICUIsRTL();
76 #else
77 return base::i18n::IsRTL();
78 #endif
79 }
80
68 } // namespace 81 } // namespace
69 82
70 NetErrorHelper::NetErrorHelper(RenderFrame* render_view) 83 NetErrorHelper::NetErrorHelper(RenderFrame* render_view)
71 : RenderFrameObserver(render_view), 84 : RenderFrameObserver(render_view),
72 content::RenderFrameObserverTracker<NetErrorHelper>(render_view), 85 content::RenderFrameObserverTracker<NetErrorHelper>(render_view),
73 core_(this) { 86 core_(this) {
74 RenderThread::Get()->AddObserver(this); 87 RenderThread::Get()->AddObserver(this);
75 CommandLine* command_line = CommandLine::ForCurrentProcess(); 88 CommandLine* command_line = CommandLine::ForCurrentProcess();
76 bool auto_reload_enabled = 89 bool auto_reload_enabled =
77 command_line->HasSwitch(switches::kEnableOfflineAutoReload); 90 command_line->HasSwitch(switches::kEnableOfflineAutoReload);
(...skipping 21 matching lines...) Expand all
99 112
100 void NetErrorHelper::OnStop() { 113 void NetErrorHelper::OnStop() {
101 core_.OnStop(); 114 core_.OnStop();
102 } 115 }
103 116
104 bool NetErrorHelper::OnMessageReceived(const IPC::Message& message) { 117 bool NetErrorHelper::OnMessageReceived(const IPC::Message& message) {
105 bool handled = true; 118 bool handled = true;
106 119
107 IPC_BEGIN_MESSAGE_MAP(NetErrorHelper, message) 120 IPC_BEGIN_MESSAGE_MAP(NetErrorHelper, message)
108 IPC_MESSAGE_HANDLER(ChromeViewMsg_NetErrorInfo, OnNetErrorInfo) 121 IPC_MESSAGE_HANDLER(ChromeViewMsg_NetErrorInfo, OnNetErrorInfo)
109 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAltErrorPageURL, OnSetAltErrorPageURL); 122 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetNavigationCorrectionInfo,
123 OnSetNavigationCorrectionInfo);
110 IPC_MESSAGE_UNHANDLED(handled = false) 124 IPC_MESSAGE_UNHANDLED(handled = false)
111 IPC_END_MESSAGE_MAP() 125 IPC_END_MESSAGE_MAP()
112 126
113 return handled; 127 return handled;
114 } 128 }
115 129
116 void NetErrorHelper::NetworkStateChanged(bool enabled) { 130 void NetErrorHelper::NetworkStateChanged(bool enabled) {
117 core_.NetworkStateChanged(enabled); 131 core_.NetworkStateChanged(enabled);
118 } 132 }
119 133
120 void NetErrorHelper::GetErrorHTML( 134 void NetErrorHelper::GetErrorHTML(
121 blink::WebFrame* frame, 135 blink::WebFrame* frame,
122 const blink::WebURLError& error, 136 const blink::WebURLError& error,
123 bool is_failed_post, 137 bool is_failed_post,
124 std::string* error_html) { 138 std::string* error_html) {
125 core_.GetErrorHTML(GetFrameType(frame), error, is_failed_post, error_html); 139 core_.GetErrorHTML(GetFrameType(frame), error, is_failed_post, error_html);
126 } 140 }
127 141
128 bool NetErrorHelper::ShouldSuppressErrorPage(blink::WebFrame* frame, 142 bool NetErrorHelper::ShouldSuppressErrorPage(blink::WebFrame* frame,
129 const GURL& url) { 143 const GURL& url) {
130 return core_.ShouldSuppressErrorPage(GetFrameType(frame), url); 144 return core_.ShouldSuppressErrorPage(GetFrameType(frame), url);
131 } 145 }
132 146
133 void NetErrorHelper::GenerateLocalizedErrorPage(const blink::WebURLError& error, 147 void NetErrorHelper::GenerateLocalizedErrorPage(
134 bool is_failed_post, 148 const blink::WebURLError& error,
135 std::string* error_html) const { 149 bool is_failed_post,
150 scoped_ptr<LocalizedError::ErrorPageParams> params,
151 std::string* error_html) const {
136 error_html->clear(); 152 error_html->clear();
137 153
138 int resource_id = IDR_NET_ERROR_HTML; 154 int resource_id = IDR_NET_ERROR_HTML;
139 const base::StringPiece template_html( 155 const base::StringPiece template_html(
140 ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id)); 156 ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id));
141 if (template_html.empty()) { 157 if (template_html.empty()) {
142 NOTREACHED() << "unable to load template."; 158 NOTREACHED() << "unable to load template.";
143 } else { 159 } else {
144 base::DictionaryValue error_strings; 160 base::DictionaryValue error_strings;
145 LocalizedError::GetStrings(error.reason, error.domain.utf8(), 161 LocalizedError::GetStrings(error.reason, error.domain.utf8(),
146 error.unreachableURL, is_failed_post, 162 error.unreachableURL, is_failed_post,
147 error.staleCopyInCache, 163 error.staleCopyInCache,
148 RenderThread::Get()->GetLocale(), 164 RenderThread::Get()->GetLocale(),
149 render_frame()->GetRenderView()-> 165 render_frame()->GetRenderView()->
150 GetAcceptLanguages(), 166 GetAcceptLanguages(),
151 &error_strings); 167 params.Pass(), &error_strings);
152 // "t" is the id of the template's root node. 168 // "t" is the id of the template's root node.
153 *error_html = webui::GetTemplatesHtml(template_html, &error_strings, "t"); 169 *error_html = webui::GetTemplatesHtml(template_html, &error_strings, "t");
154 } 170 }
155 } 171 }
156 172
157 void NetErrorHelper::LoadErrorPageInMainFrame(const std::string& html, 173 void NetErrorHelper::LoadErrorPageInMainFrame(const std::string& html,
158 const GURL& failed_url) { 174 const GURL& failed_url) {
159 blink::WebView* web_view = render_frame()->GetRenderView()->GetWebView(); 175 blink::WebView* web_view = render_frame()->GetRenderView()->GetWebView();
160 if (!web_view) 176 if (!web_view)
161 return; 177 return;
162 blink::WebFrame* frame = web_view->mainFrame(); 178 blink::WebFrame* frame = web_view->mainFrame();
163 frame->loadHTMLString(html, GURL(kUnreachableWebDataURL), failed_url, true); 179 frame->loadHTMLString(html, GURL(kUnreachableWebDataURL), failed_url, true);
164 } 180 }
165 181
166 void NetErrorHelper::EnableStaleLoadBindings(const GURL& page_url) { 182 void NetErrorHelper::EnableStaleLoadBindings(const GURL& page_url) {
167 ErrorCacheLoad::Install(render_frame(), page_url); 183 ErrorCacheLoad::Install(render_frame(), page_url);
168 } 184 }
169 185
170 void NetErrorHelper::UpdateErrorPage(const blink::WebURLError& error, 186 void NetErrorHelper::UpdateErrorPage(const blink::WebURLError& error,
171 bool is_failed_post) { 187 bool is_failed_post) {
172 base::DictionaryValue error_strings; 188 base::DictionaryValue error_strings;
173 LocalizedError::GetStrings(error.reason, 189 LocalizedError::GetStrings(error.reason,
174 error.domain.utf8(), 190 error.domain.utf8(),
175 error.unreachableURL, 191 error.unreachableURL,
176 is_failed_post, 192 is_failed_post,
177 error.staleCopyInCache, 193 error.staleCopyInCache,
178 RenderThread::Get()->GetLocale(), 194 RenderThread::Get()->GetLocale(),
179 render_frame()->GetRenderView()-> 195 render_frame()->GetRenderView()->
180 GetAcceptLanguages(), 196 GetAcceptLanguages(),
197 scoped_ptr<LocalizedError::ErrorPageParams>(),
181 &error_strings); 198 &error_strings);
182 199
183 std::string json; 200 std::string json;
184 JSONWriter::Write(&error_strings, &json); 201 JSONWriter::Write(&error_strings, &json);
185 202
186 std::string js = "if (window.updateForDnsProbe) " 203 std::string js = "if (window.updateForDnsProbe) "
187 "updateForDnsProbe(" + json + ");"; 204 "updateForDnsProbe(" + json + ");";
188 base::string16 js16; 205 base::string16 js16;
189 if (!base::UTF8ToUTF16(js.c_str(), js.length(), &js16)) { 206 if (!base::UTF8ToUTF16(js.c_str(), js.length(), &js16)) {
190 NOTREACHED(); 207 NOTREACHED();
191 return; 208 return;
192 } 209 }
193 210
194 render_frame()->ExecuteJavaScript(js16); 211 render_frame()->ExecuteJavaScript(js16);
195 } 212 }
196 213
197 void NetErrorHelper::FetchErrorPage(const GURL& url) { 214 void NetErrorHelper::FetchNavigationCorrections(
198 DCHECK(!alt_error_page_fetcher_.get()); 215 const GURL& navigation_correction_url,
216 const std::string& navigation_correction_request_body) {
217 DCHECK(!correction_fetcher_.get());
199 218
200 blink::WebView* web_view = render_frame()->GetRenderView()->GetWebView(); 219 blink::WebView* web_view = render_frame()->GetRenderView()->GetWebView();
201 if (!web_view) 220 if (!web_view)
202 return; 221 return;
203 blink::WebFrame* frame = web_view->mainFrame(); 222 blink::WebFrame* frame = web_view->mainFrame();
204 223
205 alt_error_page_fetcher_.reset(content::ResourceFetcher::Create(url)); 224 correction_fetcher_.reset(
206 225 content::ResourceFetcher::Create(navigation_correction_url));
207 alt_error_page_fetcher_->Start( 226 correction_fetcher_->SetMethod("POST");
227 correction_fetcher_->SetBody(navigation_correction_request_body);
228 correction_fetcher_->SetHeader("Content-Type", "application/json");
229 correction_fetcher_->Start(
208 frame, blink::WebURLRequest::TargetIsMainFrame, 230 frame, blink::WebURLRequest::TargetIsMainFrame,
209 base::Bind(&NetErrorHelper::OnAlternateErrorPageRetrieved, 231 base::Bind(&NetErrorHelper::OnNavigationCorrectionsFetched,
210 base::Unretained(this))); 232 base::Unretained(this)));
211 233
212 alt_error_page_fetcher_->SetTimeout( 234 correction_fetcher_->SetTimeout(
213 base::TimeDelta::FromSeconds(kAlterErrorPageFetchTimeoutSec)); 235 base::TimeDelta::FromSeconds(kNavigationCorrectionFetchTimeoutSec));
214 } 236 }
215 237
216 void NetErrorHelper::CancelFetchErrorPage() { 238 void NetErrorHelper::CancelFetchNavigationCorrections() {
217 alt_error_page_fetcher_.reset(); 239 correction_fetcher_.reset();
218 } 240 }
219 241
220 void NetErrorHelper::ReloadPage() { 242 void NetErrorHelper::ReloadPage() {
221 render_frame()->GetWebFrame()->reload(false); 243 render_frame()->GetWebFrame()->reload(false);
222 } 244 }
223 245
224 void NetErrorHelper::OnNetErrorInfo(int status_num) { 246 void NetErrorHelper::OnNetErrorInfo(int status_num) {
225 DCHECK(status_num >= 0 && status_num < chrome_common_net::DNS_PROBE_MAX); 247 DCHECK(status_num >= 0 && status_num < chrome_common_net::DNS_PROBE_MAX);
226 248
227 DVLOG(1) << "Received status " << DnsProbeStatusToString(status_num); 249 DVLOG(1) << "Received status " << DnsProbeStatusToString(status_num);
228 250
229 core_.OnNetErrorInfo(static_cast<DnsProbeStatus>(status_num)); 251 core_.OnNetErrorInfo(static_cast<DnsProbeStatus>(status_num));
230 } 252 }
231 253
232 void NetErrorHelper::OnSetAltErrorPageURL(const GURL& alt_error_page_url) { 254 void NetErrorHelper::OnSetNavigationCorrectionInfo(
233 core_.set_alt_error_page_url(alt_error_page_url); 255 const GURL& navigation_correction_url,
256 const std::string& language,
257 const std::string& country_code,
258 const std::string& api_key,
259 const GURL& search_url) {
260 core_.OnSetNavigationCorrectionInfo(navigation_correction_url, language,
261 country_code, api_key, search_url);
234 } 262 }
235 263
236 void NetErrorHelper::OnAlternateErrorPageRetrieved( 264 void NetErrorHelper::OnNavigationCorrectionsFetched(
237 const blink::WebURLResponse& response, 265 const blink::WebURLResponse& response,
238 const std::string& data) { 266 const std::string& data) {
239 // The fetcher may only be deleted after |data| is passed to |core_|. Move 267 // The fetcher may only be deleted after |data| is passed to |core_|. Move
240 // it to a temporary to prevent any potential re-entrancy issues. 268 // it to a temporary to prevent any potential re-entrancy issues.
241 scoped_ptr<content::ResourceFetcher> fetcher( 269 scoped_ptr<content::ResourceFetcher> fetcher(
242 alt_error_page_fetcher_.release()); 270 correction_fetcher_.release());
243 if (!response.isNull() && response.httpStatusCode() == 200) { 271 if (!response.isNull() && response.httpStatusCode() == 200) {
244 core_.OnAlternateErrorPageFetched(data); 272 core_.OnNavigationCorrectionsFetched(
273 data, render_frame()->GetRenderView()->GetAcceptLanguages(),
274 LocaleIsRTL());
245 } else { 275 } else {
246 core_.OnAlternateErrorPageFetched(""); 276 core_.OnNavigationCorrectionsFetched(
277 "", render_frame()->GetRenderView()->GetAcceptLanguages(),
278 LocaleIsRTL());
247 } 279 }
248 } 280 }
OLDNEW
« no previous file with comments | « trunk/src/chrome/renderer/net/net_error_helper.h ('k') | trunk/src/chrome/renderer/net/net_error_helper_core.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698