aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrmr19932015-08-26 18:21:27 +0100
committermrmr19932015-08-26 18:22:52 +0100
commit46fe5cffc952b80371f839fce0aa2fc8ded27f50 (patch)
tree95d1a8e17e2925476d5206ac85cf161d6c5f436b
parentc08e59ea14c5b691a20a62d204456a8496258d0f (diff)
downloadvimium-46fe5cffc952b80371f839fce0aa2fc8ded27f50.tar.bz2
Use createElementNS for XML documents and remove XML specific codepaths
This implements @gdh1995's idea from #1796.
-rw-r--r--content_scripts/hud.coffee2
-rw-r--r--content_scripts/link_hints.coffee2
-rw-r--r--content_scripts/ui_component.coffee17
-rw-r--r--content_scripts/vimium_frontend.coffee17
-rw-r--r--lib/clipboard.coffee2
-rw-r--r--lib/dom_utils.coffee18
-rw-r--r--lib/utils.coffee2
7 files changed, 29 insertions, 31 deletions
diff --git a/content_scripts/hud.coffee b/content_scripts/hud.coffee
index bfad71b7..5a3d9b79 100644
--- a/content_scripts/hud.coffee
+++ b/content_scripts/hud.coffee
@@ -96,7 +96,7 @@ class Tween
styleElement: null
constructor: (@cssSelector, insertionPoint = document.documentElement) ->
- @styleElement = document.createElement "style"
+ @styleElement = DomUtils.createElement "style"
unless @styleElement.style
# We're in an XML document, so we shouldn't inject any elements. See the comment in UIComponent.
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 8e106b0f..3b607e8e 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -127,7 +127,7 @@ class LinkHintsMode
# Creates a link marker for the given link.
#
createMarkerFor: (link) ->
- marker = document.createElement("div")
+ marker = DomUtils.createElement("div")
marker.className = "vimiumReset internalVimiumHintMarker vimiumHintMarker"
marker.clickableItem = link.element
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee
index e4cfc293..a5be78fc 100644
--- a/content_scripts/ui_component.coffee
+++ b/content_scripts/ui_component.coffee
@@ -6,28 +6,17 @@ class UIComponent
shadowDOM: null
constructor: (iframeUrl, className, @handleMessage) ->
- styleSheet = document.createElement "style"
-
- unless styleSheet.style
- # If this is an XML document, nothing we do here works:
- # * <style> elements show their contents inline,
- # * <iframe> elements don't load any content,
- # * document.createElement generates elements that have style == null and ignore CSS.
- # If this is the case we don't want to pollute the DOM to no or negative effect. So we bail
- # immediately, and disable all externally-called methods.
- @postMessage = @activate = @show = @hide = ->
- console.log "This vimium feature is disabled because it is incompatible with this page."
- return
+ styleSheet = DomUtils.createElement "style"
styleSheet.type = "text/css"
# Default to everything hidden while the stylesheet loads.
styleSheet.innerHTML = "@import url(\"#{chrome.runtime.getURL("content_scripts/vimium.css")}\");"
- @iframeElement = document.createElement "iframe"
+ @iframeElement = DomUtils.createElement "iframe"
extend @iframeElement,
className: className
seamless: "seamless"
- shadowWrapper = document.createElement "div"
+ shadowWrapper = DomUtils.createElement "div"
# PhantomJS doesn't support createShadowRoot, so guard against its non-existance.
@shadowDOM = shadowWrapper.createShadowRoot?() ? shadowWrapper
@shadowDOM.appendChild styleSheet
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 9d850419..62aa684d 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -276,17 +276,16 @@ setScrollPosition = ({ scrollX, scrollY }) ->
#
window.focusThisFrame = do ->
# Create a shadow DOM wrapping the frame so the page's styles don't interfere with ours.
- highlightedFrameElement = document.createElement "div"
+ highlightedFrameElement = DomUtils.createElement "div"
# PhantomJS doesn't support createShadowRoot, so guard against its non-existance.
_shadowDOM = highlightedFrameElement.createShadowRoot?() ? highlightedFrameElement
# Inject stylesheet.
- _styleSheet = document.createElement "style"
- if _styleSheet.style?
- _styleSheet.innerHTML = "@import url(\"#{chrome.runtime.getURL("content_scripts/vimium.css")}\");"
- _shadowDOM.appendChild _styleSheet
+ _styleSheet = DomUtils.createElement "style"
+ _styleSheet.innerHTML = "@import url(\"#{chrome.runtime.getURL("content_scripts/vimium.css")}\");"
+ _shadowDOM.appendChild _styleSheet
- _frameEl = document.createElement "div"
+ _frameEl = DomUtils.createElement "div"
_frameEl.className = "vimiumReset vimiumHighlightedFrame"
_shadowDOM.appendChild _frameEl
@@ -405,7 +404,7 @@ extend window,
Math.min(count, visibleInputs.length) - 1
hints = for tuple in visibleInputs
- hint = document.createElement "div"
+ hint = DomUtils.createElement "div"
hint.className = "vimiumReset internalVimiumInputHint vimiumInputHint"
# minus 1 for the border
@@ -775,7 +774,7 @@ window.enterFindMode = ->
window.showHelpDialog = (html, fid) ->
return if (isShowingHelpDialog || !document.body || fid != frameId)
isShowingHelpDialog = true
- container = document.createElement("div")
+ container = DomUtils.createElement("div")
container.id = "vimiumHelpDialogContainer"
container.className = "vimiumReset"
@@ -861,7 +860,7 @@ CursorHider =
# See #1345 and #1348.
return unless Utils.haveChromeVersion "39.0.2171.71"
- @cursorHideStyle = document.createElement("style")
+ @cursorHideStyle = DomUtils.createElement("style")
@cursorHideStyle.innerHTML = """
body * {pointer-events: none !important; cursor: none !important;}
body, html {cursor: none !important;}
diff --git a/lib/clipboard.coffee b/lib/clipboard.coffee
index 2b28df70..26cd2fad 100644
--- a/lib/clipboard.coffee
+++ b/lib/clipboard.coffee
@@ -1,6 +1,6 @@
Clipboard =
_createTextArea: ->
- textArea = document.createElement("textarea")
+ textArea = DomUtils.createElement("textarea")
textArea.style.position = "absolute"
textArea.style.left = "-100%"
textArea
diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee
index d4f5953d..8a3969b1 100644
--- a/lib/dom_utils.coffee
+++ b/lib/dom_utils.coffee
@@ -8,12 +8,22 @@ DomUtils =
else
func()
+ createElement: (tagName) ->
+ element = document.createElement tagName
+ if element.style
+ # The document namespace provides (X)HTML elements, so we can use them directly.
+ element
+ else
+ # The document namespace doesn't give (X)HTML elements, so we create them with the correct namespace
+ # manually.
+ document.createElementNS "http://www.w3.org/1999/xhtml", tagName
+
#
# Adds a list of elements to a page.
# Note that adding these nodes all at once (via the parent div) is significantly faster than one-by-one.
#
addElementList: (els, overlayOptions) ->
- parent = document.createElement("div")
+ parent = DomUtils.createElement("div")
parent.id = overlayOptions.id if overlayOptions.id?
parent.className = overlayOptions.className if overlayOptions.className?
parent.appendChild(el) for el in els
@@ -236,7 +246,7 @@ DomUtils =
# momentarily flash a rectangular border to give user some visual feedback
flashRect: (rect) ->
- flashEl = document.createElement("div")
+ flashEl = DomUtils.createElement("div")
flashEl.id = "vimiumFlash"
flashEl.className = "vimiumReset"
flashEl.style.left = rect.left + window.scrollX + "px"
@@ -297,7 +307,7 @@ DomUtils =
'letterSpacing', 'wordSpacing' ]
(element, position) ->
- div = document.createElement "div"
+ div = DomUtils.createElement "div"
div.id = "vimium-input-textarea-caret-position-mirror-div"
document.body.appendChild div
@@ -315,7 +325,7 @@ DomUtils =
if element.nodeName.toLowerCase() == "input"
div.textContent = div.textContent.replace /\s/g, "\u00a0"
- span = document.createElement "span"
+ span = DomUtils.createElement "span"
span.textContent = element.value.substring(position) || "."
div.appendChild span
diff --git a/lib/utils.coffee b/lib/utils.coffee
index d4beff03..c0da6fb3 100644
--- a/lib/utils.coffee
+++ b/lib/utils.coffee
@@ -21,7 +21,7 @@ Utils =
# Creates a single DOM element from :html
createElementFromHtml: (html) ->
- tmp = document.createElement("div")
+ tmp = DomUtils.createElement("div")
tmp.innerHTML = html
tmp.firstChild