| Index: samples-dev/swarm/SwarmViews.dart
 | 
| diff --git a/samples-dev/swarm/SwarmViews.dart b/samples-dev/swarm/SwarmViews.dart
 | 
| index d81a38c85d67e17b936a874c280adf3d97afb091..003e544a36cc55194c540c9f7d3a0ee59e8c0467 100644
 | 
| --- a/samples-dev/swarm/SwarmViews.dart
 | 
| +++ b/samples-dev/swarm/SwarmViews.dart
 | 
| @@ -70,13 +70,12 @@ class FrontView extends CompositeView {
 | 
|      headerView = new HeaderView(swarm);
 | 
|      topView.addChild(headerView);
 | 
|  
 | 
| -    sliderMenu = new SliderMenu(swarm.sections.sectionTitles,
 | 
| -        (sectionTitle) {
 | 
| -          swarm.state.moveToNewSection(sectionTitle);
 | 
| -          _onSectionSelected(sectionTitle);
 | 
| -          // Start with no articles selected.
 | 
| -          swarm.state.selectedArticle.value = null;
 | 
| -        });
 | 
| +    sliderMenu = new SliderMenu(swarm.sections.sectionTitles, (sectionTitle) {
 | 
| +      swarm.state.moveToNewSection(sectionTitle);
 | 
| +      _onSectionSelected(sectionTitle);
 | 
| +      // Start with no articles selected.
 | 
| +      swarm.state.selectedArticle.value = null;
 | 
| +    });
 | 
|      topView.addChild(sliderMenu);
 | 
|      addChild(topView);
 | 
|  
 | 
| @@ -99,8 +98,12 @@ class FrontView extends CompositeView {
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
|      _createSectionViews();
 | 
| -    attachWatch(swarm.state.currentArticle, (e) { _refreshCurrentArticle(); });
 | 
| -    attachWatch(swarm.state.storyMaximized, (e) { _refreshMaximized(); });
 | 
| +    attachWatch(swarm.state.currentArticle, (e) {
 | 
| +      _refreshCurrentArticle();
 | 
| +    });
 | 
| +    attachWatch(swarm.state.storyMaximized, (e) {
 | 
| +      _refreshMaximized();
 | 
| +    });
 | 
|    }
 | 
|  
 | 
|    void _refreshCurrentArticle() {
 | 
| @@ -121,8 +124,8 @@ class FrontView extends CompositeView {
 | 
|  
 | 
|      headerView.startTransitionToMainView();
 | 
|  
 | 
| -    currentSection.dataSourceView.reattachSubview(
 | 
| -        detachedView.source, detachedView, true);
 | 
| +    currentSection.dataSourceView
 | 
| +        .reattachSubview(detachedView.source, detachedView, true);
 | 
|  
 | 
|      storyView.node.onTransitionEnd.first.then((e) {
 | 
|        currentSection.hidden = false;
 | 
| @@ -157,8 +160,8 @@ class FrontView extends CompositeView {
 | 
|        // TODO(jmesserly): make this code better
 | 
|        final view = currentSection.findView(source);
 | 
|  
 | 
| -      final newPosition = FxUtil.computeRelativePosition(
 | 
| -         view.node, bottomView.node);
 | 
| +      final newPosition =
 | 
| +          FxUtil.computeRelativePosition(view.node, bottomView.node);
 | 
|        currentSection.dataSourceView.detachSubview(view.source);
 | 
|        detachedView = view;
 | 
|  
 | 
| @@ -197,8 +200,8 @@ class FrontView extends CompositeView {
 | 
|    void _animateDataSourceToMaximized() {
 | 
|      FxUtil.setWebkitTransform(topView.node, 0, -HeaderView.HEIGHT);
 | 
|      if (detachedView != null) {
 | 
| -      FxUtil.setWebkitTransform(detachedView.node, 0,
 | 
| -          -DataSourceView.TAB_ONLY_HEIGHT);
 | 
| +      FxUtil.setWebkitTransform(
 | 
| +          detachedView.node, 0, -DataSourceView.TAB_ONLY_HEIGHT);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -326,7 +329,9 @@ class SwarmBackButton extends View {
 | 
|    Element render() => new Element.html('<div class="back-arrow button"></div>');
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
| -    addOnClick((e) { _backToMain(swarm.state); });
 | 
| +    addOnClick((e) {
 | 
| +      _backToMain(swarm.state);
 | 
| +    });
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -365,9 +370,13 @@ class HeaderView extends CompositeView {
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
|      // Respond to changes to whether the story is being shown as text or web.
 | 
| -    attachWatch(swarm.state.storyTextMode, (e) { refreshWebStoryButtons(); });
 | 
| +    attachWatch(swarm.state.storyTextMode, (e) {
 | 
| +      refreshWebStoryButtons();
 | 
| +    });
 | 
|  
 | 
| -    _title.addOnClick((e) { _backToMain(swarm.state); });
 | 
| +    _title.addOnClick((e) {
 | 
| +      _backToMain(swarm.state);
 | 
| +    });
 | 
|  
 | 
|      // Wire up the events.
 | 
|      _configButton.addOnClick((e) {
 | 
| @@ -418,7 +427,6 @@ class HeaderView extends CompositeView {
 | 
|      startTransitionToMainView();
 | 
|    }
 | 
|  
 | 
| -
 | 
|    /**
 | 
|     * Refreshes whether or not the buttons specific to the display of a story in
 | 
|     * the web perspective are visible.
 | 
| @@ -433,7 +441,7 @@ class HeaderView extends CompositeView {
 | 
|  
 | 
|      _webBackButton.hidden = webButtonsHidden;
 | 
|      _webForwardButton.hidden = webButtonsHidden;
 | 
| -    _newWindowButton.hidden  = webButtonsHidden;
 | 
| +    _newWindowButton.hidden = webButtonsHidden;
 | 
|    }
 | 
|  
 | 
|    void startTransitionToMainView() {
 | 
| @@ -457,7 +465,6 @@ class HeaderView extends CompositeView {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /** A back button for the web view of a story that is equivalent to clicking
 | 
|   * "back" in the browser. */
 | 
|  // TODO(rnystrom): We have nearly identical versions of this littered through
 | 
| @@ -470,7 +477,9 @@ class WebBackButton extends View {
 | 
|    }
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
| -    addOnClick((e) { back(); });
 | 
| +    addOnClick((e) {
 | 
| +      back();
 | 
| +    });
 | 
|    }
 | 
|  
 | 
|    /** Equivalent to [window.history.back] */
 | 
| @@ -491,7 +500,9 @@ class WebForwardButton extends View {
 | 
|    }
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
| -    addOnClick((e) { forward(); });
 | 
| +    addOnClick((e) {
 | 
| +      forward();
 | 
| +    });
 | 
|    }
 | 
|  
 | 
|    /** Equivalent to [window.history.forward] */
 | 
| @@ -514,12 +525,11 @@ class DataSourceViewFactory implements ViewFactory<Feed> {
 | 
|    int get height => null; // Width for this view isn't known.
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /**
 | 
|   * A view for the items from a single data source.
 | 
|   * Shows a title and a list of items.
 | 
|   */
 | 
| -class DataSourceView extends CompositeView  {
 | 
| +class DataSourceView extends CompositeView {
 | 
|    // TODO(jacobr): make this value be coupled with the CSS file.
 | 
|    static const TAB_ONLY_HEIGHT = 34;
 | 
|  
 | 
| @@ -527,19 +537,20 @@ class DataSourceView extends CompositeView  {
 | 
|    VariableSizeListView<Article> itemsView;
 | 
|  
 | 
|    DataSourceView(this.source, Swarm swarm) : super('query') {
 | 
| -
 | 
|      // TODO(jacobr): make the title a view or decide it is sane for a subclass
 | 
|      // of component view to manually add some DOM cruft.
 | 
| -    node.nodes.add(new Element.html(
 | 
| -        '<h2>${source.title}</h2>'));
 | 
| +    node.nodes.add(new Element.html('<h2>${source.title}</h2>'));
 | 
|  
 | 
|      // TODO(jacobr): use named arguments when available.
 | 
|      itemsView = addChild(new VariableSizeListView<Article>(
 | 
|          source.articles,
 | 
|          new ArticleViewFactory(swarm),
 | 
| -        true, /* scrollable */
 | 
| -        true, /* vertical */
 | 
| -        swarm.state.currentArticle, /* selectedItem */
 | 
| +        true,
 | 
| +        /* scrollable */
 | 
| +        true,
 | 
| +        /* vertical */
 | 
| +        swarm.state.currentArticle,
 | 
| +        /* selectedItem */
 | 
|          !Device.supportsTouch /* snapToArticles */,
 | 
|          false /* paginate */,
 | 
|          true /* removeClippedViews */,
 | 
| @@ -562,14 +573,16 @@ class ToggleButton extends View {
 | 
|    List<String> states;
 | 
|  
 | 
|    ToggleButton(this.states)
 | 
| -    : super(),
 | 
| -      onChanged = new EventListeners();
 | 
| +      : super(),
 | 
| +        onChanged = new EventListeners();
 | 
|  
 | 
|    Element render() => new Element.tag('button');
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
|      state = states[0];
 | 
| -    node.onClick.listen((event) { toggle(); });
 | 
| +    node.onClick.listen((event) {
 | 
| +      toggle();
 | 
| +    });
 | 
|    }
 | 
|  
 | 
|    String get state {
 | 
| @@ -599,8 +612,7 @@ class ArticleViewFactory implements VariableSizeViewFactory<Article> {
 | 
|    Swarm swarm;
 | 
|  
 | 
|    ArticleViewLayout layout;
 | 
| -  ArticleViewFactory(this.swarm)
 | 
| -    : layout = ArticleViewLayout.getSingleton();
 | 
| +  ArticleViewFactory(this.swarm) : layout = ArticleViewLayout.getSingleton();
 | 
|  
 | 
|    View newView(Article item) => new ArticleView(item, swarm, layout);
 | 
|  
 | 
| @@ -637,9 +649,9 @@ class ArticleViewLayout {
 | 
|  
 | 
|    int width;
 | 
|    static ArticleViewLayout _singleton;
 | 
| -  ArticleViewLayout() :
 | 
| -    measureBodyText = new MeasureText(BODY_FONT),
 | 
| -    measureTitleText = new MeasureText(TITLE_FONT) {
 | 
| +  ArticleViewLayout()
 | 
| +      : measureBodyText = new MeasureText(BODY_FONT),
 | 
| +        measureTitleText = new MeasureText(TITLE_FONT) {
 | 
|      num screenWidth = window.screen.width;
 | 
|      width = DESKTOP_WIDTH;
 | 
|    }
 | 
| @@ -665,19 +677,18 @@ class ArticleViewLayout {
 | 
|     * titleContainer and snippetContainer may be null in which case the size is
 | 
|     * computed but no actual layout is performed.
 | 
|     */
 | 
| -  ArticleViewMetrics computeLayout(Article item,
 | 
| -      StringBuffer titleBuffer,
 | 
| -      StringBuffer snippetBuffer) {
 | 
| +  ArticleViewMetrics computeLayout(
 | 
| +      Article item, StringBuffer titleBuffer, StringBuffer snippetBuffer) {
 | 
|      int titleWidth = width - BODY_MARGIN_LEFT;
 | 
|  
 | 
|      if (item.hasThumbnail) {
 | 
|        titleWidth = width - TITLE_MARGIN_LEFT;
 | 
|      }
 | 
|  
 | 
| -    final titleLines = measureTitleText.addLineBrokenText(titleBuffer,
 | 
| -        item.title, titleWidth, MAX_TITLE_LINES);
 | 
| -    final bodyLines = measureBodyText.addLineBrokenText(snippetBuffer,
 | 
| -        item.textBody, width - BODY_MARGIN_LEFT, MAX_BODY_LINES);
 | 
| +    final titleLines = measureTitleText.addLineBrokenText(
 | 
| +        titleBuffer, item.title, titleWidth, MAX_TITLE_LINES);
 | 
| +    final bodyLines = measureBodyText.addLineBrokenText(
 | 
| +        snippetBuffer, item.textBody, width - BODY_MARGIN_LEFT, MAX_BODY_LINES);
 | 
|  
 | 
|      int height = bodyLines * LINE_HEIGHT + TOTAL_MARGIN;
 | 
|  
 | 
| @@ -741,7 +752,6 @@ class ArticleView extends View {
 | 
|    }
 | 
|  
 | 
|    void afterRender(Element node) {
 | 
| -
 | 
|      // Select this view's item.
 | 
|      addOnClick((e) {
 | 
|        // Mark the item as read, so it shows as read in other views
 | 
| @@ -791,13 +801,13 @@ class ArticleView extends View {
 | 
|          // Story View.
 | 
|          swarm.frontView.detachedView.itemsView.showView(selArticle);
 | 
|        } else {
 | 
| -        if(swarm.frontView.currentSection.inCurrentView(selArticle)) {
 | 
| +        if (swarm.frontView.currentSection.inCurrentView(selArticle)) {
 | 
|            // Scroll horizontally if needed.
 | 
| -          swarm.frontView.currentSection.dataSourceView.showView(
 | 
| -              selArticle.dataSource);
 | 
| -          DataSourceView dataView = swarm.frontView.currentSection
 | 
| -              .findView(selArticle.dataSource);
 | 
| -          if(dataView != null) {
 | 
| +          swarm.frontView.currentSection.dataSourceView
 | 
| +              .showView(selArticle.dataSource);
 | 
| +          DataSourceView dataView =
 | 
| +              swarm.frontView.currentSection.findView(selArticle.dataSource);
 | 
| +          if (dataView != null) {
 | 
|              dataView.itemsView.showView(selArticle);
 | 
|            }
 | 
|          }
 | 
| @@ -807,8 +817,8 @@ class ArticleView extends View {
 | 
|  
 | 
|    String getDataUriForImage(final img) {
 | 
|      // TODO(hiltonc,jimhug) eval perf of this vs. reusing one canvas element
 | 
| -    final CanvasElement canvas = new CanvasElement(
 | 
| -      height: img.height, width: img.width);
 | 
| +    final CanvasElement canvas =
 | 
| +        new CanvasElement(height: img.height, width: img.width);
 | 
|  
 | 
|      final CanvasRenderingContext2D ctx = canvas.getContext("2d");
 | 
|      ctx.drawImage(img, 0, 0, img.width, img.height);
 | 
| @@ -848,8 +858,8 @@ class StoryContentView extends View {
 | 
|    get childViews => [_pagedStory];
 | 
|  
 | 
|    Element render() {
 | 
| -    final storyContent = new Element.html(
 | 
| -        '<div class="story-content">${item.htmlBody}</div>');
 | 
| +    final storyContent =
 | 
| +        new Element.html('<div class="story-content">${item.htmlBody}</div>');
 | 
|      for (Element element in storyContent.querySelectorAll(
 | 
|          "iframe, script, style, object, embed, frameset, frame")) {
 | 
|        element.remove();
 | 
| @@ -896,9 +906,9 @@ class SectionView extends CompositeView {
 | 
|    final PageState pageState;
 | 
|  
 | 
|    SectionView(this.swarm, this.section, this._viewFactory)
 | 
| -    : super('section-view'),
 | 
| -      loadingText = new View.html('<div class="loading-section"></div>'),
 | 
| -      pageState = new PageState() {
 | 
| +      : super('section-view'),
 | 
| +        loadingText = new View.html('<div class="loading-section"></div>'),
 | 
| +        pageState = new PageState() {
 | 
|      addChild(loadingText);
 | 
|    }
 | 
|  
 | 
| @@ -912,14 +922,16 @@ class SectionView extends CompositeView {
 | 
|      if (dataSourceView == null) {
 | 
|        // TODO(jacobr): use named arguments when available.
 | 
|        dataSourceView = new ListView<Feed>(
 | 
| -          section.feeds, _viewFactory,
 | 
| +          section.feeds,
 | 
| +          _viewFactory,
 | 
|            true /* scrollable */,
 | 
|            false /* vertical */,
 | 
|            null /* selectedItem */,
 | 
|            true /* snapToItems */,
 | 
|            true /* paginate */,
 | 
|            true /* removeClippedViews */,
 | 
| -          false, /* showScrollbar */
 | 
| +          false,
 | 
| +          /* showScrollbar */
 | 
|            pageState);
 | 
|        dataSourceView.addClass("data-source-view");
 | 
|        addChild(dataSourceView);
 | 
| 
 |