summaryrefslogtreecommitdiffstats
path: root/chrome_frame/chrome_frame_activex_base.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome_frame/chrome_frame_activex_base.h')
-rw-r--r--chrome_frame/chrome_frame_activex_base.h42
1 files changed, 36 insertions, 6 deletions
diff --git a/chrome_frame/chrome_frame_activex_base.h b/chrome_frame/chrome_frame_activex_base.h
index c5d17d4..a2774e3 100644
--- a/chrome_frame/chrome_frame_activex_base.h
+++ b/chrome_frame/chrome_frame_activex_base.h
@@ -175,13 +175,15 @@ class ATL_NO_VTABLE ChromeFrameActivexBase : // NOLINT
public:
ChromeFrameActivexBase()
: ready_state_(READYSTATE_UNINITIALIZED),
- failed_to_fetch_in_place_frame_(false) {
+ url_fetcher_(new UrlmonUrlRequestManager()),
+ failed_to_fetch_in_place_frame_(false),
+ draw_sad_tab_(false) {
m_bWindowOnly = TRUE;
- url_fetcher_.set_container(static_cast<IDispatch*>(this));
+ url_fetcher_->set_container(static_cast<IDispatch*>(this));
}
~ChromeFrameActivexBase() {
- url_fetcher_.set_container(NULL);
+ url_fetcher_->set_container(NULL);
}
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE |
@@ -206,6 +208,7 @@ BEGIN_COM_MAP(ChromeFrameActivexBase)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
+ COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_FUNC_BLIND(0, InterfaceNotSupported)
END_COM_MAP()
@@ -270,6 +273,10 @@ END_MSG_MAP()
Uninitialize();
}
+ void ResetUrlRequestManager() {
+ url_fetcher_.reset(new UrlmonUrlRequestManager());
+ }
+
static HRESULT WINAPI InterfaceNotSupported(void* pv, REFIID riid, void** ppv,
DWORD dw) {
#ifndef NDEBUG
@@ -300,7 +307,23 @@ END_MSG_MAP()
NOTREACHED();
return E_FAIL;
}
- // Don't draw anything.
+
+ if (draw_sad_tab_) {
+ // TODO(tommi): Draw a proper sad tab.
+ RECT rc = {0};
+ if (draw_info.prcBounds) {
+ rc.top = draw_info.prcBounds->top;
+ rc.bottom = draw_info.prcBounds->bottom;
+ rc.left = draw_info.prcBounds->left;
+ rc.right = draw_info.prcBounds->right;
+ } else {
+ GetClientRect(&rc);
+ }
+ ::DrawTextA(draw_info.hdcDraw, ":-(", -1, &rc,
+ DT_CENTER | DT_VCENTER | DT_SINGLELINE);
+ } else {
+ // Don't draw anything.
+ }
return S_OK;
}
@@ -512,7 +535,7 @@ END_MSG_MAP()
LRESULT OnCreate(UINT message, WPARAM wparam, LPARAM lparam,
BOOL& handled) { // NO_LINT
ModifyStyle(0, WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0);
- url_fetcher_.put_notification_window(m_hWnd);
+ url_fetcher_->put_notification_window(m_hWnd);
if (automation_client_.get()) {
automation_client_->SetParentWindow(m_hWnd);
} else {
@@ -535,6 +558,7 @@ END_MSG_MAP()
// ChromeFrameDelegate override
virtual void OnAutomationServerReady() {
+ draw_sad_tab_ = false;
ChromeFramePlugin<T>::OnAutomationServerReady();
ready_state_ = READYSTATE_COMPLETE;
@@ -544,6 +568,10 @@ END_MSG_MAP()
// ChromeFrameDelegate override
virtual void OnAutomationServerLaunchFailed(
AutomationLaunchResult reason, const std::string& server_version) {
+ DLOG(INFO) << __FUNCTION__;
+ if (reason == AUTOMATION_SERVER_CRASHED)
+ draw_sad_tab_ = true;
+
ready_state_ = READYSTATE_UNINITIALIZED;
FireOnChanged(DISPID_READYSTATE);
}
@@ -1201,6 +1229,8 @@ END_MSG_MAP()
// If false, we tried but failed to fetch an IOleInPlaceFrame from our host.
// Cached here so we don't try to fetch it every time if we keep failing.
bool failed_to_fetch_in_place_frame_;
+ bool draw_sad_tab_;
+
ScopedComPtr<IOleInPlaceFrame> in_place_frame_;
// For more information on the ready_state_ property see:
@@ -1222,7 +1252,7 @@ END_MSG_MAP()
// Handle network requests when host network stack is used. Passed to the
// automation client on initialization.
- UrlmonUrlRequestManager url_fetcher_;
+ scoped_ptr<UrlmonUrlRequestManager> url_fetcher_;
};
#endif // CHROME_FRAME_CHROME_FRAME_ACTIVEX_BASE_H_