Controlling in an <iframe> or Popup

TerriaJS can be configured to accept messages posted to it by its parent window. This is useful when embedding a TerriaJS app in an iframe and when the parent wants to send more data to the embedded app than can be reasonably included in a URL.

Click here to see a demo, which also sizes the iframe to fill the available space.

First, the TerriaJS app must include a line like this:

updateApplicationOnMessageFromParentWindow(terria, window);

Then, the parent window can send messages like this:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>NationalMap Embed Test</title>
    </head>

    <body>
        <iframe
            id="embeddedNationalMap"
            src="https://nationalmap.gov.au"
            width="1024"
            height="768"
        ></iframe>

        <script type="text/javascript">
            window.addEventListener("message", function (e) {
                var iframeWindow = document.getElementById(
                    "embeddedNationalMap"
                ).contentWindow;
                if (e.source === iframeWindow && e.data === "ready") {
                    // NationalMap is ready to receive messages!
                    iframeWindow.postMessage(
                        {
                            initSources: [
                                {
                                    initialCamera: {
                                        north: -33.827,
                                        east: 151.249,
                                        south: -33.907,
                                        west: 151.165
                                    },
                                    workbench: ["my-data"],
                                    catalog: [
                                        {
                                            type: "group",
                                            name: "Foo",
                                            members: [
                                                {
                                                    type: "csv",
                                                    name: "My Data",
                                                    id: "my-data",
                                                    csvString:
                                                        "POA,Some Value\n2000,1\n2205,2"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        },
                        "https://nationalmap.gov.au"
                    );
                }
            });
        </script>
    </body>
</html>

Notice that parent is creating a CSV catalog item with embedded data. The CSV is only two lines in this case, but in a real application it could be large, much larger than could fit in a URL.