content.coffee | |
---|---|
Template | |
Private variables | |
Backups of relevant elements, each related to individual requests. | elementBackups = {} |
Details of the last relevant elements. | elements =
field: null
link: null
other: null |
List of shortcuts used by enabled templates. | hotkeys = [] |
Helpers | |
Extract the value the specified | extractAll = (array, property) ->
results = []
for element in array when element[property]?
results.push element[property] if element[property] not in results
results |
Attempt to derive the most relevant anchor element from those stored under
the | getLink = (id, url) ->
return unless elementBackups[id]?
if elementBackups[id].link?.href is url
elementBackups[id].link
else
parentLink elementBackups[id].other |
Attempt to extract the contents of the meta element with the specified
| getMeta = (name, csv) ->
content = document.querySelector("meta[name='#{name}']")?.content?.trim()
if csv and content?
results = []
for value in content.split /\s*,\s*/ when value.length
results.push value if value not in results
results
else
content |
Determine whether or not | isEditable = (node) ->
node? and not node.disabled and not node.readOnly |
Traverse the parents of | parentLink = (node) ->
return unless node?
if node.nodeName is 'A' then node else parentLink node.parentNode |
Paste | paste = (node, value) ->
return unless node? or value
str = node.value.substr 0, node.selectionStart
str += value
str += node.value.substr node.selectionEnd, node.value.length
node.value = str |
Functionality | |
Wrap the function functionality in a request for Template's extension ID and current version so that it can be used to detect previous injections. | chrome.extension.sendRequest type: 'info', (data) ->
hotkeys = data.hotkeys
isMac = navigator.userAgent.toLowerCase().indexOf('mac') isnt -1 |
Only add the listeners if a previous injection isn't detected for version of Template that is currently running. | return if document.body.getAttribute(data.id) is data.version
document.body.setAttribute data.id, data.version |
Record relevant links and input fields when using the right-click menu. | window.addEventListener 'contextmenu', (e) ->
switch e.target.nodeName
when 'A' then elements.link = e.target
when 'INPUT', 'TEXTAREA' then elements.field = e.target
else elements.other = e.target |
Add a listener for extension keyboard shortcuts in to the page context. | window.addEventListener 'keydown', (e) ->
if (not isMac and e.ctrlKey and e.altKey) or
(isMac and e.shiftKey and e.altKey)
key = String.fromCharCode(e.keyCode).toUpperCase()
if key in hotkeys
if e.target.nodeName in ['INPUT', 'TEXTAREA']
elements.field = e.target
else
elements.field = null
chrome.extension.sendRequest
data: key: key
type: 'shortcut'
e.preventDefault() |
Add a listener to provide the background page with information that is extracted from the DOM or perform auto-paste functionality. | chrome.extension.onRequest.addListener (request, sender, sendResponse) -> |
Ensure local hotkeys are up-to-date. | if request.hotkeys?
hotkeys = request.hotkeys
return sendResponse()
return sendResponse() unless request.id?
if request.type is 'paste'
if request.contents? and
isEditable elementBackups[request.id]?.field
paste elementBackups[request.id].field, request.contents |
Backups no longer required so might as well clean up a bit. | delete elementBackups[request.id]
return sendResponse() |
Create a backup of the relevant elements for this request. | elementBackups[request.id] =
field: if request.editable or request.shortcut then elements.field
link: if request.link then elements.link
other: if request.link then elements.other
selection = window.getSelection()
unless selection.isCollapsed
if contents = selection.getRangeAt(0).cloneContents()
container = document.createElement 'div'
container.appendChild contents |
Convert relative addresses to absolute. | href.href = href.href for href in container.querySelectorAll '[href]'
src.src = src.src for src in container.querySelectorAll '[src]' |
Capture addresses for links and images. | images = extractAll container.querySelectorAll('img[src]'), 'src'
links = extractAll container.querySelectorAll('a[href]'), 'href'
link = getLink request.id, request.url |
Build response with values derived from the DOM. | sendResponse
author: getMeta 'author'
characterSet: document.characterSet
description: getMeta 'description'
images: extractAll document.images, 'src'
keywords: getMeta('keywords', yes)
lastModified: document.lastModified
linkHTML: link?.innerHTML
linkText: link?.textContent
links: extractAll document.links, 'href'
pageHeight: window.innerHeight
pageWidth: window.innerWidth
referrer: document.referrer
scripts: extractAll document.scripts, 'src'
selectedImages: images
selectedLinks: links
selection: selection.toString()
selectionHTML: container?.innerHTML
styleSheets: extractAll document.styleSheets, 'href'
|