OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/icon_loader.h" | 5 #include "chrome/browser/icon_loader.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/nix/mime_util_xdg.h" | 9 #include "base/nix/mime_util_xdg.h" |
10 #include "ui/views/linux_ui/linux_ui.h" | 10 #include "ui/views/linux_ui/linux_ui.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 NOTREACHED(); | 38 NOTREACHED(); |
39 } | 39 } |
40 | 40 |
41 views::LinuxUI* ui = views::LinuxUI::instance(); | 41 views::LinuxUI* ui = views::LinuxUI::instance(); |
42 if (ui) { | 42 if (ui) { |
43 gfx::Image image = ui->GetIconForContentType(group_, size_pixels); | 43 gfx::Image image = ui->GetIconForContentType(group_, size_pixels); |
44 if (!image.IsEmpty()) | 44 if (!image.IsEmpty()) |
45 image_.reset(new gfx::Image(image)); | 45 image_.reset(new gfx::Image(image)); |
46 } | 46 } |
47 | 47 |
| 48 // TODO(jbroman): This should get better once PostTask can take a |
| 49 // OnceCallback, which seems the "right" thing to do. |
| 50 // |
| 51 // The root of the error in doing this the obvious way is that the functor |
| 52 // (first) argument to Bind isn't moved (rather a const& is used, because |
| 53 // running a repeating callback doesn't move from it). We could probably make |
| 54 // it work (by adjusting Invoker<...>::Run to move under some circumstances, |
| 55 // but it'd be a hack. |
| 56 // |
| 57 // This is a hack that does essentially that: it moves the functor like the |
| 58 // arguments are moved, even though that's not really safe if the callback is |
| 59 // invoked more than once. |
48 target_task_runner_->PostTask( | 60 target_task_runner_->PostTask( |
49 FROM_HERE, base::Bind(&IconLoader::NotifyDelegate, this)); | 61 FROM_HERE, |
| 62 base::Bind( |
| 63 [](IconLoadedCallback callback, IconLoader* loader, |
| 64 std::unique_ptr<gfx::Image> image, const IconGroup& group) { |
| 65 std::move(callback).Run(loader, std::move(image), group); |
| 66 }, |
| 67 base::Passed(&callback_), base::Unretained(this), |
| 68 base::Passed(&image_), group_)); |
50 } | 69 } |
OLD | NEW |