1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/offline/offline_load_page.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/i18n/rtl.h"
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_piece.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/network_library.h"
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_util.h"
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/extensions/extension.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/jstemplate_builder.h"
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/url_constants.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_controller.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h"
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_service.h"
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_type.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/browser_resources.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Maximum time to show a blank page.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxBlankPeriod = 3000;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A utility function to set the dictionary's value given by |resource_id|.
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid SetString(DictionaryValue* strings, const char* name, int resource_id) {
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  strings->SetString(name, l10n_util::GetStringUTF16(resource_id));
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OfflineLoadPage::Show(int process_host_id, int render_view_id,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const GURL& url, Delegate* delegate) {
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (NetworkStateNotifier::is_connected()) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Check again in UI thread and proceed if it's connected.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate->OnBlockingPageComplete(true);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabContents* tab_contents =
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        tab_util::GetTabContentsByID(process_host_id, render_view_id);
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // There is a chance that the tab is closed after we decided to show
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // offline and before we actually show the offline page.
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!tab_contents)
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (new OfflineLoadPage(tab_contents, url, delegate))->Show();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOfflineLoadPage::OfflineLoadPage(TabContents* tab_contents,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const GURL& url,
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 Delegate* delegate)
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : InterstitialPage(tab_contents, true, url),
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      delegate_(delegate),
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      proceeded_(false),
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      in_test_(false) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::NETWORK_STATE_CHANGED,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string OfflineLoadPage::GetHTMLContents() {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue strings;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 time_to_wait = std::max(
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      static_cast<int64>(0),
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      kMaxBlankPeriod -
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NetworkStateNotifier::GetOfflineDuration().InMilliseconds());
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Set the timeout to show the page.
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  strings.SetInteger("time_to_wait", static_cast<int>(time_to_wait));
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Button labels
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SetString(&strings, "heading", IDS_OFFLINE_LOAD_HEADLINE);
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetString(&strings, "try_loading", IDS_OFFLINE_TRY_LOADING);
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SetString(&strings, "network_settings", IDS_OFFLINE_NETWORK_SETTINGS);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Activation
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  strings.SetBoolean("show_activation", ShowActivationMessage());
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool rtl = base::i18n::IsRTL();
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings.SetString("textdirection", rtl ? "rtl" : "ltr");
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  string16 failed_url(ASCIIToUTF16(url().spec()));
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (rtl)
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    base::i18n::WrapStringWithLTRFormatting(&failed_url);
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings.SetString("url", failed_url);
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The offline page for app has icons and slightly different message.
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Profile* profile = tab()->profile();
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(profile);
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const Extension* extension = NULL;
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* extensions_service = profile->GetExtensionService();
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Extension service does not exist in test.
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (extensions_service)
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    extension = extensions_service->GetExtensionByWebExtent(url());
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (extension)
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GetAppOfflineStrings(extension, failed_url, &strings);
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  else
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GetNormalOfflineStrings(failed_url, &strings);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::StringPiece html(
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ResourceBundle::GetSharedInstance().GetRawDataResource(
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          IDR_OFFLINE_LOAD_HTML));
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return jstemplate_builder::GetI18nTemplateHtml(html, &strings);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid OfflineLoadPage::GetAppOfflineStrings(
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const Extension* app,
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const string16& failed_url,
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DictionaryValue* strings) const {
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings->SetString("title", app->name());
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL icon_url = app->GetIconURL(Extension::EXTENSION_ICON_LARGE,
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  ExtensionIconSet::MATCH_EXACTLY);
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (icon_url.is_empty()) {
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    strings->SetString("display_icon", "none");
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    strings->SetString("icon", string16());
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Default icon is not accessible from interstitial page.
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // TODO(oshima): Figure out how to use default icon.
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    strings->SetString("display_icon", "block");
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    strings->SetString("icon", icon_url.spec());
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings->SetString(
141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "msg",
142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringFUTF16(IDS_APP_OFFLINE_LOAD_DESCRIPTION,
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                 failed_url));
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid OfflineLoadPage::GetNormalOfflineStrings(
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const string16& failed_url, DictionaryValue* strings) const {
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings->SetString("title", tab()->GetTitle());
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // No icon for normal web site.
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings->SetString("display_icon", "none");
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings->SetString("icon", string16());
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  strings->SetString(
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "msg",
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringFUTF16(IDS_SITE_OFFLINE_LOAD_DESCRIPTION,
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                 failed_url));
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OfflineLoadPage::CommandReceived(const std::string& cmd) {
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string command(cmd);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The Jasonified response has quotes, remove them.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (command.length() > 1 && command[0] == '"') {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    command = command.substr(1, command.length() - 2);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(oshima): record action for metrics.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (command == "proceed") {
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Proceed();
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (command == "dontproceed") {
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DontProceed();
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else if (command == "open_network_settings") {
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser* browser = BrowserList::GetLastActive();
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    DCHECK(browser);
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    browser->ShowOptionsTab(chrome::kInternetOptionsSubPage);
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (command == "open_activate_broadband") {
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser = BrowserList::GetLastActive();
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(browser);
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    browser->OpenMobilePlanTabAndActivate();
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(WARNING) << "Unknown command:" << cmd;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OfflineLoadPage::Proceed() {
185201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  proceeded_ = true;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->OnBlockingPageComplete(true);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InterstitialPage::Proceed();
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OfflineLoadPage::DontProceed() {
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Inogre if it's already proceeded.
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (proceeded_)
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->OnBlockingPageComplete(false);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InterstitialPage::DontProceed();
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OfflineLoadPage::Observe(NotificationType type,
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const NotificationSource& source,
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const NotificationDetails& details) {
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (type.value == NotificationType::NETWORK_STATE_CHANGED) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    chromeos::NetworkStateDetails* state_details =
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        Details<chromeos::NetworkStateDetails>(details).ptr();
205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DVLOG(1) << "NetworkStateChanaged notification received: state="
206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch             << state_details->state();
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (state_details->state() ==
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        chromeos::NetworkStateDetails::CONNECTED) {
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      registrar_.Remove(this, NotificationType::NETWORK_STATE_CHANGED,
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        NotificationService::AllSources());
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Proceed();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    InterstitialPage::Observe(type, source, details);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool OfflineLoadPage::ShowActivationMessage() {
219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CrosLibrary* cros = CrosLibrary::Get();
220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!cros || !cros->GetNetworkLibrary()->cellular_available())
221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const CellularNetworkVector& cell_networks =
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cros->GetNetworkLibrary()->cellular_networks();
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (size_t i = 0; i < cell_networks.size(); ++i) {
226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    chromeos::ActivationState activation_state =
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        cell_networks[i]->activation_state();
228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (activation_state == ACTIVATION_STATE_ACTIVATED)
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return false;
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return true;
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
235