Home | History | Annotate | Download | only in chrome_frame
      1 // Copyright (c) 2012 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_FRAME_TEST_UTILS_H_
      6 #define CHROME_FRAME_TEST_UTILS_H_
      7 
      8 #include <string>
      9 
     10 #include <atlbase.h>
     11 #include <atlcom.h>
     12 
     13 #include "base/strings/string16.h"
     14 
     15 namespace base {
     16 class FilePath;
     17 }
     18 
     19 extern const wchar_t kChromeFrameDllName[];
     20 extern const wchar_t kChromeLauncherExeName[];
     21 
     22 // Helper class used to register different chrome frame DLLs while running
     23 // tests. The default constructor registers the DLL found in the build path.
     24 // Programs that use this class MUST include a call to the class's
     25 // RegisterAndExitProcessIfDirected method at the top of their main entrypoint.
     26 //
     27 // At destruction, again registers the DLL found in the build path if another
     28 // DLL has since been registered. Triggers GTEST asserts on failure.
     29 //
     30 // TODO(robertshield): Ideally, make this class restore the originally
     31 // registered chrome frame DLL (e.g. by looking in HKCR) on destruction.
     32 class ScopedChromeFrameRegistrar {
     33  public:
     34   enum RegistrationType {
     35     PER_USER,
     36     SYSTEM_LEVEL,
     37   };
     38 
     39   explicit ScopedChromeFrameRegistrar(RegistrationType registration_type);
     40   ScopedChromeFrameRegistrar(const std::wstring& path,
     41                              RegistrationType registration_type);
     42   virtual ~ScopedChromeFrameRegistrar();
     43 
     44   void RegisterChromeFrameAtPath(const std::wstring& path);
     45   void UnegisterChromeFrameAtPath(const std::wstring& path);
     46   void RegisterReferenceChromeFrameBuild();
     47 
     48   std::wstring GetChromeFrameDllPath() const;
     49 
     50   static void RegisterAtPath(const std::wstring& path,
     51                              RegistrationType registration_type);
     52   static void UnregisterAtPath(const std::wstring& path,
     53                                RegistrationType registration_type);
     54   static void RegisterDefaults();
     55   static base::FilePath GetReferenceChromeFrameDllPath();
     56 
     57   // Registers or unregisters a COM DLL and exits the process if the process's
     58   // command line is:
     59   // this.exe --call-registration-entrypoint path_to_dll entrypoint
     60   // Otherwise simply returns. This method should be invoked at the start of the
     61   // entrypoint in each executable that uses ScopedChromeFrameRegistrar to
     62   // register or unregister DLLs.
     63   static void RegisterAndExitProcessIfDirected();
     64 
     65  private:
     66   enum RegistrationOperation {
     67     REGISTER,
     68     UNREGISTER,
     69   };
     70 
     71   // The string "--call-registration-entrypoint".
     72   static const wchar_t kCallRegistrationEntrypointSwitch[];
     73 
     74   static void DoRegistration(const string16& path,
     75                              RegistrationType registration_type,
     76                              RegistrationOperation registration_operation);
     77 
     78   // Contains the path of the most recently registered Chrome Frame DLL.
     79   std::wstring new_chrome_frame_dll_path_;
     80 
     81   // Contains the path of the Chrome Frame DLL to be registered at destruction.
     82   std::wstring original_dll_path_;
     83 
     84   // Indicates whether per user or per machine registration is needed.
     85   RegistrationType registration_type_;
     86   // We need to register the chrome path provider only once per process. This
     87   // flag keeps track of that.
     88   static bool register_chrome_path_provider_;
     89 };
     90 
     91 // Returns the path to the Chrome Frame DLL in the build directory. Assumes
     92 // that the test executable is running from the build folder or a similar
     93 // folder structure.
     94 base::FilePath GetChromeFrameBuildPath();
     95 
     96 // Callback description for onload, onloaderror, onmessage
     97 static _ATL_FUNC_INFO g_single_param = {CC_STDCALL, VT_EMPTY, 1, {VT_VARIANT}};
     98 // Simple class that forwards the callbacks.
     99 template <typename T>
    100 class DispCallback
    101     : public IDispEventSimpleImpl<1, DispCallback<T>, &IID_IDispatch> {
    102  public:
    103   typedef HRESULT (T::*Method)(const VARIANT* param);
    104 
    105   DispCallback(T* owner, Method method) : owner_(owner), method_(method) {
    106   }
    107 
    108   BEGIN_SINK_MAP(DispCallback)
    109     SINK_ENTRY_INFO(1, IID_IDispatch, DISPID_VALUE, OnCallback, &g_single_param)
    110   END_SINK_MAP()
    111 
    112   virtual ULONG STDMETHODCALLTYPE AddRef() {
    113     return owner_->AddRef();
    114   }
    115   virtual ULONG STDMETHODCALLTYPE Release() {
    116     return owner_->Release();
    117   }
    118 
    119   STDMETHOD(OnCallback)(VARIANT param) {
    120     return (owner_->*method_)(&param);
    121   }
    122 
    123   IDispatch* ToDispatch() {
    124     return reinterpret_cast<IDispatch*>(this);
    125   }
    126 
    127   T* owner_;
    128   Method method_;
    129 };
    130 
    131 // If the workstation is locked and cannot receive user input.
    132 bool IsWorkstationLocked();
    133 
    134 #endif  // CHROME_FRAME_TEST_UTILS_H_
    135