| OLD | NEW | 
|    1 // Copyright 2016 The Chromium Authors. All rights reserved. |    1 // Copyright 2016 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/win/settings_app_monitor.h" |    5 #include "chrome/browser/win/settings_app_monitor.h" | 
|    6  |    6  | 
|    7 #include <atlbase.h> |    7 #include <atlbase.h> | 
|    8 #include <atlcom.h> |    8 #include <atlcom.h> | 
|    9 #include <oleauto.h> |    9 #include <oleauto.h> | 
|   10 #include <stdint.h> |   10 #include <stdint.h> | 
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   47   // Deletes the instance. |   47   // Deletes the instance. | 
|   48   void DeleteOnAutomationThread(); |   48   void DeleteOnAutomationThread(); | 
|   49  |   49  | 
|   50   // Initializes the context, invoking the monitor's |OnInitialized| method via |   50   // Initializes the context, invoking the monitor's |OnInitialized| method via | 
|   51   // |monitor_runner| when done. On success, the monitor's other On* methods |   51   // |monitor_runner| when done. On success, the monitor's other On* methods | 
|   52   // will be invoked as events are observed. On failure, this instance |   52   // will be invoked as events are observed. On failure, this instance | 
|   53   // self-destructs after posting |init_callback|. |task_runner| is the runner |   53   // self-destructs after posting |init_callback|. |task_runner| is the runner | 
|   54   // for the dedicated thread on which the context lives (owned by its |   54   // for the dedicated thread on which the context lives (owned by its | 
|   55   // UIAutomationClient). |   55   // UIAutomationClient). | 
|   56   void Initialize(base::SingleThreadTaskRunner* task_runner, |   56   void Initialize(base::SingleThreadTaskRunner* task_runner, | 
|   57                   base::SequencedTaskRunner* monitor_runner, |   57                   scoped_refptr<base::SequencedTaskRunner> monitor_runner, | 
|   58                   const base::WeakPtr<SettingsAppMonitor>& monitor); |   58                   const base::WeakPtr<SettingsAppMonitor>& monitor); | 
|   59  |   59  | 
|   60  private: |   60  private: | 
|   61   class EventHandler; |   61   class EventHandler; | 
|   62  |   62  | 
|   63   // The one and only method that may be called from outside of the automation |   63   // The one and only method that may be called from outside of the automation | 
|   64   // thread. |   64   // thread. | 
|   65   Context(); |   65   Context(); | 
|   66   ~Context(); |   66   ~Context(); | 
|   67  |   67  | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|   89   base::win::ScopedComPtr<IUIAutomationFocusChangedEventHandler> |   89   base::win::ScopedComPtr<IUIAutomationFocusChangedEventHandler> | 
|   90   GetFocusChangedEventHandler(); |   90   GetFocusChangedEventHandler(); | 
|   91  |   91  | 
|   92   // Installs an event handler to observe events of interest. |   92   // Installs an event handler to observe events of interest. | 
|   93   HRESULT InstallObservers(); |   93   HRESULT InstallObservers(); | 
|   94  |   94  | 
|   95   // The task runner for the automation thread. |   95   // The task runner for the automation thread. | 
|   96   base::SingleThreadTaskRunner* task_runner_ = nullptr; |   96   base::SingleThreadTaskRunner* task_runner_ = nullptr; | 
|   97  |   97  | 
|   98   // The task runner on which the owning monitor lives. |   98   // The task runner on which the owning monitor lives. | 
|   99   base::SequencedTaskRunner* monitor_runner_ = nullptr; |   99   scoped_refptr<base::SequencedTaskRunner> monitor_runner_ = nullptr; | 
|  100  |  100  | 
|  101   // The monitor that owns this context. |  101   // The monitor that owns this context. | 
|  102   base::WeakPtr<SettingsAppMonitor> monitor_; |  102   base::WeakPtr<SettingsAppMonitor> monitor_; | 
|  103  |  103  | 
|  104   // The automation client. |  104   // The automation client. | 
|  105   base::win::ScopedComPtr<IUIAutomation> automation_; |  105   base::win::ScopedComPtr<IUIAutomation> automation_; | 
|  106  |  106  | 
|  107   // The event handler. |  107   // The event handler. | 
|  108   base::win::ScopedComPtr<IUnknown> event_handler_; |  108   base::win::ScopedComPtr<IUnknown> event_handler_; | 
|  109  |  109  | 
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  557   return context->weak_ptr_factory_.GetWeakPtr(); |  557   return context->weak_ptr_factory_.GetWeakPtr(); | 
|  558 } |  558 } | 
|  559  |  559  | 
|  560 void SettingsAppMonitor::Context::DeleteOnAutomationThread() { |  560 void SettingsAppMonitor::Context::DeleteOnAutomationThread() { | 
|  561   DCHECK(task_runner_->BelongsToCurrentThread()); |  561   DCHECK(task_runner_->BelongsToCurrentThread()); | 
|  562   delete this; |  562   delete this; | 
|  563 } |  563 } | 
|  564  |  564  | 
|  565 void SettingsAppMonitor::Context::Initialize( |  565 void SettingsAppMonitor::Context::Initialize( | 
|  566     base::SingleThreadTaskRunner* task_runner, |  566     base::SingleThreadTaskRunner* task_runner, | 
|  567     base::SequencedTaskRunner* monitor_runner, |  567     scoped_refptr<base::SequencedTaskRunner> monitor_runner, | 
|  568     const base::WeakPtr<SettingsAppMonitor>& monitor) { |  568     const base::WeakPtr<SettingsAppMonitor>& monitor) { | 
|  569   // This and all other methods must be called on the automation thread. |  569   // This and all other methods must be called on the automation thread. | 
|  570   DCHECK(task_runner->BelongsToCurrentThread()); |  570   DCHECK(task_runner->BelongsToCurrentThread()); | 
|  571   DCHECK(!monitor_runner->RunsTasksOnCurrentThread()); |  571   DCHECK(!monitor_runner->RunsTasksOnCurrentThread()); | 
|  572  |  572  | 
|  573   task_runner_ = task_runner; |  573   task_runner_ = task_runner; | 
|  574   monitor_runner_ = monitor_runner; |  574   monitor_runner_ = monitor_runner; | 
|  575   monitor_ = monitor; |  575   monitor_ = monitor; | 
|  576  |  576  | 
|  577   HRESULT result = automation_.CreateInstance(CLSID_CUIAutomation, nullptr, |  577   HRESULT result = automation_.CreateInstance(CLSID_CUIAutomation, nullptr, | 
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  698       weak_ptr_factory_(this) { |  698       weak_ptr_factory_(this) { | 
|  699   ui::win::CreateATLModuleIfNeeded(); |  699   ui::win::CreateATLModuleIfNeeded(); | 
|  700   // Start the automation thread and initialize the automation client on it. |  700   // Start the automation thread and initialize the automation client on it. | 
|  701   context_ = Context::Create(); |  701   context_ = Context::Create(); | 
|  702   automation_thread_.init_com_with_mta(true); |  702   automation_thread_.init_com_with_mta(true); | 
|  703   automation_thread_.Start(); |  703   automation_thread_.Start(); | 
|  704   automation_thread_.task_runner()->PostTask( |  704   automation_thread_.task_runner()->PostTask( | 
|  705       FROM_HERE, |  705       FROM_HERE, | 
|  706       base::Bind(&SettingsAppMonitor::Context::Initialize, context_, |  706       base::Bind(&SettingsAppMonitor::Context::Initialize, context_, | 
|  707                  base::Unretained(automation_thread_.task_runner().get()), |  707                  base::Unretained(automation_thread_.task_runner().get()), | 
|  708                  base::Unretained(base::SequencedTaskRunnerHandle::Get().get()), |  708                  base::SequencedTaskRunnerHandle::Get(), | 
|  709                  weak_ptr_factory_.GetWeakPtr())); |  709                  weak_ptr_factory_.GetWeakPtr())); | 
|  710 } |  710 } | 
|  711  |  711  | 
|  712 SettingsAppMonitor::~SettingsAppMonitor() { |  712 SettingsAppMonitor::~SettingsAppMonitor() { | 
|  713   DCHECK(thread_checker_.CalledOnValidThread()); |  713   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  714  |  714  | 
|  715   // context_ is still valid when the caller destroys the instance before the |  715   // context_ is still valid when the caller destroys the instance before the | 
|  716   // callback(s) have fired. In this case, delete the context on the automation |  716   // callback(s) have fired. In this case, delete the context on the automation | 
|  717   // thread before joining with it. DeleteSoon is not used because the monitor |  717   // thread before joining with it. DeleteSoon is not used because the monitor | 
|  718   // has only a WeakPtr to the context that is bound to the automation thread. |  718   // has only a WeakPtr to the context that is bound to the automation thread. | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  737   delegate_->OnChooserInvoked(); |  737   delegate_->OnChooserInvoked(); | 
|  738 } |  738 } | 
|  739  |  739  | 
|  740 void SettingsAppMonitor::OnBrowserChosen(const base::string16& browser_name) { |  740 void SettingsAppMonitor::OnBrowserChosen(const base::string16& browser_name) { | 
|  741   DCHECK(thread_checker_.CalledOnValidThread()); |  741   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  742   delegate_->OnBrowserChosen(browser_name); |  742   delegate_->OnBrowserChosen(browser_name); | 
|  743 } |  743 } | 
|  744  |  744  | 
|  745 }  // namespace win |  745 }  // namespace win | 
|  746 }  // namespace shell_integration |  746 }  // namespace shell_integration | 
| OLD | NEW |