|  | <!-- | 
|  | Copyright (C) 2015 The Android Open Source Project | 
|  |  | 
|  | Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | you may not use this file except in compliance with the License. | 
|  | You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, software | 
|  | distributed under the License is distributed on an "AS IS" BASIS, | 
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | See the License for the specific language governing permissions and | 
|  | limitations under the License. | 
|  | --> | 
|  |  | 
|  | <link rel="import" href="../../../bower_components/polymer/polymer.html"> | 
|  |  | 
|  | <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html"> | 
|  | <link rel="import" href="../../shared/gr-button/gr-button.html"> | 
|  | <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html"> | 
|  | <link rel="import" href="../gr-diff-builder/gr-diff-builder.html"> | 
|  | <link rel="import" href="../gr-diff-comment-thread/gr-diff-comment-thread.html"> | 
|  | <link rel="import" href="../gr-diff-highlight/gr-diff-highlight.html"> | 
|  | <link rel="import" href="../gr-diff-selection/gr-diff-selection.html"> | 
|  | <link rel="import" href="../gr-syntax-themes/gr-theme-default.html"> | 
|  | <link rel="import" href="../../../styles/shared-styles.html"> | 
|  |  | 
|  | <script src="../../../scripts/hiddenscroll.js"></script> | 
|  |  | 
|  | <dom-module id="gr-diff"> | 
|  | <template> | 
|  | <style include="shared-styles"> | 
|  | :host { | 
|  | --light-remove-highlight-color: #fee; | 
|  | --dark-remove-highlight-color: rgba(255, 0, 0, 0.15); | 
|  | --light-add-highlight-color: #efe; | 
|  | --dark-add-highlight-color: rgba(0, 255, 0, 0.15); | 
|  | --light-rebased-remove-highlight-color: #fff6ea; | 
|  | --dark-rebased-remove-highlight-color: rgba(255, 139, 6, 0.15); | 
|  | --light-rebased-add-highlight-color: #edfffa; | 
|  | --dark-rebased-add-highlight-color: rgba(11, 255, 155, 0.15); | 
|  | } | 
|  | :host(.no-left) .sideBySide ::content .left, | 
|  | :host(.no-left) .sideBySide ::content .left + td, | 
|  | :host(.no-left) .sideBySide ::content .right:not([data-value]), | 
|  | :host(.no-left) .sideBySide ::content .right:not([data-value]) + td { | 
|  | display: none; | 
|  | } | 
|  | .diffContainer { | 
|  | border-bottom: 1px solid #eee; | 
|  | border-top: 1px solid #eee; | 
|  | display: flex; | 
|  | font: 12px var(--monospace-font-family); | 
|  | } | 
|  | .diffContainer.hiddenscroll { | 
|  | padding-bottom: .8em; | 
|  | } | 
|  | table { | 
|  | border-collapse: collapse; | 
|  | border-right: 1px solid #ddd; | 
|  | table-layout: fixed; | 
|  | } | 
|  | .lineNum { | 
|  | background-color: #eee; | 
|  | } | 
|  | .image-diff .gr-diff { | 
|  | text-align: center; | 
|  | } | 
|  | .image-diff img { | 
|  | max-width: 50em; | 
|  | outline: 1px solid #ccc; | 
|  | } | 
|  | .image-diff label { | 
|  | font-family: var(--font-family); | 
|  | font-style: italic; | 
|  | } | 
|  | .diff-row { | 
|  | outline: none; | 
|  | } | 
|  | .diff-row.target-row.target-side-left .lineNum.left, | 
|  | .diff-row.target-row.target-side-right .lineNum.right, | 
|  | .diff-row.target-row.unified .lineNum { | 
|  | background-color: #BBDEFB; | 
|  | } | 
|  | .diff-row.target-row.target-side-left .lineNum.left:before, | 
|  | .diff-row.target-row.target-side-right .lineNum.right:before, | 
|  | .diff-row.target-row.unified .lineNum:before { | 
|  | color: #000; | 
|  | } | 
|  | .blank, | 
|  | .content { | 
|  | background-color: #fff; | 
|  | } | 
|  | .full-width { | 
|  | width: 100%; | 
|  | } | 
|  | .full-width .contentText { | 
|  | white-space: pre-wrap; | 
|  | word-wrap: break-word; | 
|  | } | 
|  | .lineNum, | 
|  | .content { | 
|  | /* Set font size based the user's diff preference. */ | 
|  | font-size: var(--font-size, 12px); | 
|  | vertical-align: top; | 
|  | white-space: pre; | 
|  | } | 
|  | .contextLineNum:before, | 
|  | .lineNum:before { | 
|  | box-sizing: border-box; | 
|  | display: inline-block; | 
|  | color: #666; | 
|  | content: attr(data-value); | 
|  | padding: 0 .5em; | 
|  | text-align: right; | 
|  | width: 100%; | 
|  | } | 
|  | .canComment .lineNum[data-value] { | 
|  | cursor: pointer; | 
|  | } | 
|  | .canComment .lineNum[data-value="FILE"]:before { | 
|  | content: 'File'; | 
|  | } | 
|  | .content { | 
|  | overflow: hidden; | 
|  | /* Set max and min width since setting width on table cells still | 
|  | allows them to shrink. */ | 
|  | max-width: var(--content-width, 80ch); | 
|  | min-width: var(--content-width, 80ch); | 
|  | width: var(--content-width, 80ch); | 
|  | } | 
|  | .content.add .intraline, | 
|  | .delta.total .content.add { | 
|  | background-color: var(--dark-add-highlight-color); | 
|  | } | 
|  | .content.add { | 
|  | background-color: var(--light-add-highlight-color); | 
|  | } | 
|  | .content.remove .intraline, | 
|  | .delta.total .content.remove { | 
|  | background-color: var(--dark-remove-highlight-color); | 
|  | } | 
|  | .content.remove { | 
|  | background-color: var(--light-remove-highlight-color); | 
|  | } | 
|  | .dueToRebase .content.add .intraline, | 
|  | .delta.total.dueToRebase .content.add { | 
|  | background-color: var(--dark-rebased-add-highlight-color); | 
|  | } | 
|  | .dueToRebase .content.add { | 
|  | background-color: var(--light-rebased-add-highlight-color); | 
|  | } | 
|  | .dueToRebase .content.remove .intraline, | 
|  | .delta.total.dueToRebase .content.remove { | 
|  | background-color: var(--dark-rebased-remove-highlight-color); | 
|  | } | 
|  | .dueToRebase .content.remove { | 
|  | background-color: var(--light-rebased-remove-highlight-color); | 
|  | } | 
|  | .content .contentText:empty:after { | 
|  | /* Newline, to ensure empty lines are one line-height tall. */ | 
|  | content: '\A'; | 
|  | } | 
|  | .contextControl { | 
|  | background-color: #fef; | 
|  | color: #849; | 
|  | } | 
|  | .contextControl gr-button { | 
|  | display: inline-block; | 
|  | font-family: var(--monospace-font-family); | 
|  | text-decoration: none; | 
|  | } | 
|  | .contextControl td:not(.lineNum) { | 
|  | text-align: center; | 
|  | } | 
|  | .displayLine .diff-row.target-row td { | 
|  | box-shadow: inset 0 -1px #bbb; | 
|  | } | 
|  | .br:after { | 
|  | /* Line feed */ | 
|  | content: '\A'; | 
|  | } | 
|  | .tab { | 
|  | display: inline-block; | 
|  | } | 
|  | .tab-indicator:before { | 
|  | color: #C62828; | 
|  | /* >> character */ | 
|  | content: '\00BB'; | 
|  | } | 
|  | .trailing-whitespace { | 
|  | border-radius: .4em; | 
|  | background-color: #FF9AD2; | 
|  | } | 
|  | #diffHeader { | 
|  | background-color: #F9F9F9; | 
|  | color: #2A00FF; | 
|  | font-family: var(--monospace-font-family); | 
|  | font-size: var(--font-size, 12px); | 
|  | padding: 0.5em 0 0.5em 4em; | 
|  | } | 
|  | #sizeWarning { | 
|  | display: none; | 
|  | margin: 1em auto; | 
|  | max-width: 60em; | 
|  | text-align: center; | 
|  | } | 
|  | #sizeWarning gr-button { | 
|  | margin: 1em; | 
|  | } | 
|  | #sizeWarning.warn { | 
|  | display: block; | 
|  | } | 
|  | .target-row td.blame { | 
|  | background: #eee; | 
|  | } | 
|  | col.blame { | 
|  | display: none; | 
|  | } | 
|  | td.blame { | 
|  | display: none; | 
|  | font-family: var(--font-family); | 
|  | font-size: var(--font-size, 12px); | 
|  | padding: 0 .5em; | 
|  | white-space: pre; | 
|  | } | 
|  | :host(.showBlame) col.blame { | 
|  | display: table-column; | 
|  | } | 
|  | :host(.showBlame) td.blame { | 
|  | display: table-cell; | 
|  | } | 
|  | td.blame > span { | 
|  | opacity: 0.6; | 
|  | } | 
|  | td.blame > span.startOfRange { | 
|  | opacity: 1; | 
|  | } | 
|  | td.blame .sha { | 
|  | font-family: var(--monospace-font-family); | 
|  | } | 
|  | .full-width td.blame { | 
|  | overflow: hidden; | 
|  | width: 200px; | 
|  | } | 
|  | </style> | 
|  | <style include="gr-theme-default"></style> | 
|  | <div id="diffHeader" hidden$="[[_computeDiffHeaderHidden(_diffHeaderItems)]]"> | 
|  | <template | 
|  | is="dom-repeat" | 
|  | items="[[_diffHeaderItems]]"> | 
|  | <div>[[item]]</div> | 
|  | </template> | 
|  | </div> | 
|  | <div class$="[[_computeContainerClass(_loggedIn, viewMode, displayLine)]]" | 
|  | on-tap="_handleTap"> | 
|  | <gr-diff-selection diff="[[_diff]]"> | 
|  | <gr-diff-highlight | 
|  | id="highlights" | 
|  | logged-in="[[_loggedIn]]" | 
|  | comments="{{comments}}"> | 
|  | <gr-diff-builder | 
|  | id="diffBuilder" | 
|  | comments="[[comments]]" | 
|  | project-name="[[projectName]]" | 
|  | diff="[[_diff]]" | 
|  | diff-path="[[path]]" | 
|  | view-mode="[[viewMode]]" | 
|  | line-wrapping="[[lineWrapping]]" | 
|  | is-image-diff="[[isImageDiff]]" | 
|  | base-image="[[_baseImage]]" | 
|  | revision-image="[[_revisionImage]]"> | 
|  | <table | 
|  | id="diffTable" | 
|  | class$="[[_diffTableClass]]" | 
|  | role="presentation"></table> | 
|  | </gr-diff-builder> | 
|  | </gr-diff-highlight> | 
|  | </gr-diff-selection> | 
|  | </div> | 
|  | <div id="sizeWarning" class$="[[_computeWarningClass(_showWarning)]]"> | 
|  | <p> | 
|  | Prevented render because "Whole file" is enabled and this diff is very | 
|  | large (about [[_diffLength(_diff)]] lines). | 
|  | </p> | 
|  | <gr-button on-tap="_handleLimitedBypass"> | 
|  | Render with limited context | 
|  | </gr-button> | 
|  | <gr-button on-tap="_handleFullBypass"> | 
|  | Render anyway (may be slow) | 
|  | </gr-button> | 
|  | </div> | 
|  | <gr-rest-api-interface id="restAPI"></gr-rest-api-interface> | 
|  | </template> | 
|  | <script src="gr-diff-line.js"></script> | 
|  | <script src="gr-diff-group.js"></script> | 
|  | <script src="gr-diff.js"></script> | 
|  | </dom-module> |