1<?php
2// $Header: /cvsroot/html2ps/box.iframe.php,v 1.14 2006/12/18 19:44:21 Konstantin Exp $
3
4class IFrameBox extends InlineBlockBox {
5  function &create(&$root, &$pipeline) {
6    $box =& new IFrameBox($root, $pipeline);
7    $box->readCSS($pipeline->get_current_css_state());
8    return $box;
9  }
10
11  // Note that IFRAME width is NOT determined by its content, thus we need to override 'get_min_width' and
12  // 'get_max_width'; they should return the constrained frame width.
13  function get_min_width(&$context) {
14    return $this->get_max_width($context);
15  }
16
17  function get_max_width(&$context) {
18    return $this->get_width();
19  }
20
21  function IFrameBox(&$root, $pipeline) {
22    $this->InlineBlockBox();
23
24    // If NO src attribute specified, just return.
25    if (!$root->has_attribute('src') ||
26        trim($root->get_attribute('src')) == '') {
27      return;
28    };
29
30    // Determine the fullly qualified URL of the frame content
31    $src = $root->get_attribute('src');
32    $url = $pipeline->guess_url($src);
33    $data = $pipeline->fetch($url);
34
35    /**
36     * If framed page could not be fetched return immediately
37     */
38    if (is_null($data)) { return; };
39
40    /**
41     * Render only iframes containing HTML only
42     *
43     * Note that content-type header may contain additional information after the ';' sign
44     */
45    $content_type = $data->get_additional_data('Content-Type');
46    $content_type_array = explode(';', $content_type);
47    if ($content_type_array[0] != "text/html") { return; };
48
49    $html = $data->get_content();
50
51    // Remove control symbols if any
52    $html = preg_replace('/[\x00-\x07]/', "", $html);
53    $converter = Converter::create();
54    $html = $converter->to_utf8($html, $data->detect_encoding());
55    $html = html2xhtml($html);
56    $tree = TreeBuilder::build($html);
57
58    // Save current stylesheet, as each frame may load its own stylesheets
59    //
60    $pipeline->pushCSS();
61    $css =& $pipeline->get_current_css();
62    $css->scan_styles($tree, $pipeline);
63
64    $frame_root = traverse_dom_tree_pdf($tree);
65    $box_child =& create_pdf_box($frame_root, $pipeline);
66    $this->add_child($box_child);
67
68    // Restore old stylesheet
69    //
70    $pipeline->pop_css();
71
72    $pipeline->pop_base_url();
73  }
74}
75
76?>