diff options
author | ttuttle@chromium.org <ttuttle@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-14 22:35:24 +0000 |
---|---|---|
committer | ttuttle@chromium.org <ttuttle@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-14 22:35:24 +0000 |
commit | 93cccd87635c8d7af87b4dcc2e1d8c1078e39856 (patch) | |
tree | eea219601267add52c0b315eb3fa338ed80a6c3e | |
parent | c00e0b33bc019318ba8edf3b1b7edc90efa29fb3 (diff) | |
download | chromium_src-93cccd87635c8d7af87b4dcc2e1d8c1078e39856.zip chromium_src-93cccd87635c8d7af87b4dcc2e1d8c1078e39856.tar.gz chromium_src-93cccd87635c8d7af87b4dcc2e1d8c1078e39856.tar.bz2 |
Unify browser- and renderer- side logic for new DNS error pages
Create a new NetErrorTracker (TODO: better name?) that can be used on the browser and renderer side to watch the Start/Commit/Fail/Finish events and tell whether a tab or renderer is currently displaying a DNS error page.
This will be used immediately for the new NetErrorHelper (the renderer-side RenderViewObserver that receives the NetErrorInfo IPC from the browser-side NetErrorTabHelper); in a later CL, I'll convert NetErrorTabHelper to use it as well.
BUG=156415
Review URL: https://chromiumcodereview.appspot.com/12223098
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182556 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/chrome_common.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests_unit.gypi | 1 | ||||
-rw-r--r-- | chrome/common/net/net_error_tracker.cc | 66 | ||||
-rw-r--r-- | chrome/common/net/net_error_tracker.h | 66 | ||||
-rw-r--r-- | chrome/common/net/net_error_tracker_unittest.cc | 99 |
5 files changed, 234 insertions, 0 deletions
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi index 16ba699..4877e2d 100644 --- a/chrome/chrome_common.gypi +++ b/chrome/chrome_common.gypi @@ -608,6 +608,8 @@ 'target_name': 'common_net', 'type': 'static_library', 'sources': [ + 'common/net/net_error_tracker.cc', + 'common/net/net_error_tracker.h', 'common/net/net_resource_provider.cc', 'common/net/net_resource_provider.h', 'common/net/predictor_common.h', diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index a942574..3651b06 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi @@ -1565,6 +1565,7 @@ 'common/metrics/metrics_util_unittest.cc', 'common/metrics/variations/variations_util_unittest.cc', 'common/multi_process_lock_unittest.cc', + 'common/net/net_error_tracker_unittest.cc', 'common/net/x509_certificate_model_unittest.cc', 'common/pref_names_util_unittest.cc', 'common/service_process_util_unittest.cc', diff --git a/chrome/common/net/net_error_tracker.cc b/chrome/common/net/net_error_tracker.cc new file mode 100644 index 0000000..6cf69ca --- /dev/null +++ b/chrome/common/net/net_error_tracker.cc @@ -0,0 +1,66 @@ +// Copyright (c) 2013 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. + +#include "chrome/common/net/net_error_tracker.h" + +NetErrorTracker::NetErrorTracker(const Callback& callback) + : callback_(callback), + load_state_(LOAD_NONE), + load_type_(PAGE_NORMAL), + error_type_(ERROR_OTHER), + dns_error_page_state_(DNS_ERROR_PAGE_NONE) { +} + +NetErrorTracker::~NetErrorTracker() { +} + +void NetErrorTracker::OnStartProvisionalLoad(FrameType frame, PageType page) { + if (frame == FRAME_SUB) + return; + + load_state_ = LOAD_STARTED; + load_type_ = page; + + // TODO(ttuttle): Add support for aborts, then move this to OnCommit. + if (load_type_ == PAGE_NORMAL) + SetDnsErrorPageState(DNS_ERROR_PAGE_NONE); +} + +void NetErrorTracker::OnCommitProvisionalLoad(FrameType frame) { + if (frame == FRAME_SUB) + return; + + load_state_ = LOAD_COMMITTED; +} + +void NetErrorTracker::OnFailProvisionalLoad(FrameType frame, ErrorType error) { + if (frame == FRAME_SUB) + return; + + load_state_ = LOAD_FAILED; + + if (load_type_ == PAGE_NORMAL) { + error_type_ = error; + if (error_type_ == ERROR_DNS) + SetDnsErrorPageState(DNS_ERROR_PAGE_PENDING); + } +} + +void NetErrorTracker::OnFinishLoad(FrameType frame) { + if (frame == FRAME_SUB) + return; + + load_state_ = LOAD_FINISHED; + + if (load_type_ == PAGE_ERROR && error_type_ == ERROR_DNS) + SetDnsErrorPageState(DNS_ERROR_PAGE_LOADED); +} + +void NetErrorTracker::SetDnsErrorPageState(DnsErrorPageState state) { + if (state == dns_error_page_state_) + return; + + dns_error_page_state_ = state; + callback_.Run(state); +} diff --git a/chrome/common/net/net_error_tracker.h b/chrome/common/net/net_error_tracker.h new file mode 100644 index 0000000..530abcb --- /dev/null +++ b/chrome/common/net/net_error_tracker.h @@ -0,0 +1,66 @@ +// Copyright (c) 2013 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. + +#ifndef CHROME_COMMON_NET_NET_ERROR_TRACKER_H_ +#define CHROME_COMMON_NET_NET_ERROR_TRACKER_H_ + +#include "base/bind.h" + +class NetErrorTracker { + public: + enum FrameType { + FRAME_SUB, + FRAME_MAIN + }; + + enum PageType { + PAGE_NORMAL, + PAGE_ERROR + }; + + enum ErrorType { + ERROR_OTHER, + ERROR_DNS + }; + + enum DnsErrorPageState { + DNS_ERROR_PAGE_NONE, + DNS_ERROR_PAGE_PENDING, + DNS_ERROR_PAGE_LOADED + }; + + typedef base::Callback<void(DnsErrorPageState state)> Callback; + + explicit NetErrorTracker(const Callback& callback); + ~NetErrorTracker(); + + void OnStartProvisionalLoad(FrameType frame, PageType page); + void OnCommitProvisionalLoad(FrameType frame); + void OnFailProvisionalLoad(FrameType frame, ErrorType error); + void OnFinishLoad(FrameType frame); + + private: + enum LoadState { + LOAD_NONE, + LOAD_STARTED, + LOAD_COMMITTED, + LOAD_FAILED, + LOAD_FINISHED + }; + + void SetDnsErrorPageState(DnsErrorPageState state); + + Callback callback_; + + LoadState load_state_; + PageType load_type_; + + ErrorType error_type_; + + DnsErrorPageState dns_error_page_state_; + + DISALLOW_COPY_AND_ASSIGN(NetErrorTracker); +}; + +#endif // CHROME_COMMON_NET_NET_ERROR_TRACKER_H_ diff --git a/chrome/common/net/net_error_tracker_unittest.cc b/chrome/common/net/net_error_tracker_unittest.cc new file mode 100644 index 0000000..b54360e --- /dev/null +++ b/chrome/common/net/net_error_tracker_unittest.cc @@ -0,0 +1,99 @@ +// Copyright (c) 2013 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. + +#include "chrome/common/net/net_error_tracker.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +typedef NetErrorTracker::FrameType FrameType; +typedef NetErrorTracker::PageType PageType; +typedef NetErrorTracker::ErrorType ErrorType; + +const FrameType FRAME_SUB = NetErrorTracker::FRAME_SUB; +const FrameType FRAME_MAIN = NetErrorTracker::FRAME_MAIN; + +const PageType PAGE_NORMAL = NetErrorTracker::PAGE_NORMAL; +const PageType PAGE_ERROR = NetErrorTracker::PAGE_ERROR; + +const ErrorType ERROR_OTHER = NetErrorTracker::ERROR_OTHER; +const ErrorType ERROR_DNS = NetErrorTracker::ERROR_DNS; + +class NetErrorTrackerTest : public testing::Test { + public: + NetErrorTrackerTest() + : ALLOW_THIS_IN_INITIALIZER_LIST(tracker_( + base::Bind(&NetErrorTrackerTest::TrackerCallback, + base::Unretained(this)))), + callback_state_(NetErrorTracker::DNS_ERROR_PAGE_NONE), + callback_count_(0) { + } + + protected: + NetErrorTracker tracker_; + NetErrorTracker::DnsErrorPageState callback_state_; + int callback_count_; + + private: + void TrackerCallback(NetErrorTracker::DnsErrorPageState state) { + callback_state_ = state; + ++callback_count_; + } +}; + +TEST_F(NetErrorTrackerTest, InitialState) { + EXPECT_EQ(0, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_NONE, callback_state_); +} + +TEST_F(NetErrorTrackerTest, SuccessfulMainFrameLoad) { + tracker_.OnStartProvisionalLoad(FRAME_MAIN, PAGE_NORMAL); + tracker_.OnCommitProvisionalLoad(FRAME_MAIN); + tracker_.OnFinishLoad(FRAME_MAIN); + + EXPECT_EQ(0, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_NONE, callback_state_); +} + +TEST_F(NetErrorTrackerTest, SuccessfulSubFrameLoad) { + tracker_.OnStartProvisionalLoad(FRAME_SUB, PAGE_NORMAL); + tracker_.OnCommitProvisionalLoad(FRAME_SUB); + tracker_.OnFinishLoad(FRAME_SUB); + + EXPECT_EQ(0, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_NONE, callback_state_); +} + +TEST_F(NetErrorTrackerTest, FailedMainFrameLoad) { + tracker_.OnStartProvisionalLoad(FRAME_MAIN, PAGE_NORMAL); + EXPECT_EQ(0, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_NONE, callback_state_); + + tracker_.OnFailProvisionalLoad(FRAME_MAIN, ERROR_DNS); + EXPECT_EQ(1, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_PENDING, callback_state_); + + tracker_.OnStartProvisionalLoad(FRAME_MAIN, PAGE_ERROR); + tracker_.OnCommitProvisionalLoad(FRAME_MAIN); + tracker_.OnFinishLoad(FRAME_MAIN); + EXPECT_EQ(2, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_LOADED, callback_state_); + + tracker_.OnStartProvisionalLoad(FRAME_MAIN, PAGE_NORMAL); + EXPECT_EQ(3, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_NONE, callback_state_); +} + +TEST_F(NetErrorTrackerTest, FailedSubFrameLoad) { + tracker_.OnStartProvisionalLoad(FRAME_SUB, PAGE_NORMAL); + tracker_.OnFailProvisionalLoad(FRAME_SUB, ERROR_DNS); + tracker_.OnStartProvisionalLoad(FRAME_SUB, PAGE_ERROR); + tracker_.OnCommitProvisionalLoad(FRAME_SUB); + tracker_.OnFinishLoad(FRAME_SUB); + EXPECT_EQ(0, callback_count_); + EXPECT_EQ(NetErrorTracker::DNS_ERROR_PAGE_NONE, callback_state_); +} + +} // namespace |