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

Side by Side Diff: chrome/browser/views/sync/sync_setup_flow.cc

Issue 160598: Add files to browser/sync. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 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
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2009 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 #ifdef CHROME_PERSONALIZATION
6
7 #include "base/json_reader.h"
8 #include "base/json_writer.h"
9 #include "base/string_util.h"
10 #include "base/values.h"
11 #include "chrome/browser/browser.h"
12 #include "chrome/browser/browser_list.h"
13 #include "chrome/browser/renderer_host/render_view_host.h"
14 #include "chrome/browser/sync/auth_error_state.h"
15 #include "chrome/browser/sync/profile_sync_service.h"
16 #include "chrome/browser/tab_contents/tab_contents.h"
17 #include "chrome/browser/views/sync/sync_setup_flow.h"
18 #include "chrome/common/pref_service.h"
19
20 static const int kSyncDialogWidth = 267;
21 static const int kSyncDialogHeight = 369;
22
23 // XPath expression for finding specific iframes.
24 static const wchar_t* kLoginIFrameXPath = L"//iframe[@id='login']";
25 static const wchar_t* kMergeIFrameXPath = L"//iframe[@id='merge']";
26
27 // Helper function to read the JSON string from the Value parameter.
28 static std::string GetJsonResponse(const Value* content) {
29 if (!content || !content->IsType(Value::TYPE_LIST)) {
30 NOTREACHED();
31 return std::string();
32 }
33 const ListValue* args = static_cast<const ListValue*>(content);
34 if (args->GetSize() != 1) {
35 NOTREACHED();
36 return std::string();
37 }
38
39 std::string result;
40 Value* value = NULL;
41 if (!args->Get(0, &value) || !value->GetAsString(&result)) {
42 NOTREACHED();
43 return std::string();
44 }
45
46 return result;
47 }
48
49 void FlowHandler::RegisterMessages() {
50 dom_ui_->RegisterMessageCallback("SubmitAuth",
51 NewCallback(this, &FlowHandler::HandleSubmitAuth));
52 dom_ui_->RegisterMessageCallback("SubmitMergeAndSync",
53 NewCallback(this, &FlowHandler::HandleSubmitMergeAndSync));
54 }
55
56 static bool GetUsernameAndPassword(const std::string& json,
57 std::string* username, std::string* password) {
58 scoped_ptr<Value> parsed_value(JSONReader::Read(json, false));
59 if (!parsed_value.get() || !parsed_value->IsType(Value::TYPE_DICTIONARY))
60 return false;
61
62 DictionaryValue* result = static_cast<DictionaryValue*>(parsed_value.get());
63 if (!result->GetString(L"user", username) ||
64 !result->GetString(L"pass", password)) {
65 return false;
66 }
67 return true;
68 }
69
70 void FlowHandler::HandleSubmitAuth(const Value* value) {
71 std::string json(GetJsonResponse(value));
72 std::string username, password;
73 if (json.empty())
74 return;
75
76 if (!GetUsernameAndPassword(json, &username, &password)) {
77 // The page sent us something that we didn't understand.
78 // This probably indicates a programming error.
79 NOTREACHED();
80 return;
81 }
82
83 if (flow_)
84 flow_->OnUserSubmittedAuth(username, password);
85 }
86
87 void FlowHandler::HandleSubmitMergeAndSync(const Value* value) {
88 if (flow_)
89 flow_->OnUserAcceptedMergeAndSync();
90 }
91
92 // Called by SyncSetupFlow::Advance.
93 void FlowHandler::ShowGaiaLogin(const DictionaryValue& args) {
94 std::string json;
95 JSONWriter::Write(&args, false, &json);
96 std::wstring javascript = std::wstring(L"showGaiaLogin") +
97 L"(" + UTF8ToWide(json) + L");";
98 ExecuteJavascriptInIFrame(kLoginIFrameXPath, javascript);
99 }
100
101 void FlowHandler::ShowGaiaSuccessAndClose() {
102 ExecuteJavascriptInIFrame(kLoginIFrameXPath, L"showGaiaSuccessAndClose();");
103 }
104
105 void FlowHandler::ShowGaiaSuccessAndSettingUp() {
106 ExecuteJavascriptInIFrame(kLoginIFrameXPath,
107 L"showGaiaSuccessAndSettingUp();");
108 }
109
110 void FlowHandler::ShowMergeAndSync() {
111 if (dom_ui_) // NULL during testing.
112 dom_ui_->CallJavascriptFunction(L"showMergeAndSync");
113 }
114
115 void FlowHandler::ShowMergeAndSyncDone() {
116 ExecuteJavascriptInIFrame(kMergeIFrameXPath, L"showMergeAndSyncDone();");
117 }
118
119 void FlowHandler::ExecuteJavascriptInIFrame(const std::wstring& iframe_xpath,
120 const std::wstring& js) {
121 if (dom_ui_) {
122 RenderViewHost* rvh = dom_ui_->tab_contents()->render_view_host();
123 rvh->ExecuteJavascriptInWebFrame(iframe_xpath, js);
124 }
125 }
126
127 SyncSetupFlow::~SyncSetupFlow() {
128 flow_handler_->set_flow(NULL);
129 }
130
131 void SyncSetupFlow::GetDialogSize(gfx::Size* size) const {
132 size->set_width(kSyncDialogWidth);
133 size->set_height(kSyncDialogHeight);
134 }
135
136 // A callback to notify the delegate that the dialog closed.
137 void SyncSetupFlow::OnDialogClosed(const std::string& json_retval) {
138 DCHECK(json_retval.empty());
139 container_->set_flow(NULL); // Sever ties from the wizard.
140 if (current_state_ == SyncSetupWizard::DONE) {
141 PrefService* prefs = service_->profile()->GetPrefs();
142 prefs->SetBoolean(prefs::kSyncHasSetupCompleted, true);
143 prefs->ScheduleSavePersistentPrefs();
144 }
145 service_->OnUserCancelledDialog();
146 delete this;
147 }
148
149 // static
150 void SyncSetupFlow::GetArgsForGaiaLogin(const ProfileSyncService* service,
151 DictionaryValue* args) {
152 AuthErrorState error(service->GetAuthErrorState());
153 if (!service->last_attempted_user_email().empty()) {
154 args->SetString(L"user", service->last_attempted_user_email());
155 args->SetInteger(L"error", error);
156 } else {
157 std::wstring user(UTF16ToWide(service->GetAuthenticatedUsername()));
158 args->SetString(L"user", user);
159 args->SetInteger(L"error", user.empty() ? 0 : error);
160 }
161 }
162
163 void SyncSetupFlow::GetDOMMessageHandlers(
164 std::vector<DOMMessageHandler*>* handlers) const {
165 handlers->push_back(flow_handler_);
166 }
167
168 bool SyncSetupFlow::ShouldAdvance(SyncSetupWizard::State state) {
169 switch (state) {
170 case SyncSetupWizard::GAIA_LOGIN:
171 return current_state_ == SyncSetupWizard::GAIA_LOGIN;
172 case SyncSetupWizard::GAIA_SUCCESS:
173 return current_state_ == SyncSetupWizard::GAIA_LOGIN;
174 case SyncSetupWizard::MERGE_AND_SYNC:
175 return current_state_ == SyncSetupWizard::GAIA_SUCCESS;
176 case SyncSetupWizard::DONE:
177 return current_state_ == SyncSetupWizard::MERGE_AND_SYNC ||
178 current_state_ == SyncSetupWizard::GAIA_SUCCESS;
179 default:
180 NOTREACHED() << "Unhandled State: " << state;
181 return false;
182 }
183 }
184
185 void SyncSetupFlow::Advance(SyncSetupWizard::State advance_state) {
186 if (!ShouldAdvance(advance_state))
187 return;
188 switch (advance_state) {
189 case SyncSetupWizard::GAIA_LOGIN: {
190 DictionaryValue args;
191 SyncSetupFlow::GetArgsForGaiaLogin(service_, &args);
192 flow_handler_->ShowGaiaLogin(args);
193 break;
194 }
195 case SyncSetupWizard::GAIA_SUCCESS:
196 if (end_state_ == SyncSetupWizard::GAIA_SUCCESS)
197 flow_handler_->ShowGaiaSuccessAndClose();
198 else
199 flow_handler_->ShowGaiaSuccessAndSettingUp();
200 break;
201 case SyncSetupWizard::MERGE_AND_SYNC:
202 flow_handler_->ShowMergeAndSync();
203 break;
204 case SyncSetupWizard::DONE:
205 if (current_state_ == SyncSetupWizard::MERGE_AND_SYNC)
206 flow_handler_->ShowMergeAndSyncDone();
207 else if (current_state_ == SyncSetupWizard::GAIA_SUCCESS)
208 flow_handler_->ShowGaiaSuccessAndClose();
209 break;
210 default:
211 NOTREACHED() << "Invalid advance state: " << advance_state;
212 }
213 current_state_ = advance_state;
214 }
215
216
217 // static
218 SyncSetupFlow* SyncSetupFlow::Run(ProfileSyncService* service,
219 SyncSetupFlowContainer* container,
220 SyncSetupWizard::State start,
221 SyncSetupWizard::State end) {
222 DictionaryValue args;
223 if (start == SyncSetupWizard::GAIA_LOGIN)
224 SyncSetupFlow::GetArgsForGaiaLogin(service, &args);
225 std::string json_args;
226 JSONWriter::Write(&args, false, &json_args);
227
228 Browser* b = BrowserList::GetLastActive();
229 if (!b)
230 return NULL;
231
232 FlowHandler* handler = new FlowHandler();
233 SyncSetupFlow* flow = new SyncSetupFlow(start, end, json_args,
234 container, handler, service);
235 handler->set_flow(flow);
236 b->BrowserShowHtmlDialog(flow, NULL);
237 return flow;
238 }
239
240 #endif // CHROME_PERSONALIZATION
OLDNEW
« no previous file with comments | « chrome/browser/views/sync/sync_setup_flow.h ('k') | chrome/browser/views/sync/sync_setup_wizard.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698