Skip to content

Commit

Permalink
[Mojo] Add HTML bindings
Browse files Browse the repository at this point in the history
The HTML bindings for Mojo are based on the JS bindings. We simply package up
the JavaScript code for the JS bindings into HTML containers so they can be
loaded with HTML imports.

R=hansmuller@chromium.org

Review URL: https://codereview.chromium.org/652183003

Cr-Commit-Position: refs/heads/master@{#299599}
  • Loading branch information
abarth authored and Commit bot committed Oct 15, 2014
1 parent d554614 commit e4089c4
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 5 deletions.
1 change: 1 addition & 0 deletions mojo/public/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ group("public") {
"//mojo/public/cpp/environment:standalone",
"//mojo/public/cpp/utility",
"//mojo/public/interfaces/bindings/tests:test_interfaces",
"//mojo/public/html",
]

if (is_linux) {
Expand Down
25 changes: 25 additions & 0 deletions mojo/public/html/BUILD.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

action_foreach("html") {
script = "convert_amd_modules_to_html.py"
sources = [
"//mojo/public/js/bindings/buffer.js",
"//mojo/public/js/bindings/codec.js",
"//mojo/public/js/bindings/connection.js",
"//mojo/public/js/bindings/connector.js",
"//mojo/public/js/bindings/router.js",
"//mojo/public/js/bindings/unicode.js",
"//mojo/public/js/bindings/validator.js",
]
outputs = [
"$target_gen_dir/{{source_name_part}}.html",
]
args = [
"--input",
"{{source}}",
"--output",
rebase_path(target_gen_dir, root_build_dir) + "/{{source_name_part}}.html"
]
}
99 changes: 99 additions & 0 deletions mojo/public/html/convert_amd_modules_to_html.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import sys
import re

IMPORT_TEMPLATE = '<link rel="import" href="/%s.html" as="%s" />'
PREAMBLE_TEMPLATE = '<script>'
POSTAMBLE_TEMPLATE = ' this.exports = exports;\n</script>'

class Import(object):
def __init__(self, path, name):
self.path = path
self.name = name

class Module(object):
def __init__(self):
self.name = ""
self.imports = []
self.body = ""

def Serialize(module):
lines = []
for i in module.imports:
lines.append(IMPORT_TEMPLATE % (i.path, i.name))
lines.append(PREAMBLE_TEMPLATE)
lines.append(module.body)
lines.append(POSTAMBLE_TEMPLATE)
return "\n".join(lines)

name_regex = re.compile(r'define\("([^"]+)"')
import_regex = re.compile(r' +"([^"]+)",')
begin_body_regexp = re.compile(r', function\(([^)]*)\)')
end_body_regexp = re.compile(r'return exports')

def AddImportNames(module, unparsed_names):
names = [n.strip() for n in unparsed_names.split(',')]
for i in range(len(module.imports)):
module.imports[i].name = names[i]

def RewritePathNames(path):
return path.replace("mojo/public/js/bindings", "mojo/public/html")

def Parse(amd_module):
module = Module()
body_lines = []
state = "name"
for line in amd_module.splitlines():
if state == "name":
m = name_regex.search(line)
if m:
module.name = m.group(1)
m = begin_body_regexp.search(line)
if m:
AddImportNames(module, m.group(1))
state = "body"
else:
state = "imports"
continue
if state == "imports":
m = import_regex.search(line)
if m:
module.imports.append(Import(RewritePathNames(m.group(1)), None))
continue
m = begin_body_regexp.search(line)
if m:
AddImportNames(module, m.group(1))
state = "body"
continue
raise Exception, "Unknown import declaration"
if state == "body":
if end_body_regexp.search(line):
module.body = "\n".join(body_lines)
return module
body_lines.append(line)
continue
raise Exception, "Unknown parser state"
raise Exception, "End of file reached with finding a module"

def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input")
parser.add_argument("--output")
args = parser.parse_args()

module = None
with open(args.input, "r") as input_file:
module = Parse(input_file.read())

with open(args.output, "w+") as output_file:
output_file.write(Serialize(module))

return 0

if __name__ == "__main__":
sys.exit(main())
4 changes: 2 additions & 2 deletions mojo/public/js/bindings/codec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

define("mojo/public/js/bindings/codec", [
"mojo/public/js/bindings/unicode",
"mojo/public/js/bindings/buffer"
], function(unicode, buffer) {
"mojo/public/js/bindings/buffer",
], function(unicode, buffer) {

var kErrorUnsigned = "Passing negative value to unsigned";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->

<link rel="import" href="//mojo/public/js/bindings/codec.html" as="codec" />
<link rel="import" href="//mojo/public/js/bindings/validator.html" as="validator" />
<link rel="import" href="/mojo/public/html/codec.html" as="codec" />
<link rel="import" href="/mojo/public/html/validator.html" as="validator" />
{%- for import in imports %}
<link rel="import" href="//{{import.module.path}}.html" as="{{import.unique_name}}" />
<link rel="import" href="/{{import.module.path}}.html" as="{{import.unique_name}}" />
{%- endfor %}
<script>
{%- include "module_definition.tmpl" %}
Expand Down

0 comments on commit e4089c4

Please sign in to comment.