Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: src/plugin/PluginClass.cpp

Issue 29332848: Issue #3432 - Manage COM events with a resource class
Left Patch Set: rebase, address comments Created Jan. 7, 2016, 4:21 p.m.
Right Patch Set: rebase only Created July 27, 2016, 8:55 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « src/plugin/PluginClass.h ('k') | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH 3 * Copyright (C) 2006-2016 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 #include "PluginStdAfx.h" 18 #include "PluginStdAfx.h"
19 19
20 #include "PluginClass.h" 20 #include "PluginClass.h"
21 #include "PluginSettings.h" 21 #include "PluginSettings.h"
22 #include "PluginSystem.h" 22 #include "PluginSystem.h"
23 #include "PluginFilter.h" 23 #include "PluginFilter.h"
24 #include "PluginMimeFilterClient.h" 24 #include "PluginMimeFilterClient.h"
25 #include "AdblockPlusClient.h" 25 #include "AdblockPlusClient.h"
26 #include "PluginClientBase.h" 26 #include "PluginClientBase.h"
27 #include "PluginClientFactory.h" 27 #include "PluginClientFactory.h"
28 #include "PluginUtil.h" 28 #include "PluginUtil.h"
29 #include "../shared/Utils.h" 29 #include "../shared/Utils.h"
30 #include "../shared/Dictionary.h" 30 #include "../shared/Dictionary.h"
31 #include "IeVersion.h" 31 #include "IeVersion.h"
32 #include "../shared/Version.h" 32 #include "../shared/Version.h"
33 #include "Instances.h"
33 #include <thread> 34 #include <thread>
34 #include <array> 35 #include <array>
35 36
36 #ifdef DEBUG_HIDE_EL 37 #ifdef DEBUG_HIDE_EL
37 DWORD profileTime = 0; 38 DWORD profileTime = 0;
38 #endif 39 #endif
39 40
40 extern CComModule _Module; 41 extern CComModule _Module;
41 42
42 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); 43 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR);
43 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR ECT); 44 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR ECT);
44 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); 45 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE);
45 46
46 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL }; 47 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL };
47 DWORD CPluginClass::s_hIconTypes[ICON_MAX] = { IDI_ICON_DISABLED, IDI_ICON_ENABL ED, IDI_ICON_DEACTIVATED }; 48 DWORD CPluginClass::s_hIconTypes[ICON_MAX] = { IDI_ICON_DISABLED, IDI_ICON_ENABL ED, IDI_ICON_DEACTIVATED };
48 uint32_t iconHeight = 32; 49 uint32_t iconHeight = 32;
49 uint32_t iconWidth = 32; 50 uint32_t iconWidth = 32;
50 51
51 CPluginMimeFilterClient* CPluginClass::s_mimeFilter = NULL; 52 CPluginMimeFilterClient* CPluginClass::s_mimeFilter = NULL;
52 53
53 CLOSETHEMEDATA pfnClose = NULL; 54 CLOSETHEMEDATA pfnClose = NULL;
54 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; 55 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL;
55 OPENTHEMEDATA pfnOpenThemeData = NULL; 56 OPENTHEMEDATA pfnOpenThemeData = NULL;
56 57
57 ATOM CPluginClass::s_atomPaneClass = NULL; 58 ATOM CPluginClass::s_atomPaneClass = NULL;
58 HINSTANCE CPluginClass::s_hUxtheme = NULL; 59 HINSTANCE CPluginClass::s_hUxtheme = NULL;
59 std::set<CPluginClass*> CPluginClass::s_instances; 60 std::set<CPluginClass*> CPluginClass::s_instances;
60 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances;
61 61
62 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; 62 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal;
63 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; 63 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow;
64 64
65 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; 65 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2;
66
67 namespace
68 {
69 /**
70 * A synchronized map whose key is always the current thread ID.
71 */
72 class CurrentThreadMap
73 : public SyncMap<DWORD, CPluginClass*, nullptr>
74 {
75 typedef SyncMap<DWORD, CPluginClass*, nullptr> Base;
76
77 public:
78 bool AddIfAbsent(CPluginClass* p)
79 {
80 return Base::AddIfAbsent(::GetCurrentThreadId(), p);
81 }
82
83 bool RemoveAndCheck()
84 {
85 return Base::RemoveIfPresent(::GetCurrentThreadId());
86 }
87
88 CPluginClass* Locate()
89 {
90 return Base::Locate(::GetCurrentThreadId());
91 }
92 };
93
94 /**
95 * Map from thread ID's to CPluginClass instances
96 */
97 CurrentThreadMap threadMap;
98 }
66 99
67 /* 100 /*
68 * Without namespace declaration, the identifier "Rectangle" is ambiguous 101 * Without namespace declaration, the identifier "Rectangle" is ambiguous
69 * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85) .aspx 102 * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85) .aspx
70 */ 103 */
71 namespace AdblockPlus 104 namespace AdblockPlus
72 { 105 {
73 /** 106 /**
74 * Replacement for ATL type CRect. 107 * Replacement for ATL type CRect.
75 */ 108 */
76 class Rectangle 109 class Rectangle
77 : public RECT 110 : public RECT
78 { 111 {
79 public: 112 public:
80 int Height() const 113 unsigned long Height() const
81 { 114 {
82 return bottom - top; 115 if (bottom < top)
83 } 116 {
84 117 throw std::runtime_error("invariant violation: rectangle bottom < top");
85 int Width() const 118 }
86 { 119 return static_cast<unsigned long>(bottom - top);
87 return right - left; 120 }
121
122 unsigned long Width() const
123 {
124 if (right < left)
125 {
126 throw std::runtime_error("invariant violation: rectangle right < left");
127 }
128 return static_cast<unsigned long>(right - left);
88 } 129 }
89 }; 130 };
90 } 131 }
91 132
92 CPluginClass::CPluginClass() 133 CPluginClass::CPluginClass()
93 : m_webBrowser2(nullptr), 134 : m_webBrowser2(nullptr),
94 detachedInitializationFailed(false) 135 detachedInitializationFailed(false)
95 { 136 {
96 DEBUG_GENERAL([this]() -> std::wstring 137 DEBUG_GENERAL([this]() -> std::wstring
97 { 138 {
98 std::wstring s = L"CPluginClass::<constructor>, this = "; 139 std::wstring s = L"CPluginClass::<constructor>, this = ";
99 s += ToHexLiteral(this); 140 s += ToHexLiteral(this);
100 return s; 141 return s;
101 }()); 142 }());
102 143
103 //Use this line to debug memory leaks 144 //Use this line to debug memory leaks
104 // _CrtDumpMemoryLeaks(); 145 // _CrtDumpMemoryLeaks();
105 146
106 m_hTabWnd = NULL; 147 m_hTabWnd = NULL;
107 m_hStatusBarWnd = NULL; 148 m_hStatusBarWnd = NULL;
108 m_hPaneWnd = NULL; 149 m_hPaneWnd = NULL;
109 m_nPaneWidth = 0; 150 m_nPaneWidth = 0;
110 m_pWndProcStatus = NULL; 151 m_pWndProcStatus = NULL;
111 m_hTheme = NULL; 152 m_hTheme = NULL;
112 m_isInitializedOk = false; 153 m_isInitializedOk = false;
113
114
115 m_tab = new CPluginTab(); 154 m_tab = new CPluginTab();
116
117 Dictionary::Create(GetBrowserLanguage()); 155 Dictionary::Create(GetBrowserLanguage());
118 } 156 }
119 157
120 CPluginClass::~CPluginClass() 158 CPluginClass::~CPluginClass()
121 { 159 {
122 DEBUG_GENERAL([this]() -> std::wstring 160 DEBUG_GENERAL([this]() -> std::wstring
123 { 161 {
124 std::wstring s = L"CPluginClass::<destructor>, this = "; 162 std::wstring s = L"CPluginClass::<destructor>, this = ";
125 s += ToHexLiteral(this); 163 s += ToHexLiteral(this);
126 return s; 164 return s;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 201
164 return browser; 202 return browser;
165 } 203 }
166 204
167 std::wstring CPluginClass::GetBrowserUrl() const 205 std::wstring CPluginClass::GetBrowserUrl() const
168 { 206 {
169 std::wstring url; 207 std::wstring url;
170 if (m_webBrowser2) 208 if (m_webBrowser2)
171 { 209 {
172 CComBSTR bstrURL; 210 CComBSTR bstrURL;
173 if (SUCCEEDED(m_webBrowser2->get_LocationURL(&bstrURL)) && bstrURL) 211 if (SUCCEEDED(m_webBrowser2->get_LocationURL(&bstrURL)))
174 { 212 {
175 url = std::wstring(bstrURL, SysStringLen(bstrURL)); 213 url = ToWstring(bstrURL);
176 } 214 }
177 } 215 }
178 else 216 else
179 { 217 {
180 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr owser2 == nullptr"); 218 DEBUG_GENERAL(L"CPluginClass::GetBrowserUrl - Reached with m_webBrowser2 == nullptr (probable invariant violation)");
219 }
220 if (url.empty())
221 {
181 url = m_tab->GetDocumentUrl(); 222 url = m_tab->GetDocumentUrl();
182 } 223 }
183 return url; 224 return url;
184 } 225 }
185 226
186 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) 227 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr)
187 { 228 {
188 if (thisPtr == NULL) 229 if (thisPtr == NULL)
189 return 0; 230 return 0;
190 auto self = static_cast<CPluginClass*>(thisPtr); 231 auto self = static_cast<CPluginClass*>(thisPtr);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p ointer to IWebBrowser2*"); 268 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p ointer to IWebBrowser2*");
228 } 269 }
229 DEBUG_GENERAL([this]() -> std::wstring 270 DEBUG_GENERAL([this]() -> std::wstring
230 { 271 {
231 std::wstringstream ss; 272 std::wstringstream ss;
232 ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); 273 ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this);
233 ss << L", browser = " << ToHexLiteral(m_webBrowser2); 274 ss << L", browser = " << ToHexLiteral(m_webBrowser2);
234 return ss.str(); 275 return ss.str();
235 }()); 276 }());
236 277
278 /*
279 * Add ourselves to the thread map.
280 */
281 if (!threadMap.AddIfAbsent(this))
282 {
283 throw std::logic_error("CPluginClass::SetSite - May not overwrite existi ng entry in thread map");
284 }
285
237 //register the mimefilter 286 //register the mimefilter
238 //and only mimefilter 287 //and only mimefilter
239 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread 288 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread
240 s_criticalSectionLocal.Lock(); 289 s_criticalSectionLocal.Lock();
241 { 290 {
242 // Always register on startup, then check if we need to unregister in a separate thread 291 // Always register on startup, then check if we need to unregister in a separate thread
243 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); 292 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
244 s_asyncWebBrowser2 = unknownSite; 293 s_asyncWebBrowser2 = unknownSite;
245 s_instances.insert(this); 294 s_instances.insert(this);
246 } 295 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 m_hPaneWnd = NULL; 336 m_hPaneWnd = NULL;
288 } 337 }
289 338
290 m_hTabWnd = NULL; 339 m_hTabWnd = NULL;
291 m_hStatusBarWnd = NULL; 340 m_hStatusBarWnd = NULL;
292 341
293 // Remove instance from the list, shutdown threads 342 // Remove instance from the list, shutdown threads
294 HANDLE hMainThread = NULL; 343 HANDLE hMainThread = NULL;
295 HANDLE hTabThread = NULL; 344 HANDLE hTabThread = NULL;
296 345
346 if (!threadMap.RemoveAndCheck())
347 {
348 throw std::logic_error("CPluginClass::SetSite - Missing entry in thread map");
349 }
350
297 s_criticalSectionLocal.Lock(); 351 s_criticalSectionLocal.Lock();
298 { 352 {
299 s_instances.erase(this); 353 s_instances.erase(this);
300
301 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::Ge tCurrentThreadId());
302 if (it != s_threadInstances.end())
303 {
304 s_threadInstances.erase(it);
305 }
306 if (s_instances.empty()) 354 if (s_instances.empty())
307 { 355 {
308 // TODO: Explicitly releasing a resource when a container becomes empt y looks like a job better suited for shared_ptr 356 // TODO: Explicitly releasing a resource when a container becomes empt y looks like a job better suited for shared_ptr
309 CPluginClientFactory::ReleaseMimeFilterClientInstance(); 357 CPluginClientFactory::ReleaseMimeFilterClientInstance();
310 } 358 }
311 } 359 }
312 s_criticalSectionLocal.Unlock(); 360 s_criticalSectionLocal.Unlock();
313 361
314 m_webBrowser2 = nullptr; 362 m_webBrowser2 = nullptr;
315 363
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 503
456 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; 504 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp;
457 if (!webBrowser) 505 if (!webBrowser)
458 { 506 {
459 return; 507 return;
460 } 508 }
461 if (!urlVariant || urlVariant->vt != VT_BSTR) 509 if (!urlVariant || urlVariant->vt != VT_BSTR)
462 { 510 {
463 return; 511 return;
464 } 512 }
465 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); 513 std::wstring url = ToWstring(urlVariant->bstrVal);
466 514
467 // If webbrowser2 is equal to top level browser (as set in SetSite), we are 515 // If webbrowser2 is equal to top level browser (as set in SetSite), we are
468 // navigating new page 516 // navigating new page
469 CPluginClient* client = CPluginClient::GetInstance(); 517 CPluginClient* client = CPluginClient::GetInstance();
470 if (url.find(L"javascript") == 0) 518 if (url.find(L"javascript") == 0)
471 { 519 {
472 } 520 }
473 else if (IsRootBrowser(webBrowser)) 521 else if (IsRootBrowser(webBrowser))
474 { 522 {
475 m_tab->OnNavigate(url); 523 m_tab->OnNavigate(url);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u nsigned long validFlagsMask) 585 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u nsigned long validFlagsMask)
538 { 586 {
539 if (detachedInitializationFailed) return; 587 if (detachedInitializationFailed) return;
540 try 588 try
541 { 589 {
542 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); 590 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)");
543 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL ECMDIDF_WINDOWSTATE_ENABLED) 591 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL ECMDIDF_WINDOWSTATE_ENABLED)
544 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA BLED); 592 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA BLED);
545 if (newtabshown) 593 if (newtabshown)
546 { 594 {
547 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find( GetCurrentThreadId()); 595 if (!m_isInitializedOk)
548 if (it == s_threadInstances.end()) 596 {
549 { 597 m_isInitializedOk = true;
550 s_threadInstances[::GetCurrentThreadId()] = this; 598 InitObject();
551 if (!m_isInitializedOk) 599 UpdateStatusBar();
552 {
553 m_isInitializedOk = true;
554 InitObject();
555 UpdateStatusBar();
556 }
557 } 600 }
558 } 601 }
559 notificationMessage.Hide(); 602 notificationMessage.Hide();
560 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); 603 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end");
561 } 604 }
562 catch (...) 605 catch (...)
563 { 606 {
564 } 607 }
565 } 608 }
566 609
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
954 s_criticalSectionLocal.Unlock(); 997 s_criticalSectionLocal.Unlock();
955 998
956 return result; 999 return result;
957 } 1000 }
958 1001
959 CPluginTab* CPluginClass::GetTab() 1002 CPluginTab* CPluginClass::GetTab()
960 { 1003 {
961 return m_tab; 1004 return m_tab;
962 } 1005 }
963 1006
964 CPluginTab* CPluginClass::GetTab(DWORD dwThreadId) 1007 CPluginTab* CPluginClass::GetTabForCurrentThread()
965 { 1008 {
966 CPluginTab* tab = NULL; 1009 auto p = threadMap.Locate();
967 1010 return p ? p->m_tab : nullptr;
968 s_criticalSectionLocal.Lock();
969 {
970 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(dw ThreadId);
971 if (it != s_threadInstances.end())
972 {
973 tab = it->second->m_tab;
974 }
975 }
976 s_criticalSectionLocal.Unlock();
977
978 return tab;
979 } 1011 }
980 1012
981 // Entry point 1013 // Entry point
982 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O LECMD prgCmds[], OLECMDTEXT* pCmdText) 1014 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O LECMD prgCmds[], OLECMDTEXT* pCmdText)
983 { 1015 {
984 if (detachedInitializationFailed) return S_OK; 1016 if (detachedInitializationFailed) return S_OK;
985 try 1017 try
986 { 1018 {
987 if (cCmds == 0) return E_INVALIDARG; 1019 if (cCmds == 0) return E_INVALIDARG;
988 if (prgCmds == 0) return E_POINTER; 1020 if (prgCmds == 0) return E_POINTER;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 1168
1137 MENUITEMINFOW miiSep = {}; 1169 MENUITEMINFOW miiSep = {};
1138 miiSep.cbSize = sizeof(miiSep); 1170 miiSep.cbSize = sizeof(miiSep);
1139 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; 1171 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE;
1140 miiSep.fType = MFT_SEPARATOR; 1172 miiSep.fType = MFT_SEPARATOR;
1141 1173
1142 CPluginClient* client = CPluginClient::GetInstance(); 1174 CPluginClient* client = CPluginClient::GetInstance();
1143 CPluginSettings* settings = CPluginSettings::GetInstance(); 1175 CPluginSettings* settings = CPluginSettings::GetInstance();
1144 { 1176 {
1145 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); 1177 ctext = dictionary->Lookup("menu", "menu-disable-on-site");
1146 // Is domain in white list?
1147 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url)); 1178 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url));
1148 if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl())) 1179 /*
1149 { 1180 * The display state of the "disable on this site" menu item depends upon ta b content
1181 */
1182 if (!GetTab()->IsPossibleToDisableOnSite())
1183 {
1184 // Since we can't disable the present content,
1185 // it makes no sense to offer the user an option to block it.
1186 fmii.fState = MFS_UNCHECKED | MFS_DISABLED;
1187 }
1188 else if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl()))
1189 {
1190 // Domain is in white list, indicated by a check mark
1150 fmii.fState = MFS_CHECKED | MFS_ENABLED; 1191 fmii.fState = MFS_CHECKED | MFS_ENABLED;
1151 } 1192 }
1152 else 1193 else
1153 { 1194 {
1154 fmii.fState = MFS_UNCHECKED | MFS_ENABLED; 1195 fmii.fState = MFS_UNCHECKED | MFS_ENABLED;
1155 } 1196 }
1156 fmii.fMask = MIIM_STRING | MIIM_STATE; 1197 fmii.fMask = MIIM_STRING | MIIM_STATE;
1157 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); 1198 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str());
1158 fmii.cch = static_cast<UINT>(ctext.size()); 1199 fmii.cch = static_cast<UINT>(ctext.size());
1159 1200
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 } 1413 }
1373 return ::CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wParam, lPara m); 1414 return ::CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wParam, lPara m);
1374 } 1415 }
1375 1416
1376 1417
1377 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url) 1418 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url)
1378 { 1419 {
1379 // use the disable icon as defualt, if the client doesn't exists 1420 // use the disable icon as defualt, if the client doesn't exists
1380 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); 1421 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED);
1381 1422
1382 CPluginTab* tab = GetTab(::GetCurrentThreadId()); 1423 CPluginTab* tab = GetTabForCurrentThread();
1383 if (tab) 1424 if (tab)
1384 { 1425 {
1385 CPluginClient* client = CPluginClient::GetInstance(); 1426 CPluginClient* client = CPluginClient::GetInstance();
1386 if (CPluginSettings::GetInstance()->IsPluginEnabled()) 1427 if (CPluginSettings::GetInstance()->IsPluginEnabled())
1387 { 1428 {
1388 if (client->IsWhitelistedUrl(url)) 1429 if (client->IsWhitelistedUrl(url))
1389 { 1430 {
1390 hIcon = GetIcon(ICON_PLUGIN_DISABLED); 1431 hIcon = GetIcon(ICON_PLUGIN_DISABLED);
1391 } 1432 }
1392 else 1433 else
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1536 pClass->DisplayPluginMenu(hMenu, -1, pt, TPM_LEFTALIGN | TPM_BOTTOMALIGN ); 1577 pClass->DisplayPluginMenu(hMenu, -1, pt, TPM_LEFTALIGN | TPM_BOTTOMALIGN );
1537 break; 1578 break;
1538 } 1579 }
1539 case WM_DESTROY: 1580 case WM_DESTROY:
1540 break; 1581 break;
1541 case SC_CLOSE: 1582 case SC_CLOSE:
1542 break; 1583 break;
1543 1584
1544 case WM_UPDATEUISTATE: 1585 case WM_UPDATEUISTATE:
1545 { 1586 {
1546 CPluginTab* tab = GetTab(::GetCurrentThreadId()); 1587 CPluginTab* tab = GetTabForCurrentThread();
1547 if (tab) 1588 if (tab)
1548 { 1589 {
1549 tab->OnActivate(); 1590 tab->OnActivate();
1550 RECT rect; 1591 RECT rect;
1551 GetWindowRect(pClass->m_hPaneWnd, &rect); 1592 GetWindowRect(pClass->m_hPaneWnd, &rect);
1552 pClass->notificationMessage.Move(rect.left + (rect.right - rect.left) / 2, rect.top + (rect.bottom - rect.top) / 2); 1593 pClass->notificationMessage.MoveToCenter(rect);
1553 } 1594 }
1554 if (LOWORD(wParam) == UIS_CLEAR) 1595 if (LOWORD(wParam) == UIS_CLEAR)
1555 { 1596 {
1556 pClass->notificationMessage.Hide(); 1597 pClass->notificationMessage.Hide();
1557 } 1598 }
1558 break; 1599 break;
1559 } 1600 }
1560 case WM_WINDOWPOSCHANGING: 1601 case WM_WINDOWPOSCHANGING:
1561 { 1602 {
1562 RECT rect; 1603 RECT rect;
1563 GetWindowRect(pClass->m_hPaneWnd, &rect); 1604 GetWindowRect(pClass->m_hPaneWnd, &rect);
1564 if (pClass->notificationMessage.IsVisible()) 1605 if (pClass->notificationMessage.IsVisible())
1565 { 1606 {
1566 pClass->notificationMessage.Move(rect.left + (rect.right - rect.left) / 2, rect.top + (rect.bottom - rect.top) / 2); 1607 pClass->notificationMessage.MoveToCenter(rect);
1567 } 1608 }
1568 break; 1609 break;
1569 } 1610 }
1570 case WM_WINDOWPOSCHANGED: 1611 case WM_WINDOWPOSCHANGED:
1571 { 1612 {
1572 WINDOWPOS* wndPos = reinterpret_cast<WINDOWPOS*>(lParam); 1613 WINDOWPOS* wndPos = reinterpret_cast<WINDOWPOS*>(lParam);
1573 if (wndPos->flags & SWP_HIDEWINDOW) 1614 if (wndPos->flags & SWP_HIDEWINDOW)
1574 { 1615 {
1575 pClass->notificationMessage.Hide(); 1616 pClass->notificationMessage.Hide();
1576 } 1617 }
1577 break; 1618 break;
1578 } 1619 }
1579 case WM_ALREADY_UP_TO_DATE: 1620 case WM_ALREADY_UP_TO_DATE:
1580 { 1621 {
1581 Dictionary* dictionary = Dictionary::GetInstance(); 1622 Dictionary* dictionary = Dictionary::GetInstance();
1582 std::wstring upToDateText = dictionary->Lookup("updater", "update-alread y-up-to-date-text"); 1623 std::wstring upToDateText = dictionary->Lookup("updater", "update-alread y-up-to-date-text");
1583 std::wstring upToDateTitle = dictionary->Lookup("updater", "update-alrea dy-up-to-date-title"); 1624 std::wstring upToDateTitle = dictionary->Lookup("updater", "update-alrea dy-up-to-date-title");
1584 pClass->notificationMessage.SetTextAndIcon(upToDateText, upToDateTitle, TTI_INFO); 1625 pClass->notificationMessage.SetTextAndIcon(upToDateText, upToDateTitle, TTI_INFO);
1585 break; 1626 break;
1586 } 1627 }
1587 case WM_UPDATE_CHECK_ERROR: 1628 case WM_UPDATE_CHECK_ERROR:
1588 { 1629 {
1589 Dictionary* dictionary = Dictionary::GetInstance(); 1630 Dictionary* dictionary = Dictionary::GetInstance();
1590 std::wstring errorText = dictionary->Lookup("updater", "update-error-tex t"); 1631 std::wstring errorText = dictionary->Lookup("updater", "update-error-tex t");
1591 std::wstring errorTitle = dictionary->Lookup("updater", "update-error-ti tle"); 1632 std::wstring errorTitle = dictionary->Lookup("updater", "update-error-ti tle");
1592 pClass->notificationMessage.SetTextAndIcon(errorText, errorText, TTI_ERR OR); 1633 pClass->notificationMessage.SetTextAndIcon(errorText, errorTitle, TTI_ER ROR);
1593 break; 1634 break;
1594 } 1635 }
1595 case WM_DOWNLOADING_UPDATE: 1636 case WM_DOWNLOADING_UPDATE:
1596 { 1637 {
1597 Dictionary* dictionary = Dictionary::GetInstance(); 1638 Dictionary* dictionary = Dictionary::GetInstance();
1598 std::wstring downloadingText = dictionary->Lookup("updater", "downloadin g-update-text"); 1639 std::wstring downloadingText = dictionary->Lookup("updater", "downloadin g-update-text");
1599 std::wstring downloadingTitle = dictionary->Lookup("updater", "downloadi ng-update-title"); 1640 std::wstring downloadingTitle = dictionary->Lookup("updater", "downloadi ng-update-title");
1600 pClass->notificationMessage.SetTextAndIcon(downloadingText, downloadingT itle, TTI_INFO); 1641 pClass->notificationMessage.SetTextAndIcon(downloadingText, downloadingT itle, TTI_INFO);
1601 break; 1642 break;
1602 } 1643 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 s_criticalSectionLocal.Unlock(); 1687 s_criticalSectionLocal.Unlock();
1647 1688
1648 return icon; 1689 return icon;
1649 } 1690 }
1650 1691
1651 ATOM CPluginClass::GetAtomPaneClass() 1692 ATOM CPluginClass::GetAtomPaneClass()
1652 { 1693 {
1653 return s_atomPaneClass; 1694 return s_atomPaneClass;
1654 } 1695 }
1655 1696
LEFTRIGHT

Powered by Google App Engine
This is Rietveld