Blame view

node_modules/vue-style-loader/lib/addStylesShadow.js 1.86 KB
ce4c83ff   wxy   初始提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  import listToStyles from './listToStyles'
  
  export default function addStylesToShadowDOM (parentId, list, shadowRoot) {
    var styles = listToStyles(parentId, list)
    addStyles(styles, shadowRoot)
  }
  
  /*
  type StyleObject = {
    id: number;
    parts: Array<StyleObjectPart>
  }
  
  type StyleObjectPart = {
    css: string;
    media: string;
    sourceMap: ?string
  }
  */
  
  function addStyles (styles /* Array<StyleObject> */, shadowRoot) {
    const injectedStyles =
      shadowRoot._injectedStyles ||
      (shadowRoot._injectedStyles = {})
    for (var i = 0; i < styles.length; i++) {
      var item = styles[i]
      var style = injectedStyles[item.id]
      if (!style) {
        for (var j = 0; j < item.parts.length; j++) {
          addStyle(item.parts[j], shadowRoot)
        }
        injectedStyles[item.id] = true
      }
    }
  }
  
  function createStyleElement (shadowRoot) {
    var styleElement = document.createElement('style')
    styleElement.type = 'text/css'
    shadowRoot.appendChild(styleElement)
    return styleElement
  }
  
  function addStyle (obj /* StyleObjectPart */, shadowRoot) {
    var styleElement = createStyleElement(shadowRoot)
    var css = obj.css
    var media = obj.media
    var sourceMap = obj.sourceMap
  
    if (media) {
      styleElement.setAttribute('media', media)
    }
  
    if (sourceMap) {
      // https://developer.chrome.com/devtools/docs/javascript-debugging
      // this makes source maps inside style tags work properly in Chrome
      css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */'
      // http://stackoverflow.com/a/26603875
      css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'
    }
  
    if (styleElement.styleSheet) {
      styleElement.styleSheet.cssText = css
    } else {
      while (styleElement.firstChild) {
        styleElement.removeChild(styleElement.firstChild)
      }
      styleElement.appendChild(document.createTextNode(css))
    }
  }