Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Joseph Pecoraro | 3 * Copyright (C) 2009 Joseph Pecoraro |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 2661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2672 * @param {boolean} overloaded | 2672 * @param {boolean} overloaded |
| 2673 */ | 2673 */ |
| 2674 WebInspector.StylePropertyTreeElement = function(stylesPane, styleRule, style, p roperty, isShorthand, inherited, overloaded) | 2674 WebInspector.StylePropertyTreeElement = function(stylesPane, styleRule, style, p roperty, isShorthand, inherited, overloaded) |
| 2675 { | 2675 { |
| 2676 WebInspector.StylePropertyTreeElementBase.call(this, styleRule, style, prope rty, inherited, overloaded, isShorthand); | 2676 WebInspector.StylePropertyTreeElementBase.call(this, styleRule, style, prope rty, inherited, overloaded, isShorthand); |
| 2677 this._parentPane = stylesPane; | 2677 this._parentPane = stylesPane; |
| 2678 this.isShorthand = isShorthand; | 2678 this.isShorthand = isShorthand; |
| 2679 this._applyStyleThrottler = new WebInspector.Throttler(0); | 2679 this._applyStyleThrottler = new WebInspector.Throttler(0); |
| 2680 } | 2680 } |
| 2681 | 2681 |
| 2682 /** @typedef {{expanded: boolean, hasChildren: boolean, isEditingName: boolean, previousContent: string}} */ | |
| 2683 WebInspector.StylePropertyTreeElement.Context; | |
| 2684 | |
| 2682 WebInspector.StylePropertyTreeElement.prototype = { | 2685 WebInspector.StylePropertyTreeElement.prototype = { |
| 2683 /** | 2686 /** |
| 2684 * @return {?WebInspector.DOMNode} | 2687 * @return {?WebInspector.DOMNode} |
| 2685 */ | 2688 */ |
| 2686 node: function() | 2689 node: function() |
| 2687 { | 2690 { |
| 2688 return this._parentPane._node; | 2691 return this._parentPane._node; |
| 2689 }, | 2692 }, |
| 2690 | 2693 |
| 2691 /** | 2694 /** |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2937 return fieldValue; | 2940 return fieldValue; |
| 2938 var modelUrlRegex = new RegExp(urlRegex); | 2941 var modelUrlRegex = new RegExp(urlRegex); |
| 2939 for (var i = 1; i < splitFieldValue.length; i += 2) { | 2942 for (var i = 1; i < splitFieldValue.length; i += 2) { |
| 2940 var match = modelUrlRegex.exec(modelValue); | 2943 var match = modelUrlRegex.exec(modelValue); |
| 2941 if (match) | 2944 if (match) |
| 2942 splitFieldValue[i] = match[0]; | 2945 splitFieldValue[i] = match[0]; |
| 2943 } | 2946 } |
| 2944 return splitFieldValue.join(""); | 2947 return splitFieldValue.join(""); |
| 2945 } | 2948 } |
| 2946 | 2949 |
| 2950 /** @type {!WebInspector.StylePropertyTreeElement.Context} */ | |
| 2947 var context = { | 2951 var context = { |
| 2948 expanded: this.expanded, | 2952 expanded: this.expanded, |
| 2949 hasChildren: this.hasChildren, | 2953 hasChildren: this.hasChildren, |
| 2950 isEditingName: isEditingName, | 2954 isEditingName: isEditingName, |
| 2951 previousContent: selectElement.textContent | 2955 previousContent: selectElement.textContent |
| 2952 }; | 2956 }; |
| 2953 | 2957 |
| 2954 // Lie about our children to prevent expanding on double click and to co llapse shorthands. | 2958 // Lie about our children to prevent expanding on double click and to co llapse shorthands. |
| 2955 this.hasChildren = false; | 2959 this.hasChildren = false; |
| 2956 | 2960 |
| 2957 if (selectElement.parentElement) | 2961 if (selectElement.parentElement) |
| 2958 selectElement.parentElement.classList.add("child-editing"); | 2962 selectElement.parentElement.classList.add("child-editing"); |
| 2959 selectElement.textContent = selectElement.textContent; // remove color s watch and the like | 2963 selectElement.textContent = selectElement.textContent; // remove color s watch and the like |
| 2960 | 2964 |
| 2961 /** | 2965 /** |
| 2966 * @param {!WebInspector.StylePropertyTreeElement.Context} context | |
| 2967 * @param {!Event} event | |
| 2962 * @this {WebInspector.StylePropertyTreeElement} | 2968 * @this {WebInspector.StylePropertyTreeElement} |
| 2963 */ | 2969 */ |
| 2964 function pasteHandler(context, event) | 2970 function pasteHandler(context, event) |
| 2965 { | 2971 { |
| 2966 var data = event.clipboardData.getData("Text"); | 2972 var data = event.clipboardData.getData("Text"); |
| 2967 if (!data) | 2973 if (!data) |
| 2968 return; | 2974 return; |
| 2969 var colonIdx = data.indexOf(":"); | 2975 var colonIdx = data.indexOf(":"); |
| 2970 if (colonIdx < 0) | 2976 if (colonIdx < 0) |
| 2971 return; | 2977 return; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2982 this.property.value = value; | 2988 this.property.value = value; |
| 2983 this.nameElement.textContent = name; | 2989 this.nameElement.textContent = name; |
| 2984 this.valueElement.textContent = value; | 2990 this.valueElement.textContent = value; |
| 2985 this.nameElement.normalize(); | 2991 this.nameElement.normalize(); |
| 2986 this.valueElement.normalize(); | 2992 this.valueElement.normalize(); |
| 2987 | 2993 |
| 2988 this.editingCommitted(event.target.textContent, context, "forward"); | 2994 this.editingCommitted(event.target.textContent, context, "forward"); |
| 2989 } | 2995 } |
| 2990 | 2996 |
| 2991 /** | 2997 /** |
| 2998 * @param {!WebInspector.StylePropertyTreeElement.Context} context | |
| 2999 * @param {!Event} event | |
| 2992 * @this {WebInspector.StylePropertyTreeElement} | 3000 * @this {WebInspector.StylePropertyTreeElement} |
| 2993 */ | 3001 */ |
| 2994 function blurListener(context, event) | 3002 function blurListener(context, event) |
| 2995 { | 3003 { |
| 2996 var treeElement = this._parentPane._mouseDownTreeElement; | 3004 var treeElement = this._parentPane._mouseDownTreeElement; |
| 2997 var moveDirection = ""; | 3005 var moveDirection = ""; |
| 2998 if (treeElement === this) { | 3006 if (treeElement === this) { |
| 2999 if (isEditingName && this._parentPane._mouseDownTreeElementIsVal ue) | 3007 if (isEditingName && this._parentPane._mouseDownTreeElementIsVal ue) |
| 3000 moveDirection = "forward"; | 3008 moveDirection = "forward"; |
| 3001 if (!isEditingName && this._parentPane._mouseDownTreeElementIsNa me) | 3009 if (!isEditingName && this._parentPane._mouseDownTreeElementIsNa me) |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 3012 | 3020 |
| 3013 var applyItemCallback = !isEditingName ? this._applyFreeFlowStyleTextEdi t.bind(this) : undefined; | 3021 var applyItemCallback = !isEditingName ? this._applyFreeFlowStyleTextEdi t.bind(this) : undefined; |
| 3014 this._prompt = new WebInspector.StylesSidebarPane.CSSPropertyPrompt(isEd itingName ? WebInspector.CSSMetadata.cssPropertiesMetainfo : WebInspector.CSSMet adata.keywordsForProperty(this.nameElement.textContent), this, isEditingName); | 3022 this._prompt = new WebInspector.StylesSidebarPane.CSSPropertyPrompt(isEd itingName ? WebInspector.CSSMetadata.cssPropertiesMetainfo : WebInspector.CSSMet adata.keywordsForProperty(this.nameElement.textContent), this, isEditingName); |
| 3015 this._prompt.setAutocompletionTimeout(0); | 3023 this._prompt.setAutocompletionTimeout(0); |
| 3016 if (applyItemCallback) { | 3024 if (applyItemCallback) { |
| 3017 this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemApp lied, applyItemCallback, this); | 3025 this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemApp lied, applyItemCallback, this); |
| 3018 this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemAcc epted, applyItemCallback, this); | 3026 this._prompt.addEventListener(WebInspector.TextPrompt.Events.ItemAcc epted, applyItemCallback, this); |
| 3019 } | 3027 } |
| 3020 var proxyElement = this._prompt.attachAndStartEditing(selectElement, blu rListener.bind(this, context)); | 3028 var proxyElement = this._prompt.attachAndStartEditing(selectElement, blu rListener.bind(this, context)); |
| 3021 | 3029 |
| 3022 proxyElement.addEventListener("keydown", this.editingNameValueKeyDown.bi nd(this, context), false); | 3030 proxyElement.addEventListener("keydown", this._editingNameValueKeyDown.b ind(this, context), false); |
| 3023 proxyElement.addEventListener("keypress", this.editingNameValueKeyPress. bind(this, context), false); | 3031 proxyElement.addEventListener("keypress", this._editingNameValueKeyPress .bind(this, context), false); |
| 3032 proxyElement.addEventListener("input", this._editingNameValueInput.bind( this, context), false); | |
| 3024 if (isEditingName) | 3033 if (isEditingName) |
| 3025 proxyElement.addEventListener("paste", pasteHandler.bind(this, conte xt), false); | 3034 proxyElement.addEventListener("paste", pasteHandler.bind(this, conte xt), false); |
| 3026 | 3035 |
| 3027 window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1); | 3036 window.getSelection().setBaseAndExtent(selectElement, 0, selectElement, 1); |
| 3028 }, | 3037 }, |
| 3029 | 3038 |
| 3030 editingNameValueKeyDown: function(context, event) | 3039 /** |
| 3040 * @param {!WebInspector.StylePropertyTreeElement.Context} context | |
| 3041 * @param {!Event} event | |
| 3042 */ | |
| 3043 _editingNameValueKeyDown: function(context, event) | |
| 3031 { | 3044 { |
| 3032 if (event.handled) | 3045 if (event.handled) |
| 3033 return; | 3046 return; |
| 3034 | 3047 |
| 3035 var isEditingName = context.isEditingName; | |
| 3036 var result; | 3048 var result; |
| 3037 | 3049 |
| 3038 if (isEnterKey(event)) { | 3050 if (isEnterKey(event)) { |
| 3039 event.preventDefault(); | 3051 event.preventDefault(); |
| 3040 result = "forward"; | 3052 result = "forward"; |
| 3041 } else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code || event.keyIdentifier === "U+001B") | 3053 } else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code || event.keyIdentifier === "U+001B") |
| 3042 result = "cancel"; | 3054 result = "cancel"; |
| 3043 else if (!isEditingName && this._newProperty && event.keyCode === WebIns pector.KeyboardShortcut.Keys.Backspace.code) { | 3055 else if (!context.isEditingName && this._newProperty && event.keyCode == = WebInspector.KeyboardShortcut.Keys.Backspace.code) { |
| 3044 // For a new property, when Backspace is pressed at the beginning of new property value, move back to the property name. | 3056 // For a new property, when Backspace is pressed at the beginning of new property value, move back to the property name. |
| 3045 var selection = window.getSelection(); | 3057 var selection = window.getSelection(); |
| 3046 if (selection.isCollapsed && !selection.focusOffset) { | 3058 if (selection.isCollapsed && !selection.focusOffset) { |
| 3047 event.preventDefault(); | 3059 event.preventDefault(); |
| 3048 result = "backward"; | 3060 result = "backward"; |
| 3049 } | 3061 } |
| 3050 } else if (event.keyIdentifier === "U+0009") { // Tab key. | 3062 } else if (event.keyIdentifier === "U+0009") { // Tab key. |
| 3051 result = event.shiftKey ? "backward" : "forward"; | 3063 result = event.shiftKey ? "backward" : "forward"; |
| 3052 event.preventDefault(); | 3064 event.preventDefault(); |
| 3053 } | 3065 } |
| 3054 | 3066 |
| 3055 if (result) { | 3067 if (result) { |
| 3056 switch (result) { | 3068 switch (result) { |
| 3057 case "cancel": | 3069 case "cancel": |
| 3058 this.editingCancelled(null, context); | 3070 this.editingCancelled(null, context); |
| 3059 break; | 3071 break; |
| 3060 case "forward": | 3072 case "forward": |
| 3061 case "backward": | 3073 case "backward": |
| 3062 this.editingCommitted(event.target.textContent, context, result) ; | 3074 this.editingCommitted(event.target.textContent, context, result) ; |
| 3063 break; | 3075 break; |
| 3064 } | 3076 } |
| 3065 | 3077 |
| 3066 event.consume(); | 3078 event.consume(); |
| 3067 return; | 3079 return; |
| 3068 } | 3080 } |
| 3069 | |
| 3070 if (!isEditingName) | |
| 3071 this._applyFreeFlowStyleTextEdit(); | |
| 3072 }, | 3081 }, |
| 3073 | 3082 |
| 3074 editingNameValueKeyPress: function(context, event) | 3083 /** |
| 3084 * @param {!WebInspector.StylePropertyTreeElement.Context} context | |
| 3085 * @param {!Event} event | |
| 3086 */ | |
| 3087 _editingNameValueKeyPress: function(context, event) | |
| 3075 { | 3088 { |
| 3076 function shouldCommitValueSemicolon(text, cursorPosition) | 3089 function shouldCommitValueSemicolon(text, cursorPosition) |
| 3077 { | 3090 { |
| 3078 // FIXME: should this account for semicolons inside comments? | 3091 // FIXME: should this account for semicolons inside comments? |
| 3079 var openQuote = ""; | 3092 var openQuote = ""; |
| 3080 for (var i = 0; i < cursorPosition; ++i) { | 3093 for (var i = 0; i < cursorPosition; ++i) { |
| 3081 var ch = text[i]; | 3094 var ch = text[i]; |
| 3082 if (ch === "\\" && openQuote !== "") | 3095 if (ch === "\\" && openQuote !== "") |
| 3083 ++i; // skip next character inside string | 3096 ++i; // skip next character inside string |
| 3084 else if (!openQuote && (ch === "\"" || ch === "'")) | 3097 else if (!openQuote && (ch === "\"" || ch === "'")) |
| 3085 openQuote = ch; | 3098 openQuote = ch; |
| 3086 else if (openQuote === ch) | 3099 else if (openQuote === ch) |
| 3087 openQuote = ""; | 3100 openQuote = ""; |
| 3088 } | 3101 } |
| 3089 return !openQuote; | 3102 return !openQuote; |
| 3090 } | 3103 } |
| 3091 | 3104 |
| 3092 var keyChar = String.fromCharCode(event.charCode); | 3105 var keyChar = String.fromCharCode(event.charCode); |
| 3093 var isFieldInputTerminated = (context.isEditingName ? keyChar === ":" : keyChar === ";" && shouldCommitValueSemicolon(event.target.textContent, event.ta rget.selectionLeftOffset())); | 3106 var isFieldInputTerminated = (context.isEditingName ? keyChar === ":" : keyChar === ";" && shouldCommitValueSemicolon(event.target.textContent, event.ta rget.selectionLeftOffset())); |
| 3094 if (isFieldInputTerminated) { | 3107 if (isFieldInputTerminated) { |
| 3095 // Enter or colon (for name)/semicolon outside of string (for value) . | 3108 // Enter or colon (for name)/semicolon outside of string (for value) . |
| 3096 event.consume(true); | 3109 event.consume(true); |
| 3097 this.editingCommitted(event.target.textContent, context, "forward"); | 3110 this.editingCommitted(event.target.textContent, context, "forward"); |
| 3098 return; | 3111 return; |
| 3099 } | 3112 } |
| 3100 }, | 3113 }, |
| 3101 | 3114 |
| 3115 /** | |
| 3116 * @param {!WebInspector.StylePropertyTreeElement.Context} context | |
| 3117 * @param {!Event} event | |
| 3118 */ | |
| 3119 _editingNameValueInput: function(context, event) | |
| 3120 { | |
| 3121 if (!context.isEditingName) | |
|
apavlov
2014/10/13 13:39:48
You may want to check that the value has actually
lushnikov
2014/10/13 14:38:23
The check is performed in the innerApplyStyleText
| |
| 3122 this._applyFreeFlowStyleTextEdit(); | |
| 3123 }, | |
| 3124 | |
| 3102 _applyFreeFlowStyleTextEdit: function() | 3125 _applyFreeFlowStyleTextEdit: function() |
| 3103 { | 3126 { |
| 3104 var valueText = this.valueElement.textContent; | 3127 var valueText = this.valueElement.textContent; |
| 3105 if (valueText.indexOf(";") === -1) | 3128 if (valueText.indexOf(";") === -1) |
| 3106 this.applyStyleText(this.nameElement.textContent + ": " + valueText, false, false, false); | 3129 this.applyStyleText(this.nameElement.textContent + ": " + valueText, false, false, false); |
| 3107 }, | 3130 }, |
| 3108 | 3131 |
| 3109 kickFreeFlowStyleEditForTest: function() | 3132 kickFreeFlowStyleEditForTest: function() |
| 3110 { | 3133 { |
| 3111 this._applyFreeFlowStyleTextEdit(); | 3134 this._applyFreeFlowStyleTextEdit(); |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3559 if (userEnteredText && (userEnteredText === userEnteredText.toUpperCase( ))) { | 3582 if (userEnteredText && (userEnteredText === userEnteredText.toUpperCase( ))) { |
| 3560 for (var i = 0; i < results.length; ++i) | 3583 for (var i = 0; i < results.length; ++i) |
| 3561 results[i] = results[i].toUpperCase(); | 3584 results[i] = results[i].toUpperCase(); |
| 3562 } | 3585 } |
| 3563 var selectedIndex = this._cssCompletions.mostUsedOf(results); | 3586 var selectedIndex = this._cssCompletions.mostUsedOf(results); |
| 3564 completionsReadyCallback(results, selectedIndex); | 3587 completionsReadyCallback(results, selectedIndex); |
| 3565 }, | 3588 }, |
| 3566 | 3589 |
| 3567 __proto__: WebInspector.TextPrompt.prototype | 3590 __proto__: WebInspector.TextPrompt.prototype |
| 3568 } | 3591 } |
| OLD | NEW |