Use common blob header for file detail and blame

Change-Id: Ia6e4efce3580fef7467ba307a0c00b99a7515f47
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
index ab5d89e..9d02ac6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/BlobSoyData.java
@@ -85,6 +85,7 @@
       data.put("size", Long.toString(loader.getSize()));
     }
     if (path != null && view.getRevision().getPeeledType() == OBJ_COMMIT) {
+      data.put("fileUrl", GitilesView.path().copyFrom(view).toUrl());
       data.put("logUrl", GitilesView.log().copyFrom(view).toUrl());
       data.put("blameUrl", GitilesView.blame().copyFrom(view).toUrl());
     }
diff --git a/gitiles-servlet/src/main/resources/com/google/gitiles/static/gitiles.css b/gitiles-servlet/src/main/resources/com/google/gitiles/static/gitiles.css
index d0cc951..0a89f75 100644
--- a/gitiles-servlet/src/main/resources/com/google/gitiles/static/gitiles.css
+++ b/gitiles-servlet/src/main/resources/com/google/gitiles/static/gitiles.css
@@ -336,7 +336,10 @@
 /* Styles for the blame detail template. */
 
 #blame {
-  margin: 0;
+  margin-top: 10px;
+  margin-bottom: 10px;
+  margin-left: 0px;
+  margin-right: 0px;
   padding: 0;
 }
 #blame td {
@@ -379,7 +382,7 @@
 /* Styles for pretty-print regions, including overriding some defaults from
  * prettify.css. */
 
-ol.prettyprint {
+ol.prettyprint, #blame {
   border-top: #ddd solid 1px; /* BORDER */
   border-bottom: #ddd solid 1px; /* BORDER */
   border-left: none;
diff --git a/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy b/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy
index 6a0c25e..8f8ac40 100644
--- a/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy
+++ b/gitiles-servlet/src/main/resources/com/google/gitiles/templates/BlameDetail.soy
@@ -41,6 +41,8 @@
     {param css: [gitiles.PRETTIFY_CSS_URL] /}
   {/call}
 
+  {call .blobHeader data="$data" /}
+
   <table id="blame">
     {let $regionIdx: 0 /}
     {foreach $line in $data.lines}
diff --git a/gitiles-servlet/src/main/resources/com/google/gitiles/templates/ObjectDetail.soy b/gitiles-servlet/src/main/resources/com/google/gitiles/templates/ObjectDetail.soy
index edb3100..e3f6a2a 100644
--- a/gitiles-servlet/src/main/resources/com/google/gitiles/templates/ObjectDetail.soy
+++ b/gitiles-servlet/src/main/resources/com/google/gitiles/templates/ObjectDetail.soy
@@ -209,33 +209,36 @@
 {/template}
 
 /**
+ * Common header for a blob shared between detail, blame, etc. views.
+ *
+ * @param sha SHA of this file's blob.
+ * @param? fileUrl optional URL to a detail view of this file.
+ * @param? logUrl optional URL to a log for this file.
+ * @param? blameUrl optional URL to a blame for this file.
+ */
+{template .blobHeader}
+<div class="sha1">
+  {msg desc="SHA-1 for the file's blob"}blob: {$sha}{/msg}
+  {if $fileUrl}{sp}[<a href="{$fileUrl}">{msg desc="detail view of a file"}file{/msg}</a>]{/if}
+  {if $logUrl}{sp}[<a href="{$logUrl}">{msg desc="history for a file"}log{/msg}</a>]{/if}
+  {if $blameUrl}{sp}[<a href="{$blameUrl}">{msg desc="blame for a file"}blame{/msg}</a>]{/if}
+</div>
+{/template}
+
+/**
  * Detailed listing of a blob.
  *
  * @param sha SHA of this file's blob.
  * @param? logUrl optional URL to a log for this file.
  * @param? blameUrl optional URL to a blame for this file.
- * @param lines lines in the file (may be empty), or null for a binary file.
- * @param? size for binary files only, size in bytes.
- */
-{template .blobDetail}
-<div class="sha1">
-  {msg desc="SHA-1 for the file's blob"}blob: {$sha}{/msg}
-  {if $logUrl}{sp}[<a href="{$logUrl}">{msg desc="history for a file"}file history{/msg}</a>]{/if}
-  {if $blameUrl}{sp}[<a href="{$blameUrl}">{msg desc="blame for a file"}blame{/msg}</a>]{/if}
-</div>
-
-{call .blobBox data="all" /}
-{/template}
-
-/**
- * Preformatted box containing blob contents.
- *
  * @param lines lines (may be empty), or null for a binary file. Each line
  *     is a list of entries with "classes" and "text" fields for pretty-printed
  *     spans.
  * @param? size for binary files only, size in bytes.
  */
-{template .blobBox}
+{template .blobDetail}
+  {call .blobHeader data="all" /}
+
   {if $lines != null}
     {if $lines}
       <ol class="prettyprint">