1// Copyright (c) 2013 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#ifndef WIN8_TEST_OPEN_WITH_DIALOG_CONTROLLER_H_ 6#define WIN8_TEST_OPEN_WITH_DIALOG_CONTROLLER_H_ 7 8#include <windows.h> 9 10#include <vector> 11 12#include "base/basictypes.h" 13#include "base/callback_forward.h" 14#include "base/memory/weak_ptr.h" 15#include "base/strings/string16.h" 16 17namespace win8 { 18 19// Asynchronously drives Windows 8's OpenWithDialog into making a given program 20// the default handler for an URL protocol. 21class OpenWithDialogController { 22 public: 23 // A callback that is invoked upon completion of the OpenWithDialog 24 // interaction. If the HRESULT indicates success, the interaction completed 25 // successfully. Otherwise, the vector of strings may contain the list of 26 // possible choices if the desired program could not be selected. 27 typedef base::Callback<void(HRESULT, std::vector<base::string16>)> 28 SetDefaultCallback; 29 30 OpenWithDialogController(); 31 ~OpenWithDialogController(); 32 33 // Starts the process of making |program| the default handler for 34 // |url_protocol|. |parent_window| may be NULL. |callback| will be invoked 35 // upon completion. This instance may be deleted prior to |callback| being 36 // invoked to cancel the operation. 37 // Note: This will fail if |program| is already default for |url_protocol| 38 // since |program| will not show up verbatim in the dialog (e.g., in EN-US, it 39 // will be prefixed by "Keep using "). 40 void Begin(HWND parent_window, 41 const base::string16& url_protocol, 42 const base::string16& program, 43 const SetDefaultCallback& callback); 44 45 // Sychronously drives the dialog by running a message loop. Do not by any 46 // means call this on a thread that already has a message loop. Returns S_OK 47 // on success. Otherwise, |choices| may contain the list of possible choices 48 // if the desired program could not be selected. 49 HRESULT RunSynchronously(HWND parent_window, 50 const base::string16& url_protocol, 51 const base::string16& program, 52 std::vector<base::string16>* choices); 53 54 private: 55 class Context; 56 57 base::WeakPtr<Context> context_; 58 59 DISALLOW_COPY_AND_ASSIGN(OpenWithDialogController); 60}; 61 62} // namespace win8 63 64#endif // WIN8_TEST_OPEN_WITH_DIALOG_CONTROLLER_H_ 65