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