You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by ch...@apache.org on 2009/08/14 14:17:59 UTC

svn commit: r804181 - in /incubator/shindig/trunk/php/src/gadgets: render/GadgetBaseRenderer.php rewrite/GadgetRewriter.php

Author: chabotc
Date: Fri Aug 14 12:17:59 2009
New Revision: 804181

URL: http://svn.apache.org/viewvc?rev=804181&view=rev
Log:
When a proxied content document didn't have a head tag, DOM Rewriting based script and css injection failed since it never triggered the head listener, to avoid that a head tag is automatically added if it's missing

Modified:
    incubator/shindig/trunk/php/src/gadgets/render/GadgetBaseRenderer.php
    incubator/shindig/trunk/php/src/gadgets/rewrite/GadgetRewriter.php

Modified: incubator/shindig/trunk/php/src/gadgets/render/GadgetBaseRenderer.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/gadgets/render/GadgetBaseRenderer.php?rev=804181&r1=804180&r2=804181&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/gadgets/render/GadgetBaseRenderer.php (original)
+++ incubator/shindig/trunk/php/src/gadgets/render/GadgetBaseRenderer.php Fri Aug 14 12:17:59 2009
@@ -266,7 +266,7 @@
     $rewriter = new GadgetRewriter($this->context);
     $rewriter->addObserver('head', $this, 'addHeadTags');
     $rewriter->addObserver('body', $this, 'addBodyTags');
-    return $rewriter->rewrite($content, $this->gadget);
+    return $rewriter->rewrite($content, $this->gadget, true);
   }
 
   /**

Modified: incubator/shindig/trunk/php/src/gadgets/rewrite/GadgetRewriter.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/gadgets/rewrite/GadgetRewriter.php?rev=804181&r1=804180&r2=804181&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/gadgets/rewrite/GadgetRewriter.php (original)
+++ incubator/shindig/trunk/php/src/gadgets/rewrite/GadgetRewriter.php Fri Aug 14 12:17:59 2009
@@ -38,7 +38,7 @@
    * @param string $content
    * @param Gadget $gadget
    */
-  public function rewrite($content, Gadget &$gadget) {
+  public function rewrite($content, Gadget &$gadget, $checkDocument = false) {
     // Check to see if the gadget requested rewriting, or if rewriting is forced in the configuration
     if (is_array($gadget->gadgetSpec->rewrite) || Config::get('rewrite_by_default')) {
       require_once "src/gadgets/rewrite/ContentRewriter.php";
@@ -68,6 +68,11 @@
         // parsing failed, return the unmodified content
         return $content;
       }
+
+      if ($checkDocument) {
+      	$this->checkDocument();
+      }
+
       // find and parse all nodes in the dom document
       $rootNodes = $this->doc->getElementsByTagName('*');
       $this->parseNodes($rootNodes);
@@ -82,6 +87,32 @@
   }
 
   /**
+   * Proxied content documents do not always have a head tag which would cause the css & script injection
+   * to fail (since that node listeners would never be called). Do note that the html and body tags will
+   * already be automatically added by the DOMDocument->loadHtml function
+   */
+  private function checkDocument() {
+    foreach ($this->doc->childNodes as $node) {
+    	$htmlNode = false;
+    	if (isset($node->tagName) && strtolower($node->tagName) == 'html') {
+    		$htmlNode = $node;
+    		$hasHeadTag = false;
+    		foreach ($node->childNodes as $htmlChild) {
+    			if (isset($htmlChild->tagName) && $htmlChild->tagName == 'head') {
+    				$hasHeadTag = true;
+    				break;
+    			}
+    		}
+    		// If no <head> tag was found but we do have a <html> node, then add the <head> tag to it
+    		if (!$hasHeadTag && $htmlNode && $htmlNode->childNodes->length > 0) {
+    			$firstChild = $htmlNode->childNodes->item(0);
+          $htmlNode->insertBefore($this->doc->createElement('head'), $firstChild);
+    		}
+    	}
+    }
+  }
+
+  /**
    * This function should be called from the DomRewriter implmentation class in the form of:
    * addObserver('img', $this, 'rewriteImage')
    *