Home | History | Annotate | Download | only in browser
      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