我试图阻止任何外部由TEmbeddedWB或TWebBrowser(或TCppWebBrowser)加载。 我想阻止从因特网包括图片,JavaScript,CSS外部,外部[嵌入]或[对象]或[功能]或[帧]或[IFRAME]装载任何东西,执行JavaScript可以加载外部内容等
这个问题由两个部分组成:
- 将web浏览器进入“限制所有”(除了没有图像基本的HTML),并且如果这样的内容存在检测
- 如果外部内容不存在好了,如果是,则呈现出“下载吧”的点击后使网页浏览器进入“下载所有”模式,并得到所有内容。
第一个项目的问题。 在TEmbeddedWB您可以使用DownloadOptions开关阻止几乎所有的东西,最重要的是ForceOffline开关,但即使这一切关掉它还是通过像一些事情[object]
或[iframe]
标签。 我知道这是因为我实现OnBeforeNavigate2事件的情况下,它会触发包含在这些标签的URL,它也使得日志本地服务器的条目。 设置OfflineMode
和ForceOfflineMode
在TEmbeddedWB不利于这些项目。
因此,如何我真的能阻止所有? 因此,它需要开始阻止外部元素,包括脚本和CSS作为基本的HTML。 是否有每次要下载任何东西,因此它可以被阻止或避免通过阻断所有外部下载首先触发该事件时触发一个事件的方法吗? 我需要与Internet Explorer区和安全摆弄? 在正确的方向上没有任何指针将是有益的。
第二项也是非常棘手,因为我需要检测,如果有问题的标签存在(如“小程序”,“脚本”,“链接”等,这种检测并不需要完美的,但它至少必须足够好,以覆盖。大多数这样的标签我已经做了这样的:
//----------------------------------------------------------------------
// Check for external content (images, scripts, ActiveX, frames...)
//----------------------------------------------------------------------
try
{
bool HasExternalContent = false;
DelphiInterface<IHTMLDocument2> diDoc; // Smart pointer wrapper - should automatically call release() and do reference counting
diDoc = TEmbeddedWB->Document;
DelphiInterface<IHTMLElementCollection> diColApplets; DelphiInterface<IDispatch> diDispApplets; DelphiInterface<IHTMLObjectElement> diObj;
DelphiInterface<IHTMLElementCollection> diColEmbeds; DelphiInterface<IDispatch> diDispEmbeds;
DelphiInterface<IHTMLFramesCollection2> diColFrames; DelphiInterface<IDispatch> diDispFrames;
DelphiInterface<IHTMLElementCollection> diColImages; DelphiInterface<IDispatch> diDispImages; DelphiInterface<IHTMLImgElement> diImg;
DelphiInterface<IHTMLElementCollection> diColLinks; DelphiInterface<IDispatch> diDispLinks;
DelphiInterface<IHTMLElementCollection> diColPlugins; DelphiInterface<IDispatch> diDispPlugins;
DelphiInterface<IHTMLElementCollection> diColScripts; DelphiInterface<IDispatch> diDispScripts;
DelphiInterface<IHTMLStyleSheetsCollection> diColStyleSheets; DelphiInterface<IDispatch> diDispStyleSheets;
OleCheck(diDoc->Get_applets (diColApplets));
OleCheck(diDoc->Get_embeds (diColEmbeds));
OleCheck(diDoc->Get_frames (diColFrames));
OleCheck(diDoc->Get_images (diColImages));
OleCheck(diDoc->Get_links (diColLinks));
OleCheck(diDoc->Get_plugins (diColPlugins));
OleCheck(diDoc->Get_scripts (diColScripts));
OleCheck(diDoc->Get_styleSheets (diColStyleSheets));
// Scan for applets external links
for (int i = 0; i < diColApplets->length; i++)
{
OleCheck(diColApplets->item(i,i,diDispApplets));
if (diDispApplets != NULL)
{
diDispApplets->QueryInterface(IID_IHTMLObjectElement, (void**)&diObj);
if (diObj != NULL)
{
UnicodeString s1 = Sysutils::Trim(diObj->data),
s2 = Sysutils::Trim(diObj->codeBase),
s3 = Sysutils::Trim(diObj->classid);
if (StartsText("http", s1) || StartsText("http", s2) || StartsText("http", s3))
{
HasExternalContent = true;
break; // At least 1 found, bar will be shown, no further search needed
}
}
}
}
// Scan for images external links
for (int i = 0; i < diColImages->length; i++)
{
OleCheck(diColImages->item(i,i,diDispImages));
if (diDispImages != NULL) // Unnecessary? OleCheck throws exception if this applies?
{
diDispImages->QueryInterface(IID_IHTMLImgElement, (void**)&diImg);
if (diImg != NULL)
{
UnicodeString s1 = Sysutils::Trim(diImg->src);
// Case insensitive check
if (StartsText("http", s1))
{
HasExternalContent = true;
break; // At least 1 found, bar will be shown, no further search needed
}
}
}
}
}
catch (Exception &e)
{
// triggered by OleCheck
ShowMessage(e.Message);
}
有没有扫描此更简单的方法或只有一个是运行使用其他接口功能的几个循环,如Get_applets
, Get_embeds
, Get_stylesheets
等类似上面的代码? 到目前为止,我发现我不得不调用以下功能涵盖所有的这样的:
OleCheck(diDoc->Get_applets (diColApplets));
OleCheck(diDoc->Get_embeds (diColEmbeds));
OleCheck(diDoc->Get_frames (diColFrames));
OleCheck(diDoc->Get_images (diColImages));
OleCheck(diDoc->Get_links (diColLinks));
OleCheck(diDoc->Get_plugins (diColPlugins));
OleCheck(diDoc->Get_scripts (diColScripts));
OleCheck(diDoc->Get_styleSheets (diColStyleSheets));
但我宁愿没有实现,很多循环是否可以这样处理更容易。 它可以?