| Index: extension/content_script.js
|
| diff --git a/extension/content_script.js b/extension/content_script.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df97cbf850b87356d641164dc5ad827bb8a8c658
|
| --- /dev/null
|
| +++ b/extension/content_script.js
|
| @@ -0,0 +1,83 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +// Glue code that runs on the page referencing dart web components.
|
| +// Some logic has to be placed here rather than on the background page
|
| +// because of chrome security restrictions.
|
| +
|
| +// Port used to send requests to the background page to proxy urls.
|
| +var proxyPort = null;
|
| +
|
| +// Port used to send requests to the background page to parse components.
|
| +var parsePort = null;
|
| +
|
| +function endsWith(str, pattern) {
|
| + return str.lastIndexOf(pattern) == str.length - pattern.length;
|
| +}
|
| +
|
| +function onRequestParse() {
|
| + if (parsePort == null) {
|
| + parsePort = chrome.extension.connect({name: "parse"});
|
| + }
|
| + var l = window.location;
|
| + var pageUrl = l.protocol + "//" + l.host + l.pathname;
|
| + parsePort.postMessage({url: pageUrl});
|
| + parsePort.onMessage.addListener(function(msg) {
|
| + if (msg.type == "CREATE_DATA_URLS") {
|
| + var requests = msg.requests;
|
| + var response = [];
|
| + for (var i = 0; i < requests.length; i++) {
|
| + var request = requests[i];
|
| + var url = request.url;
|
| + var content = request.content;
|
| + var contentType =
|
| + endsWith(url, ".html") ? "text/html" : "application/javascript";
|
| + var objectUrl = webkitURL.createObjectURL(
|
| + new Blob([content], {type: contentType}));
|
| + response.push({url: url, redirectUrl: objectUrl});
|
| + }
|
| + if (proxyPort == null) {
|
| + proxyPort = chrome.extension.connect({name: "proxy"});
|
| + }
|
| + proxyPort.postMessage({requests: response});
|
| + // TODO(jacobr): remove timeout and listen for a message from the
|
| + // background page instead.
|
| + var generatedPageUrl = pageUrl.replace(/[/]([^/]+)$/,
|
| + function(match, p1) { return "/_" + p1 + ".html"});
|
| + window.setTimeout(function() {
|
| + for (var i = 0; i < requests.length; i++) {
|
| + var request = requests[i];
|
| + var url = request.url;
|
| + var content = request.content;
|
| + if (url == generatedPageUrl) {
|
| + // Replace the contents of the existing document with the
|
| + // proxied content at the url with an additional .html added.
|
| + // We prefer this versus redirecting to the page with an extra
|
| + // .html so that refreshing this page does the right thing.
|
| + var newDoc = document.open("text/html", "replace");
|
| + newDoc.write(content);
|
| + newDoc.close();
|
| + }
|
| + }
|
| + }, 100);
|
| + }
|
| + })
|
| +
|
| +}
|
| +
|
| +document.addEventListener("DOMContentLoaded", function() {
|
| + if (document.querySelector("link[rel=components], element, template")) {
|
| + // TODO(jacobr): should we always parse if there could be components?
|
| + onRequestParse();
|
| + }
|
| +});
|
| +
|
| +window.addEventListener("message", function(event) {
|
| + if (event.source != window)
|
| + return;
|
| +
|
| + if (event.data.type == "PARSE") {
|
| + onRequestParse();
|
| + }
|
| +}, false);
|
|
|