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

Unified Diff: chrome/renderer/net/net_error_helper.cc

Issue 13270005: Display DNS probe results. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Round two. Created 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/net/net_error_helper.cc
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index 3e7b9ee92d81a7059f8a434b8c50d4e34762d372..39998e4967b0c778119d24e68231841aab32105b 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -4,10 +4,15 @@
#include "chrome/renderer/net/net_error_helper.h"
+#include <string>
+
+#include "base/json/json_writer.h"
+#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/common/localized_error.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/net/net_error_info.h"
+#include "chrome/common/net/net_error_tracker.h"
#include "content/public/common/content_client.h"
#include "content/public/common/url_constants.h"
#include "content/public/renderer/content_renderer_client.h"
@@ -24,7 +29,10 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
using base::DictionaryValue;
-using chrome_common_net::DnsProbeResult;
+using base::JSONWriter;
+using chrome_common_net::DnsProbeStatus;
+using chrome_common_net::DnsProbeStatusToString;
+using chrome_common_net::DnsProbesEnabledByFieldTrial;
using content::RenderThread;
using content::RenderView;
using content::RenderViewObserver;
@@ -42,9 +50,10 @@ bool IsErrorPage(const GURL& url) {
// Returns whether |net_error| is a DNS-related error (and therefore whether
// the tab helper should start a DNS probe after receiving it.)
-bool IsDnsError(int net_error) {
- return net_error == net::ERR_NAME_NOT_RESOLVED ||
- net_error == net::ERR_NAME_RESOLUTION_FAILED;
+bool IsDnsError(const WebKit::WebURLError& error) {
+ return std::string(error.domain.utf8()) == net::kErrorDomain &&
+ (error.reason == net::ERR_NAME_NOT_RESOLVED ||
+ error.reason == net::ERR_NAME_RESOLUTION_FAILED);
}
NetErrorTracker::FrameType GetFrameType(WebKit::WebFrame* frame) {
@@ -59,49 +68,18 @@ NetErrorTracker::PageType GetPageType(WebKit::WebFrame* frame) {
}
NetErrorTracker::ErrorType GetErrorType(const WebKit::WebURLError& error) {
- return IsDnsError(error.reason) ? NetErrorTracker::ERROR_DNS
- : NetErrorTracker::ERROR_OTHER;
-}
-
-// Converts a DNS probe result into a net error. Returns OK if the error page
-// should not be changed from the original DNS error.
-int DnsProbeResultToNetError(DnsProbeResult result) {
- switch (result) {
- case chrome_common_net::DNS_PROBE_UNKNOWN:
- return net::OK;
- case chrome_common_net::DNS_PROBE_NO_INTERNET:
- // TODO(ttuttle): This is not the same error as when NCN returns this;
- // ideally we should have two separate error codes for "no network" and
- // "network with no internet".
- return net::ERR_INTERNET_DISCONNECTED;
- case chrome_common_net::DNS_PROBE_BAD_CONFIG:
- // This is unspecific enough that we should still show the full DNS error
- // page.
- return net::OK;
- case chrome_common_net::DNS_PROBE_NXDOMAIN:
- return net::ERR_NAME_NOT_RESOLVED;
- default:
- NOTREACHED();
- return net::OK;
- }
-}
-
-WebKit::WebURLError NetErrorToWebURLError(int net_error) {
- WebKit::WebURLError error;
- error.domain = WebKit::WebString::fromUTF8(net::kErrorDomain);
- error.reason = net_error;
- return error;
+ return IsDnsError(error) ? NetErrorTracker::ERROR_DNS
+ : NetErrorTracker::ERROR_OTHER;
}
} // namespace
NetErrorHelper::NetErrorHelper(RenderView* render_view)
: RenderViewObserver(render_view),
- ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(base::Bind(
- &NetErrorHelper::TrackerCallback,
- base::Unretained(this)))),
- dns_error_page_state_(NetErrorTracker::DNS_ERROR_PAGE_NONE),
- updated_error_page_(false) {
+ state_(IDLE),
+ ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(
+ base::Bind(&NetErrorHelper::TrackerCallback,
+ base::Unretained(this)))) {
}
NetErrorHelper::~NetErrorHelper() {
@@ -114,6 +92,7 @@ void NetErrorHelper::DidStartProvisionalLoad(WebKit::WebFrame* frame) {
void NetErrorHelper::DidFailProvisionalLoad(WebKit::WebFrame* frame,
const WebKit::WebURLError& error) {
tracker_.OnFailProvisionalLoad(GetFrameType(frame), GetErrorType(error));
+ last_error_ = error;
}
void NetErrorHelper::DidCommitProvisionalLoad(WebKit::WebFrame* frame,
@@ -125,6 +104,17 @@ void NetErrorHelper::DidFinishLoad(WebKit::WebFrame* frame) {
tracker_.OnFinishLoad(GetFrameType(frame));
}
+void NetErrorHelper::TrackerCallback(
+ NetErrorTracker::DnsErrorPageState tracker_state) {
+ if (tracker_state == NetErrorTracker::DNS_ERROR_PAGE_LOADED)
+ state_ = AWAITING_INITIAL_IPC;
+ else
+ state_ = IDLE;
+
+ DVLOG(1) << "Renderer in tracker state " << tracker_state
+ << ", new state " << state_ << ".";
+}
+
bool NetErrorHelper::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
@@ -136,52 +126,110 @@ bool NetErrorHelper::OnMessageReceived(const IPC::Message& message) {
return handled;
}
-void NetErrorHelper::OnNetErrorInfo(int dns_probe_result) {
- DVLOG(1) << "Received DNS probe result " << dns_probe_result;
+bool NetErrorHelper::GetErrorStringsForDnsProbe(
+ const WebKit::WebURLError& error,
+ base::DictionaryValue* strings,
+ const std::string& locale) {
+ if (!IsDnsError(error))
+ return false;
+
+ if (!DnsProbesEnabledByFieldTrial()) {
+ DVLOG(1) << "Ignoring DNS error; probes disabled by field trial.";
+ return false;
+ }
+
+ // Get the strings for a fake "DNS probe possible" error
+ WebKit::WebURLError fake_error;
+ fake_error.domain = WebKit::WebString::fromUTF8(
+ chrome_common_net::kDnsProbeErrorDomain);
+ fake_error.reason = chrome_common_net::DNS_PROBE_POSSIBLE;
+ fake_error.unreachableURL = error.unreachableURL;
+ LocalizedError::GetStrings(fake_error, strings, locale);
+ return true;
+}
+
+void NetErrorHelper::OnNetErrorInfo(int status_num) {
+ if (status_num < 0 ||
+ status_num >= chrome_common_net::DNS_PROBE_MAX) {
+ LOG(WARNING) << "Ignoring NetErrorInfo: invalid status " << status_num;
+ NOTREACHED();
+ return;
+ }
+
+ DVLOG(1) << "Renderer received status "
+ << DnsProbeStatusToString(status_num);
+
+ DnsProbeStatus status = static_cast<DnsProbeStatus>(status_num);
+ bool is_finished = status >= chrome_common_net::DNS_PROBE_FINISHED_UNKNOWN;
- if (dns_probe_result < 0 ||
- dns_probe_result >= chrome_common_net::DNS_PROBE_MAX) {
- DLOG(WARNING) << "Ignoring DNS probe result: invalid result "
- << dns_probe_result;
+ if (status == chrome_common_net::DNS_PROBE_POSSIBLE) {
+ DLOG(WARNING) << "Ignoring NetErrorInfo: DNS_PROBE_POSSIBLE from browser.";
NOTREACHED();
return;
}
- if (dns_error_page_state_ != NetErrorTracker::DNS_ERROR_PAGE_LOADED) {
- DVLOG(1) << "Ignoring DNS probe result: not on DNS error page.";
+ if (state_ == IDLE) {
+ // Unexpected IPC in idle; the browser sent the status after the renderer
+ // started loading a new page but before the browser became aware of it.
+ DVLOG(1) << "Ignoring NetErrorInfo: in state IDLE";
return;
}
- if (updated_error_page_) {
- DVLOG(1) << "Ignoring DNS probe result: already updated error page.";
+ if (state_ == AWAITING_PROBE_RESULT && !is_finished) {
+ DLOG(WARNING) << "Ignoring NetErrorInfo: "
+ << "non-FINISHED status in state AWAITING_PROBE_RESULT.";
+ NOTREACHED();
return;
}
- UpdateErrorPage(static_cast<DnsProbeResult>(dns_probe_result));
- updated_error_page_ = true;
-}
+ if (status == chrome_common_net::DNS_PROBE_STARTED) {
+ DCHECK_EQ(AWAITING_INITIAL_IPC, state_);
+ state_ = AWAITING_PROBE_RESULT;
+ } else {
+ state_ = IDLE;
+ }
-void NetErrorHelper::TrackerCallback(
- NetErrorTracker::DnsErrorPageState state) {
- dns_error_page_state_ = state;
+ DVLOG(1) << "Renderer in new state " << state_ << ".";
- if (state == NetErrorTracker::DNS_ERROR_PAGE_LOADED)
- updated_error_page_ = false;
+ last_status_ = status;
mmenke 2013/04/10 16:56:58 Don't think last_status_ serves any purpose - can
Deprecated (see juliatuttle) 2013/04/10 23:42:32 Done.
+
+ UpdateErrorPage();
}
-void NetErrorHelper::UpdateErrorPage(DnsProbeResult dns_probe_result) {
- DVLOG(1) << "Updating error page with result " << dns_probe_result;
+WebKit::WebURLError NetErrorHelper::MakeUpdatedError() {
mmenke 2013/04/10 16:56:58 Doesn't always make a WebKitError. Suggest GetFin
mmenke 2013/04/10 16:56:58 This can be const.
Deprecated (see juliatuttle) 2013/04/10 23:42:32 GetUpdatedError(), since it's not necessarily the
Deprecated (see juliatuttle) 2013/04/10 23:42:32 Done.
+ // If a probe didn't run or wasn't conclusive, restore the original error.
+ if (last_status_ == chrome_common_net::DNS_PROBE_NOT_RUN
+ || last_status_ == chrome_common_net::DNS_PROBE_FINISHED_UNKNOWN)
mmenke 2013/04/10 16:56:58 nit: Put "||" on previous line.
mmenke 2013/04/10 16:56:58 nit: Use braces in if's where the condition uses
Deprecated (see juliatuttle) 2013/04/10 23:42:32 Done.
Deprecated (see juliatuttle) 2013/04/10 23:42:32 Done.
+ return last_error_;
- int net_error = DnsProbeResultToNetError(dns_probe_result);
- if (net_error == net::OK)
- return;
+ WebKit::WebURLError error;
+ error.domain = WebKit::WebString::fromUTF8(
+ chrome_common_net::kDnsProbeErrorDomain);
+ error.reason = last_status_;
+ error.unreachableURL = last_error_.unreachableURL;
- DVLOG(1) << "net error code is " << net_error;
+ return error;
+}
+void NetErrorHelper::UpdateErrorPage() {
DictionaryValue error_strings;
- LocalizedError::GetStrings(NetErrorToWebURLError(net_error),
+ LocalizedError::GetStrings(MakeUpdatedError(),
&error_strings,
RenderThread::Get()->GetLocale());
- // TODO(ttuttle): Update error page with error_strings.
+ std::string json;
+ JSONWriter::Write(&error_strings, &json);
+
+ std::string js = "updateForDnsProbe(" + json + ");";
+ string16 js16;
+ if (!UTF8ToUTF16(js.c_str(), js.length(), &js16)) {
+ NOTREACHED();
+ return;
+ }
+
+ DVLOG(1) << "Renderer updating error page.";
+ DVLOG(2) << "New strings: " << js;
+
+ string16 frame_xpath;
+ render_view()->EvaluateScript(frame_xpath, js16, 0, false);
}

Powered by Google App Engine
This is Rietveld 408576698