1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/merge_session_load_page.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_delegate.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_preferences_util.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/browser_resources.h" 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/interstitial_page.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/escape.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/jstemplate_builder.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::InterstitialPage; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Delay time for showing interstitial page. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kShowDelayTimeMS = 1000; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maximum time for showing interstitial page. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kTotalWaitTimeMS = 10000; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MergeSessionLoadPage::MergeSessionLoadPage( 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const MergeSessionThrottle::CompletionCallback& callback) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : callback_(callback), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proceeded_(false), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_(web_contents), 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_(url) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_page_ = InterstitialPage::Create(web_contents, true, url, this); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MergeSessionLoadPage::~MergeSessionLoadPage() { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MergeSessionLoadPage::Show() { 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OAuth2LoginManager* manager = GetOAuth2LoginManager(); 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (manager && manager->ShouldBlockTabLoading()) { 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) manager->AddObserver(this); 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) interstitial_page_->Show(); 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) interstitial_page_->Proceed(); 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string MergeSessionLoadPage::GetHTMLContents() { 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue strings; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) strings.SetString("title", web_contents_->GetTitle()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set the timeout to show the page. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) strings.SetInteger("show_delay_time", kShowDelayTimeMS); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) strings.SetInteger("total_wait_time", kTotalWaitTimeMS); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(zelidrag): Flip the message to IDS_MERGE_SESSION_LOAD_HEADLINE 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // after merge. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) strings.SetString("heading", 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_TAB_LOADING_TITLE)); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool rtl = base::i18n::IsRTL(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) strings.SetString("textdirection", rtl ? "rtl" : "ltr"); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webui::UseVersion2 version2; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPiece html( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceBundle::GetSharedInstance().GetRawDataResource( 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDR_MERGE_SESSION_LOAD_HTML)); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return webui::GetI18nTemplateHtml(html, &strings); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MergeSessionLoadPage::OverrideRendererPrefs( 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RendererPreferences* prefs) { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetBrowserContext()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) renderer_preferences_util::UpdateFromSystemSettings(prefs, profile); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MergeSessionLoadPage::OnProceed() { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proceeded_ = true; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyBlockingPageComplete(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MergeSessionLoadPage::OnDontProceed() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore if it's already proceeded. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (proceeded_) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifyBlockingPageComplete(); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MergeSessionLoadPage::CommandReceived(const std::string& cmd) { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string command(cmd); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The Jasonified response has quotes, remove them. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command.length() > 1 && command[0] == '"') 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command = command.substr(1, command.length() - 2); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command == "proceed") { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_page_->Proceed(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Unknown command:" << cmd; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MergeSessionLoadPage::NotifyBlockingPageComplete() { 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OAuth2LoginManager* manager = GetOAuth2LoginManager(); 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (manager) 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) manager->RemoveObserver(this); 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!callback_.is_null()) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::IO, FROM_HERE, callback_); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)OAuth2LoginManager* MergeSessionLoadPage::GetOAuth2LoginManager() { 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::BrowserContext* browser_context = web_contents_->GetBrowserContext(); 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!browser_context) 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return NULL; 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context); 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!profile) 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return NULL; 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile); 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void MergeSessionLoadPage::OnSessionRestoreStateChanged( 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Profile* user_profile, OAuth2LoginManager::SessionRestoreState state) { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OAuth2LoginManager* manager = GetOAuth2LoginManager(); 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << "Merge session should " 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << (!manager->ShouldBlockTabLoading() ? 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " NOT " : "") 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << " be blocking now, " 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << state; 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!manager->ShouldBlockTabLoading()) { 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) manager->RemoveObserver(this); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interstitial_page_->Proceed(); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 174