OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/offline/offline_load_page.h" | 5 #include "chrome/browser/chromeos/offline/offline_load_page.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
11 #include "base/string_piece.h" | 11 #include "base/string_piece.h" |
12 #include "base/stringprintf.h" | 12 #include "base/stringprintf.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/browser_list.h" |
15 #include "chrome/browser/browser_thread.h" | 16 #include "chrome/browser/browser_thread.h" |
| 17 #include "chrome/browser/extensions/extensions_service.h" |
| 18 #include "chrome/browser/profile.h" |
16 #include "chrome/browser/tab_contents/navigation_controller.h" | 19 #include "chrome/browser/tab_contents/navigation_controller.h" |
17 #include "chrome/browser/tab_contents/navigation_entry.h" | 20 #include "chrome/browser/tab_contents/navigation_entry.h" |
18 #include "chrome/browser/tab_contents/tab_contents.h" | 21 #include "chrome/browser/tab_contents/tab_contents.h" |
19 #include "chrome/browser/tab_contents/tab_util.h" | 22 #include "chrome/browser/tab_contents/tab_util.h" |
20 #include "chrome/browser/ui/browser.h" | 23 #include "chrome/browser/ui/browser.h" |
| 24 #include "chrome/common/extensions/extension.h" |
21 #include "chrome/common/jstemplate_builder.h" | 25 #include "chrome/common/jstemplate_builder.h" |
22 #include "chrome/common/notification_type.h" | 26 #include "chrome/common/notification_type.h" |
| 27 #include "chrome/common/url_constants.h" |
23 #include "grit/browser_resources.h" | 28 #include "grit/browser_resources.h" |
24 #include "grit/generated_resources.h" | 29 #include "grit/generated_resources.h" |
25 | 30 |
26 namespace { | 31 namespace { |
27 | 32 |
28 // Maximum time to show a blank page. | 33 // Maximum time to show a blank page. |
29 const int kMaxBlankPeriod = 3000; | 34 const int kMaxBlankPeriod = 3000; |
30 | 35 |
31 // A utility function to set the dictionary's value given by |resource_id|. | 36 // A utility function to set the dictionary's value given by |resource_id|. |
32 void SetString(DictionaryValue* strings, const char* name, int resource_id) { | 37 void SetString(DictionaryValue* strings, const char* name, int resource_id) { |
(...skipping 23 matching lines...) Expand all Loading... |
56 const GURL& url, | 61 const GURL& url, |
57 Delegate* delegate) | 62 Delegate* delegate) |
58 : InterstitialPage(tab_contents, true, url), | 63 : InterstitialPage(tab_contents, true, url), |
59 delegate_(delegate) { | 64 delegate_(delegate) { |
60 registrar_.Add(this, NotificationType::NETWORK_STATE_CHANGED, | 65 registrar_.Add(this, NotificationType::NETWORK_STATE_CHANGED, |
61 NotificationService::AllSources()); | 66 NotificationService::AllSources()); |
62 } | 67 } |
63 | 68 |
64 std::string OfflineLoadPage::GetHTMLContents() { | 69 std::string OfflineLoadPage::GetHTMLContents() { |
65 DictionaryValue strings; | 70 DictionaryValue strings; |
66 SetString(&strings, "headLine", IDS_OFFLINE_LOAD_HEADLINE); | 71 // Toggle Cancel button. |
67 SetString(&strings, "description", IDS_OFFLINE_LOAD_DESCRIPTION); | 72 strings.SetString("display_cancel", |
68 SetString(&strings, "load_button", IDS_OFFLINE_LOAD_BUTTON); | 73 tab()->controller().CanGoBack() ? "inline" : "none"); |
69 SetString(&strings, "back_button", IDS_OFFLINE_BACK_BUTTON); | |
70 | 74 |
71 // TODO(oshima): tab()->GetTitle() always return url. This has to be | |
72 // a cached title. | |
73 strings.SetString("title", tab()->GetTitle()); | |
74 strings.SetString("textdirection", base::i18n::IsRTL() ? "rtl" : "ltr"); | |
75 strings.SetString("display_go_back", | |
76 tab()->controller().CanGoBack() ? "inline" : "none"); | |
77 int64 time_to_wait = std::max( | 75 int64 time_to_wait = std::max( |
78 static_cast<int64>(0), | 76 static_cast<int64>(0), |
79 kMaxBlankPeriod - | 77 kMaxBlankPeriod - |
80 NetworkStateNotifier::GetOfflineDuration().InMilliseconds()); | 78 NetworkStateNotifier::GetOfflineDuration().InMilliseconds()); |
| 79 // Set the timeout to show the page. |
81 strings.SetString("on_load", | 80 strings.SetString("on_load", |
82 WideToUTF16Hack(base::StringPrintf(L"startTimer(%ld)", | 81 WideToUTF16Hack(base::StringPrintf(L"startTimer(%ld)", |
83 time_to_wait))); | 82 time_to_wait))); |
| 83 // Button labels |
| 84 SetString(&strings, "load_button", IDS_OFFLINE_LOAD_BUTTON); |
| 85 SetString(&strings, "cancel_button", IDS_OFFLINE_CANCEL_BUTTON); |
84 | 86 |
85 // TODO(oshima): thumbnail is not working yet. fix this. | 87 SetString(&strings, "heading", IDS_OFFLINE_LOAD_HEADLINE); |
86 const std::string url = "chrome://thumb/" + GetURL().spec(); | 88 SetString(&strings, "network_settings", IDS_OFFLINE_NETWORK_SETTINGS); |
87 strings.SetString("thumbnailUrl", "url(" + url + ")"); | 89 |
| 90 bool rtl = base::i18n::IsRTL(); |
| 91 strings.SetString("textdirection", rtl ? "rtl" : "ltr"); |
| 92 |
| 93 string16 failed_url(ASCIIToUTF16(url().spec())); |
| 94 if (rtl) |
| 95 base::i18n::WrapStringWithLTRFormatting(&failed_url); |
| 96 strings.SetString("url", failed_url); |
| 97 |
| 98 // The offline page for app has icons and slightly different message. |
| 99 Profile* profile = tab()->profile(); |
| 100 DCHECK(profile); |
| 101 const Extension* extension = NULL; |
| 102 ExtensionsService* extensions_service = profile->GetExtensionsService(); |
| 103 // Extension service does not exist in test. |
| 104 if (extensions_service) |
| 105 extension = extensions_service->GetExtensionByWebExtent(url()); |
| 106 |
| 107 if (extension) |
| 108 GetAppOfflineStrings(extension, failed_url, &strings); |
| 109 else |
| 110 GetNormalOfflineStrings(failed_url, &strings); |
88 | 111 |
89 base::StringPiece html( | 112 base::StringPiece html( |
90 ResourceBundle::GetSharedInstance().GetRawDataResource( | 113 ResourceBundle::GetSharedInstance().GetRawDataResource( |
91 IDR_OFFLINE_LOAD_HTML)); | 114 IDR_OFFLINE_LOAD_HTML)); |
92 return jstemplate_builder::GetI18nTemplateHtml(html, &strings); | 115 return jstemplate_builder::GetI18nTemplateHtml(html, &strings); |
93 } | 116 } |
94 | 117 |
| 118 void OfflineLoadPage::GetAppOfflineStrings( |
| 119 const Extension* app, |
| 120 const string16& failed_url, |
| 121 DictionaryValue* strings) const { |
| 122 strings->SetString("title", app->name()); |
| 123 |
| 124 GURL icon_url = app->GetIconURL(Extension::EXTENSION_ICON_LARGE, |
| 125 ExtensionIconSet::MATCH_EXACTLY); |
| 126 if (icon_url.is_empty()) { |
| 127 strings->SetString("display_icon", "none"); |
| 128 strings->SetString("icon", string16()); |
| 129 } else { |
| 130 // Default icon is not accessible from interstitial page. |
| 131 // TODO(oshima): Figure out how to use default icon. |
| 132 strings->SetString("display_icon", "block"); |
| 133 strings->SetString("icon", icon_url.spec()); |
| 134 } |
| 135 |
| 136 strings->SetString( |
| 137 "msg", |
| 138 l10n_util::GetStringFUTF16(IDS_APP_OFFLINE_LOAD_DESCRIPTION, |
| 139 failed_url)); |
| 140 } |
| 141 |
| 142 void OfflineLoadPage::GetNormalOfflineStrings( |
| 143 const string16& failed_url, DictionaryValue* strings) const { |
| 144 strings->SetString("title", tab()->GetTitle()); |
| 145 |
| 146 // No icon for normal web site. |
| 147 strings->SetString("display_icon", "none"); |
| 148 strings->SetString("icon", string16()); |
| 149 |
| 150 strings->SetString( |
| 151 "msg", |
| 152 l10n_util::GetStringFUTF16(IDS_SITE_OFFLINE_LOAD_DESCRIPTION, |
| 153 failed_url)); |
| 154 } |
| 155 |
95 void OfflineLoadPage::CommandReceived(const std::string& cmd) { | 156 void OfflineLoadPage::CommandReceived(const std::string& cmd) { |
96 std::string command(cmd); | 157 std::string command(cmd); |
97 // The Jasonified response has quotes, remove them. | 158 // The Jasonified response has quotes, remove them. |
98 if (command.length() > 1 && command[0] == '"') { | 159 if (command.length() > 1 && command[0] == '"') { |
99 command = command.substr(1, command.length() - 2); | 160 command = command.substr(1, command.length() - 2); |
100 } | 161 } |
101 // TODO(oshima): record action for metrics. | 162 // TODO(oshima): record action for metrics. |
102 if (command == "proceed") { | 163 if (command == "proceed") { |
103 Proceed(); | 164 Proceed(); |
104 } else if (command == "dontproceed") { | 165 } else if (command == "dontproceed") { |
105 DontProceed(); | 166 DontProceed(); |
| 167 } else if (command == "open_network_settings") { |
| 168 Browser* browser = BrowserList::GetLastActive(); |
| 169 DCHECK(browser); |
| 170 browser->ShowOptionsTab(chrome::kInternetOptionsSubPage); |
106 } else { | 171 } else { |
107 LOG(WARNING) << "Unknown command:" << cmd; | 172 LOG(WARNING) << "Unknown command:" << cmd; |
108 } | 173 } |
109 } | 174 } |
110 | 175 |
111 void OfflineLoadPage::Proceed() { | 176 void OfflineLoadPage::Proceed() { |
112 delegate_->OnBlockingPageComplete(true); | 177 delegate_->OnBlockingPageComplete(true); |
113 InterstitialPage::Proceed(); | 178 InterstitialPage::Proceed(); |
114 } | 179 } |
115 | 180 |
(...skipping 15 matching lines...) Expand all Loading... |
131 registrar_.Remove(this, NotificationType::NETWORK_STATE_CHANGED, | 196 registrar_.Remove(this, NotificationType::NETWORK_STATE_CHANGED, |
132 NotificationService::AllSources()); | 197 NotificationService::AllSources()); |
133 Proceed(); | 198 Proceed(); |
134 } | 199 } |
135 } else { | 200 } else { |
136 InterstitialPage::Observe(type, source, details); | 201 InterstitialPage::Observe(type, source, details); |
137 } | 202 } |
138 } | 203 } |
139 | 204 |
140 } // namespace chromeos | 205 } // namespace chromeos |
OLD | NEW |