15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This view displays information on the host resolver:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Shows the default address family.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Has a button to enable IPv6, if it is disabled.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Shows the current host cache contents.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Has a button to clear the host cache.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - Shows the parameters used to construct the host cache (capacity, ttl).
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mmenke):  Add links for each address entry to the corresponding NetLog
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                source.  This could either be done by adding NetLog source ids
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                to cache entries, or tracking sources based on their type and
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                description.  Former is simpler, latter may be useful
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                elsewhere as well.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DnsView = (function() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'use strict';
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We inherit from DivView.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var superClass = DivView;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *  @constructor
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function DnsView() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assertFirstConstructorCall(DnsView);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Call superclass's constructor.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    superClass.call(this, DnsView.MAIN_BOX_ID);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $(DnsView.ENABLE_IPV6_BUTTON_ID).onclick =
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        g_browser.enableIPv6.bind(g_browser);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $(DnsView.CLEAR_CACHE_BUTTON_ID).onclick =
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        g_browser.sendClearHostResolverCache.bind(g_browser);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register to receive changes to the host resolver info.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_browser.addHostResolverInfoObserver(this, false);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsView.TAB_ID = 'tab-handle-dns';
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsView.TAB_NAME = 'DNS';
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsView.TAB_HASH = '#dns';
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IDs for special HTML elements in dns_view.html
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.MAIN_BOX_ID = 'dns-view-tab-content';
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.DEFAULT_FAMILY_SPAN_ID = 'dns-view-default-family';
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.IPV6_DISABLED_SPAN_ID = 'dns-view-ipv6-disabled';
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.ENABLE_IPV6_BUTTON_ID = 'dns-view-enable-ipv6';
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.INTERNAL_DNS_ENABLED_SPAN_ID = 'dns-view-internal-dns-enabled';
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.INTERNAL_DNS_INVALID_CONFIG_SPAN_ID =
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'dns-view-internal-dns-invalid-config';
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.INTERNAL_DNS_CONFIG_TBODY_ID = 'dns-view-internal-dns-config-tbody';
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.CLEAR_CACHE_BUTTON_ID = 'dns-view-clear-cache';
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.CAPACITY_SPAN_ID = 'dns-view-cache-capacity';
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.ACTIVE_SPAN_ID = 'dns-view-cache-active';
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.EXPIRED_SPAN_ID = 'dns-view-cache-expired';
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.CACHE_TBODY_ID = 'dns-view-cache-tbody';
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cr.addSingletonGetter(DnsView);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DnsView.prototype = {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inherit the superclass's methods.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: superClass.prototype,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onLoadLogFinish: function(data) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return this.onHostResolverInfoChanged(data.hostResolverInfo);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    onHostResolverInfoChanged: function(hostResolverInfo) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Clear the existing values.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.DEFAULT_FAMILY_SPAN_ID).innerHTML = '';
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.CAPACITY_SPAN_ID).innerHTML = '';
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.CACHE_TBODY_ID).innerHTML = '';
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.ACTIVE_SPAN_ID).innerHTML = '0';
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.EXPIRED_SPAN_ID).innerHTML = '0';
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Update fields containing async DNS configuration information.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      displayAsyncDnsConfig_(hostResolverInfo);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // No info.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!hostResolverInfo || !hostResolverInfo.cache)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var family = hostResolverInfo.default_address_family;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addTextNode($(DnsView.DEFAULT_FAMILY_SPAN_ID),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  addressFamilyToString(family));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var ipv6Disabled = (family == AddressFamily.ADDRESS_FAMILY_IPV4);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setNodeDisplay($(DnsView.IPV6_DISABLED_SPAN_ID), ipv6Disabled);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fill in the basic cache information.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var hostResolverCache = hostResolverInfo.cache;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.CAPACITY_SPAN_ID).innerText = hostResolverCache.capacity;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var expiredEntries = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Date the cache was logged.  This will be either now, when actively
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // logging data, or the date the log dump was created.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var logDate;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (MainView.isViewingLoadedLog()) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logDate = new Date(ClientInfo.numericDate);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logDate = new Date();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fill in the cache contents table.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (var i = 0; i < hostResolverCache.entries.length; ++i) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var e = hostResolverCache.entries[i];
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var tr = addNode($(DnsView.CACHE_TBODY_ID), 'tr');
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var hostnameCell = addNode(tr, 'td');
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addTextNode(hostnameCell, e.hostname);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var familyCell = addNode(tr, 'td');
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addTextNode(familyCell,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    addressFamilyToString(e.address_family));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var addressesCell = addNode(tr, 'td');
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (e.error != undefined) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var errorText =
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              e.error + ' (' + netErrorToString(e.error) + ')';
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var errorNode = addTextNode(addressesCell, 'error: ' + errorText);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          addressesCell.classList.add('warning-text');
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          addListToNode_(addNode(addressesCell, 'div'), e.addresses);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var expiresDate = timeutil.convertTimeTicksToDate(e.expiration);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var expiresCell = addNode(tr, 'td');
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        timeutil.addNodeWithDate(expiresCell, expiresDate);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (logDate > timeutil.convertTimeTicksToDate(e.expiration)) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ++expiredEntries;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var expiredSpan = addNode(expiresCell, 'span');
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expiredSpan.classList.add('warning-text');
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          addTextNode(expiredSpan, ' [Expired]');
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.ACTIVE_SPAN_ID).innerText =
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          hostResolverCache.entries.length - expiredEntries;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $(DnsView.EXPIRED_SPAN_ID).innerText = expiredEntries;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Displays information corresponding to the current async DNS configuration.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Object} hostResolverInfo The host resolver information.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function displayAsyncDnsConfig_(hostResolverInfo) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear the table.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $(DnsView.INTERNAL_DNS_CONFIG_TBODY_ID).innerHTML = '';
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Figure out if the internal DNS resolver is disabled or has no valid
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // configuration information, and update display accordingly.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var enabled = hostResolverInfo &&
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  hostResolverInfo.dns_config !== undefined;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var noConfig = enabled &&
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   hostResolverInfo.dns_config.nameservers === undefined;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $(DnsView.INTERNAL_DNS_ENABLED_SPAN_ID).innerText = enabled;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    setNodeDisplay($(DnsView.INTERNAL_DNS_INVALID_CONFIG_SPAN_ID), noConfig);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the internal DNS resolver is disabled or has no valid configuration,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we're done.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!enabled || noConfig)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var dnsConfig = hostResolverInfo.dns_config;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Display nameservers first.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var nameserverRow = addNode($(DnsView.INTERNAL_DNS_CONFIG_TBODY_ID), 'tr');
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addNodeWithText(nameserverRow, 'th', 'nameservers');
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addListToNode_(addNode(nameserverRow, 'td'), dnsConfig.nameservers);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add everything else in |dnsConfig| to the table.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var key in dnsConfig) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (key == 'nameservers')
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var tr = addNode($(DnsView.INTERNAL_DNS_CONFIG_TBODY_ID), 'tr');
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addNodeWithText(tr, 'th', key);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var td = addNode(tr, 'td');
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For lists, display each list entry on a separate line.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (typeof dnsConfig[key] == 'object' &&
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          dnsConfig[key].constructor == Array) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addListToNode_(td, dnsConfig[key]);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addTextNode(td, dnsConfig[key]);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Takes a last of strings and adds them all to a DOM node, displaying them
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * on separate lines.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {DomNode} node The parent node.
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {Array.<string>} list List of strings to add to the node.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function addListToNode_(node, list) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < list.length; ++i)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addNodeWithText(node, 'div', list[i]);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DnsView;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
214