summaryrefslogtreecommitdiff
path: root/core/dom/document.js
diff options
context:
space:
mode:
Diffstat (limited to 'core/dom/document.js')
-rw-r--r--core/dom/document.js270
1 files changed, 270 insertions, 0 deletions
diff --git a/core/dom/document.js b/core/dom/document.js
new file mode 100644
index 0000000..425acb8
--- /dev/null
+++ b/core/dom/document.js
@@ -0,0 +1,270 @@
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+/**
+ * @fileOverview Defines the {@link CKEDITOR.dom.document} class, which
+ * represents a DOM document.
+ */
+
+/**
+ * Represents a DOM document.
+ *
+ * var document = new CKEDITOR.dom.document( document );
+ *
+ * @class
+ * @extends CKEDITOR.dom.domObject
+ * @constructor Creates a document class instance.
+ * @param {Object} domDocument A native DOM document.
+ */
+CKEDITOR.dom.document = function( domDocument ) {
+ CKEDITOR.dom.domObject.call( this, domDocument );
+};
+
+// PACKAGER_RENAME( CKEDITOR.dom.document )
+
+CKEDITOR.dom.document.prototype = new CKEDITOR.dom.domObject();
+
+CKEDITOR.tools.extend( CKEDITOR.dom.document.prototype, {
+ /**
+ * The node type. This is a constant value set to {@link CKEDITOR#NODE_DOCUMENT}.
+ *
+ * @readonly
+ * @property {Number} [=CKEDITOR.NODE_DOCUMENT]
+ */
+ type: CKEDITOR.NODE_DOCUMENT,
+
+ /**
+ * Appends a CSS file to the document.
+ *
+ * CKEDITOR.document.appendStyleSheet( '/mystyles.css' );
+ *
+ * @param {String} cssFileUrl The CSS file URL.
+ */
+ appendStyleSheet: function( cssFileUrl ) {
+ if ( this.$.createStyleSheet )
+ this.$.createStyleSheet( cssFileUrl );
+ else {
+ var link = new CKEDITOR.dom.element( 'link' );
+ link.setAttributes({
+ rel: 'stylesheet',
+ type: 'text/css',
+ href: cssFileUrl
+ });
+
+ this.getHead().append( link );
+ }
+ },
+
+ /**
+ * Creates a CSS style sheet and inserts it into the document.
+ *
+ * @param cssStyleText {String} CSS style text.
+ * @returns {Object} The created DOM native style sheet object.
+ */
+ appendStyleText: function( cssStyleText ) {
+ if ( this.$.createStyleSheet ) {
+ var styleSheet = this.$.createStyleSheet( "" );
+ styleSheet.cssText = cssStyleText;
+ } else {
+ var style = new CKEDITOR.dom.element( 'style', this );
+ style.append( new CKEDITOR.dom.text( cssStyleText, this ) );
+ this.getHead().append( style );
+ }
+
+ return styleSheet || style.$.sheet;
+ },
+
+ /**
+ * Creates {@link CKEDITOR.dom.element} instance in this document.
+ *
+ * @returns {CKEDITOR.dom.element}
+ * @todo
+ */
+ createElement: function( name, attribsAndStyles ) {
+ var element = new CKEDITOR.dom.element( name, this );
+
+ if ( attribsAndStyles ) {
+ if ( attribsAndStyles.attributes )
+ element.setAttributes( attribsAndStyles.attributes );
+
+ if ( attribsAndStyles.styles )
+ element.setStyles( attribsAndStyles.styles );
+ }
+
+ return element;
+ },
+
+ /**
+ * Creates {@link CKEDITOR.dom.text} instance in this document.
+ *
+ * @param {String} text Value of the text node.
+ * @returns {CKEDITOR.dom.element}
+ */
+ createText: function( text ) {
+ return new CKEDITOR.dom.text( text, this );
+ },
+
+ /**
+ * Moves the selection focus to this document's window.
+ */
+ focus: function() {
+ this.getWindow().focus();
+ },
+
+ /**
+ * Returns the element that is currently designated as the active element in the document.
+ *
+ * **Note:** Only one element can be active at a time in a document.
+ * An active element does not necessarily have focus,
+ * but an element with focus is always the active element in a document.
+ *
+ * @returns {CKEDITOR.dom.element}
+ */
+ getActive: function() {
+ return new CKEDITOR.dom.element( this.$.activeElement );
+ },
+
+ /**
+ * Gets an element based on its id.
+ *
+ * var element = CKEDITOR.document.getById( 'myElement' );
+ * alert( element.getId() ); // 'myElement'
+ *
+ * @param {String} elementId The element id.
+ * @returns {CKEDITOR.dom.element} The element instance, or null if not found.
+ */
+ getById: function( elementId ) {
+ var $ = this.$.getElementById( elementId );
+ return $ ? new CKEDITOR.dom.element( $ ) : null;
+ },
+
+ /**
+ * Gets a node based on its address. See {@link CKEDITOR.dom.node#getAddress}.
+ *
+ * @param {Array} address
+ * @param {Boolean} [normalized=false]
+ */
+ getByAddress: function( address, normalized ) {
+ var $ = this.$.documentElement;
+
+ for ( var i = 0; $ && i < address.length; i++ ) {
+ var target = address[ i ];
+
+ if ( !normalized ) {
+ $ = $.childNodes[ target ];
+ continue;
+ }
+
+ var currentIndex = -1;
+
+ for ( var j = 0; j < $.childNodes.length; j++ ) {
+ var candidate = $.childNodes[ j ];
+
+ if ( normalized === true && candidate.nodeType == 3 && candidate.previousSibling && candidate.previousSibling.nodeType == 3 ) {
+ continue;
+ }
+
+ currentIndex++;
+
+ if ( currentIndex == target ) {
+ $ = candidate;
+ break;
+ }
+ }
+ }
+
+ return $ ? new CKEDITOR.dom.node( $ ) : null;
+ },
+
+ /**
+ * Gets elements list based on given tag name.
+ *
+ * @param {String} tagName The element tag name.
+ * @returns {CKEDITOR.dom.nodeList} The nodes list.
+ */
+ getElementsByTag: function( tagName, namespace ) {
+ if ( !( CKEDITOR.env.ie && !( document.documentMode > 8 ) ) && namespace )
+ tagName = namespace + ':' + tagName;
+ return new CKEDITOR.dom.nodeList( this.$.getElementsByTagName( tagName ) );
+ },
+
+ /**
+ * Gets the `<head>` element for this document.
+ *
+ * var element = CKEDITOR.document.getHead();
+ * alert( element.getName() ); // 'head'
+ *
+ * @returns {CKEDITOR.dom.element} The `<head>` element.
+ */
+ getHead: function() {
+ var head = this.$.getElementsByTagName( 'head' )[ 0 ];
+ if ( !head )
+ head = this.getDocumentElement().append( new CKEDITOR.dom.element( 'head' ), true );
+ else
+ head = new CKEDITOR.dom.element( head );
+
+ return head;
+ },
+
+ /**
+ * Gets the `<body>` element for this document.
+ *
+ * var element = CKEDITOR.document.getBody();
+ * alert( element.getName() ); // 'body'
+ *
+ * @returns {CKEDITOR.dom.element} The `<body>` element.
+ */
+ getBody: function() {
+ return new CKEDITOR.dom.element( this.$.body );
+ },
+
+ /**
+ * Gets the DOM document element for this document.
+ *
+ * @returns {CKEDITOR.dom.element} The DOM document element.
+ */
+ getDocumentElement: function() {
+ return new CKEDITOR.dom.element( this.$.documentElement );
+ },
+
+ /**
+ * Gets the window object that holds this document.
+ *
+ * @returns {CKEDITOR.dom.window} The window object.
+ */
+ getWindow: function() {
+ return new CKEDITOR.dom.window( this.$.parentWindow || this.$.defaultView );
+ },
+
+ /**
+ * Defines the document contents through document.write. Note that the
+ * previous document contents will be lost (cleaned).
+ *
+ * document.write(
+ * '<html>' +
+ * '<head><title>Sample Doc</title></head>' +
+ * '<body>Document contents created by code</body>' +
+ * '</html>'
+ * );
+ *
+ * @since 3.5
+ * @param {String} html The HTML defining the document contents.
+ */
+ write: function( html ) {
+ // Don't leave any history log in IE. (#5657)
+ this.$.open( 'text/html', 'replace' );
+
+ // Support for custom document.domain in IE.
+ //
+ // The script must be appended because if placed before the
+ // doctype, IE will go into quirks mode and mess with
+ // the editable, e.g. by changing its default height.
+ if ( CKEDITOR.env.ie )
+ html = html.replace( /(?:^\s*<!DOCTYPE[^>]*?>)|^/i, '$&\n<script data-cke-temp="1">(' + CKEDITOR.tools.fixDomain + ')();</script>' );
+
+ this.$.write( html );
+ this.$.close();
+ }
+});