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

Side by Side Diff: src/plugin/PluginWbPassThrough.cpp

Issue 5231751647461376: Issue 1264 - Generate custom response for subdocument on subdomain request (Closed)
Patch Set: Created Sept. 5, 2014, 3:16 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/plugin/PluginWbPassThrough.h ('k') | src/plugin/SinkPolicy.inl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include "PluginStdAfx.h" 1 #include "PluginStdAfx.h"
2 2
3 #include "PluginWbPassThrough.h" 3 #include "PluginWbPassThrough.h"
4 #include "PluginClient.h" 4 #include "PluginClient.h"
5 #include "PluginClientFactory.h" 5 #include "PluginClientFactory.h"
6 #ifdef SUPPORT_FILTER 6 #ifdef SUPPORT_FILTER
7 #include "PluginFilter.h" 7 #include "PluginFilter.h"
8 #endif 8 #endif
9 #include "PluginSettings.h" 9 #include "PluginSettings.h"
10 #include "PluginClass.h" 10 #include "PluginClass.h"
11 #include "PluginSystem.h" 11 #include "PluginSystem.h"
12 12
13 #include "wtypes.h" 13 #include "wtypes.h"
14 14
15 EXTERN_C IMAGE_DOS_HEADER __ImageBase; 15 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
16 16
17 17 namespace
18 {
19 std::string g_myPageBlocked = "<!DOCTYPE html>"
20 "<html>"
21 "<body>"
22 "<!-- blocked by AdblockPlus -->"
23 "</body>"
24 "</html>";
25 }
18 26
19 int WBPassthruSink::GetContentTypeFromMimeType(CString mimeType) 27 int WBPassthruSink::GetContentTypeFromMimeType(CString mimeType)
20 { 28 {
21 if (mimeType.Find(L"image/") >= 0) 29 if (mimeType.Find(L"image/") >= 0)
22 { 30 {
23 return CFilter::contentTypeImage; 31 return CFilter::contentTypeImage;
24 } 32 }
25 if (mimeType.Find(L"text/css") >= 0) 33 if (mimeType.Find(L"text/css") >= 0)
26 { 34 {
27 return CFilter::contentTypeStyleSheet; 35 return CFilter::contentTypeStyleSheet;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 return contentType; 116 return contentType;
109 } 117 }
110 118
111 //////////////////////////////////////////////////////////////////////////////// //////// 119 //////////////////////////////////////////////////////////////////////////////// ////////
112 //WBPassthruSink 120 //WBPassthruSink
113 //Monitor and/or cancel every request and responde 121 //Monitor and/or cancel every request and responde
114 //WB makes, including images, sounds, scripts, etc 122 //WB makes, including images, sounds, scripts, etc
115 //////////////////////////////////////////////////////////////////////////////// //////// 123 //////////////////////////////////////////////////////////////////////////////// ////////
116 HRESULT WBPassthruSink::OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSin k, 124 HRESULT WBPassthruSink::OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSin k,
117 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HAN DLE_PTR dwReserved, 125 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HAN DLE_PTR dwReserved,
118 IInternetProtocol* pTargetProtocol) 126 IInternetProtocol* pTargetProtocol, bool& handle d)
119 { 127 {
120
121 m_pTargetProtocol = pTargetProtocol; 128 m_pTargetProtocol = pTargetProtocol;
122 bool isBlocked = false; 129 bool isBlocked = false;
123 m_shouldBlock = false; 130 m_currentPositionOfSentPage = 0;
124 m_lastDataReported = false;
125 CString src; 131 CString src;
126 src.Append(szUrl); 132 src.Append(szUrl);
127 DEBUG_GENERAL(src); 133 DEBUG_GENERAL(src);
128 CPluginClient::UnescapeUrl(src); 134 CPluginClient::UnescapeUrl(src);
129 135
130 CString boundDomain; 136 CString boundDomain;
131 CString mimeType; 137 CString mimeType;
132 LPOLESTR mime[10]; 138 LPOLESTR mime[10];
133 if (pOIBindInfo) 139 if (pOIBindInfo)
134 { 140 {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 } 236 }
231 else 237 else
232 { 238 {
233 CPluginDebug::DebugResultIgnoring(type, src, boundDomain); 239 CPluginDebug::DebugResultIgnoring(type, src, boundDomain);
234 } 240 }
235 #endif 241 #endif
236 242
237 //Fixes the iframe back button issue 243 //Fixes the iframe back button issue
238 if (client->GetIEVersion() > 6) 244 if (client->GetIEVersion() > 6)
239 { 245 {
240 if ((contentType == CFilter::contentTypeImage) && (isBlocked)) 246 if (contentType == CFilter::contentTypeImage && isBlocked)
241 { 247 {
242 m_shouldBlock = true;
243 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); 248 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol);
244 249 handled = true;
250 // IE shows a cross that img is not loaded
245 return INET_E_REDIRECT_FAILED; 251 return INET_E_REDIRECT_FAILED;
246
247 } 252 }
248 if (((contentType == CFilter::contentTypeSubdocument))&& (isBlocked)) 253 if (contentType == CFilter::contentTypeSubdocument && isBlocked)
249 { 254 {
250 m_shouldBlock = true; 255 PassthroughAPP::CustomSinkStartPolicy<WBPassthru, WBPassthruSink>::GetProt ocol(this)->m_shouldSupplyCustomContent = true;
251 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); 256 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol);
252 257
253 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/html"); 258 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/html");
254 259 m_spInternetProtocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION, 0, static _cast<ULONG>(g_myPageBlocked.size()));
255 //Here we check if we are running on Windows 8 Consumer Preview. 260 handled = true;
256 //For some reason on that environment the next line causes IE to crash 261 return S_OK;
257 if (CPluginSettings::GetInstance()->GetWindowsBuildNumber() != 8250)
258 {
259 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECT_FAILED, 0, szUrl) ;
260 }
261
262 return INET_E_REDIRECT_FAILED;
263 } 262 }
264 if (((contentType == CFilter::contentTypeScript)) && (isBlocked)) 263 if (contentType == CFilter::contentTypeScript && isBlocked)
265 { 264 {
266 m_shouldBlock = true;
267 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); 265 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol);
268 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/javascript"); 266 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/javascript");
269 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); 267 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:");
268 handled = true;
270 return INET_E_REDIRECT_FAILED; 269 return INET_E_REDIRECT_FAILED;
271 } 270 }
272 if ((contentType == CFilter::contentTypeXmlHttpRequest) && (isBlocked)) 271 if (contentType == CFilter::contentTypeXmlHttpRequest && isBlocked)
273 { 272 {
274 m_shouldBlock = true;
275 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); 273 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol);
276 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); 274 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:");
275 handled = true;
277 return INET_E_REDIRECT_FAILED; 276 return INET_E_REDIRECT_FAILED;
278 } 277 }
279 if ((isBlocked)) 278 if (isBlocked)
280 { 279 {
281 m_shouldBlock = true;
282 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); 280 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol);
283 m_spInternetProtocolSink->ReportResult(S_FALSE, 0, L""); 281 m_spInternetProtocolSink->ReportResult(S_FALSE, 0, L"");
284 282 handled = true;
285 return INET_E_REDIRECT_FAILED; 283 return INET_E_REDIRECT_FAILED;
286 } 284 }
287 } 285 }
288 #endif // SUPPORT_FILTER 286 #endif // SUPPORT_FILTER
289 287
290 return isBlocked ? S_FALSE : BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInf o, grfPI, dwReserved, pTargetProtocol); 288 return isBlocked ? S_FALSE : BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInf o, grfPI, dwReserved, pTargetProtocol);
291 } 289 }
292 290
293 291
294 HRESULT WBPassthruSink::Read(void *pv, ULONG cb, ULONG* pcbRead) 292 HRESULT WBPassthruSink::OnRead(void* pv, ULONG cb, ULONG* pcbRead)
295 { 293 {
296 if (m_shouldBlock) 294 if (nullptr == pv) {
295 return E_POINTER;
296 }
297 if (nullptr == pcbRead) {
298 return E_POINTER;
299 }
300 *pcbRead = 0;
301
302 if (PassthroughAPP::CustomSinkStartPolicy<WBPassthru, WBPassthruSink>::GetProt ocol(this)->m_shouldSupplyCustomContent)
297 { 303 {
298 *pcbRead = 0; 304 ULONG myPageSize = static_cast<ULONG>(g_myPageBlocked.size());
299 if (!m_lastDataReported) 305 auto positionGrow = std::min<ULONG>(cb, static_cast<ULONG>(g_myPageBlocked.s ize() - m_currentPositionOfSentPage));
300 { 306 if (0 == positionGrow) {
301 if (cb <= 1) 307 return S_FALSE;
302 { 308 }
303 //IE must've gone nuts if this happened, but let's be cool about it and report we have no more data 309 std::copy(g_myPageBlocked.begin(), g_myPageBlocked.begin() + positionGrow,
304 m_spInternetProtocolSink->ReportResult(S_FALSE, 0, NULL); 310 stdext::make_checked_array_iterator(static_cast<char*>(pv), cb));
305 return S_FALSE; 311 *pcbRead = positionGrow;
306 } 312 m_currentPositionOfSentPage += positionGrow;
307 *pcbRead = 1;
308 memcpy(pv, " ", 1);
309 313
310 if (m_spInternetProtocolSink != NULL) 314 if (m_spInternetProtocolSink) {
311 { 315 m_spInternetProtocolSink->ReportData(BSCF_INTERMEDIATEDATANOTIFICATION,
312 m_spInternetProtocolSink->ReportResult(S_OK, 0, NULL); 316 static_cast<ULONG>(m_currentPositionOfSentPage), myPageSize);
313 } 317 }
314 m_lastDataReported = true; 318 if (myPageSize == m_currentPositionOfSentPage && m_spInternetProtocolSink) {
315 m_shouldBlock = false; 319 m_spInternetProtocolSink->ReportData(BSCF_DATAFULLYAVAILABLE, myPageSize, myPageSize);
316 return S_OK; 320 m_spInternetProtocolSink->ReportResult(S_OK, 0, nullptr);
317 } 321 }
318 return S_OK; 322 return S_OK;
319 } 323 }
320 else 324 return m_pTargetProtocol->Read(pv, cb, pcbRead);
321 {
322
323 return m_pTargetProtocol->Read(pv, cb, pcbRead);
324 }
325 return S_OK;
326 } 325 }
327 STDMETHODIMP WBPassthruSink::Switch( 326 STDMETHODIMP WBPassthruSink::Switch(
328 /* [in] */ PROTOCOLDATA *pProtocolData) 327 /* [in] */ PROTOCOLDATA *pProtocolData)
329 { 328 {
330 ATLASSERT(m_spInternetProtocolSink != 0); 329 ATLASSERT(m_spInternetProtocolSink != 0);
331 330
332 /* 331 /*
333 From Igor Tandetnik "itandetnik@mvps.org" 332 From Igor Tandetnik "itandetnik@mvps.org"
334 " 333 "
335 Beware multithreading. URLMon has this nasty habit of spinning worker 334 Beware multithreading. URLMon has this nasty habit of spinning worker
336 threads, not even bothering to initialize COM on them, and calling APP 335 threads, not even bothering to initialize COM on them, and calling APP
337 methods on those threads. If you try to raise COM events directly from 336 methods on those threads. If you try to raise COM events directly from
338 such a thread, bad things happen (random crashes, events being lost). 337 such a thread, bad things happen (random crashes, events being lost).
339 You are only guaranteed to be on the main STA thread in two cases. 338 You are only guaranteed to be on the main STA thread in two cases.
340 First, in methods of interfaces that were obtained with 339 First, in methods of interfaces that were obtained with
341 IServiceProvider, such as IHttpNegotiage::BeginningTransaction or 340 IServiceProvider, such as IHttpNegotiage::BeginningTransaction or
342 IAuthenticate::Authenticate. Second, you can call 341 IAuthenticate::Authenticate. Second, you can call
343 IInternetProtocolSink::Switch with PD_FORCE_SWITCH flag in 342 IInternetProtocolSink::Switch with PD_FORCE_SWITCH flag in
344 PROTOCOLDATA::grfFlags, eventually URLMon will turn around and call 343 PROTOCOLDATA::grfFlags, eventually URLMon will turn around and call
345 IInternetProtocol::Continue on the main thread. 344 IInternetProtocol::Continue on the main thread.
346 345
347 Or, if you happen to have a window handy that was created on the main 346 Or, if you happen to have a window handy that was created on the main
348 thread, you can post yourself a message. 347 thread, you can post yourself a message.
349 " 348 "
350 */ 349 */
351 return m_spInternetProtocolSink ? m_spInternetProtocolSink->Switch(pProtocolDa ta) : E_UNEXPECTED; 350 return m_spInternetProtocolSink ? m_spInternetProtocolSink->Switch(pProtocolDa ta) : E_UNEXPECTED;
352 } 351 }
353 352
354
355 STDMETHODIMP WBPassthruSink::BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeade rs, DWORD dwReserved, LPWSTR *pszAdditionalHeaders) 353 STDMETHODIMP WBPassthruSink::BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeade rs, DWORD dwReserved, LPWSTR *pszAdditionalHeaders)
356 { 354 {
357 if (pszAdditionalHeaders) 355 if (pszAdditionalHeaders)
358 { 356 {
359 *pszAdditionalHeaders = 0; 357 *pszAdditionalHeaders = 0;
360 } 358 }
361 359
362 CComPtr<IHttpNegotiate> spHttpNegotiate; 360 CComPtr<IHttpNegotiate> spHttpNegotiate;
363 QueryServiceFromClient(&spHttpNegotiate); 361 QueryServiceFromClient(&spHttpNegotiate);
364 return spHttpNegotiate ? spHttpNegotiate->BeginningTransaction(szURL, szHeader s,dwReserved, pszAdditionalHeaders) : S_OK; 362 return spHttpNegotiate ? spHttpNegotiate->BeginningTransaction(szURL, szHeader s,dwReserved, pszAdditionalHeaders) : S_OK;
(...skipping 10 matching lines...) Expand all
375 QueryServiceFromClient(&spHttpNegotiate); 373 QueryServiceFromClient(&spHttpNegotiate);
376 374
377 return spHttpNegotiate ? spHttpNegotiate->OnResponse(dwResponseCode, szRespons eHeaders, szRequestHeaders, pszAdditionalRequestHeaders) : S_OK; 375 return spHttpNegotiate ? spHttpNegotiate->OnResponse(dwResponseCode, szRespons eHeaders, szRequestHeaders, pszAdditionalRequestHeaders) : S_OK;
378 } 376 }
379 377
380 STDMETHODIMP WBPassthruSink::ReportProgress(ULONG ulStatusCode, LPCWSTR szStatus Text) 378 STDMETHODIMP WBPassthruSink::ReportProgress(ULONG ulStatusCode, LPCWSTR szStatus Text)
381 { 379 {
382 return m_spInternetProtocolSink ? m_spInternetProtocolSink->ReportProgress(ulS tatusCode, szStatusText) : S_OK; 380 return m_spInternetProtocolSink ? m_spInternetProtocolSink->ReportProgress(ulS tatusCode, szStatusText) : S_OK;
383 } 381 }
384 382
383 WBPassthru::WBPassthru()
384 : m_shouldSupplyCustomContent(false)
385 {
386 }
385 387
386 STDMETHODIMP WBPassthru::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink , 388 STDMETHODIMP WBPassthru::Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink ,
387 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) 389 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
388 { 390 {
389 ATLASSERT(m_spInternetProtocol != 0); 391 ATLASSERT(m_spInternetProtocol != 0);
390 if (!m_spInternetProtocol) 392 if (!m_spInternetProtocol)
391 { 393 {
392 return E_UNEXPECTED; 394 return E_UNEXPECTED;
393 } 395 }
394 396
395 return OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, 397 return OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, m_spInterne tProtocol);
396 dwReserved, m_spInternetProtocol);
397 } 398 }
398 399
399 STDMETHODIMP WBPassthru::Read(»/* [in, out] */ void *pv,/* [in] */ ULONG cb,/* [out] */ ULONG *pcbRead) 400 STDMETHODIMP WBPassthru::Read(/* [in, out] */ void *pv,/* [in] */ ULONG cb,/* [o ut] */ ULONG *pcbRead)
400 { 401 {
401 402 WBPassthruSink* pSink = GetSink();
402 WBPassthruSink* pSink = GetSink(); 403 return pSink->OnRead(pv, cb, pcbRead);
403 return pSink->Read(pv, cb, pcbRead); 404 }
404 } 405
406 STDMETHODIMP WBPassthru::LockRequest(/* [in] */ DWORD options)
407 {
408 if (m_shouldSupplyCustomContent)
409 {
410 return S_OK;
411 }
412 return PassthroughAPP::CInternetProtocol<WBStartPolicy>::LockRequest(options);
413 }
414
415 STDMETHODIMP WBPassthru::UnlockRequest()
416 {
417 if (m_shouldSupplyCustomContent)
418 {
419 return S_OK;
420 }
421 return PassthroughAPP::CInternetProtocol<WBStartPolicy>::UnlockRequest();
422 }
OLDNEW
« no previous file with comments | « src/plugin/PluginWbPassThrough.h ('k') | src/plugin/SinkPolicy.inl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld