browser.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /**
  2. * Package: svgedit.browser
  3. *
  4. * Licensed under the Apache License, Version 2
  5. *
  6. * Copyright(c) 2010 Jeff Schiller
  7. * Copyright(c) 2010 Alexis Deveria
  8. */
  9. // Dependencies:
  10. // 1) jQuery (for $.alert())
  11. var svgedit = svgedit || {};
  12. (function() {
  13. if (!svgedit.browser) {
  14. svgedit.browser = {};
  15. }
  16. var supportsSvg_ = (function() {
  17. return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
  18. })();
  19. svgedit.browser.supportsSvg = function() { return supportsSvg_; }
  20. if(!svgedit.browser.supportsSvg()) {
  21. window.location = "browser-not-supported.html";
  22. }
  23. else{
  24. var svgns = 'http://www.w3.org/2000/svg';
  25. var userAgent = navigator.userAgent;
  26. var svg = document.createElementNS(svgns, 'svg');
  27. // Note: Browser sniffing should only be used if no other detection method is possible
  28. var isOpera_ = !!window.opera;
  29. var isWebkit_ = userAgent.indexOf("AppleWebKit") >= 0;
  30. var isGecko_ = userAgent.indexOf('Gecko/') >= 0;
  31. var isIE_ = userAgent.indexOf('MSIE') >= 0;
  32. var isChrome_ = userAgent.indexOf('Chrome/') >= 0;
  33. var isWindows_ = userAgent.indexOf('Windows') >= 0;
  34. var supportsSelectors_ = (function() {
  35. return !!svg.querySelector;
  36. })();
  37. var supportsXpath_ = (function() {
  38. return !!document.evaluate;
  39. })();
  40. // segList functions (for FF1.5 and 2.0)
  41. var supportsPathReplaceItem_ = (function() {
  42. var path = document.createElementNS(svgns, 'path');
  43. path.setAttribute('d','M0,0 10,10');
  44. var seglist = path.pathSegList;
  45. var seg = path.createSVGPathSegLinetoAbs(5,5);
  46. try {
  47. seglist.replaceItem(seg, 0);
  48. return true;
  49. } catch(err) {}
  50. return false;
  51. })();
  52. var supportsPathInsertItemBefore_ = (function() {
  53. var path = document.createElementNS(svgns,'path');
  54. path.setAttribute('d','M0,0 10,10');
  55. var seglist = path.pathSegList;
  56. var seg = path.createSVGPathSegLinetoAbs(5,5);
  57. try {
  58. seglist.insertItemBefore(seg, 0);
  59. return true;
  60. } catch(err) {}
  61. return false;
  62. })();
  63. // text character positioning (for IE9)
  64. var supportsGoodTextCharPos_ = (function() {
  65. var retValue = false;
  66. var svgroot = document.createElementNS(svgns, 'svg');
  67. var svgcontent = document.createElementNS(svgns, 'svg');
  68. document.documentElement.appendChild(svgroot);
  69. svgcontent.setAttribute('x', 5);
  70. svgroot.appendChild(svgcontent);
  71. var text = document.createElementNS(svgns,'text');
  72. text.textContent = 'a';
  73. svgcontent.appendChild(text);
  74. var pos = text.getStartPositionOfChar(0).x;
  75. document.documentElement.removeChild(svgroot);
  76. return (pos === 0);
  77. })();
  78. var supportsPathBBox_ = (function() {
  79. var svgcontent = document.createElementNS(svgns, 'svg');
  80. document.documentElement.appendChild(svgcontent);
  81. var path = document.createElementNS(svgns, 'path');
  82. path.setAttribute('d','M0,0 C0,0 10,10 10,0');
  83. svgcontent.appendChild(path);
  84. var bbox = path.getBBox();
  85. document.documentElement.removeChild(svgcontent);
  86. return (bbox.height > 4 && bbox.height < 5);
  87. })();
  88. // Support for correct bbox sizing on groups with horizontal/vertical lines
  89. var supportsHVLineContainerBBox_ = (function() {
  90. var svgcontent = document.createElementNS(svgns, 'svg');
  91. document.documentElement.appendChild(svgcontent);
  92. var path = document.createElementNS(svgns, 'path');
  93. path.setAttribute('d','M0,0 10,0');
  94. var path2 = document.createElementNS(svgns, 'path');
  95. path2.setAttribute('d','M5,0 15,0');
  96. var g = document.createElementNS(svgns, 'g');
  97. g.appendChild(path);
  98. g.appendChild(path2);
  99. svgcontent.appendChild(g);
  100. var bbox = g.getBBox();
  101. document.documentElement.removeChild(svgcontent);
  102. // Webkit gives 0, FF gives 10, Opera (correctly) gives 15
  103. return (bbox.width == 15);
  104. })();
  105. var supportsEditableText_ = (function() {
  106. // TODO: Find better way to check support for this
  107. return isOpera_;
  108. })();
  109. var supportsGoodDecimals_ = (function() {
  110. // Correct decimals on clone attributes (Opera < 10.5/win/non-en)
  111. var rect = document.createElementNS(svgns, 'rect');
  112. rect.setAttribute('x',.1);
  113. var crect = rect.cloneNode(false);
  114. var retValue = (crect.getAttribute('x').indexOf(',') == -1);
  115. if(!retValue) {
  116. $.alert("NOTE: This version of Opera is known to contain bugs in SVG-edit.\n\
  117. Please upgrade to the <a href='http://opera.com'>latest version</a> in which the problems have been fixed.");
  118. }
  119. return retValue;
  120. })();
  121. var supportsNonScalingStroke_ = (function() {
  122. var rect = document.createElementNS(svgns, 'rect');
  123. rect.setAttribute('style','vector-effect:non-scaling-stroke');
  124. return rect.style.vectorEffect === 'non-scaling-stroke';
  125. })();
  126. var supportsNativeSVGTransformLists_ = (function() {
  127. var rect = document.createElementNS(svgns, 'rect');
  128. var rxform = rect.transform.baseVal;
  129. var t1 = svg.createSVGTransform();
  130. rxform.appendItem(t1);
  131. return rxform.getItem(0) == t1;
  132. })();
  133. // Public API
  134. svgedit.browser.isOpera = function() { return isOpera_; }
  135. svgedit.browser.isWebkit = function() { return isWebkit_; }
  136. svgedit.browser.isGecko = function() { return isGecko_; }
  137. svgedit.browser.isIE = function() { return isIE_; }
  138. svgedit.browser.isChrome = function() { return isChrome_; }
  139. svgedit.browser.isWindows = function() { return isWindows_; }
  140. svgedit.browser.supportsSelectors = function() { return supportsSelectors_; }
  141. svgedit.browser.supportsXpath = function() { return supportsXpath_; }
  142. svgedit.browser.supportsPathReplaceItem = function() { return supportsPathReplaceItem_; }
  143. svgedit.browser.supportsPathInsertItemBefore = function() { return supportsPathInsertItemBefore_; }
  144. svgedit.browser.supportsPathBBox = function() { return supportsPathBBox_; }
  145. svgedit.browser.supportsHVLineContainerBBox = function() { return supportsHVLineContainerBBox_; }
  146. svgedit.browser.supportsGoodTextCharPos = function() { return supportsGoodTextCharPos_; }
  147. svgedit.browser.supportsEditableText = function() { return supportsEditableText_; }
  148. svgedit.browser.supportsGoodDecimals = function() { return supportsGoodDecimals_; }
  149. svgedit.browser.supportsNonScalingStroke = function() { return supportsNonScalingStroke_; }
  150. svgedit.browser.supportsNativeTransformLists = function() { return supportsNativeSVGTransformLists_; }
  151. }
  152. })();