zoukankan      html  css  js  c++  java
  • RTCMultiConnection.js过程探索(一)

    RTCMultiConnection.js过程探索(一)

    一、函数路线图

    以下是RTCMultiConnection.js中函数运行过程图:

     

    图1

    二、fun04

    2.1 分析

     

    图2

    注:为什么要先研究fun04,因为从上述日志可以看出,先执行的fun04,接下来,对fun04的子函数全打上日志。打完日志后,执行如下:

     

    图3

    注:经过分析,发现fun01-03全是实在实的函数,而fun04是一堆变量,所以先走fun04,按照上面打的日志,先研究04.01。

    2.2 代码04.01

    本阶段整体代码如下:

     

    图4

    1)代码段一

    var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    
    var isFirefox = typeof window.InstallTrigger !== 'undefined';
    
    var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;

    a.)分枝一

    var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

    注:判断是否为Opera浏览器,我是在谷歌浏览器上运行的,所以答案为否。

    b.)分枝二

    var isFirefox = typeof window.InstallTrigger !== 'undefined';

    注:判断是否为火狐浏览器,答案为否。

    c.)分枝三

    var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;

    注:判断是否为Safari浏览器,答案为否。

    2)代码段二

    var isChrome = !!window.chrome && !isOpera;
    
    var isIE = !!document.documentMode;
    
    var isMobileDevice =
    
    !!navigator.userAgent.match(/Android|iPhone|iPad|iPod|BlackBerry|IEMobile/i);

    a.)分枝一

    var isChrome = !!window.chrome && !isOpera;

    注:判断是否为谷歌浏览器,结果为true.

    b.)分枝二

    var isIE = !!document.documentMode;

    注:判断是否为IE浏览器,结果为false,如下:

     

    图5

    c.)分枝三

    var isMobileDevice =
    
    !!navigator.userAgent.match(/Android|iPhone|iPad|iPod|BlackBerry|IEMobile/i);

    注:判断是否为手持设备,结果为false。

    2.3 代码04.02—04.05

    本阶段整体代码如下:

     

    图6

    1)代码段一

    //04.02
    
    if (typeof cordova !== 'undefined') {
    
       isMobileDevice = true;
    
       isChrome = true;
    
    }

    注:这个if主要是判断用没用cordova框架的,cordova框架是一个跨平台框架,可以增加兼容性。

    2)代码段二

    //04.03
    
    if (navigator && navigator.userAgent && navigator.userAgent.indexOf('Crosswalk') !== -1) {
    
        isMobileDevice = true;
    
        isChrome = true;
    
    }

    注:这个if主要判断用不用Crosswalk。

    3)代码段三

    //04.04
    
    var isPluginRTC = !isMobileDevice && (isSafari || isIE);
    
    //04.05
    
    if (isPluginRTC && typeof URL !== 'undefined') {
    
        URL.createObjectURL = function() {};
    
    }

    a.)分枝一

    var isPluginRTC = !isMobileDevice && (isSafari || isIE);

    注:定义变量isPluginRTC,判断是不是插件RTC。因为isMobileDevice为false,!isMobileDevice为true,执行后面的(isSafari || isIE),均为false,所以isPluginRTC为false.

    b.)分枝二

    if (isPluginRTC && typeof URL !== 'undefined') {
    
        URL.createObjectURL = function() {};
    
    }

    注:isPluginRTC为false,所以这个if不走了。

    2.4 代码04.06--04.08

    本阶段代码如下:

     

    图7

    1)代码段一

    //04.06
    
    // detect node-webkit
    
    var isNodeWebkit = !!(window.process &&
    
                          (typeof window.process === 'object') &&
    
                          window.process.versions &&
    
                          window.process.versions['node-webkit']);
    
    var chromeVersion = 50;
    
    var matchArray = navigator.userAgent.match(/Chrom(e|ium)/([0-9]+)./);

    a.)分枝一

    var isNodeWebkit = !!(window.process &&
    
                          (typeof window.process === 'object') &&
    
                          window.process.versions &&
    
                          window.process.versions['node-webkit']);

    注:用于检测node-webkit,结果为false,如下:

     

    图8

    b.)分枝二

    var chromeVersion = 50;

    注:定义一个变量chromeVersion谷歌浏览器版本,并赋值为50。

    c.)分枝三

    var matchArray = navigator.userAgent.match(/Chrom(e|ium)/([0-9]+)./);

    注:定义一个数组matchArray,能匹配出浏览器版本等信息,具体如下:

     

    图9

    2)代码段二

    //04.07
    
    if (isChrome && matchArray && matchArray[2]) {
    
       chromeVersion = parseInt(matchArray[2], 10);
    
    }

    注:这个if,主要判断是谷歌浏览器的话,重新赋值版本信息chromeVersion,本例中为64. parseInt是个函数,把字符串转为数字用的,后面的10的意思是转为10进制,也是默认值。

    3)代码段三

    //04.08
    
    var firefoxVersion = 50;
    
    matchArray = navigator.userAgent.match(/Firefox/(.*)/);
    
    if (isFirefox && matchArray && matchArray[1]) {
    
        firefoxVersion = parseInt(matchArray[1], 10);
    
    }

    注:上述代码是判断火狐浏览器的,初始版本号也定义为50,接下来由于没匹配上,所以重新赋值不成功。

  • 相关阅读:
    Mooncake (排序+贪心)
    The Black Hole of Numbers (strtoint+inttostr+sort)
    随机排序
    EF 随机排序
    禁用DropDownList的Items
    sql之left join、right join、inner join的区别
    SQL优化-索引
    .net 面试问题 汇总
    从简单的例子理解泛型
    1.1 使用内置的Camera应用程序捕获图像
  • 原文地址:https://www.cnblogs.com/webrtcPC/p/r1.html
Copyright © 2011-2022 走看看