Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: chrome/browser/chromeos/ui/screensaver_extension_dialog.cc

Issue 9455038: Screensaver at login screen. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: and another build fix.. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/ui/screensaver_extension_dialog.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/memory/ref_counted.h"
10 #include "chrome/browser/extensions/extension_service.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/profiles/profile_manager.h"
13 #include "chrome/browser/sessions/restore_tab_helper.h"
14 #include "chrome/browser/ui/views/extensions/extension_dialog.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/common/extensions/extension.h"
17 #include "chrome/common/extensions/extension_file_util.h"
18
19 using content::BrowserThread;
20
21 namespace {
22
23 ScreensaverExtensionDialog* g_instance = NULL;
24
25 } // namespace
26
27 namespace browser {
28
29 void ShowScreensaverDialog() {
30 ScreensaverExtensionDialog::ShowScreensaverDialog();
31 }
32
33 void CloseScreensaverDialog() {
34 ScreensaverExtensionDialog::CloseScreensaverDialog();
35 }
36
37 } // namespace browser
38
39 // static
40 void ScreensaverExtensionDialog::ShowScreensaverDialog() {
41 if (!g_instance)
42 g_instance = new ScreensaverExtensionDialog();
43 g_instance->Show();
44 }
45
46 // static
47 void ScreensaverExtensionDialog::CloseScreensaverDialog() {
48 if (g_instance)
49 g_instance->Close();
50 }
51
52 ScreensaverExtensionDialog::ScreensaverExtensionDialog()
53 : screensaver_extension_(NULL),
54 loading_extension_(false) {
55 }
56
57 void ScreensaverExtensionDialog::LoadExtension() {
58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
59 std::string error;
60 std::string extension_path = CommandLine::ForCurrentProcess()->
61 GetSwitchValueASCII(switches::kKioskModeScreensaverPath);
62
63 scoped_refptr<Extension> screensaver_extension =
64 extension_file_util::LoadExtension(
65 FilePath(extension_path),
66 Extension::COMPONENT,
67 Extension::NO_FLAGS,
68 &error);
69
70 if (!screensaver_extension) {
71 LOG(ERROR) << "Could not load screensaver extension from: " <<
72 extension_path;
73 return;
74 }
75
76 BrowserThread::PostTask(BrowserThread::UI,
77 FROM_HERE,
78 base::Bind(
79 &ScreensaverExtensionDialog::SetExtensionAndShow,
80 base::Unretained(this),
81 screensaver_extension));
82 }
83
84 void ScreensaverExtensionDialog::SetExtensionAndShow(
85 scoped_refptr<Extension> extension) {
86 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
87 screensaver_extension_ = extension;
88 loading_extension_ = false;
89 Show();
90 }
91
92 void ScreensaverExtensionDialog::Show() {
93 // Whenever we're loading the extension, Show() will
94 // be called after the load finishes, so return.
95 if (loading_extension_)
96 return;
97
98 if (!screensaver_extension_) {
99 loading_extension_ = true;
100 BrowserThread::PostTask(BrowserThread::FILE,
101 FROM_HERE,
102 base::Bind(
103 &ScreensaverExtensionDialog::LoadExtension,
104 base::Unretained(this)));
105 return;
106 }
107
108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
109 Profile* default_profile = ProfileManager::GetDefaultProfile();
110 if (default_profile->GetExtensionService()->AddExtension(
111 screensaver_extension_)) {
112 extension_dialog_ = ExtensionDialog::ShowFullscreen(
113 screensaver_extension_->GetFullLaunchURL(),
114 default_profile,
115 string16(),
116 this);
117 } else {
118 LOG(ERROR) << "Couldn't add screensaver extension to profile.";
119 }
120 }
121
122 void ScreensaverExtensionDialog::Close() {
123 if (extension_dialog_) {
124 extension_dialog_->Close();
125 extension_dialog_ = NULL;
126 }
127 }
128
129 ScreensaverExtensionDialog::~ScreensaverExtensionDialog() {
130 if (extension_dialog_)
131 extension_dialog_->ObserverDestroyed();
132 }
133
134 void ScreensaverExtensionDialog::ExtensionDialogClosing(
135 ExtensionDialog* dialog) {
136 // Release our reference to the dialog to allow it to close.
137 extension_dialog_ = NULL;
138 }
139
140 void ScreensaverExtensionDialog::ExtensionTerminated(
141 ExtensionDialog* dialog) {
142 // This needs to be run 'slightly' delayed. When we get the extension
143 // terminated notification, the extension isn't fully unloaded yet. There
144 // is no good way to get around this. The correct solution will be to
145 // not need to reload the extension at all - but the current wiring in
146 // ExtensionViewsHost makes that not possible.
147 MessageLoop::current()->PostTask(FROM_HERE,
148 base::Bind(&ScreensaverExtensionDialog::ReloadAndShow,
149 base::Unretained(this)));
150 dialog->Close();
151 }
152
153 void ScreensaverExtensionDialog::ReloadAndShow() {
154 ProfileManager::GetDefaultProfile()->GetExtensionService()->ReloadExtension(
155 screensaver_extension_->id());
156
157 Show();
158 }
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/ui/screensaver_extension_dialog.h ('k') | chrome/browser/ui/views/extensions/extension_dialog.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698