diff options
author | pinkerton@google.com <pinkerton@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-21 22:04:44 +0000 |
---|---|---|
committer | pinkerton@google.com <pinkerton@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-21 22:04:44 +0000 |
commit | 88d749436bf04c540448065a1601ece53bfdb312 (patch) | |
tree | 4be4d6d86a0884932d13efd92a2a18d60a7f962f /chrome | |
parent | 1c36b962d877273125d92c4996a136fc1ac7e806 (diff) | |
download | chromium_src-88d749436bf04c540448065a1601ece53bfdb312.zip chromium_src-88d749436bf04c540448065a1601ece53bfdb312.tar.gz chromium_src-88d749436bf04c540448065a1601ece53bfdb312.tar.bz2 |
add basic command handling for browser window and for where there are no windows open. Can now create new browser windows.
Review URL: http://codereview.chromium.org/18458
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8387 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/app/nibs/English.lproj/MainMenu.xib | 24 | ||||
-rw-r--r-- | chrome/browser/app_controller_mac.h | 5 | ||||
-rw-r--r-- | chrome/browser/app_controller_mac.mm | 54 | ||||
-rw-r--r-- | chrome/browser/browser.cc | 16 | ||||
-rw-r--r-- | chrome/browser/browser.h | 7 | ||||
-rw-r--r-- | chrome/browser/browser_window_controller.h | 3 | ||||
-rw-r--r-- | chrome/browser/browser_window_controller.mm | 30 | ||||
-rw-r--r-- | chrome/chrome.xcodeproj/project.pbxproj | 16 | ||||
-rw-r--r-- | chrome/common/temp_scaffolding_stubs.cpp | 7 | ||||
-rw-r--r-- | chrome/common/temp_scaffolding_stubs.h | 10 |
10 files changed, 147 insertions, 25 deletions
diff --git a/chrome/app/nibs/English.lproj/MainMenu.xib b/chrome/app/nibs/English.lproj/MainMenu.xib index 8a8d5be..a0d3176 100644 --- a/chrome/app/nibs/English.lproj/MainMenu.xib +++ b/chrome/app/nibs/English.lproj/MainMenu.xib @@ -8,7 +8,7 @@ <string key="IBDocument.HIToolboxVersion">352.00</string> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="136"/> + <integer value="82"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -191,6 +191,7 @@ <int key="NSMnemonicLoc">2147483647</int> <reference key="NSOnImage" ref="353210768"/> <reference key="NSMixedImage" ref="549394948"/> + <int key="NSTag">34000</int> </object> <object class="NSMenuItem" id="603924433"> <reference key="NSMenu" ref="720053764"/> @@ -1241,6 +1242,14 @@ </object> <int key="connectionID">489</int> </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">commandDispatch:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="705341025"/> + </object> + <int key="connectionID">490</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -2468,7 +2477,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">489</int> + <int key="maxID">490</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -2485,6 +2494,17 @@ <string key="minorKey">browser/app_controller_mac.h</string> </object> </object> + <object class="IBPartialClassDescription"> + <string key="className">FirstResponder</string> + <object class="NSMutableDictionary" key="actions"> + <string key="NS.key.0">commandDispatch:</string> + <string key="NS.object.0">id</string> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBUserSource</string> + <string key="minorKey"/> + </object> + </object> </object> </object> <int key="IBDocument.localizationMode">0</int> diff --git a/chrome/browser/app_controller_mac.h b/chrome/browser/app_controller_mac.h index 09fa014..db562a3 100644 --- a/chrome/browser/app_controller_mac.h +++ b/chrome/browser/app_controller_mac.h @@ -7,11 +7,14 @@ #import <Cocoa/Cocoa.h> +class CommandUpdater; + // The application controller object, created by loading the MainMenu nib. // This handles things like responding to menus when there are no windows // open, etc and acts as the NSApplication delegate. -@interface AppController : NSObject { +@interface AppController : NSObject<NSUserInterfaceValidations> { @public + CommandUpdater* menuState_; // strong ref } - (IBAction)quit:(id)sender; diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 16073d8..f2face3 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm @@ -5,10 +5,27 @@ #import "app_controller_mac.h" #import "base/message_loop.h" +#import "chrome/app/chrome_dll_resource.h" +#import "chrome/browser/browser.h" #import "chrome/browser/browser_list.h" +#import "chrome/browser/command_updater.h" + +@interface AppController(PRIVATE) +- (void)initMenuState; +@end @implementation AppController +- (void)awakeFromNib { + // set up the command updater for when there are no windows open + [self initMenuState]; +} + +- (void)dealloc { + delete menuState_; + [super dealloc]; +} + // We can't use the standard terminate: method because it will abrubptly exit // the app and leave things on the stack in an unfinalized state. We need to // post a quit message to our run loop so the stack can gracefully unwind. @@ -32,5 +49,42 @@ MessageLoopForUI::current()->Quit(); } +// Called to validate menu items when there are no key windows. All the +// items we care about have been set with the |commandDispatch:| action and +// a target of FirstResponder in IB. If it's not one of those, let it +// continue up the responder chain to be handled elsewhere. We pull out the +// tag as the cross-platform constant to differentiate and dispatch the +// various commands. +- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { + SEL action = [item action]; + BOOL enable = NO; + if (action == @selector(commandDispatch:)) { + NSInteger tag = [item tag]; + if (menuState_->SupportsCommand(tag)) + enable = menuState_->IsCommandEnabled(tag) ? YES : NO; + } else if (action == @selector(quit:)) { + enable = YES; + } + return enable; +} + +// Called when the user picks a menu item when there are no key windows. Calls +// through to the browser object to execute the command. This assumes that the +// command is supported and doesn't check, otherwise it would have been disabled +// in the UI in validateUserInterfaceItem:. +- (void)commandDispatch:(id)sender { + NSInteger tag = [sender tag]; + switch (tag) { + case IDC_NEW_WINDOW: + Browser::OpenEmptyWindow(NULL); + break; + }; +} + +- (void)initMenuState { + menuState_ = new CommandUpdater(NULL); + menuState_->UpdateCommandEnabled(IDC_NEW_WINDOW, true); + // TODO(pinkerton): ...more to come... +} @end diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index ddceec2..6691066 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -6,6 +6,7 @@ #include "base/idle_timer.h" #include "base/logging.h" #include "base/string_util.h" +#include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/browser_list.h" #include "chrome/common/pref_names.h" #include "chrome/common/pref_service.h" @@ -22,7 +23,6 @@ #include "chrome/browser/browser.h" -#include "chrome/app/chrome_dll_resource.h" #include "chrome/app/locales/locale_settings.h" #include "chrome/browser/automation/ui_controls.h" #include "chrome/browser/browser_process.h" @@ -1070,6 +1070,8 @@ Browser* Browser::GetBrowserForController( return NULL; } +#endif // OS_WIN + /////////////////////////////////////////////////////////////////////////////// // Browser, CommandUpdater::CommandUpdaterDelegate implementation: @@ -1089,6 +1091,7 @@ void Browser::ExecuteCommand(int id) { // The order of commands in this switch statement must match the function // declaration order in browser.h! switch (id) { +#if defined(OS_WIN) // Navigation commands case IDC_BACK: GoBack(); break; case IDC_FORWARD: GoForward(); break; @@ -1217,12 +1220,17 @@ void Browser::ExecuteCommand(int id) { case IDC_ABOUT: OpenAboutChromeDialog(); break; case IDC_HELP_PAGE: OpenHelpTab(); break; +#elif defined(OS_MACOSX) + case IDC_NEW_WINDOW: NewWindow(); break; +#endif default: LOG(WARNING) << "Received Unimplemented Command: " << id; break; } } +#if defined(OS_WIN) + /////////////////////////////////////////////////////////////////////////////// // Browser, TabStripModelDelegate implementation: @@ -1884,6 +1892,8 @@ void Browser::Observe(NotificationType type, } } +#endif // OS_WIN + /////////////////////////////////////////////////////////////////////////////// // Browser, Command and state updating (private): @@ -2005,9 +2015,11 @@ void Browser::InitCommandState() { // Show various bits of UI command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, normal_window); +#if defined(OS_WIN) command_updater_.UpdateCommandEnabled(IDC_DEBUGGER, // The debugger doesn't work in single process mode. normal_window && !RenderProcessHost::run_renderer_in_process()); +#endif command_updater_.UpdateCommandEnabled(IDC_NEW_PROFILE, normal_window); command_updater_.UpdateCommandEnabled(IDC_REPORT_BUG, normal_window); command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR, normal_window); @@ -2022,6 +2034,8 @@ void Browser::InitCommandState() { } } +#if defined(OS_WIN) + void Browser::UpdateCommandsForTabState() { TabContents* current_tab = GetSelectedTabContents(); if (!current_tab) // May be NULL during tab restore. diff --git a/chrome/browser/browser.h b/chrome/browser/browser.h index 3157e5a..cd53a18 100644 --- a/chrome/browser/browser.h +++ b/chrome/browser/browser.h @@ -16,6 +16,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_window.h" +#include "chrome/browser/command_updater.h" #include "chrome/browser/sessions/session_id.h" #include "chrome/common/notification_service.h" #include "chrome/common/pref_member.h" @@ -23,7 +24,6 @@ #include "skia/include/SkBitmap.h" #if defined(OS_WIN) -#include "chrome/browser/command_updater.h" #include "chrome/browser/shell_dialogs.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/tab_contents_delegate.h" @@ -238,9 +238,10 @@ class Browser : public TabStripModelDelegate, void OpenCurrentURL(); void Go(); void Stop(); - +#endif // Window management commands void NewWindow(); +#if defined(OS_WIN) void NewIncognitoWindow(); void NewProfileWindowByIndex(int index); void CloseWindow(); @@ -320,10 +321,12 @@ class Browser : public TabStripModelDelegate, const NavigationController* controller, int* index); // Interface implementations //////////////////////////////////////////////// +#endif // Overridden from CommandUpdater::CommandUpdaterDelegate: virtual void ExecuteCommand(int id); +#if defined(OS_WIN) // Overridden from TabStripModelDelegate: virtual GURL GetBlankTabURL() const; virtual void CreateNewStripWithContents(TabContents* detached_contents, diff --git a/chrome/browser/browser_window_controller.h b/chrome/browser/browser_window_controller.h index 7ae2bd0..9d99a2e 100644 --- a/chrome/browser/browser_window_controller.h +++ b/chrome/browser/browser_window_controller.h @@ -13,7 +13,8 @@ class Browser; class BrowserWindow; -@interface BrowserWindowController : NSWindowController { +@interface BrowserWindowController : + NSWindowController<NSUserInterfaceValidations> { @private Browser* browser_; // strong BrowserWindow* window_shim_; // strong diff --git a/chrome/browser/browser_window_controller.mm b/chrome/browser/browser_window_controller.mm index c5e4abc..bb5b9cc 100644 --- a/chrome/browser/browser_window_controller.mm +++ b/chrome/browser/browser_window_controller.mm @@ -58,6 +58,36 @@ return YES; } +// Called to validate menu and toolbar items when this window is key. All the +// items we care about have been set with the |commandDispatch:| action and +// a target of FirstResponder in IB. If it's not one of those, let it +// continue up the responder chain to be handled elsewhere. We pull out the +// tag as the cross-platform constant to differentiate and dispatch the +// various commands. +// NOTE: we might have to handle state for app-wide menu items, +// although we could cheat and directly ask the app controller if our +// command_updater doesn't support the command. This may or may not be an issue, +// too early to tell. +- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { + SEL action = [item action]; + BOOL enable = NO; + if (action == @selector(commandDispatch:)) { + NSInteger tag = [item tag]; + if (browser_->command_updater()->SupportsCommand(tag)) + enable = browser_->command_updater()->IsCommandEnabled(tag) ? YES : NO; + } + return enable; +} + +// Called when the user picks a menu or toolbar item when this window is key. +// Calls through to the browser object to execute the command. This assumes that +// the command is supported and doesn't check, otherwise it would have been +// disabled in the UI in validateUserInterfaceItem:. +- (void)commandDispatch:(id)sender { + NSInteger tag = [sender tag]; + browser_->ExecuteCommand(tag); +} + // NSToolbar delegate methods - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar { diff --git a/chrome/chrome.xcodeproj/project.pbxproj b/chrome/chrome.xcodeproj/project.pbxproj index d9d105c..cecc5bc 100644 --- a/chrome/chrome.xcodeproj/project.pbxproj +++ b/chrome/chrome.xcodeproj/project.pbxproj @@ -308,6 +308,8 @@ E46C4B4C0F21098F00B393B8 /* worker_thread_ticker_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = E46C4B4B0F21098F00B393B8 /* worker_thread_ticker_unittest.cc */; }; E46C4C2E0F212CAF00B393B8 /* browser.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BF8300E9D4839009A6919 /* browser.cc */; }; E46C4D0F0F2138D400B393B8 /* browser_list.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BF83C0E9D4839009A6919 /* browser_list.cc */; }; + E46C4ED40F27A94100B393B8 /* command_updater.cc in Sources */ = {isa = PBXBuildFile; fileRef = E46C4ED30F27A94100B393B8 /* command_updater.cc */; }; + E46C4EF30F27A9B000B393B8 /* command_updater_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = E46C4EF20F27A9B000B393B8 /* command_updater_unittest.cc */; }; E48B66A80F26257E002E47EC /* libnet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D7B004E0E9D5464009A6919 /* libnet.a */; }; E48B67320F2625B8002E47EC /* libgoogleurl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D7BFF6E0E9D540F009A6919 /* libgoogleurl.a */; }; E48B67CB0F262607002E47EC /* libmodp_b64.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D7B005D0E9D54AA009A6919 /* libmodp_b64.a */; }; @@ -1105,9 +1107,6 @@ 4D7BF85F0E9D4839009A6919 /* chrome_thread.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chrome_thread.cc; sourceTree = "<group>"; }; 4D7BF8600E9D4839009A6919 /* chrome_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chrome_thread.h; sourceTree = "<group>"; }; 4D7BF8610E9D4839009A6919 /* chrome_thread_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chrome_thread_unittest.cc; sourceTree = "<group>"; }; - 4D7BF8630E9D4839009A6919 /* controller.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = controller.cc; sourceTree = "<group>"; }; - 4D7BF8640E9D4839009A6919 /* controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = controller.h; sourceTree = "<group>"; }; - 4D7BF8650E9D4839009A6919 /* controller_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = controller_unittest.cc; sourceTree = "<group>"; }; 4D7BF8660E9D4839009A6919 /* crash_recovery_uitest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crash_recovery_uitest.cc; sourceTree = "<group>"; }; 4D7BF8670E9D4839009A6919 /* cross_site_request_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cross_site_request_manager.cc; sourceTree = "<group>"; }; 4D7BF8680E9D4839009A6919 /* cross_site_request_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cross_site_request_manager.h; sourceTree = "<group>"; }; @@ -1787,6 +1786,9 @@ E46C46C30F1F9AE200B393B8 /* temp_scaffolding_stubs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = temp_scaffolding_stubs.h; sourceTree = "<group>"; }; E46C46C40F1F9AE200B393B8 /* temp_scaffolding_stubs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = temp_scaffolding_stubs.cpp; sourceTree = "<group>"; }; E46C4B4B0F21098F00B393B8 /* worker_thread_ticker_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = worker_thread_ticker_unittest.cc; sourceTree = "<group>"; }; + E46C4ED20F27A94100B393B8 /* command_updater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = command_updater.h; sourceTree = "<group>"; }; + E46C4ED30F27A94100B393B8 /* command_updater.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = command_updater.cc; sourceTree = "<group>"; }; + E46C4EF20F27A9B000B393B8 /* command_updater_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = command_updater_unittest.cc; sourceTree = "<group>"; }; E48B684C0F2630D3002E47EC /* browser_window_factory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = browser_window_factory.mm; sourceTree = "<group>"; }; E48B68550F26330C002E47EC /* browser_window_controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = browser_window_controller.h; sourceTree = "<group>"; }; E48B68560F26330C002E47EC /* browser_window_controller.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = browser_window_controller.mm; sourceTree = "<group>"; }; @@ -2183,9 +2185,9 @@ 4D7BF85F0E9D4839009A6919 /* chrome_thread.cc */, 4D7BF8600E9D4839009A6919 /* chrome_thread.h */, 4D7BF8610E9D4839009A6919 /* chrome_thread_unittest.cc */, - 4D7BF8630E9D4839009A6919 /* controller.cc */, - 4D7BF8640E9D4839009A6919 /* controller.h */, - 4D7BF8650E9D4839009A6919 /* controller_unittest.cc */, + E46C4EF20F27A9B000B393B8 /* command_updater_unittest.cc */, + E46C4ED20F27A94100B393B8 /* command_updater.h */, + E46C4ED30F27A94100B393B8 /* command_updater.cc */, 4D7BF8660E9D4839009A6919 /* crash_recovery_uitest.cc */, 4D7BF8670E9D4839009A6919 /* cross_site_request_manager.cc */, 4D7BF8680E9D4839009A6919 /* cross_site_request_manager.h */, @@ -3849,6 +3851,7 @@ E43A771C0F1661AF00ABD5D1 /* chrome_url_data_manager.cc in Sources */, E43A77110F16613700ABD5D1 /* chrome_url_request_context.cc in Sources */, 4D7BFAEF0E9D49E7009A6919 /* chunk_range.cc in Sources */, + E46C4ED40F27A94100B393B8 /* command_updater.cc in Sources */, 4D7BF9970E9D4863009A6919 /* cross_site_request_manager.cc in Sources */, 4D7BFA7C0E9D4994009A6919 /* dns_host_info.cc in Sources */, E4F324550EE5CFB1002533CE /* download_database.cc in Sources */, @@ -3935,6 +3938,7 @@ 4D7BFCE10E9D4DC8009A6919 /* bzip2_unittest.cc in Sources */, 4D7BFB350E9D4C18009A6919 /* chrome_thread_unittest.cc in Sources */, 4D7BFB710E9D4C55009A6919 /* chunk_range_unittest.cc in Sources */, + E46C4EF30F27A9B000B393B8 /* command_updater_unittest.cc in Sources */, 4D7BFB510E9D4C3E009A6919 /* dns_host_info_unittest.cc in Sources */, E4F324950EE5D758002533CE /* extension_unittest.cc in Sources */, A54612DC0EE9958600A8EE5D /* extensions_service_unittest.cc in Sources */, diff --git a/chrome/common/temp_scaffolding_stubs.cpp b/chrome/common/temp_scaffolding_stubs.cpp index 3517c4f..bdfec42 100644 --- a/chrome/common/temp_scaffolding_stubs.cpp +++ b/chrome/common/temp_scaffolding_stubs.cpp @@ -212,9 +212,6 @@ void InstallJankometer(const CommandLine&) { //-------------------------------------------------------------------------- -void Browser::InitCommandState() { -} - void Browser::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { @@ -223,3 +220,7 @@ void Browser::Observe(NotificationType type, LocationBarView* Browser::GetLocationBarView() const { return window_->GetLocationBarView(); } + +void Browser::NewWindow() { + Browser::OpenEmptyWindow(NULL); +} diff --git a/chrome/common/temp_scaffolding_stubs.h b/chrome/common/temp_scaffolding_stubs.h index 712ca0d..428cfb2 100644 --- a/chrome/common/temp_scaffolding_stubs.h +++ b/chrome/common/temp_scaffolding_stubs.h @@ -176,6 +176,7 @@ class Profile { SessionService* GetSessionService() { return NULL; } bool IsOffTheRecord() { return false; } URLRequestContext* GetRequestContext() { return NULL; } + virtual Profile* GetOriginalProfile() { return this; } private: std::wstring GetPrefFilePath(); @@ -280,15 +281,6 @@ class TabStripModel { scoped_ptr<TabContents> contents_; }; -class CommandUpdater { - public: - class CommandUpdaterDelegate { - public: - }; - - CommandUpdater(CommandUpdaterDelegate* const) { } -}; - class SelectFileDialog : public base::RefCountedThreadSafe<SelectFileDialog> { public: class Listener { |