blob: 456e3db15e418f9601a65326ff541b921180393e [file] [log] [blame]
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef WEBKIT_ACTIVEX_SHIM_WEB_ACTIVEX_SITE_H__
#define WEBKIT_ACTIVEX_SHIM_WEB_ACTIVEX_SITE_H__
#include <objsafe.h>
#include <map>
#include <vector>
#include "base/scoped_comptr_win.h"
#include "webkit/activex_shim/activex_util.h"
namespace activex_shim {
class WebActiveXContainer;
class ActiveXPlugin;
// Control creation parameters
struct ControlParam {
ControlParam(const std::wstring& new_name, const std::wstring& new_value) {
name = new_name;
value = new_value;
}
ControlParam() { }
std::wstring name;
std::wstring value;
};
// ActiveX control site to receive requests etc from the ActiveX control,
// and interact the container to host a control.
// Implemented interfaces:
// IDispatch:
// Required for ambient properties.
// IOleClientSite:
// Required interface.
// IOleControlSite:
// Required interface.
// IOleInPlaceSiteWindowless:
// Required for windowless activation.
// IServiceProvider:
// Some controls use this interface to get interface to the IBindHost,
// IWebBrowserApp interfaces. e.g., Flash needs the IBindHost to create
// a moniker to the movie. Thus this is a required interface.
// IPropertyBag:
// If the control supports IPersistPropertyBag, we could use this interface
// to initialize the control with param values.
class WebActiveXSite : public MinimumIDispatchImpl,
public IOleClientSite,
public IOleControlSite,
public IOleInPlaceSiteWindowless,
public IServiceProvider,
public IPropertyBag,
public IPropertyBag2 {
public:
WebActiveXSite();
// It's necessary to make it virtual because we do not directly create
// this object. Instead we usually create NoRefIUnknownImpl<WebActiveXSite>
virtual ~WebActiveXSite();
// Container calls this to init a site. The container should assume passing
// the ownership of IUnknown to site, and not try to release control there
// after. Site will release control in FinalRelease.
void Init(WebActiveXContainer* container, IUnknown* control);
// Deactive and release ActiveX control. Cleanup everything.
void FinalRelease();
// Sets the extent of the control, params and inplace activates it.
HRESULT ActivateControl(int x, int y, int width, int height,
const std::vector<ControlParam>& params);
// A simplified version of calling control's DoVerb.
HRESULT DoVerb(long verb);
// Changes the position/size of the control. The container/plugin is
// responsible to call this everytime the control's position/size changed.
void SetRect(const RECT* rect);
// IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
void** object);
// IOleClientSite
virtual HRESULT STDMETHODCALLTYPE SaveObject();
virtual HRESULT STDMETHODCALLTYPE GetMoniker(
DWORD assign,
DWORD which_moniker,
IMoniker** moniker);
virtual HRESULT STDMETHODCALLTYPE GetContainer(IOleContainer** container);
virtual HRESULT STDMETHODCALLTYPE ShowObject();
virtual HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL show);
virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout();
// IOleControlSite
virtual HRESULT STDMETHODCALLTYPE OnControlInfoChanged();
virtual HRESULT STDMETHODCALLTYPE LockInPlaceActive(BOOL lock);
virtual HRESULT STDMETHODCALLTYPE GetExtendedControl(IDispatch** disp);
virtual HRESULT STDMETHODCALLTYPE TransformCoords(POINTL* ptl_himetric,
POINTF* ptf_container,
DWORD flags);
virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(MSG* msg,
DWORD modifiers);
virtual HRESULT STDMETHODCALLTYPE OnFocus(BOOL got_focus);
virtual HRESULT STDMETHODCALLTYPE ShowPropertyFrame();
// IOleWindow
virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* wnd);
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL enter_mode);
// IOleInPlaceSite
virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate();
virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate();
virtual HRESULT STDMETHODCALLTYPE OnUIActivate();
virtual HRESULT STDMETHODCALLTYPE GetWindowContext(
IOleInPlaceFrame** frame,
IOleInPlaceUIWindow** doc,
LPRECT pos,
LPRECT clip,
LPOLEINPLACEFRAMEINFO frame_info);
virtual HRESULT STDMETHODCALLTYPE Scroll(SIZE scroll_extant);
virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(BOOL undoable);
virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate();
virtual HRESULT STDMETHODCALLTYPE DiscardUndoState();
virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo();
virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(LPCRECT pos);
// IOleInPlaceSiteEx
virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivateEx(
BOOL* no_redraw,
DWORD flags);
virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivateEx(BOOL no_redraw);
virtual HRESULT STDMETHODCALLTYPE RequestUIActivate();
// IOleInPlaceSiteWindowless
virtual HRESULT STDMETHODCALLTYPE CanWindowlessActivate();
virtual HRESULT STDMETHODCALLTYPE GetCapture();
virtual HRESULT STDMETHODCALLTYPE SetCapture(BOOL capture);
virtual HRESULT STDMETHODCALLTYPE GetFocus();
virtual HRESULT STDMETHODCALLTYPE SetFocus(BOOL focus);
virtual HRESULT STDMETHODCALLTYPE GetDC(
LPCRECT rect,
DWORD flags,
HDC* dc);
virtual HRESULT STDMETHODCALLTYPE ReleaseDC(HDC dc);
virtual HRESULT STDMETHODCALLTYPE InvalidateRect(
LPCRECT rect,
BOOL erase);
virtual HRESULT STDMETHODCALLTYPE InvalidateRgn(
HRGN rgn,
BOOL erase);
virtual HRESULT STDMETHODCALLTYPE ScrollRect(
INT dx,
INT dy,
LPCRECT scroll,
LPCRECT clip);
virtual HRESULT STDMETHODCALLTYPE AdjustRect(LPRECT rc);
virtual HRESULT STDMETHODCALLTYPE OnDefWindowMessage(
UINT msg,
WPARAM wparam,
LPARAM lparam,
LRESULT* result);
// IServiceProvider
virtual HRESULT STDMETHODCALLTYPE QueryService(
REFGUID guid,
REFIID riid,
void** object);
// IPropertyBag
virtual HRESULT STDMETHODCALLTYPE Read(LPCOLESTR prop_name, VARIANT* var,
IErrorLog* err_log);
virtual HRESULT STDMETHODCALLTYPE Write(LPCOLESTR prop_name, VARIANT* var);
// IPropertyBag2
virtual HRESULT STDMETHODCALLTYPE Read(ULONG c_properties,
PROPBAG2* prop_bag,
IErrorLog* err_log,
VARIANT* value,
HRESULT* error);
virtual HRESULT STDMETHODCALLTYPE Write(ULONG c_properties,
PROPBAG2* prop_bag,
VARIANT* value);
virtual HRESULT STDMETHODCALLTYPE CountProperties(ULONG* c_properties);
virtual HRESULT STDMETHODCALLTYPE GetPropertyInfo(ULONG iproperty,
ULONG c_properties,
PROPBAG2* prop_bag,
ULONG* properties_returned);
virtual HRESULT STDMETHODCALLTYPE LoadObject(LPCOLESTR pstr_name,
DWORD hint,
IUnknown* unk_object,
IErrorLog* err_log);
friend WebActiveXContainer;
friend ActiveXPlugin;
private:
// Call IOleObject::SetExtent to change the size of the control. width and
// height should be in pixels.
HRESULT SetExtent(int width, int height);
WebActiveXContainer* container_;
// Theorectically the control could support only IUnknown interface. This is
// the minimum requirement.
ScopedComPtr<IUnknown> control_;
// These are all optional interfaces and they could be NULL even if we have
// created the control successfully.
ScopedComPtr<IDispatch> dispatch_;
ScopedComPtr<IOleObject> ole_object_;
ScopedComPtr<IOleInPlaceObject> inplace_object_;
ScopedComPtr<IViewObject> view_object_;
ScopedComPtr<IOleInPlaceObjectWindowless> inplace_object_windowless_;
RECT rect_;
// We need to remember whether we are activated so we can decide whether to
// deactivate during destruction.
bool inplace_activated_;
bool has_capture_;
// We need to save the initial properties so that during control
// initialization, the control can query us (IPropertyBag) for those
// properties.
std::vector<ControlParam> initial_params_;
DISALLOW_EVIL_CONSTRUCTORS(WebActiveXSite);
};
} // namespace activex_shim
#endif // #ifndef WEBKIT_ACTIVEX_SHIM_WEB_ACTIVEX_SITE_H__