| Index: webkit/activex_shim/web_activex_container.cc
|
| ===================================================================
|
| --- webkit/activex_shim/web_activex_container.cc (revision 25626)
|
| +++ webkit/activex_shim/web_activex_container.cc (working copy)
|
| @@ -1,351 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "webkit/activex_shim/web_activex_container.h"
|
| -
|
| -#include "base/scoped_comptr_win.h"
|
| -#include "webkit/activex_shim/activex_plugin.h"
|
| -#include "webkit/activex_shim/activex_util.h"
|
| -#include "webkit/activex_shim/npn_scripting.h"
|
| -#include "webkit/activex_shim/npp_impl.h"
|
| -#include "webkit/activex_shim/web_activex_site.h"
|
| -
|
| -namespace activex_shim {
|
| -
|
| -// WebActiveXContainer
|
| -WebActiveXContainer::WebActiveXContainer()
|
| - : plugin_(NULL),
|
| - container_wnd_(NULL) {
|
| -}
|
| -
|
| -WebActiveXContainer::~WebActiveXContainer() {
|
| - // Don't do anything here. Do everything in FinalRelease.
|
| -}
|
| -
|
| -void WebActiveXContainer::Init(ActiveXPlugin* plugin) {
|
| - plugin_ = plugin;
|
| -}
|
| -
|
| -void WebActiveXContainer::FinalRelease() {
|
| - container_wnd_ = NULL;
|
| - for (unsigned int i = 0; i < sites_.size(); i++) {
|
| - delete sites_[i];
|
| - }
|
| - sites_.clear();
|
| -}
|
| -
|
| -// IUnknown
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::QueryInterface(
|
| - REFIID iid,
|
| - void** object) {
|
| - *object = NULL;
|
| - if (iid == IID_IUnknown) {
|
| - *object = static_cast<IUnknown*>(static_cast<IOleContainer*>(this));
|
| - } else if (iid == IID_IDispatch) {
|
| - *object = static_cast<IDispatch*>(static_cast<IHTMLDocument2Impl*>(this));
|
| - } else if (iid == IID_IParseDisplayName) {
|
| - *object = static_cast<IParseDisplayName*>(this);
|
| - } else if (iid == IID_IOleContainer) {
|
| - *object = static_cast<IOleContainer*>(this);
|
| - } else if (iid == IID_IOleWindow) {
|
| - *object = static_cast<IOleWindow*>(this);
|
| - } else if (iid == IID_IOleInPlaceUIWindow) {
|
| - *object = static_cast<IOleInPlaceUIWindow*>(this);
|
| - } else if (iid == IID_IOleInPlaceFrame) {
|
| - *object = static_cast<IOleInPlaceFrame*>(this);
|
| - } else if (iid == IID_IHTMLDocument) {
|
| - *object = static_cast<IHTMLDocument*>(this);
|
| - } else if (iid == IID_IHTMLDocument2) {
|
| - *object = static_cast<IHTMLDocument2*>(this);
|
| - } else if (iid == IID_IWebBrowser) {
|
| - *object = static_cast<IWebBrowser*>(this);
|
| - } else if (iid == IID_IWebBrowserApp) {
|
| - *object = static_cast<IWebBrowserApp*>(this);
|
| - } else if (iid == IID_IWebBrowser2) {
|
| - *object = static_cast<IWebBrowser2*>(this);
|
| - } else if (iid == IID_IBindHost) {
|
| - *object = static_cast<IBindHost*>(this);
|
| - }
|
| - TRACK_QUERY_INTERFACE(iid, *object != NULL);
|
| - return (*object != NULL) ? S_OK : E_NOINTERFACE;
|
| -}
|
| -
|
| -// IParseDisplayName
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::ParseDisplayName(
|
| - IBindCtx* bc,
|
| - LPOLESTR display_name,
|
| - ULONG* cheaten,
|
| - IMoniker** moniker) {
|
| - TRACK_METHOD();
|
| - // Do not support this.
|
| - return E_NOTIMPL;
|
| -}
|
| -
|
| -// IOleContainer
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::EnumObjects(DWORD flags,
|
| - IEnumUnknown** ppenum) {
|
| - TRACK_METHOD();
|
| - // Do not support enumeration.
|
| - return E_NOTIMPL;
|
| -};
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::LockContainer(BOOL lock) {
|
| - TRACK_METHOD();
|
| - // Do not allow locking container.
|
| - return E_NOTIMPL;
|
| -};
|
| -
|
| -// IOleWindow
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::GetWindow(HWND* wnd) {
|
| - TRACK_METHOD();
|
| - *wnd = container_wnd();
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::ContextSensitiveHelp(
|
| - BOOL enter_mode) {
|
| - TRACK_METHOD();
|
| - return E_NOTIMPL;
|
| -}
|
| -
|
| -// IOleInPlaceUIWindow
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::GetBorder(LPRECT border) {
|
| - TRACK_METHOD();
|
| - // Does not allow tool bar etc.
|
| - return INPLACE_E_NOTOOLSPACE;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::RequestBorderSpace(
|
| - LPCBORDERWIDTHS border_widths) {
|
| - TRACK_METHOD();
|
| - return INPLACE_E_NOTOOLSPACE;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::SetBorderSpace(
|
| - LPCBORDERWIDTHS border_widths) {
|
| - TRACK_METHOD();
|
| - return E_UNEXPECTED;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::SetActiveObject(
|
| - IOleInPlaceActiveObject* active_object,
|
| - LPCOLESTR obj_name) {
|
| - TRACK_METHOD();
|
| - // Ignore whatever.
|
| - return S_OK;
|
| -}
|
| -
|
| -// IOleInPlaceFrame
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::InsertMenus(
|
| - HMENU hmenu_shared,
|
| - LPOLEMENUGROUPWIDTHS menu_widths) {
|
| - TRACK_METHOD();
|
| - // No menu is allowed.
|
| - return E_UNEXPECTED;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::SetMenu(
|
| - HMENU hmenu_shared,
|
| - HOLEMENU hole_menu,
|
| - HWND active_object) {
|
| - TRACK_METHOD();
|
| - return E_UNEXPECTED;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::RemoveMenus(
|
| - HMENU hmenu_shared) {
|
| - TRACK_METHOD();
|
| - return E_UNEXPECTED;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::SetStatusText(
|
| - LPCOLESTR status_text) {
|
| - TRACK_METHOD();
|
| - return E_UNEXPECTED;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::EnableModeless(BOOL enable) {
|
| - TRACK_METHOD();
|
| - return E_UNEXPECTED;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::TranslateAccelerator(
|
| - LPMSG msg,
|
| - WORD id) {
|
| - TRACK_METHOD();
|
| - // TODO(ruijiang): Link it with browser message processing.
|
| - // Returning S_FALSE means: The keystroke was not used.
|
| - return S_FALSE;
|
| -}
|
| -
|
| -// IHTMLDocument2
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::get_URL(BSTR* p) {
|
| - TRACK_METHOD();
|
| - std::wstring url = plugin_->GetCurrentURL();
|
| - *p = SysAllocString(url.c_str());
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::get_cookie(BSTR* p) {
|
| - TRACK_METHOD();
|
| - *p = SysAllocString(plugin_->GetWindow().
|
| - GetObjectProperty("document").GetStringProperty("cookie").c_str());
|
| - return S_OK;
|
| -}
|
| -
|
| -// IWebBrowser
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::Navigate(
|
| - BSTR url,
|
| - VARIANT* flags,
|
| - VARIANT* target_frame_name,
|
| - VARIANT* post_data,
|
| - VARIANT* headers) {
|
| - TRACK_METHOD();
|
| - // TODO(ruijiang): See if we need to handle the optional params.
|
| - plugin_->GetWindow().Invoke("open", "%s%s", url, L"_blank");
|
| - return S_OK;
|
| -}
|
| -
|
| -// IWebBrowserApp
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::get_LocationURL(
|
| - BSTR* location_url) {
|
| - return get_URL(location_url);
|
| -}
|
| -
|
| -// IBindHost
|
| -
|
| -// Flash uses CreateMoniker to get the url of the movie its "movie" parameter
|
| -// points to. We must implement this otherwise Flash will not work.
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::CreateMoniker(
|
| - LPOLESTR szName,
|
| - IBindCtx* bc,
|
| - IMoniker** mk,
|
| - DWORD reserved) {
|
| - TRACK_METHOD();
|
| - std::wstring url = plugin_->ResolveURL(szName);
|
| - HRESULT hr = CreateURLMoniker(NULL, url.c_str(), mk);
|
| - return hr;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::MonikerBindToStorage(
|
| - IMoniker* mk,
|
| - IBindCtx* bc,
|
| - IBindStatusCallback* bsc,
|
| - REFIID riid,
|
| - void** obj) {
|
| - // QuickTime uses this function to get the movie data from the container.
|
| - TRACK_METHOD();
|
| - IBindCtx* new_bc = NULL;
|
| - // Logic is a little tricky here. When bc is passed in, we should use that;
|
| - // otherwise we need to create a new one and release it after done.
|
| - IBindCtx* bc_to_use = bc;
|
| - if (bc == NULL) {
|
| - CreateBindCtx(0, &new_bc);
|
| - if (!new_bc)
|
| - return E_FAIL;
|
| - bc_to_use = new_bc;
|
| - }
|
| - // We must register the callback otherwise control will not know when new
|
| - // data arrive.
|
| - if (bsc)
|
| - RegisterBindStatusCallback(bc_to_use, bsc, NULL, 0);
|
| - HRESULT hr = mk->BindToStorage(bc_to_use, NULL, riid, obj);
|
| - if (new_bc)
|
| - new_bc->Release();
|
| - return hr;
|
| -}
|
| -
|
| -HRESULT STDMETHODCALLTYPE WebActiveXContainer::MonikerBindToObject(
|
| - IMoniker* mk,
|
| - IBindCtx* bc,
|
| - IBindStatusCallback* bsc,
|
| - REFIID riid,
|
| - void** obj) {
|
| - TRACK_METHOD();
|
| - return E_NOTIMPL;
|
| -}
|
| -
|
| -HRESULT WebActiveXContainer::CreateControlWithSite(const wchar_t* clsid) {
|
| - HRESULT hr;
|
| - CLSID id;
|
| - hr = CLSIDFromString(const_cast<LPOLESTR>(clsid), &id);
|
| - if (FAILED(hr))
|
| - return hr;
|
| -
|
| - IUnknown* control;
|
| - hr = CoCreateInstance(id, NULL, CLSCTX_INPROC_SERVER, __uuidof(IUnknown),
|
| - (LPVOID*)&control);
|
| - if (FAILED(hr))
|
| - return hr;
|
| -
|
| - // First try to get the IObjectSafety interface and get/set options.
|
| - // If failed then see if the object has registered itself as safe.
|
| - unsigned long safety_flag = GetAndSetObjectSafetyOptions(control);
|
| - if (!(safety_flag & SAFE_FOR_INITIALIZING) ||
|
| - !(safety_flag & SAFE_FOR_SCRIPTING)) {
|
| - safety_flag = GetRegisteredObjectSafetyOptions(id);
|
| - if (!(safety_flag & SAFE_FOR_INITIALIZING) ||
|
| - !(safety_flag & SAFE_FOR_SCRIPTING))
|
| - return E_FAIL;
|
| - }
|
| -
|
| - // Create client site and pass it to the control.
|
| - WebActiveXSite* site = new NoRefIUnknownImpl<WebActiveXSite>;
|
| - // From now on, we should assume site will take care of the lifecycle
|
| - // of control.
|
| - site->Init(this, control);
|
| - control = NULL;
|
| -
|
| - sites_.push_back(site);
|
| - return S_OK;
|
| -}
|
| -
|
| -bool WebActiveXContainer::OnWindowMessage(UINT msg, WPARAM wparam,
|
| - LPARAM lparam, LRESULT* result) {
|
| - HRESULT hr;
|
| - for (unsigned int i = 0; i < sites_.size(); i++) {
|
| - WebActiveXSite* site = sites_[i];
|
| - if (!site->control_)
|
| - continue;
|
| -
|
| - ScopedComPtr<IOleInPlaceObjectWindowless> windowless;
|
| - windowless.QueryFrom(site->control_);
|
| - if (windowless == NULL)
|
| - continue;
|
| -
|
| - if (msg == WM_MOUSEMOVE || msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP) {
|
| - POINT pt;
|
| - pt.x = LOWORD(lparam);
|
| - pt.y = HIWORD(lparam);
|
| - if (PtInRect(&site->rect_, pt)) {
|
| - hr = windowless->OnWindowMessage(msg, wparam, lparam, result);
|
| - if (hr == S_OK)
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // We did not consume the message. The caller can now process it.
|
| - return false;
|
| -}
|
| -
|
| -IUnknown* WebActiveXContainer::GetFirstControl() {
|
| - if (sites_.size()) {
|
| - return sites_[0]->control_;
|
| - } else {
|
| - return NULL;
|
| - }
|
| -}
|
| -
|
| -WebActiveXSite* WebActiveXContainer::GetFirstSite() {
|
| - if (sites_.size()) {
|
| - return sites_[0];
|
| - } else {
|
| - return NULL;
|
| - }
|
| -}
|
| -
|
| -} // namespace activex_shim
|
|
|