From e317aa1636e88078accfe06363e0af47616a047e Mon Sep 17 00:00:00 2001 From: Sergey Chikuyonok Date: Wed, 9 Feb 2011 18:51:01 +0300 Subject: [PATCH] Working on Google Chrome extension --- .externalToolBuilders/XML View builder.launch | 3 ++- .project | 2 +- build/build.properties | 4 +++ build/build.xml | 25 ++++++++++++++++-- extensions/chrome/background.html | 3 +++ extensions/chrome/controller.js | 26 +++++++++++++++++++ extensions/chrome/manifest.json | 16 ++++++++++++ extensions/chrome/xv.css | 15 +++++++++++ 8 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 extensions/chrome/background.html create mode 100644 extensions/chrome/controller.js create mode 100644 extensions/chrome/manifest.json create mode 100644 extensions/chrome/xv.css diff --git a/.externalToolBuilders/XML View builder.launch b/.externalToolBuilders/XML View builder.launch index a1eae93..3bc5249 100644 --- a/.externalToolBuilders/XML View builder.launch +++ b/.externalToolBuilders/XML View builder.launch @@ -1,5 +1,6 @@ + @@ -8,6 +9,6 @@ - + diff --git a/.project b/.project index e4f2930..489bb13 100644 --- a/.project +++ b/.project @@ -12,7 +12,7 @@ org.eclipse.ui.externaltools.ExternalToolBuilder - full,incremental, + auto,full,incremental, LaunchConfigHandle diff --git a/build/build.properties b/build/build.properties index d73c2e2..e94ff24 100644 --- a/build/build.properties +++ b/build/build.properties @@ -3,9 +3,13 @@ dist.css.dir=${dist.dir}/css dist.css-full.dir=${dist.dir}/css-full dist.js.dir=${dist.dir}/js +dist.chrome.dir=${dist.dir}/chrome + js-src.dir=${basedir}/src css-src.dir=${basedir}/css +chrome-src.dir=${basedir}/extensions/chrome + webtasks.dir=${basedir}/ant-tools webtasks.use-cc=false force-rebuild=no \ No newline at end of file diff --git a/build/build.xml b/build/build.xml index cd23a75..9cfeb3f 100644 --- a/build/build.xml +++ b/build/build.xml @@ -19,8 +19,9 @@ + - + @@ -38,7 +39,27 @@ - + + + + + + + + + + + + + + + + + + + + + Build done diff --git a/extensions/chrome/background.html b/extensions/chrome/background.html new file mode 100644 index 0000000..2dd7ab6 --- /dev/null +++ b/extensions/chrome/background.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/extensions/chrome/controller.js b/extensions/chrome/controller.js new file mode 100644 index 0000000..423c72a --- /dev/null +++ b/extensions/chrome/controller.js @@ -0,0 +1,26 @@ +function isXML(doc) { + return !(doc instanceof HTMLDocument || doc instanceof SVGDocument); +} + +function canTransform() { + return document && isXML(document) && document.documentElement; +} + +xv_dom.getByClass = function(class_name, context) { + return _.filter((context || document).getElementsByTagName('*'), function(n) { + return xv_dom.hasClass(n, class_name); + }); +}; + +if (canTransform()) { + var html = xv_dom.fromHTML('' + + '
' + + ''); + + var source_doc = document.documentElement; + + var pi = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="' + chrome.extension.getURL('xv.css') + '"'); + document.insertBefore(pi, document.firstChild); + + document.replaceChild(html, document.documentElement); +} \ No newline at end of file diff --git a/extensions/chrome/manifest.json b/extensions/chrome/manifest.json new file mode 100644 index 0000000..31eb884 --- /dev/null +++ b/extensions/chrome/manifest.json @@ -0,0 +1,16 @@ +{ + "name" : "XV", + "version" : "1.0", + "description" : "View XML files in Google Chrome", + "background_page": "background.html", + "permissions" : [ + "tabs", + "http://*/*", + "https://*/*" + ], + "content_scripts": [{ + "js": ["xv.js", "controller.js"], + "matches": ["http://*/*", "https://*/*", "file://*/*"], + "run_at": "document_end" + }] +} \ No newline at end of file diff --git a/extensions/chrome/xv.css b/extensions/chrome/xv.css new file mode 100644 index 0000000..3477d10 --- /dev/null +++ b/extensions/chrome/xv.css @@ -0,0 +1,15 @@ +/* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 3.1.1 build: 47 */ html { color: #000; background: #FFF; } body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td { margin: 0; padding: 0; } table { border-collapse: collapse; border-spacing: 0; } fieldset, img { border: 0; } address, caption, cite, code, dfn, em, strong, th, var { font-style: normal; font-weight: normal; } li { list-style: none; } caption, th { text-align: left; } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; } q:before, q:after { content: ''; } abbr, acronym { border: 0; font-variant: normal; } sup { vertical-align: text-top; } sub { vertical-align: text-bottom; } input, textarea, select { font-family: inherit; font-size: inherit; font-weight: inherit; } input, textarea, select { *font-size: 100%; } legend { color: #000; } body { font-family: sans-serif; font-size: 11px; } + +div { + display: block; +} + +span { + display: inline; +} + +input[type=search] { + display: inline-block; font: -webkit-small-control; letter-spacing: normal; line-height: normal; text-align: -webkit-auto; text-indent: 0; text-shadow: none; text-transform: none; word-spacing: normal; + -webkit-appearance: searchfield; + -webkit-box-sizing: border-box; -webkit-user-select: text; +} div[class~=xv-source-pane] { position: absolute; top:0; bottom:0; left:0; right:0; overflow: auto; } div[class~=xv-source-pane-inner] { position: relative; padding: 10px; padding-left: 0; } div[class~=xv-source-xml] { display: none; } div[class~=xv-error] { position: absolute; left:50%; top:100px; width:30em; padding: 20px; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; border: 1px solid #ccc; margin-left:-15em; font-size: 15px; color:#c00; line-height: 1.5; -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.3); -moz-box-shadow: 0 0 10px rgba(0,0,0,0.3); -ms-box-shadow: 0 0 10px rgba(0,0,0,0.3); box-shadow: 0 0 10px rgba(0,0,0,0.3); } div[class~=xv-error] h2 { font-size: 20px; margin-bottom: 1em; } span[class~=xv-error-state] span[class~=xv-source-pane], span[class~=xv-error-state] span[class~=xv-search-panel] { display: none; } canvas[class~=xv-drag-image] { position: absolute; left: 0px; top:0; z-index: 1; } span[class~=xv-dnd-tooltip] { padding: 2px 5px 3px 5px; color: #fff; font-family: "Lucida Grande", sans-serif; position: absolute; display: inline-block; font-size: 11px !important; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; background: #000; opacity: 0.8; z-index:1; white-space: nowrap; top:-2em; left:0; text-shadow: none !important; } span[class~=xv-dnd-tooltip]:after { display: inline-block; content: '.'; text-indent: -2em; overflow: hidden; position: absolute; width:6px; height: 6px; top:100%; left:10px; margin-top:-3px; background: #000; z-index: -1; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); -ms-transform: rotate(45deg); } span[class~=xv-node] { padding:0.25em 0 0.2em 15px; font-family:'Consolas', 'DejaVu Sans Mono', monospace; position:relative; display: block; } span[class~=hover] { background:#fefcf1; border-color:#f2c202; } span[class~=selected] > span[class~=xv-tag-open], span[class~=selected] > span[class~=xv-tag-close] { background:#e7e7e7; } span[class~=selected] > span[class~=xv-tag-open] span[class~=xv-tag-name], span[class~=selected] > span[class~=xv-tag-close] span[class~=xv-tag-name] { background:transparent; } span[class~=xv-tag-open], span[class~=xv-tag-close] { color:#5FAFEF; display: inline-block; padding:0 3px; white-space:nowrap; position: relative; border:1px solid transparent; -webkit-border-radius:1em; -moz-border-radius:0.8em; border-radius:0.8em; } span[class~=xv-tag-name] { color: #2F6F9F; background-color: rgb(244, 250, 255); } span[class~=xv-attr] { color: #4F9FCF; position: relative; } span[class~=xv-attr-name] { color: #4F9FCF; } span[class~=xv-attr-value] { color: #d44950; } span[class~=xv-text] { color:#000; padding-left: 20px; display: block; } span[class~=xv-tag-switcher] { display:inline-block; width:10px; height:1em; margin-right:-10px; margin-left:-0.9em; margin-top:0.15em; cursor:pointer; position:absolute; visibility:hidden; } span[class~=xv-tag-switcher]:before { content:'▼'; color:#7d7d7d; position:absolute; font-size:10px; } span[class~=xv-tag]:hover > span[class~=xv-tag-switcher], span[class~=xv-comment]:hover > span[class~=xv-tag-switcher] { visibility:visible; } span[class~=xv-collapsed] > span[class~=xv-tag-switcher] { opacity:1 !important; } span[class~=xv-collapsed] > span[class~=xv-tag-switcher]:before { content:'▶'; } span[class~=xv-collapsed] > span[class~=xv-tag], span[class~=xv-collapsed] > span[class~=xv-text], span[class~=xv-collapsed] > span[class~=xv-tag-children], span[class~=xv-collapsed] > span[class~=xv-tag-close] { display:none; } span[class~=xv-collapsed] > span[class~=xv-tag-open], span[class~=xv-collapsed] > span[class~=xv-comment-start] { background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fbf0c3), to(#f7e683)) !important; background-image: -moz-linear-gradient(top, #fbf0c3, #f7e683); background-color:#f7e683 !important; color:#b89946 !important; text-shadow:0 1px 0 #fcf4d2; border-color:#fcee9e #fae089 #f8d36e #fae28c; } span[class~=xv-collapsed] > span[class~=xv-tag-open] > span[class~=xv-tag-name], span[class~=xv-collapsed] > span[class~=xv-tag-open] > span[class~=xv-attr], span[class~=xv-collapsed] > span[class~=xv-tag-open] > span[class~=xv-attr] > span[class~=xv-attr-name], span[class~=xv-collapsed] > span[class~=xv-tag-open] > span[class~=xv-attr] > span[class~=xv-attr-value] { color:inherit; background:none; } span[class~=xv-marked] > span[class~=xv-tag-open] { background:#ebf2fb; -webkit-border-radius:5px; -moz-border-radius:5px; } span[class~=xv-one-line] > span[class~=xv-tag-open], span[class~=xv-one-line] > span[class~=xv-tag-close], span[class~=xv-one-line] > span[class~=xv-text] { display: inline; } span[class~=xv-one-line] > span[class~=xv-tag-children] > span[class~=xv-text] { padding-left: 0; display: inline; } span[class~=xv-one-line] > span[class~=xv-tag-switcher] { display: none; } span[class~=xv-comment] { color: #ccc; } span[class~=xv-comment-value] { display: block; padding-left: 15px; } span[class~=xv-comment-start] { /* display: inline-block; */ padding:0 3px; border:1px solid transparent; -webkit-border-radius:1em; -moz-border-radius:0.8em; border-radius:0.8em; } span[class~=xv-collapsed] > span[class~=xv-comment-value], span[class~=xv-collapsed] > span[class~=xv-comment-end] { display: none; } span[class~=xv-collapsed] > span[class~=xv-comment-start]:after { content: '... -->'; } span[class~=xv-one-line] > span[class~=xv-comment-value] { display: inline; padding-left: 0; } span[class~=xv-pi] { font-weight: bold; padding-left:17px; color: #2F6F9F; } div[class~=xv-search-panel] { position: absolute; left:0; right:0; padding: 8px 10px; border-top: 1px solid #ededed; border-bottom: 1px solid #a3a3a3; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#e5e5e5), to(#d6d6d6)) !important; background-image: -moz-linear-gradient(top left, #e5e5e5, #d6d6d6) !important; background-color: #e5e5e5; font-size:11px; height:37px; z-index: 2; -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -ms-box-sizing:border-box; -o-box-sizing:border-box; box-sizing:border-box; } input[class~=xv-search-field] { width:80%; max-width:40em; } div[class~=xv-search-panel] div[class~=xv-search-result] { left:10px; top:40px; max-height: 300px; } div[class~=xv-search-result] { position:absolute; background:#fff; background:rgba(255,255,255,0.85); z-index:10; padding:2px; border:1px solid #d2d2d2; zoom:1; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: 0 2px 2px rgba(0,0,0,0.1); -moz-box-shadow: 0 3px 2px rgba(0,0,0,0.1); -ms-box-shadow: 0 3px 2px rgba(0,0,0,0.1); box-shadow: 0 2px 2px rgba(0,0,0,0.1); -webkit-border-top-left-radius:2px; -moz-border-radius-topleft:2px; border-top-left-radius:2px; } ul[class~=xv-search-result-content] { position:relative; overflow:auto; overflow-x:hidden; zoom:1; min-width:100px; display: block; list-style: none; } /* Content assist popup has scollable content */ div[class~=xv-search-result-overflow] ul[class~=xv-search-result-content] { padding-right:2px; } li[class~=xv-search-result-item] { color:#242423; font-family:'Lucida Grande', arial, sans-serif; font-size:11px; font-weight:bold; line-height:20px; /* Set line-height in pixels for better look in Firefox */ padding:0 4px 1px 4px; cursor:pointer; overflow:hidden; position:relative; white-space: nowrap; -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; border-radius: 3px; -webkit-border-top-left-radius:0; -moz-border-radius-topleft:0; border-top-left-radius:0; } li[class~=xv-search-result-item] em { font-weight: bold; font-style: normal; text-decoration: underline; } li[class~=xv-search-result-item-selected] { background:#7a8da1; background:-webkit-gradient(linear, left top, left bottom, from(#7a8da1), to(#455d75)); background-image:-moz-linear-gradient(top,#7a8da1,#455d75); color:#fff; text-shadow:0 1px 0 rgba(0,0,0,0.7); } span[class~=xv-search-result-xpath] { color: #ccc; margin-left:10px; font-weight: normal; display: inline-block; max-width: 40em; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; vertical-align: bottom; } /** neat scrollbars for Webkit */ ul[class~=xv-search-result-content]::-webkit-scrollbar { width:9px; height:9px; } ul[class~=xv-search-result-content]::-webkit-scrollbar-track { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAHCAIAAABPxRC5AAAAPElEQVQImVWLwRGAMBCElou5/vuLtQQfPoz8GAbutWb3Ncacs7tLTaJSpVaSJIB7AwXkoE5Rv//X3wt4ACQ3F9lopNWrAAAAAElFTkSuQmCC) transparent 50% 0 repeat-y; -webkit-border-radius:5px; } ul[class~=xv-search-result-content]::-webkit-scrollbar-thumb { -webkit-border-radius:4px; background:#c5c5c4; background: -webkit-gradient(linear, left top, right top, from(#f9f9f9), to(#e6e6e6)); border:1px solid #d3d2d2; left:0; position:absolute; -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); } div[class~=xv-search-result-hidden] { display: none !important; } span[class~=xv-dnd-tooltip-hidden] { visibility: hidden; } \ No newline at end of file