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,接下来由于没匹配上,所以重新赋值不成功。

  • 相关阅读:
    初见线段树
    用typedef声明类型
    BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
    linux命令--sysctl
    信号量学习 & 共享内存同步
    原子操作
    共享内存学习
    HOST绑定和VIP映射
    【转载】《Unix网络编程》思维导图
    外排序 & 败者树 & 多路归并-学习
  • 原文地址:https://www.cnblogs.com/webrtcPC/p/r1.html
Copyright © 2011-2022 走看看