• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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 CHROME_BROWSER_EXTERNAL_PROTOCOL_HANDLER_H_
6 #define CHROME_BROWSER_EXTERNAL_PROTOCOL_HANDLER_H_
7 #pragma once
8 
9 #include <string>
10 
11 class DictionaryValue;
12 class GURL;
13 class PrefService;
14 
15 class ExternalProtocolHandler {
16  public:
17   enum BlockState {
18     DONT_BLOCK,
19     BLOCK,
20     UNKNOWN,
21   };
22 
23   // Returns whether we should block a given scheme.
24   static BlockState GetBlockState(const std::string& scheme);
25 
26   // Sets whether we should block a given scheme.
27   static void SetBlockState(const std::string& scheme, BlockState state);
28 
29   // Checks to see if the protocol is allowed, if it is whitelisted,
30   // the application associated with the protocol is launched on the io thread,
31   // if it is blacklisted, returns silently. Otherwise, an
32   // ExternalProtocolDialog is created asking the user. If the user accepts,
33   // LaunchUrlWithoutSecurityCheck is called on the io thread and the
34   // application is launched.
35   // Must run on the UI thread.
36   static void LaunchUrl(const GURL& url, int render_process_host_id,
37                         int tab_contents_id);
38 
39   // Creates and runs a External Protocol dialog box.
40   // |url| - The url of the request.
41   // |render_process_host_id| and |routing_id| are used by
42   // tab_util::GetTabContentsByID to aquire the tab contents associated with
43   // this dialog.
44   // NOTE: There is a race between the Time of Check and the Time Of Use for
45   //       the command line. Since the caller (web page) does not have access
46   //       to change the command line by itself, we do not do anything special
47   //       to protect against this scenario.
48   // This is implemented separately on each platform.
49   static void RunExternalProtocolDialog(const GURL& url,
50                                         int render_process_host_id,
51                                         int routing_id);
52 
53   // Register the ExcludedSchemes preference.
54   static void RegisterPrefs(PrefService* prefs);
55 
56   // Starts a url using the external protocol handler with the help
57   // of shellexecute. Should only be called if the protocol is whitelisted
58   // (checked in LaunchUrl) or if the user explicitly allows it. (By selecting
59   // "Launch Application" in an ExternalProtocolDialog.) It is assumed that the
60   // url has already been escaped, which happens in LaunchUrl.
61   // NOTE: You should Not call this function directly unless you are sure the
62   // url you have has been checked against the blacklist, and has been escaped.
63   // All calls to this function should originate in some way from LaunchUrl.
64   // This will execute on the file thread.
65   static void LaunchUrlWithoutSecurityCheck(const GURL& url);
66 
67   // Prepopulates the dictionary with known protocols to deny or allow, if
68   // preferences for them do not already exist.
69   static void PrepopulateDictionary(DictionaryValue* win_pref);
70 
71   // Allows LaunchUrl to proceed with launching an external protocol handler.
72   // This is typically triggered by a user gesture, but is also called for
73   // each extension API function. Note that each call to LaunchUrl resets
74   // the state to false (not allowed).
75   static void PermitLaunchUrl();
76 };
77 
78 #endif  // CHROME_BROWSER_EXTERNAL_PROTOCOL_HANDLER_H_
79