检测MATLAB帮助浏览器

5
我想为一个大型MATLAB应用程序创建一些HTML文档,主要在MATLAB帮助浏览器中查看,在11b及以上版本的任何MATLAB版本中都可以查看。这将有一些自定义CSS(但没有什么非常复杂的)。
然而,我也希望同样的文档可以在其他浏览器中查看。我关心Chrome和IE9和10,尽管支持其他浏览器也会很受欢迎。我希望文档在所有浏览器中基本上看起来相同,包括MATLAB帮助浏览器,但在MATLAB帮助浏览器中以几种方式看起来不同-特别是,我希望matlab:链接显示和行为不同,因为它们在MATLAB帮助浏览器外不受支持。
问题1:即使是1,我也遇到了困难,因为尽管我的CSS非常简单,但MATLAB帮助浏览器似乎在支持CSS的部分方面不可预测,并且在MATLAB版本之间差异很大。我猜它根本没有记录。有人对在MATLAB帮助浏览器中使用CSS有任何经验/技巧吗?
问题2:我希望能够自动检测查看浏览器是否支持matlab:协议,但从浏览其他StackOverflow答案来看,这似乎是不可能的。鉴于我需要支持Chrome,甚至无法尝试跟随matlab:链接并检测是否失败,因为显然Chrome会默默失败。噫。所以我的下一个想法是使用JavaScript检测浏览器的UserAgent。MATLAB 11b将自己报告为带有ICEbrowser的Mozilla4.0,而13a则提供带有Trident6的Mozilla4.0。我不完全确定这些是什么-我猜它们是第三方基于Java的浏览器组件,类似于Mozilla,并且MathWorks已经在11b和13a之间更改了组件。
如果我检测到UserAgent并假设包含字符串ICEBrowserTrident的任何内容对于大多数目的来说足够区分MATLAB帮助浏览器吗?显然,我必须跟上发布13a后的UserAgent字符串。
感谢您的建议!
3个回答

3
冰浏览器是一个支持html/javascript的java html渲染器。从2012b开始,主要帮助和从2013a开始的“补充软件”帮助已经切换到客户端,该客户端是围绕本机浏览器的薄jni包装器,因此您可以在Windows上获得Trident(= Internet Explorer),在Mac上获得Webkit(= Safari)以及在Linux上获得Gecko(= Firefox)。不幸的是,他们没有更改用户代理以具有任何明显的东西,如matlab
这意味着从2013a开始,我们可以使用css / javascript渲染和真正的浏览器功能,但会遇到在开放网络上所具有的所有跨浏览器问题。而在2013a之前,浏览器功能受到了更大的限制,但只需要担心一个浏览器。
我自己也在寻找可靠的检测matlab协议是否受支持的方法,但我发现的只有你的问题:-)

3

Matlab帮助浏览器的功能因不同的Matlab版本、不同的操作系统甚至不同的架构而大不相同(最近的64位版本经常有特别糟糕的浏览器)。

我们使用用户代理来提供针对MATLAB的特定网页。以下是其中一些页面的列表:

R2010b/R2011b, 32bit, WinXP:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060705

R2010b/R2011b, 32bit, Win7:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8) Gecko/20060705

R2010b, 64bit, Win7:
Mozilla/5.0 (Java 1.6.0_17; Windows 7 6.1 amd64; de_DE) ICEbrowser/v6_0_2

R2011b, 64bit, Win7:
Mozilla/5.0 (Java 1.6.0_17; Windows 7 6.1 amd64; de_DE) ICEbrowser/v6_0_2

R2012a, 32bit, Win7:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko

R2012a, 32bit, WinXP:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko

R2012a, 64bit, Win7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2;     .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)

R2012b, 32bit, Win7:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko

R2012b, 64bit, Win7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2;     .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)

R2010b, 32bit, Linux:
Mozilla/5.0 (Java 1.6.0_17; Linux 2.6.32-33-generic i386; en_US) ICEbrowser/v6_0_2

请注意,您不能简单地对这些进行字符串比较,因为字符串的某些部分会根据客户端机器(例如语言代码)而更改。
还要注意,除了呈现HTML和CSS之外,其他功能差异很大。特别是对JavaScript和HTTP身份验证的支持。

1
我知道这个问题已经有一段时间了,但我们也有类似的愿望来检测MATLAB内部Web浏览器。在我们的情况下,我们希望只在使用MATLAB内部浏览器时显示matlab:协议edit/opentoline链接(因为它们在Web浏览器中不起作用)。
我们发现用户代理字符串是完全无用的 - 在旧版本的MATLAB中,MATLAB使用了自己的Homebrew浏览器,其用户代理无用,然后在后来的版本中切换到基于Chromium的浏览器(jxbrowser)。
在寻找识别方法时,我偶然发现浏览器无法处理URLSearchParams java调用 - 就像IE一样,它会触发一个异常。查看这里,似乎大多数Web浏览器都支持它,但Opera Mini和IE等著名浏览器除外(尽管我们可以通过其他方式识别它们)。当然,这并非百分之百可靠。它可能会在不常见的浏览器上出现误报(可能性较大),或者如果MATLAB实现对其的支持,则可能停止工作(不太可能)。然而,到目前为止,它似乎在MATLAB版本R2013a到R2019a中有效(没有安装更新版本进行测试)。 更新:在R2019a和R2022a之间的某个地方,他们从jxbrowser改变为JCEF。我修改了检测代码,加入了一个对JCEF的检查,如果存在,则认为它在MATLAB中。这使它能够在R2022a中使用(不确定中间版本是否可以)。同样,这打开了误报的可能性,但仍然比没有好。
function isMatlabBrowser() {
    try {
        if(window.operamini) {
            return false;
        }
    } catch(err) {}
    try {
        if (window.document.documentMode) {
            return false;
        }
    } catch(err) {}
    try {
        if(typeof window.cefQuery === 'function') {
            return true;
        }
    } catch (err) {}
    try {
        var hasSearchParamsFcn = new URLSearchParams(window.location.search);
    }
    catch(err) {
        return true;
    }
    return false;
}

为了让我们的Matlab链接仅在内部浏览器中显示,我使用HTML代码预制带有链接的文档页面(例如<a href="matlab: edit('myfile.m')">open</a>)。然后,每个链接都有class="matlaburi",使用CSS默认隐藏所有标记为该类别的内容。
接下来,我们添加了以下附加的JavaScript代码,检查是否在MATLAB浏览器中,并且如果是,则通过更改标记为该类别的任何东西的显示样式来使所有链接可见:
function showMatlabOpenLinks() {
    if (isMatlabBrowser()) {
        var cols = document.getElementsByClassName('matlaburi');
        for(i = 0; i < cols.length; i++) {
            cols[i].style.display = "inline";
        }
    }
}

var onLoadFcn = function() {
    showMatlabOpenLinks();
};

if(window.attachEvent) {
    window.attachEvent('onload', onLoadFcn);
} else {
    window.onload = onLoadFcn;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接