Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-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/dom_ui/mobile_setup_ui.h" | 5 #include "chrome/browser/chromeos/dom_ui/mobile_setup_ui.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 const char kFailedPaymentError[] = "failed_payment"; | 62 const char kFailedPaymentError[] = "failed_payment"; |
| 63 | 63 |
| 64 // Cellular configuration file path. | 64 // Cellular configuration file path. |
| 65 const char kCellularConfigPath[] = | 65 const char kCellularConfigPath[] = |
| 66 "/usr/share/chromeos-assets/mobile/mobile_config.json"; | 66 "/usr/share/chromeos-assets/mobile/mobile_config.json"; |
| 67 | 67 |
| 68 // Cellular config file field names. | 68 // Cellular config file field names. |
| 69 const char kVersionField[] = "version"; | 69 const char kVersionField[] = "version"; |
| 70 const char kErrorsField[] = "errors"; | 70 const char kErrorsField[] = "errors"; |
| 71 | 71 |
| 72 // Number of times we will retry to reconnect if connection fails. | |
| 73 const int kMaxConnectionRetry = 10; | |
| 74 // Connection timeout in seconds. | |
| 75 const int kConnectionTimeoutSeconds = 30; | |
| 76 | |
| 72 chromeos::CellularNetwork* GetCellularNetwork() { | 77 chromeos::CellularNetwork* GetCellularNetwork() { |
| 73 chromeos::NetworkLibrary* lib = chromeos::CrosLibrary::Get()-> | 78 chromeos::NetworkLibrary* lib = chromeos::CrosLibrary::Get()-> |
| 74 GetNetworkLibrary(); | 79 GetNetworkLibrary(); |
| 75 if (lib->cellular_networks().begin() != lib->cellular_networks().end()) { | 80 if (lib->cellular_networks().begin() != lib->cellular_networks().end()) { |
| 76 return *(lib->cellular_networks().begin()); | 81 return *(lib->cellular_networks().begin()); |
| 77 } | 82 } |
| 78 return NULL; | 83 return NULL; |
| 79 } | 84 } |
| 80 | 85 |
| 81 chromeos::CellularNetwork* GetCellularNetwork(const std::string& service_path) { | 86 chromeos::CellularNetwork* GetCellularNetwork(const std::string& service_path) { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 | 188 |
| 184 // Handlers for JS DOMUI messages. | 189 // Handlers for JS DOMUI messages. |
| 185 void HandleSetTransactionStatus(const ListValue* args); | 190 void HandleSetTransactionStatus(const ListValue* args); |
| 186 void HandleStartActivation(const ListValue* args); | 191 void HandleStartActivation(const ListValue* args); |
| 187 void SetTransactionStatus(const std::string& status); | 192 void SetTransactionStatus(const std::string& status); |
| 188 void StartActivation(); | 193 void StartActivation(); |
| 189 | 194 |
| 190 // Sends message to host registration page with system/user info data. | 195 // Sends message to host registration page with system/user info data. |
| 191 void SendDeviceInfo(); | 196 void SendDeviceInfo(); |
| 192 | 197 |
| 198 // Connects to cellular network, resets connection timer. | |
| 199 void ConnectToNetwork(chromeos::CellularNetwork* network); | |
| 200 // Reports connection timeout. | |
| 201 bool ConnectionTimeout(); | |
| 193 // Verify the state of cellular network and modify internal state. | 202 // Verify the state of cellular network and modify internal state. |
| 194 void EvaluateCellularNetwork(chromeos::CellularNetwork* network); | 203 void EvaluateCellularNetwork(chromeos::CellularNetwork* network); |
| 195 // Check the current cellular network for error conditions. | 204 // Check the current cellular network for error conditions. |
| 196 bool GotActivationError(const chromeos::CellularNetwork* network, | 205 bool GotActivationError(const chromeos::CellularNetwork* network, |
| 197 std::string* error); | 206 std::string* error); |
| 198 // Sends status updates to DOMUI page. | 207 // Sends status updates to DOMUI page. |
| 199 void UpdatePage(chromeos::CellularNetwork* network, | 208 void UpdatePage(chromeos::CellularNetwork* network, |
| 200 const std::string& error_description); | 209 const std::string& error_description); |
| 201 // Changes internal state. | 210 // Changes internal state. |
| 202 void ChangeState(chromeos::CellularNetwork* network, | 211 void ChangeState(chromeos::CellularNetwork* network, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 236 PlanActivationState state_; | 245 PlanActivationState state_; |
| 237 std::string service_path_; | 246 std::string service_path_; |
| 238 // Flags that control if wifi and ethernet connection needs to be restored | 247 // Flags that control if wifi and ethernet connection needs to be restored |
| 239 // after the activation of cellular network. | 248 // after the activation of cellular network. |
| 240 bool reenable_wifi_; | 249 bool reenable_wifi_; |
| 241 bool reenable_ethernet_; | 250 bool reenable_ethernet_; |
| 242 bool reenable_cert_check_; | 251 bool reenable_cert_check_; |
| 243 bool transaction_complete_signalled_; | 252 bool transaction_complete_signalled_; |
| 244 bool activation_status_test_; | 253 bool activation_status_test_; |
| 245 bool evaluating_; | 254 bool evaluating_; |
| 255 // Connection retry counter. | |
| 256 int connection_retry_count_; | |
| 257 // Connection start time. | |
| 258 base::Time connection_start_time_; | |
| 246 DISALLOW_COPY_AND_ASSIGN(MobileSetupHandler); | 259 DISALLOW_COPY_AND_ASSIGN(MobileSetupHandler); |
| 247 }; | 260 }; |
| 248 | 261 |
| 249 scoped_ptr<CellularConfigDocument> MobileSetupHandler::cellular_config_; | 262 scoped_ptr<CellularConfigDocument> MobileSetupHandler::cellular_config_; |
| 250 | 263 |
| 251 //////////////////////////////////////////////////////////////////////////////// | 264 //////////////////////////////////////////////////////////////////////////////// |
| 252 // | 265 // |
| 253 // CellularConfigDocument | 266 // CellularConfigDocument |
| 254 // | 267 // |
| 255 //////////////////////////////////////////////////////////////////////////////// | 268 //////////////////////////////////////////////////////////////////////////////// |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 l10n_util::GetStringFUTF16(IDS_MOBILE_CONNECTING_HEADER, | 334 l10n_util::GetStringFUTF16(IDS_MOBILE_CONNECTING_HEADER, |
| 322 network ? UTF8ToUTF16(network->name()) : string16())); | 335 network ? UTF8ToUTF16(network->name()) : string16())); |
| 323 strings.SetString("error_header", | 336 strings.SetString("error_header", |
| 324 l10n_util::GetStringUTF16(IDS_MOBILE_ERROR_HEADER)); | 337 l10n_util::GetStringUTF16(IDS_MOBILE_ERROR_HEADER)); |
| 325 strings.SetString("activating_header", | 338 strings.SetString("activating_header", |
| 326 l10n_util::GetStringUTF16(IDS_MOBILE_ACTIVATING_HEADER)); | 339 l10n_util::GetStringUTF16(IDS_MOBILE_ACTIVATING_HEADER)); |
| 327 strings.SetString("completed_header", | 340 strings.SetString("completed_header", |
| 328 l10n_util::GetStringUTF16(IDS_MOBILE_COMPLETED_HEADER)); | 341 l10n_util::GetStringUTF16(IDS_MOBILE_COMPLETED_HEADER)); |
| 329 strings.SetString("completed_text", | 342 strings.SetString("completed_text", |
| 330 l10n_util::GetStringUTF16(IDS_MOBILE_COMPLETED_TEXT)); | 343 l10n_util::GetStringUTF16(IDS_MOBILE_COMPLETED_TEXT)); |
| 344 strings.SetString("close_button", | |
| 345 l10n_util::GetStringUTF16(IDS_CLOSE)); | |
| 331 SetFontAndTextDirection(&strings); | 346 SetFontAndTextDirection(&strings); |
| 332 | 347 |
| 333 static const base::StringPiece html( | 348 static const base::StringPiece html( |
| 334 ResourceBundle::GetSharedInstance().GetRawDataResource( | 349 ResourceBundle::GetSharedInstance().GetRawDataResource( |
| 335 IDR_MOBILE_SETUP_PAGE_HTML)); | 350 IDR_MOBILE_SETUP_PAGE_HTML)); |
| 336 const std::string full_html = jstemplate_builder::GetTemplatesHtml( | 351 const std::string full_html = jstemplate_builder::GetTemplatesHtml( |
| 337 html, &strings, "t" /* template root node id */); | 352 html, &strings, "t" /* template root node id */); |
| 338 | 353 |
| 339 scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); | 354 scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); |
| 340 html_bytes->data.resize(full_html.size()); | 355 html_bytes->data.resize(full_html.size()); |
| 341 std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); | 356 std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); |
| 342 | 357 |
| 343 SendResponse(request_id, html_bytes); | 358 SendResponse(request_id, html_bytes); |
| 344 } | 359 } |
| 345 | 360 |
| 346 //////////////////////////////////////////////////////////////////////////////// | 361 //////////////////////////////////////////////////////////////////////////////// |
| 347 // | 362 // |
| 348 // MobileSetupHandler | 363 // MobileSetupHandler |
| 349 // | 364 // |
| 350 //////////////////////////////////////////////////////////////////////////////// | 365 //////////////////////////////////////////////////////////////////////////////// |
| 351 MobileSetupHandler::MobileSetupHandler(const std::string& service_path) | 366 MobileSetupHandler::MobileSetupHandler(const std::string& service_path) |
| 352 : tab_contents_(NULL), | 367 : tab_contents_(NULL), |
| 353 state_(PLAN_ACTIVATION_PAGE_LOADING), | 368 state_(PLAN_ACTIVATION_PAGE_LOADING), |
| 354 service_path_(service_path), | 369 service_path_(service_path), |
| 355 reenable_wifi_(false), | 370 reenable_wifi_(false), |
| 356 reenable_ethernet_(false), | 371 reenable_ethernet_(false), |
| 357 reenable_cert_check_(false), | 372 reenable_cert_check_(false), |
| 358 transaction_complete_signalled_(false), | 373 transaction_complete_signalled_(false), |
| 359 activation_status_test_(false), | 374 activation_status_test_(false), |
| 360 evaluating_(false) { | 375 evaluating_(false), |
| 376 connection_retry_count_(0) { | |
| 361 } | 377 } |
| 362 | 378 |
| 363 MobileSetupHandler::~MobileSetupHandler() { | 379 MobileSetupHandler::~MobileSetupHandler() { |
| 364 chromeos::NetworkLibrary* lib = | 380 chromeos::NetworkLibrary* lib = |
| 365 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); | 381 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 366 lib->RemoveNetworkManagerObserver(this); | 382 lib->RemoveNetworkManagerObserver(this); |
| 367 lib->RemoveObserverForAllNetworks(this); | 383 lib->RemoveObserverForAllNetworks(this); |
| 368 ReEnableOtherConnections(); | 384 ReEnableOtherConnections(); |
| 369 } | 385 } |
| 370 | 386 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 463 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> | 479 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> |
| 464 DisconnectFromWirelessNetwork(network); | 480 DisconnectFromWirelessNetwork(network); |
| 465 } else { | 481 } else { |
| 466 EvaluateCellularNetwork(network); | 482 EvaluateCellularNetwork(network); |
| 467 } | 483 } |
| 468 } else { | 484 } else { |
| 469 UMA_HISTOGRAM_COUNTS("Cellular.PaymentFailed", 1); | 485 UMA_HISTOGRAM_COUNTS("Cellular.PaymentFailed", 1); |
| 470 } | 486 } |
| 471 } | 487 } |
| 472 | 488 |
| 489 void MobileSetupHandler::ConnectToNetwork(chromeos::CellularNetwork* network) { | |
| 490 UMA_HISTOGRAM_COUNTS("Cellular.ConnectionRetry", 1); | |
|
Jason Glasgow
2010/11/18 04:31:12
Maybe you do not want this UMA call, since you als
zel
2010/11/18 04:39:51
Done.
| |
| 491 connection_retry_count_++; | |
| 492 connection_start_time_ = base::Time::Now(); | |
| 493 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> | |
| 494 ConnectToCellularNetwork(network); | |
| 495 } | |
| 496 | |
| 497 bool MobileSetupHandler::ConnectionTimeout() { | |
| 498 return (base::Time::Now() - | |
| 499 connection_start_time_).InSeconds() > kConnectionTimeoutSeconds; | |
| 500 } | |
| 501 | |
| 473 void MobileSetupHandler::EvaluateCellularNetwork( | 502 void MobileSetupHandler::EvaluateCellularNetwork( |
| 474 chromeos::CellularNetwork* network) { | 503 chromeos::CellularNetwork* network) { |
| 475 if (!dom_ui_) | 504 if (!dom_ui_) |
| 476 return; | 505 return; |
| 477 | 506 |
| 478 PlanActivationState new_state = state_; | 507 PlanActivationState new_state = state_; |
| 479 if (!network) { | 508 if (!network) { |
| 480 LOG(WARNING) << "Cellular service lost"; | 509 LOG(WARNING) << "Cellular service lost"; |
| 481 return; | 510 return; |
| 482 } | 511 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 580 // Wait in this state until activation state changes. | 609 // Wait in this state until activation state changes. |
| 581 break; | 610 break; |
| 582 case chromeos::ACTIVATION_STATE_ACTIVATING: | 611 case chromeos::ACTIVATION_STATE_ACTIVATING: |
| 583 break; | 612 break; |
| 584 default: | 613 default: |
| 585 break; | 614 break; |
| 586 } | 615 } |
| 587 break; | 616 break; |
| 588 } | 617 } |
| 589 case PLAN_ACTIVATION_RECONNECTING: { | 618 case PLAN_ACTIVATION_RECONNECTING: { |
| 590 // Wait until the service shows up and gets activated. | 619 if (network->connected()) { |
| 591 switch (network->activation_state()) { | 620 // Wait until the service shows up and gets activated. |
| 592 case chromeos::ACTIVATION_STATE_ACTIVATED: | 621 switch (network->activation_state()) { |
| 593 if (network->connected()) { | 622 case chromeos::ACTIVATION_STATE_ACTIVATED: |
| 594 if (network->restricted_pool()) { | |
| 595 new_state = PLAN_ACTIVATION_SHOWING_PAYMENT; | |
| 596 } else { | |
| 597 new_state = PLAN_ACTIVATION_DONE; | |
| 598 } | |
| 599 } else if (network->failed()) { | |
| 600 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> | |
| 601 ConnectToCellularNetwork(network); | |
| 602 evaluating_ = false; | |
| 603 return; | |
| 604 } | |
| 605 break; | |
| 606 case chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED: | |
| 607 if (network->connected()) { | |
| 608 if (network->restricted_pool()) | 623 if (network->restricted_pool()) |
| 609 new_state = PLAN_ACTIVATION_SHOWING_PAYMENT; | 624 new_state = PLAN_ACTIVATION_SHOWING_PAYMENT; |
| 610 } | 625 else |
| 611 break; | 626 new_state = PLAN_ACTIVATION_DONE; |
| 612 default: | 627 break; |
| 613 break; | 628 case chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED: |
| 629 if (network->restricted_pool()) | |
| 630 new_state = PLAN_ACTIVATION_SHOWING_PAYMENT; | |
| 631 break; | |
| 632 default: | |
| 633 break; | |
| 634 } | |
| 635 } else if (network->failed() || ConnectionTimeout()) { | |
| 636 // Try to reconnect again if reconnect failed, or if for some | |
| 637 // reasons we are still connected yet after all this time. | |
|
Jason Glasgow
2010/11/18 04:31:12
hard to parse comment. Maybe you mean
... if for
zel
2010/11/18 04:39:51
Done.
| |
| 638 // We should retry to connect again. | |
| 639 if (connection_retry_count_ < kMaxConnectionRetry) { | |
| 640 UMA_HISTOGRAM_COUNTS("Cellular.ConnectionRetry", 1); | |
|
Jason Glasgow
2010/11/18 04:31:12
The UMA call is also in ConnectToNetwork().
zel
2010/11/18 04:39:51
Removed call from from ConnectToNetwork()
| |
| 641 ConnectToNetwork(network); | |
| 642 evaluating_ = false; | |
| 643 return; | |
| 644 } else { | |
| 645 // We simply can't connect anymore after all these tries. | |
| 646 UMA_HISTOGRAM_COUNTS("Cellular.ConnectionFailed", 1); | |
| 647 new_state = PLAN_ACTIVATION_ERROR; | |
| 648 } | |
| 614 } | 649 } |
| 615 break; | 650 break; |
| 616 } | 651 } |
| 617 case PLAN_ACTIVATION_PAGE_LOADING: | 652 case PLAN_ACTIVATION_PAGE_LOADING: |
| 618 break; | 653 break; |
| 619 // Just ignore all signals until the site confirms payment. | 654 // Just ignore all signals until the site confirms payment. |
| 620 case PLAN_ACTIVATION_SHOWING_PAYMENT: | 655 case PLAN_ACTIVATION_SHOWING_PAYMENT: |
| 621 // Activation completed/failed, ignore network changes. | 656 // Activation completed/failed, ignore network changes. |
| 622 case PLAN_ACTIVATION_DONE: | 657 case PLAN_ACTIVATION_DONE: |
| 623 case PLAN_ACTIVATION_ERROR: | 658 case PLAN_ACTIVATION_ERROR: |
| 624 break; | 659 break; |
| 625 } | 660 } |
| 626 | 661 |
| 627 std::string error_description; | 662 std::string error_description; |
| 628 if (GotActivationError(network, &error_description)) { | 663 if (new_state != PLAN_ACTIVATION_ERROR && |
| 664 GotActivationError(network, &error_description)) { | |
| 629 // Check for this special case when we try to do activate partially | 665 // Check for this special case when we try to do activate partially |
| 630 // activated device. If that attempt failed, try to disconnect to clear the | 666 // activated device. If that attempt failed, try to disconnect to clear the |
| 631 // state and reconnect again. | 667 // state and reconnect again. |
| 632 if ((network->activation_state() == | 668 if ((network->activation_state() == |
| 633 chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED || | 669 chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED || |
| 634 network->activation_state() == chromeos::ACTIVATION_STATE_ACTIVATING) && | 670 network->activation_state() == chromeos::ACTIVATION_STATE_ACTIVATING) && |
| 635 (network->error() == chromeos::ERROR_UNKNOWN || | 671 (network->error() == chromeos::ERROR_UNKNOWN || |
| 636 network->error() == chromeos::ERROR_OTASP_FAILED)&& | 672 network->error() == chromeos::ERROR_OTASP_FAILED)&& |
| 637 (state_ == PLAN_ACTIVATION_INITIATING_ACTIVATION || | 673 (state_ == PLAN_ACTIVATION_INITIATING_ACTIVATION || |
| 638 state_ == PLAN_ACTIVATION_RECONNECTING) && | 674 state_ == PLAN_ACTIVATION_RECONNECTING) && |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 712 state_ = new_state; | 748 state_ = new_state; |
| 713 | 749 |
| 714 // Signal to JS layer that the state is changing. | 750 // Signal to JS layer that the state is changing. |
| 715 UpdatePage(network, error_description); | 751 UpdatePage(network, error_description); |
| 716 | 752 |
| 717 // Decide what to do with network object as a result of the new state. | 753 // Decide what to do with network object as a result of the new state. |
| 718 switch (new_state) { | 754 switch (new_state) { |
| 719 case PLAN_ACTIVATION_START: | 755 case PLAN_ACTIVATION_START: |
| 720 break; | 756 break; |
| 721 case PLAN_ACTIVATION_INITIATING_ACTIVATION: | 757 case PLAN_ACTIVATION_INITIATING_ACTIVATION: |
| 722 DCHECK(network); | 758 DCHECK(network); |
|
Jason Glasgow
2010/11/18 04:31:12
I think DCHECK belongs at start of this function.
zel
2010/11/18 04:39:51
I am not sure about that. We call also this method
| |
| 723 LOG(INFO) << "Activating service " << network->service_path().c_str(); | 759 LOG(INFO) << "Activating service " << network->service_path().c_str(); |
| 724 UMA_HISTOGRAM_COUNTS("Cellular.ActivationTry", 1); | 760 UMA_HISTOGRAM_COUNTS("Cellular.ActivationTry", 1); |
| 725 if (!network->StartActivation()) { | 761 if (!network->StartActivation()) { |
| 726 UMA_HISTOGRAM_COUNTS("Cellular.ActivationFailure", 1); | 762 UMA_HISTOGRAM_COUNTS("Cellular.ActivationFailure", 1); |
| 727 ChangeState(network, PLAN_ACTIVATION_ERROR, std::string()); | 763 ChangeState(network, PLAN_ACTIVATION_ERROR, std::string()); |
| 728 } | 764 } |
| 729 break; | 765 break; |
| 730 case PLAN_ACTIVATION_RECONNECTING: { | 766 case PLAN_ACTIVATION_RECONNECTING: { |
| 731 DCHECK(network); | 767 // Reset connection metrics and try to connect. |
| 732 if (network) { | 768 connection_retry_count_ = 0; |
| 733 chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> | 769 connection_start_time_ = base::Time::Now(); |
| 734 ConnectToCellularNetwork(network); | 770 ConnectToNetwork(network); |
| 735 } | |
| 736 break; | 771 break; |
| 737 } | 772 } |
| 738 case PLAN_ACTIVATION_PAGE_LOADING: | 773 case PLAN_ACTIVATION_PAGE_LOADING: |
| 739 return; | 774 return; |
| 740 case PLAN_ACTIVATION_SHOWING_PAYMENT: | 775 case PLAN_ACTIVATION_SHOWING_PAYMENT: |
| 741 // Fix for fix SSL for the walled gardens where cert chain verification | 776 // Fix for fix SSL for the walled gardens where cert chain verification |
| 742 // might not work. | 777 // might not work. |
| 743 break; | 778 break; |
| 744 case PLAN_ACTIVATION_DONE: | 779 case PLAN_ACTIVATION_DONE: |
| 745 DCHECK(network); | 780 DCHECK(network); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 908 new MobileSetupUIHTMLSource(service_path); | 943 new MobileSetupUIHTMLSource(service_path); |
| 909 | 944 |
| 910 // Set up the chrome://mobilesetup/ source. | 945 // Set up the chrome://mobilesetup/ source. |
| 911 BrowserThread::PostTask( | 946 BrowserThread::PostTask( |
| 912 BrowserThread::IO, FROM_HERE, | 947 BrowserThread::IO, FROM_HERE, |
| 913 NewRunnableMethod( | 948 NewRunnableMethod( |
| 914 Singleton<ChromeURLDataManager>::get(), | 949 Singleton<ChromeURLDataManager>::get(), |
| 915 &ChromeURLDataManager::AddDataSource, | 950 &ChromeURLDataManager::AddDataSource, |
| 916 make_scoped_refptr(html_source))); | 951 make_scoped_refptr(html_source))); |
| 917 } | 952 } |
| OLD | NEW |