def testInlineCSSWithIncludeDirective(self):
        '''Tests that include directive in external css files also inlined'''

        files = {
            'index.html': '''
      <html>
      <head>
      <link rel="stylesheet" href="foo.css">
      </head>
      </html>
      ''',
            'foo.css': '''<include src="style.css">''',
            'style.css': '''
      <include src="style2.css">
      blink {
        display: none;
      }
      ''',
            'style2.css': '''h1 {}''',
        }

        expected_inlined = '''
      <html>
      <head>
      <style>
      h1 {}
      blink {
        display: none;
      }
      </style>
      </head>
      </html>
      '''

        source_resources = set()
        tmp_dir = util.TempDir(files)
        for filename in files:
            source_resources.add(tmp_dir.GetPath(filename))

        result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None)
        resources = result.inlined_files
        resources.add(tmp_dir.GetPath('index.html'))
        self.failUnlessEqual(resources, source_resources)
        self.failUnlessEqual(expected_inlined,
                             util.FixLineEnd(result.inlined_data, '\n'))
        tmp_dir.CleanUp()
  def testInlineCSSLinks(self):
    '''Tests that only CSS files referenced via relative URLs are inlined.'''

    files = {
      'index.html': '''
      <html>
      <head>
      <link rel="stylesheet" href="foo.css">
      <link rel="stylesheet" href="chrome://resources/bar.css">
      </head>
      </html>
      ''',

      'foo.css': '''
      @import url(chrome://resources/blurp.css);
      blink {
        display: none;
      }
      ''',
    }

    expected_inlined = '''
      <html>
      <head>
      <style>
      @import url(chrome://resources/blurp.css);
      blink {
        display: none;
      }
      </style>
      <link rel="stylesheet" href="chrome://resources/bar.css">
      </head>
      </html>
      '''

    source_resources = set()
    tmp_dir = util.TempDir(files)
    for filename in files:
      source_resources.add(tmp_dir.GetPath(filename))

    result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None)
    resources = result.inlined_files
    resources.add(tmp_dir.GetPath('index.html'))
    self.failUnlessEqual(resources, source_resources)
    self.failUnlessEqual(expected_inlined,
                         util.FixLineEnd(result.inlined_data, '\n'))
    def testPreprocessOnlyAppliesRecursively(self):
        '''Tests that preprocess_only=true propagates to included files. '''

        files = {
            'index.html': '''
      <html>
        <include src="outer_include.html">
      </html>
      ''',
            'outer_include.html': '''
      <include src="inner_include.html">
      <link rel="stylesheet" href="not_inlined.css">
      ''',
            'inner_include.html':
            ''' <p>This should be inlined in index.html</p> ''',
            'not_inlined.css': ''' /* This should not be inlined. */ '''
        }

        expected_inlined = '''
      <html>
        <p>This should be inlined in index.html</p>
        <link rel="stylesheet" href="not_inlined.css">
      </html>
      '''

        source_resources = set()
        tmp_dir = util.TempDir(files)
        source_resources.add(tmp_dir.GetPath('index.html'))
        source_resources.add(tmp_dir.GetPath('outer_include.html'))
        source_resources.add(tmp_dir.GetPath('inner_include.html'))

        result = html_inline.DoInline(tmp_dir.GetPath('index.html'),
                                      None,
                                      preprocess_only=True)
        resources = result.inlined_files
        resources.add(tmp_dir.GetPath('index.html'))
        self.failUnlessEqual(resources, source_resources)

        # Ignore whitespace
        expected_inlined = re.sub(r'\s+', ' ', expected_inlined)
        actually_inlined = re.sub(r'\s+', ' ',
                                  util.FixLineEnd(result.inlined_data, '\n'))
        self.failUnlessEqual(expected_inlined, actually_inlined)

        tmp_dir.CleanUp()
    def testCommentedJsIf(self):
        '''Tests that <if> works inside a comment.'''

        files = {
            'if.js':
            '''
      // <if expr="True">
      yep();
      // </if>

      // <if expr="False">
      nope();
      // </if>
      ''',
        }

        expected_inlined = '''
      // 
      yep();
      // 

      // 
      '''

        source_resources = set()
        tmp_dir = util.TempDir(files)
        for filename in files:
            source_resources.add(tmp_dir.GetPath(filename))

        class FakeGrdNode(object):
            def EvaluateCondition(self, cond):
                return eval(cond)

        result = html_inline.DoInline(tmp_dir.GetPath('if.js'), FakeGrdNode())
        resources = result.inlined_files

        resources.add(tmp_dir.GetPath('if.js'))
        self.failUnlessEqual(resources, source_resources)
        self.failUnlessEqual(expected_inlined,
                             util.FixLineEnd(result.inlined_data, '\n'))
        tmp_dir.CleanUp()
  def testCommentedJsInclude(self):
    '''Tests that <include> works inside a comment.'''

    files = {
      'include.js': '// <include src="other.js">',
      'other.js': '// Copyright somebody\nalert(1);',
    }

    expected_inlined = '// // Copyright somebody\nalert(1);'

    source_resources = set()
    tmp_dir = util.TempDir(files)
    for filename in files:
      source_resources.add(tmp_dir.GetPath(filename))

    result = html_inline.DoInline(tmp_dir.GetPath('include.js'), None)
    resources = result.inlined_files
    resources.add(tmp_dir.GetPath('include.js'))
    self.failUnlessEqual(resources, source_resources)
    self.failUnlessEqual(expected_inlined,
                         util.FixLineEnd(result.inlined_data, '\n'))
Exemple #6
0
    def FileForLanguage(self,
                        lang,
                        output_dir,
                        create_file=True,
                        return_if_not_generated=True):
        '''Returns the filename of the file associated with this structure,
    for the specified language.

    Args:
      lang: 'fr'
      output_dir: 'c:\temp'
      create_file: True
    '''
        assert self.HasFileForLanguage()
        # If the source language is requested, and no extra changes are requested,
        # use the existing file.
        if ((not lang or lang == self.GetRoot().GetSourceLanguage())
                and self.attrs['expand_variables'] != 'true'
                and (not self.attrs['run_command']
                     or not self.RunCommandOnCurrentPlatform())):
            if return_if_not_generated:
                input_path = self.GetInputPath()
                if input_path is None:
                    return None
                return self.ToRealPath(input_path)
            else:
                return None

        if self.attrs['output_filename'] != '':
            filename = self.attrs['output_filename']
        else:
            filename = os.path.basename(self.attrs['file'])
        assert len(filename)
        filename = '%s_%s' % (lang, filename)
        filename = os.path.join(output_dir, filename)

        # Only create the output if it was requested by the call.
        if create_file:
            text = self.gatherer.Translate(
                lang,
                pseudo_if_not_available=self.PseudoIsAllowed(),
                fallback_to_english=self.ShouldFallbackToEnglish(),
                skeleton_gatherer=self.GetSkeletonGatherer())

            file_contents = util.FixLineEnd(text, self.GetLineEnd())
            if self.ExpandVariables():
                # Note that we reapply substitution a second time here.
                # This is because a) we need to look inside placeholders
                # b) the substitution values are language-dependent
                file_contents = self._Substitute(file_contents)

            with open(filename, 'wb') as file_object:
                output_stream = util.WrapOutputStream(
                    file_object, self.attrs['output_encoding'])
                output_stream.write(file_contents)

            if self.attrs['run_command'] and self.RunCommandOnCurrentPlatform(
            ):
                # Run arbitrary commands after translation is complete so that it
                # doesn't interfere with what's in translation console.
                command = self.attrs['run_command'] % {'filename': filename}
                result = os.system(command)
                assert result == 0, '"%s" failed.' % command

        return filename
    def testConditionalInclude(self):
        '''Tests that output and dependency generation includes only files not'''\
            ''' blocked by  <if> macros.'''

        files = {
          'index.html': '''
      <html>
      <if expr="True">
        <img src="img1.png" srcset="img2.png 1x, img3.png 2x">
      </if>
      <if expr="False">
        <img src="img4.png" srcset=" img5.png 1x, img6.png 2x ">
      </if>
      <if expr="True">
        <img src="chrome://theme/img11.png" srcset="img7.png 1x, '''\
                '''chrome://theme/img13.png 2x">
      </if>
      <img srcset="img8.png 300w, img9.png 11E-2w,img10.png -1e2w">
      </html>
      ''',
          'img1.png': '''a1''',
          'img2.png': '''a2''',
          'img3.png': '''a3''',
          'img4.png': '''a4''',
          'img5.png': '''a5''',
          'img6.png': '''a6''',
          'img7.png': '''a7''',
          'img8.png': '''a8''',
          'img9.png': '''a9''',
          'img10.png': '''a10''',
        }

        expected_inlined = '''
      <html>
      <img src="data:image/png;base64,YTE=" srcset="data:image/png;base64,'''\
              '''YTI= 1x,data:image/png;base64,YTM= 2x">
      <img src="chrome://theme/img11.png" srcset="data:image/png;base64,'''\
              '''YTc= 1x,chrome://theme/img13.png 2x">
      <img srcset="data:image/png;base64,YTg= 300w,data:image/png;base64,'''\
              '''YTk= 11E-2w,data:image/png;base64,YTEw -1e2w">
      </html>
      '''

        expected_files = [
            'index.html', 'img1.png', 'img2.png', 'img3.png', 'img7.png',
            'img8.png', 'img9.png', 'img10.png'
        ]

        source_resources = set()
        tmp_dir = util.TempDir(files)
        for filename in expected_files:
            source_resources.add(tmp_dir.GetPath(filename))

        class FakeGrdNode(object):
            def EvaluateCondition(self, cond):
                return eval(cond)

        # Test normal inlining.
        result = html_inline.DoInline(tmp_dir.GetPath('index.html'),
                                      FakeGrdNode())
        resources = result.inlined_files
        resources.add(tmp_dir.GetPath('index.html'))
        self.failUnlessEqual(resources, source_resources)

        # ignore whitespace
        expected_inlined = re.sub(r'\s+', ' ', expected_inlined)
        actually_inlined = re.sub(r'\s+', ' ',
                                  util.FixLineEnd(result.inlined_data, '\n'))
        self.failUnlessEqual(expected_inlined, actually_inlined)
        tmp_dir.CleanUp()
    def testWithCloseTags(self):
        '''Tests that close tags are removed.'''

        files = {
            'index.html': '''
      <html>
      <head>
      <link rel="stylesheet" href="style1.css"></link>
      <link rel="stylesheet" href="style2.css">
      </link>
      <link rel="stylesheet" href="style2.css"
      >
      </link>
      <script src="script1.js"></script>
      </head>
      <include src="tmpl1.html"></include>
      <include src="tmpl2.html">
      </include>
      <include src="tmpl2.html"
      >
      </include>
      <img src="img1.png">
      <include src='single-double-quotes.html"></include>
      <include src="double-single-quotes.html'></include>
      </html>
      ''',
            'style1.css': '''h1 {}''',
            'style2.css': '''h2 {}''',
            'tmpl1.html': '''<h1></h1>''',
            'tmpl2.html': '''<h2></h2>''',
            'script1.js': '''console.log('hello');''',
            'img1.png': '''abc''',
        }

        expected_inlined = '''
      <html>
      <head>
      <style>h1 {}</style>
      <style>h2 {}</style>
      <style>h2 {}</style>
      <script>console.log('hello');</script>
      </head>
      <h1></h1>
      <h2></h2>
      <h2></h2>
      <img src="data:image/png;base64,YWJj">
      <include src='single-double-quotes.html"></include>
      <include src="double-single-quotes.html'></include>
      </html>
      '''

        source_resources = set()
        tmp_dir = util.TempDir(files)
        for filename in files:
            source_resources.add(tmp_dir.GetPath(filename))

        # Test normal inlining.
        result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None)
        resources = result.inlined_files
        resources.add(tmp_dir.GetPath('index.html'))
        self.failUnlessEqual(resources, source_resources)
        self.failUnlessEqual(expected_inlined,
                             util.FixLineEnd(result.inlined_data, '\n'))
        tmp_dir.CleanUp()
    def testInlineIgnoresPolymerBindings(self):
        '''Tests that polymer bindings are ignored when inlining.
    '''

        files = {
            'index.html': '''
      <html>
      <head>
      <link rel="stylesheet" href="test.css">
      </head>
      <body>
        <iron-icon src="[[icon]]"></iron-icon><!-- Should be ignored. -->
        <iron-icon src="{{src}}"></iron-icon><!-- Also ignored. -->
        <!-- [[image]] should be ignored. -->
        <div style="background: url([[image]]),
                                url('test.png');">
        </div>
        <div style="background: url('test.png'),
                                url([[image]]);">
        </div>
      </body>
      </html>
      ''',
            'test.css': '''
      .image {
        background: url('test.png');
        background-image: url([[ignoreMe]]);
        background-image: image-set(url({{alsoMe}}), 1x);
        background-image: image-set(
            url({{ignore}}) 1x,
            url('test.png') 2x);
      }
      ''',
            'test.png': 'PNG DATA'
        }

        expected_inlined = '''
      <html>
      <head>
      <style>
      .image {
        background: url('data:image/png;base64,UE5HIERBVEE=');
        background-image: url([[ignoreMe]]);
        background-image: image-set(url({{alsoMe}}), 1x);
        background-image: image-set(
            url({{ignore}}) 1x,
            url('data:image/png;base64,UE5HIERBVEE=') 2x);
      }
      </style>
      </head>
      <body>
        <iron-icon src="[[icon]]"></iron-icon><!-- Should be ignored. -->
        <iron-icon src="{{src}}"></iron-icon><!-- Also ignored. -->
        <!-- [[image]] should be ignored. -->
        <div style="background: url([[image]]),
                                url('data:image/png;base64,UE5HIERBVEE=');">
        </div>
        <div style="background: url('data:image/png;base64,UE5HIERBVEE='),
                                url([[image]]);">
        </div>
      </body>
      </html>
      '''

        source_resources = set()
        tmp_dir = util.TempDir(files)
        for filename in files:
            source_resources.add(tmp_dir.GetPath(util.normpath(filename)))

        result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None)
        resources = result.inlined_files
        resources.add(tmp_dir.GetPath('index.html'))
        self.failUnlessEqual(resources, source_resources)
        self.failUnlessEqual(expected_inlined,
                             util.FixLineEnd(result.inlined_data, '\n'))

        tmp_dir.CleanUp()
Exemple #10
0
  def testImgSrcset(self):
    '''Tests that img srcset="" attributes are converted.'''

    # Note that there is no space before "img10.png" and that
    # "img11.png" has no descriptor.
    files = {
      'index.html': '''
      <html>
      <img src="img1.png" srcset="img2.png 1x, img3.png 2x">
      <img src="img4.png" srcset=" img5.png   1x , img6.png 2x ">
      <img src="chrome://theme/img11.png" srcset="img7.png 1x, '''\
          '''chrome://theme/img13.png 2x">
      <img srcset="img8.png 300w, img9.png 11E-2w,img10.png -1e2w">
      <img srcset="img11.png">
      <img srcset="img11.png, img2.png 1x">
      <img srcset="img2.png 1x, img11.png">
      </html>
      ''',
      'img1.png': '''a1''',
      'img2.png': '''a2''',
      'img3.png': '''a3''',
      'img4.png': '''a4''',
      'img5.png': '''a5''',
      'img6.png': '''a6''',
      'img7.png': '''a7''',
      'img8.png': '''a8''',
      'img9.png': '''a9''',
      'img10.png': '''a10''',
      'img11.png': '''a11''',
    }

    expected_inlined = '''
      <html>
      <img src="data:image/png;base64,YTE=" srcset="data:image/png;base64,'''\
          '''YTI= 1x,data:image/png;base64,YTM= 2x">
      <img src="data:image/png;base64,YTQ=" srcset="data:image/png;base64,'''\
          '''YTU= 1x,data:image/png;base64,YTY= 2x">
      <img src="chrome://theme/img11.png" srcset="data:image/png;base64,'''\
          '''YTc= 1x,chrome://theme/img13.png 2x">
      <img srcset="data:image/png;base64,YTg= 300w,data:image/png;base64,'''\
          '''YTk= 11E-2w,data:image/png;base64,YTEw -1e2w">
      <img srcset="data:image/png;base64,YTEx">
      <img srcset="data:image/png;base64,YTEx,data:image/png;base64,YTI= 1x">
      <img srcset="data:image/png;base64,YTI= 1x,data:image/png;base64,YTEx">
      </html>
      '''

    source_resources = set()
    tmp_dir = util.TempDir(files)
    for filename in files:
      source_resources.add(tmp_dir.GetPath(filename))

    # Test normal inlining.
    result = html_inline.DoInline(
        tmp_dir.GetPath('index.html'),
        None)
    resources = result.inlined_files
    resources.add(tmp_dir.GetPath('index.html'))
    self.failUnlessEqual(resources, source_resources)
    self.failUnlessEqual(expected_inlined,
                         util.FixLineEnd(result.inlined_data, '\n'))
    tmp_dir.CleanUp()