OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/component_updater/component_updater_service.h" | 5 #include "chrome/browser/component_updater/component_updater_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
11 #include "base/file_path.h" | 11 #include "base/file_path.h" |
12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
16 #include "base/string_number_conversions.h" | 16 #include "base/string_number_conversions.h" |
17 #include "base/string_util.h" | 17 #include "base/string_util.h" |
18 #include "base/stringprintf.h" | 18 #include "base/stringprintf.h" |
19 #include "base/timer.h" | 19 #include "base/timer.h" |
20 #include "chrome/browser/browser_process.h" | 20 #include "chrome/browser/browser_process.h" |
21 #include "chrome/browser/component_updater/component_unpacker.h" | 21 #include "chrome/browser/component_updater/component_unpacker.h" |
22 #include "chrome/common/chrome_notification_types.h" | 22 #include "chrome/common/chrome_notification_types.h" |
23 #include "chrome/common/chrome_utility_messages.h" | 23 #include "chrome/common/chrome_utility_messages.h" |
24 #include "chrome/common/chrome_version_info.h" | 24 #include "chrome/common/chrome_version_info.h" |
25 #include "chrome/common/extensions/extension.h" | 25 #include "chrome/common/extensions/extension.h" |
26 #include "content/browser/utility_process_host.h" | 26 #include "content/browser/utility_process_host.h" |
27 #include "content/common/net/url_fetcher.h" | 27 #include "content/common/net/url_fetcher.h" |
28 #include "content/common/notification_service.h" | 28 #include "content/public/browser/notification_service.h" |
29 #include "googleurl/src/gurl.h" | 29 #include "googleurl/src/gurl.h" |
30 #include "net/base/escape.h" | 30 #include "net/base/escape.h" |
31 #include "net/base/load_flags.h" | 31 #include "net/base/load_flags.h" |
32 | 32 |
33 namespace { | 33 namespace { |
34 // Extends an omaha compatible update check url |query| string. Does | 34 // Extends an omaha compatible update check url |query| string. Does |
35 // not mutate the string if it would be longer than |limit| chars. | 35 // not mutate the string if it would be longer than |limit| chars. |
36 bool AddQueryString(std::string id, std::string version, | 36 bool AddQueryString(std::string id, std::string version, |
37 size_t limit, std::string* query) { | 37 size_t limit, std::string* query) { |
38 std::string additional = | 38 std::string additional = |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 } | 340 } |
341 | 341 |
342 ComponentUpdateService::Status CrxUpdateService::Start() { | 342 ComponentUpdateService::Status CrxUpdateService::Start() { |
343 // Note that RegisterComponent will call Start() when the first | 343 // Note that RegisterComponent will call Start() when the first |
344 // component is registered, so it can be called twice. This way | 344 // component is registered, so it can be called twice. This way |
345 // we avoid scheduling the timer if there is no work to do. | 345 // we avoid scheduling the timer if there is no work to do. |
346 running_ = true; | 346 running_ = true; |
347 if (work_items_.empty()) | 347 if (work_items_.empty()) |
348 return kOk; | 348 return kOk; |
349 | 349 |
350 NotificationService::current()->Notify( | 350 content::NotificationService::current()->Notify( |
351 chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, | 351 chrome::NOTIFICATION_COMPONENT_UPDATER_STARTED, |
352 content::Source<ComponentUpdateService>(this), | 352 content::Source<ComponentUpdateService>(this), |
353 NotificationService::NoDetails()); | 353 content::NotificationService::NoDetails()); |
354 | 354 |
355 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(config_->InitialDelay()), | 355 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(config_->InitialDelay()), |
356 this, &CrxUpdateService::ProcessPendingItems); | 356 this, &CrxUpdateService::ProcessPendingItems); |
357 return kOk; | 357 return kOk; |
358 } | 358 } |
359 | 359 |
360 // Stop the main check + update loop. In flight operations will be | 360 // Stop the main check + update loop. In flight operations will be |
361 // completed. | 361 // completed. |
362 ComponentUpdateService::Status CrxUpdateService::Stop() { | 362 ComponentUpdateService::Status CrxUpdateService::Stop() { |
363 running_ = false; | 363 running_ = false; |
(...skipping 10 matching lines...) Expand all Loading... |
374 CHECK(!timer_.IsRunning()); | 374 CHECK(!timer_.IsRunning()); |
375 // It could be the case that Stop() had been called while a url request | 375 // It could be the case that Stop() had been called while a url request |
376 // or unpacking was in flight, if so we arrive here but |running_| is | 376 // or unpacking was in flight, if so we arrive here but |running_| is |
377 // false. In that case do not loop again. | 377 // false. In that case do not loop again. |
378 if (!running_) | 378 if (!running_) |
379 return; | 379 return; |
380 | 380 |
381 int64 delay = step_delay ? config_->StepDelay() : config_->NextCheckDelay(); | 381 int64 delay = step_delay ? config_->StepDelay() : config_->NextCheckDelay(); |
382 | 382 |
383 if (!step_delay) { | 383 if (!step_delay) { |
384 NotificationService::current()->Notify( | 384 content::NotificationService::current()->Notify( |
385 chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, | 385 chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, |
386 content::Source<ComponentUpdateService>(this), | 386 content::Source<ComponentUpdateService>(this), |
387 NotificationService::NoDetails()); | 387 content::NotificationService::NoDetails()); |
388 // Zero is only used for unit tests. | 388 // Zero is only used for unit tests. |
389 if (0 == delay) | 389 if (0 == delay) |
390 return; | 390 return; |
391 } | 391 } |
392 | 392 |
393 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay), | 393 timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay), |
394 this, &CrxUpdateService::ProcessPendingItems); | 394 this, &CrxUpdateService::ProcessPendingItems); |
395 } | 395 } |
396 | 396 |
397 // Given a extension-like component id, find the associated component. | 397 // Given a extension-like component id, find the associated component. |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 continue; | 627 continue; |
628 } | 628 } |
629 } | 629 } |
630 // All test passed. Queue an upgrade for this component and fire the | 630 // All test passed. Queue an upgrade for this component and fire the |
631 // notifications. | 631 // notifications. |
632 crx->crx_url = it->crx_url; | 632 crx->crx_url = it->crx_url; |
633 crx->status = CrxUpdateItem::kCanUpdate; | 633 crx->status = CrxUpdateItem::kCanUpdate; |
634 crx->next_version = Version(it->version); | 634 crx->next_version = Version(it->version); |
635 ++update_pending; | 635 ++update_pending; |
636 | 636 |
637 NotificationService::current()->Notify( | 637 content::NotificationService::current()->Notify( |
638 chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, | 638 chrome::NOTIFICATION_COMPONENT_UPDATE_FOUND, |
639 content::Source<std::string>(&crx->id), | 639 content::Source<std::string>(&crx->id), |
640 NotificationService::NoDetails()); | 640 content::NotificationService::NoDetails()); |
641 } | 641 } |
642 | 642 |
643 // All the components that are not mentioned in the manifest we | 643 // All the components that are not mentioned in the manifest we |
644 // consider them up to date. | 644 // consider them up to date. |
645 ChangeItemStatus(CrxUpdateItem::kChecking, CrxUpdateItem::kUpToDate); | 645 ChangeItemStatus(CrxUpdateItem::kChecking, CrxUpdateItem::kUpToDate); |
646 | 646 |
647 // If there are updates pending we do a short wait. | 647 // If there are updates pending we do a short wait. |
648 ScheduleNextRun(update_pending ? true : false); | 648 ScheduleNextRun(update_pending ? true : false); |
649 } | 649 } |
650 | 650 |
(...skipping 23 matching lines...) Expand all Loading... |
674 url_fetcher_.reset(); | 674 url_fetcher_.reset(); |
675 ScheduleNextRun(false); | 675 ScheduleNextRun(false); |
676 } else { | 676 } else { |
677 FilePath temp_crx_path; | 677 FilePath temp_crx_path; |
678 CHECK(source->GetResponseAsFilePath(true, &temp_crx_path)); | 678 CHECK(source->GetResponseAsFilePath(true, &temp_crx_path)); |
679 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading, | 679 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading, |
680 CrxUpdateItem::kUpdating); | 680 CrxUpdateItem::kUpdating); |
681 DCHECK_EQ(count, 1ul); | 681 DCHECK_EQ(count, 1ul); |
682 url_fetcher_.reset(); | 682 url_fetcher_.reset(); |
683 | 683 |
684 NotificationService::current()->Notify( | 684 content::NotificationService::current()->Notify( |
685 chrome::NOTIFICATION_COMPONENT_UPDATE_READY, | 685 chrome::NOTIFICATION_COMPONENT_UPDATE_READY, |
686 content::Source<std::string>(&context->id), | 686 content::Source<std::string>(&context->id), |
687 NotificationService::NoDetails()); | 687 content::NotificationService::NoDetails()); |
688 | 688 |
689 BrowserThread::PostDelayedTask(BrowserThread::FILE, FROM_HERE, | 689 BrowserThread::PostDelayedTask(BrowserThread::FILE, FROM_HERE, |
690 NewRunnableMethod(this, &CrxUpdateService::Install, | 690 NewRunnableMethod(this, &CrxUpdateService::Install, |
691 context, | 691 context, |
692 temp_crx_path), | 692 temp_crx_path), |
693 config_->StepDelay()); | 693 config_->StepDelay()); |
694 } | 694 } |
695 } | 695 } |
696 | 696 |
697 // Install consists of digital signature verification, unpacking and then | 697 // Install consists of digital signature verification, unpacking and then |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 ScheduleNextRun(false); | 743 ScheduleNextRun(false); |
744 } | 744 } |
745 | 745 |
746 // The component update factory. Using the component updater as a singleton | 746 // The component update factory. Using the component updater as a singleton |
747 // is the job of the browser process. | 747 // is the job of the browser process. |
748 ComponentUpdateService* ComponentUpdateServiceFactory( | 748 ComponentUpdateService* ComponentUpdateServiceFactory( |
749 ComponentUpdateService::Configurator* config) { | 749 ComponentUpdateService::Configurator* config) { |
750 DCHECK(config); | 750 DCHECK(config); |
751 return new CrxUpdateService(config); | 751 return new CrxUpdateService(config); |
752 } | 752 } |
OLD | NEW |