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