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#ifndef CHROME_BROWSER_CHROMEOS_OFFLINE_OFFLINE_LOAD_PAGE_H_
6#define CHROME_BROWSER_CHROMEOS_OFFLINE_OFFLINE_LOAD_PAGE_H_
7
8#include <string>
9
10#include "base/callback.h"
11#include "base/compiler_specific.h"
12#include "content/public/browser/interstitial_page_delegate.h"
13#include "net/base/network_change_notifier.h"
14#include "url/gurl.h"
15
16namespace base {
17class DictionaryValue;
18}
19
20namespace content {
21class InterstitialPage;
22class WebContents;
23}
24
25namespace extensions {
26class Extension;
27}
28
29namespace chromeos {
30
31// OfflineLoadPage class shows the interstitial page that is shown
32// when no network is available and hides when some network (either
33// one of wifi, 3g or ethernet) becomes available.
34// It deletes itself when the interstitial page is closed.
35class OfflineLoadPage
36    : public content::InterstitialPageDelegate,
37      public net::NetworkChangeNotifier::ConnectionTypeObserver {
38 public:
39  // Passed a boolean indicating whether or not it is OK to proceed with the
40  // page load.
41  typedef base::Callback<void(bool /*proceed*/)> CompletionCallback;
42
43  // Create a offline load page for the |web_contents|.  The callback will be
44  // run on the IO thread.
45  OfflineLoadPage(content::WebContents* web_contents, const GURL& url,
46                  const CompletionCallback& callback);
47
48  void Show();
49
50 protected:
51  virtual ~OfflineLoadPage();
52
53  // Overridden by tests.
54  virtual void NotifyBlockingPageComplete(bool proceed);
55
56 private:
57  friend class TestOfflineLoadPage;
58
59  // InterstitialPageDelegate implementation.
60  virtual std::string GetHTMLContents() OVERRIDE;
61  virtual void CommandReceived(const std::string& command) OVERRIDE;
62  virtual void OverrideRendererPrefs(
63      content::RendererPreferences* prefs) OVERRIDE;
64  virtual void OnProceed() OVERRIDE;
65  virtual void OnDontProceed() OVERRIDE;
66
67  // net::NetworkChangeNotifier::ConnectionTypeObserver overrides.
68  virtual void OnConnectionTypeChanged(
69      net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
70
71  CompletionCallback callback_;
72
73  // True if the proceed is chosen.
74  bool proceeded_;
75
76  content::WebContents* web_contents_;
77  GURL url_;
78  content::InterstitialPage* interstitial_page_;  // Owns us.
79
80  DISALLOW_COPY_AND_ASSIGN(OfflineLoadPage);
81};
82
83}  // namespace chromeos
84
85#endif  // CHROME_BROWSER_CHROMEOS_OFFLINE_OFFLINE_LOAD_PAGE_H_
86