Home | History | Annotate | Download | only in browser
      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/icon_loader.h"
      6 
      7 #import <AppKit/AppKit.h>
      8 
      9 #include "base/bind.h"
     10 #include "base/files/file_path.h"
     11 #include "base/message_loop/message_loop.h"
     12 #include "base/strings/sys_string_conversions.h"
     13 #include "base/threading/thread.h"
     14 #include "ui/gfx/image/image_skia.h"
     15 #include "ui/gfx/image/image_skia_util_mac.h"
     16 
     17 // static
     18 IconGroupID IconLoader::ReadGroupIDFromFilepath(
     19     const base::FilePath& filepath) {
     20   return filepath.Extension();
     21 }
     22 
     23 bool IconLoader::IsIconMutableFromFilepath(const base::FilePath&) {
     24   return false;
     25 }
     26 
     27 void IconLoader::ReadIcon() {
     28   NSString* group = base::SysUTF8ToNSString(group_);
     29   NSWorkspace* workspace = [NSWorkspace sharedWorkspace];
     30   NSImage* icon = [workspace iconForFileType:group];
     31 
     32   if (icon_size_ == ALL) {
     33     // The NSImage already has all sizes.
     34     image_.reset(new gfx::Image([icon retain]));
     35   } else {
     36     NSSize size = NSZeroSize;
     37     switch (icon_size_) {
     38       case IconLoader::SMALL:
     39         size = NSMakeSize(16, 16);
     40         break;
     41       case IconLoader::NORMAL:
     42         size = NSMakeSize(32, 32);
     43         break;
     44       default:
     45         NOTREACHED();
     46     }
     47     gfx::ImageSkia image_skia(gfx::ImageSkiaFromResizedNSImage(icon, size));
     48     if (!image_skia.isNull()) {
     49       image_skia.MakeThreadSafe();
     50       image_.reset(new gfx::Image(image_skia));
     51     }
     52   }
     53 
     54   target_message_loop_->PostTask(FROM_HERE,
     55       base::Bind(&IconLoader::NotifyDelegate, this));
     56 }
     57