Index: iframe-proxy.php
===================================================================
RCS file: iframe-proxy.php
diff -N iframe-proxy.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ iframe-proxy.php	10 Dec 2009 15:39:09 -0000
@@ -0,0 +1,15 @@
+<?php
+if (empty($_GET['url'])) die;
+
+$curl = curl_init(urldecode($_GET['url']));
+curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
+curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
+$response = curl_exec($curl);
+curl_close($curl);
+
+if (strpos($response, '<base') === FALSE) {
+  $url = parse_url(urldecode($_GET['url']));
+  $response = preg_replace('/<head.*>/U', '<head><base href="'. $url['scheme'] .'://'. $url['host'] .'/'. $url['path'] .'" />', $response);
+}
+
+die($response);
Index: iframe.js
===================================================================
RCS file: iframe.js
diff -N iframe.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ iframe.js	10 Dec 2009 15:39:09 -0000
@@ -0,0 +1,7 @@
+Drupal.behaviors.iframe_resize = function() {
+  for (var i in Drupal.settings.iframe) {
+    $('#' + i)[0].contentWindow.onload = function() {
+      $(this)[0].frameElement.style.height = ($(this)[0].document.body.scrollHeight + 18) + "px";
+    };
+  };
+}
Index: iframe.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/iframe/iframe.module,v
retrieving revision 1.12
diff -u -p -r1.12 iframe.module
--- iframe.module	10 May 2009 00:04:27 -0000	1.12
+++ iframe.module	10 Dec 2009 15:39:09 -0000
@@ -118,7 +118,7 @@ function iframe_field_settings($op, $fie
       $form['attributes']['height'] = array(
         '#type' => 'textfield',
         '#title' => t('height of the iframe'),
-        '#description' => t('iframes need fix width and height, only numbers are allowed.'),
+        '#description' => t("Either a fixed number for pixels or 'auto' for the full height of the iframed content."),
         '#default_value' => empty($field['attributes']['height']) ? '700' : $field['attributes']['height'],
         '#maxlength' => 4,
         '#size' => 4,
@@ -146,7 +146,7 @@ function iframe_field_settings($op, $fie
       if (empty($field['attributes']['width']) || (int)$field['attributes']['width']<1) {
         form_set_error('width_value', t('A default width and height must be provided.'));
       }
-      if (empty($field['attributes']['height']) || (int)$field['attributes']['height']<1) {
+      if (empty($field['attributes']['height']) || ((int)$field['attributes']['height'] < 1 && $field['attributes']['height'] != 'auto')) {
         form_set_error('height_value', t('A default width and height must be provided.'));
       }
       break;
@@ -537,6 +537,7 @@ function iframe_process($element, $edit,
      '#maxlength' => '4',
      '#size' => '4',
      '#title' => t('Height'),
+     '#description' => t("Either a fixed number for pixels or 'auto' for the full height of the iframed content."),
      '#required' => ($delta == 0 && $field['height'] == 'required') ? $field['required'] : FALSE,
      '#default_value' => !empty($element['#value']['attributes']['height'])? $element['#value']['attributes']['height'] : $field['attributes']['height'],
    );
@@ -590,6 +591,29 @@ function theme_iframe_formatter_default(
   dmsg(3,'func theme_iframe_formatter_default');
   // If no url given display nothing.
   if (empty($element['#item']['url'])) return '';
+
+  if ($element['#item']['attributes']['height'] == 'auto') {
+
+    // We can only control an IFRAME height on a percentage basis if it is served
+    // from the same domain, so if it's not then we run it through our proxy.
+    $url_local = parse_url(url('', array('absolute' => TRUE)));
+    $url_iframe = parse_url($element['#item']['url']);
+    if ($url_local['scheme'] != $url_iframe['scheme'] || $url_local['host'] != $url_iframe['host']) {
+      $url_options = array(
+        'query' => array(
+          'url' => urlencode($element['#item']['url'] . ($element['#item']['query'] ? '?'. $element['#item']['query'] : '')),
+        ),
+        'absolute' => TRUE
+      );
+      $element['#item']['url'] = url(drupal_get_path('module', 'iframe') .'/iframe-proxy.php', $url_options);
+    }
+
+    drupal_add_js(drupal_get_path('module', 'iframe') .'/iframe.js');
+    drupal_add_js(array('iframe' => array($element['#item']['html-id'] => 'auto')), 'setting');
+    $element['#item']['attributes']['height'] = '100';
+
+  }
+
   // Display all
   return iframe_iframe($element['#item']['display_title'], $element['#item']['url'], $element['#item']);
 }
@@ -601,6 +625,29 @@ function theme_iframe_formatter_iframeon
   dmsg(3,'func theme_iframe_formatter_iframeonly');
   // If no url given display nothing.
   if (empty($element['#item']['url'])) return '';
+
+  if ($element['#item']['attributes']['height'] == 'auto') {
+
+    // We can only control an IFRAME height on a percentage basis if it is served
+    // from the same domain, so if it's not then we run it through our proxy.
+    $url_local = parse_url(url('', array('absolute' => TRUE)));
+    $url_iframe = parse_url($element['#item']['url']);
+    if ($url_local['scheme'] != $url_iframe['scheme'] || $url_local['host'] != $url_iframe['host']) {
+      $url_options = array(
+        'query' => array(
+          'url' => urlencode($element['#item']['url'] . ($element['#item']['query'] ? '?'. $element['#item']['query'] : '')),
+        ),
+        'absolute' => TRUE
+      );
+      $element['#item']['url'] = url(drupal_get_path('module', 'iframe') .'/iframe-proxy.php', $url_options);
+    }
+
+    drupal_add_js(drupal_get_path('module', 'iframe') .'/iframe.js');
+    drupal_add_js(array('iframe' => array($element['#item']['html-id'] => 'auto')), 'setting');
+    $element['#item']['attributes']['height'] = '100';
+
+  }
+
   // Display all
   return iframe_iframe('', $element['#item']['url'], $element['#item']);
 }
