| Index: chrome/browser/media/media_stream_capture_indicator.cc
|
| diff --git a/chrome/browser/media/media_stream_capture_indicator.cc b/chrome/browser/media/media_stream_capture_indicator.cc
|
| index c683f338bc8e1069e866474b0995fad276aabc2e..9f56deae13de868b36703132c253683dd669664c 100644
|
| --- a/chrome/browser/media/media_stream_capture_indicator.cc
|
| +++ b/chrome/browser/media/media_stream_capture_indicator.cc
|
| @@ -11,6 +11,8 @@
|
| #include "chrome/app/chrome_command_ids.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/extensions/extension_system.h"
|
| +#include "chrome/browser/extensions/image_loader.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/status_icons/status_icon.h"
|
| #include "chrome/browser/status_icons/status_tray.h"
|
| @@ -125,8 +127,8 @@ MediaStreamCaptureIndicator::MediaStreamCaptureIndicator()
|
| mic_image_(NULL),
|
| camera_image_(NULL),
|
| balloon_image_(NULL),
|
| - request_index_(0),
|
| - weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
| + weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
|
| + icon_tracker_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
| }
|
|
|
| MediaStreamCaptureIndicator::~MediaStreamCaptureIndicator() {
|
| @@ -231,7 +233,6 @@ void MediaStreamCaptureIndicator::CreateStatusTray() {
|
| status_icon_ = status_tray->CreateStatusIcon();
|
|
|
| EnsureStatusTrayIconResources();
|
| - EnsureImageLoadingTracker();
|
| }
|
|
|
| void MediaStreamCaptureIndicator::EnsureStatusTrayIconResources() {
|
| @@ -270,14 +271,22 @@ void MediaStreamCaptureIndicator::ShowBalloon(
|
| const extensions::Extension* extension =
|
| GetExtension(render_process_id, render_view_id);
|
| if (extension) {
|
| - pending_messages_[request_index_++] =
|
| + string16 message =
|
| l10n_util::GetStringFUTF16(message_id,
|
| UTF8ToUTF16(extension->name()));
|
| - tracker_->LoadImage(
|
| +
|
| + WebContents* web_contents = tab_util::GetWebContentsByID(
|
| + render_process_id, render_view_id);
|
| +
|
| + Profile* profile =
|
| + Profile::FromBrowserContext(web_contents->GetBrowserContext());
|
| +
|
| + extensions::ExtensionSystem::Get(profile)->image_loader()->LoadImageAsync(
|
| extension,
|
| extension->GetIconResource(32, ExtensionIconSet::MATCH_BIGGER),
|
| gfx::Size(32, 32),
|
| - ImageLoadingTracker::CACHE);
|
| + base::Bind(&MediaStreamCaptureIndicator::OnImageLoaded,
|
| + icon_tracker_.GetWeakPtr(), message));
|
| return;
|
| }
|
|
|
| @@ -288,13 +297,8 @@ void MediaStreamCaptureIndicator::ShowBalloon(
|
| }
|
|
|
| void MediaStreamCaptureIndicator::OnImageLoaded(
|
| - const gfx::Image& image,
|
| - const std::string& extension_id,
|
| - int index) {
|
| - string16 message;
|
| - message.swap(pending_messages_[index]);
|
| - pending_messages_.erase(index);
|
| -
|
| + const string16& message,
|
| + const gfx::Image& image) {
|
| const gfx::ImageSkia* image_skia = !image.IsEmpty() ? image.ToImageSkia() :
|
| ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
|
| IDR_APP_DEFAULT_ICON);
|
| @@ -305,8 +309,8 @@ void MediaStreamCaptureIndicator::Hide() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(tabs_.empty());
|
|
|
| - // We have to destroy |tracker_| on the UI thread.
|
| - tracker_.reset();
|
| + // Make sure no more image loaded messages get delivered.
|
| + icon_tracker_.InvalidateWeakPtrs();
|
|
|
| if (!status_icon_)
|
| return;
|
| @@ -467,13 +471,3 @@ bool MediaStreamCaptureIndicator::IsProcessCapturing(int render_process_id,
|
| return false;
|
| return (iter->audio_ref_count > 0 || iter->video_ref_count > 0);
|
| }
|
| -
|
| -void MediaStreamCaptureIndicator::EnsureImageLoadingTracker() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (tracker_.get())
|
| - return;
|
| -
|
| - tracker_.reset(new ImageLoadingTracker(this));
|
| - pending_messages_.clear();
|
| - request_index_ = 0;
|
| -}
|
|
|