Kaynağa Gözat

[build] 2.0.0-beta.8

Evan You 10 yıl önce
ebeveyn
işleme
1cb4886380

+ 72 - 49
dist/vue.common.js

@@ -1334,15 +1334,10 @@ function applyNS(vnode, ns) {
   }
 }
 
-// in case the child is also an abstract component, e.g. <transition-control>
-// we want to recrusively retrieve the real component to be rendered
-function getRealChild(vnode) {
-  var compOptions = vnode && vnode.componentOptions;
-  if (compOptions && compOptions.Ctor.options.abstract) {
-    return getRealChild(compOptions.propsData && compOptions.propsData.child);
-  } else {
-    return vnode;
-  }
+function getFirstComponentChild(children) {
+  return children && children.filter(function (c) {
+    return c && c.componentOptions;
+  })[0];
 }
 
 function mergeVNodeHook(def, key, hook) {
@@ -1528,8 +1523,9 @@ function lifecycleMixin(Vue) {
       vm.$options._parentListeners = listeners;
       vm._updateListeners(listeners, oldListeners);
     }
-    // force udpate if has children
+    // resolve slots + force update if has children
     if (hasChildren) {
+      vm.$slots = resolveSlots(renderChildren);
       vm.$forceUpdate();
     }
   };
@@ -1890,7 +1886,7 @@ function initRender(vm) {
   vm.$vnode = null; // the placeholder node in parent tree
   vm._vnode = null; // the root of the child tree
   vm._staticTrees = null;
-  vm.$slots = {};
+  vm.$slots = resolveSlots(vm.$options._renderChildren);
   // bind the public createElement fn to this instance
   // so that we get proper render context inside it.
   vm.$createElement = bind(createElement, vm);
@@ -1909,7 +1905,6 @@ function renderMixin(Vue) {
     var _vm$$options = vm.$options;
     var render = _vm$$options.render;
     var staticRenderFns = _vm$$options.staticRenderFns;
-    var _renderChildren = _vm$$options._renderChildren;
     var _parentVnode = _vm$$options._parentVnode;
 
 
@@ -1919,9 +1914,6 @@ function renderMixin(Vue) {
     // set parent vnode. this allows render functions to have access
     // to the data on the placeholder node.
     vm.$vnode = _parentVnode;
-    // resolve slots. becaues slots are rendered in parent scope,
-    // we set the activeInstance to parent.
-    vm.$slots = resolveSlots(_renderChildren);
     // render self
     var vnode = void 0;
     try {
@@ -1965,11 +1957,23 @@ function renderMixin(Vue) {
   Vue.prototype._n = toNumber;
 
   // render static tree by index
-  Vue.prototype._m = function renderStatic(index) {
+  Vue.prototype._m = function renderStatic(index, isInFor) {
     var tree = this._staticTrees[index];
-    if (!tree) {
-      tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    // if has already-rendered static tree and not inside v-for,
+    // we can reuse the same tree by indentity.
+    if (tree && !isInFor) {
+      return tree;
+    }
+    // otherwise, render a fresh tree.
+    tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    if (Array.isArray(tree)) {
+      for (var i = 0; i < tree.length; i++) {
+        tree[i].isStatic = true;
+        tree[i].key = '__static__' + index + '_' + i;
+      }
+    } else {
       tree.isStatic = true;
+      tree.key = '__static__' + index;
     }
     return tree;
   };
@@ -2020,12 +2024,12 @@ function renderMixin(Vue) {
           value = toObject(value);
         }
         var data = vnode.data;
-        for (var key in value) {
-          if (key === 'class' || key === 'style') {
-            data[key] = value[key];
+        for (var _key in value) {
+          if (_key === 'class' || _key === 'style') {
+            data[_key] = value[_key];
           } else {
-            var hash = asProp || config.mustUseProp(key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
-            hash[key] = value[key];
+            var hash = asProp || config.mustUseProp(_key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
+            hash[_key] = value[_key];
           }
         }
       }
@@ -2803,29 +2807,26 @@ function initAssetRegisters(Vue) {
 var KeepAlive = {
   name: 'keep-alive',
   abstract: true,
-  props: {
-    child: Object
-  },
   created: function created() {
     this.cache = Object.create(null);
   },
   render: function render() {
-    var rawChild = this.child;
-    var realChild = getRealChild(this.child);
-    if (realChild && realChild.componentOptions) {
-      var opts = realChild.componentOptions;
+    var vnode = getFirstComponentChild(this.$slots.default);
+    if (vnode && vnode.componentOptions) {
+      var opts = vnode.componentOptions;
+      var key = vnode.key == null
       // same constructor may get registered as different local components
       // so cid alone is not enough (#3269)
-      var key = opts.Ctor.cid + '::' + opts.tag;
+      ? opts.Ctor.cid + '::' + opts.tag : vnode.key;
       if (this.cache[key]) {
-        var child = realChild.child = this.cache[key].child;
-        realChild.elm = this.$el = child.$el;
+        var child = vnode.child = this.cache[key].child;
+        vnode.elm = this.$el = child.$el;
       } else {
-        this.cache[key] = realChild;
+        this.cache[key] = vnode;
       }
-      realChild.data.keepAlive = true;
+      vnode.data.keepAlive = true;
     }
-    return rawChild;
+    return vnode;
   },
   destroyed: function destroyed() {
     for (var key in this.cache) {
@@ -2878,7 +2879,7 @@ Object.defineProperty(Vue.prototype, '$isServer', {
   }
 });
 
-Vue.version = '2.0.0-beta.7';
+Vue.version = '2.0.0-beta.8';
 
 // attributes that should be using props for binding
 var mustUseProp = makeMap('value,selected,checked,muted');
@@ -3035,8 +3036,10 @@ var isIE = UA$1 && /msie|trident/.test(UA$1);
 var isIE9 = UA$1 && UA$1.indexOf('msie 9.0') > 0;
 var isAndroid = UA$1 && UA$1.indexOf('android') > 0;
 
-// some browsers, e.g. PhantomJS, encodes angular brackets
-// inside attribute values when retrieving innerHTML.
+// According to
+// https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
+// when serializing innerHTML, <, >, ", & should be encoded as entities.
+// However, only some browsers, e.g. PhantomJS, encodes < and >.
 // this causes problems with the in-browser parser.
 var shouldDecodeTags = inBrowser ? function () {
   var div = document.createElement('div');
@@ -3140,9 +3143,6 @@ function isDef(s) {
 }
 
 function sameVnode(vnode1, vnode2) {
-  if (vnode1.isStatic || vnode2.isStatic) {
-    return vnode1 === vnode2;
-  }
   return vnode1.key === vnode2.key && vnode1.tag === vnode2.tag && vnode1.isComment === vnode2.isComment && !vnode1.data === !vnode2.data;
 }
 
@@ -3384,8 +3384,8 @@ function createPatchFunction(backend) {
         newStartVnode = newCh[++newStartIdx];
       } else {
         if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
-        idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : newStartVnode.isStatic ? oldCh.indexOf(newStartVnode) : null;
-        if (isUndef(idxInOld) || idxInOld === -1) {
+        idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null;
+        if (isUndef(idxInOld)) {
           // New element
           nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
           newStartVnode = newCh[++newStartIdx];
@@ -3417,7 +3417,13 @@ function createPatchFunction(backend) {
   }
 
   function patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly) {
-    if (oldVnode === vnode) return;
+    if (oldVnode === vnode) {
+      return;
+    }
+    if (vnode.isStatic && oldVnode.isStatic && vnode.key === oldVnode.key) {
+      vnode.elm = oldVnode.elm;
+      return;
+    }
     var i = void 0,
         hook = void 0;
     var hasData = isDef(i = vnode.data);
@@ -4072,7 +4078,7 @@ function enter(vnode) {
   }
 
   /* istanbul ignore if */
-  if (el._enterCb) {
+  if (el._enterCb || el.nodeType !== 1) {
     return;
   }
 
@@ -4176,7 +4182,7 @@ function leave(vnode, rm) {
   }
 
   /* istanbul ignore if */
-  if (el._leaveCb) {
+  if (el._leaveCb || el.nodeType !== 1) {
     return;
   }
 
@@ -4429,7 +4435,10 @@ var show = {
   },
   update: function update(el, _ref2, vnode) {
     var value = _ref2.value;
+    var oldValue = _ref2.oldValue;
 
+    /* istanbul ignore if */
+    if (value === oldValue) return;
     vnode = locateNode(vnode);
     var transition = vnode.data && vnode.data.transition;
     if (transition && !isIE9) {
@@ -4466,6 +4475,17 @@ var transitionProps = {
   appearActiveClass: String
 };
 
+// in case the child is also an abstract component, e.g. <keep-alive>
+// we want to recrusively retrieve the real component to be rendered
+function getRealChild(vnode) {
+  var compOptions = vnode && vnode.componentOptions;
+  if (compOptions && compOptions.Ctor.options.abstract) {
+    return getRealChild(getFirstComponentChild(compOptions.children));
+  } else {
+    return vnode;
+  }
+}
+
 function extractTransitionData(comp) {
   var data = {};
   var options = comp.$options;
@@ -4527,8 +4547,11 @@ var Transition = {
     // use getRealChild() to ignore abstract components e.g. keep-alive
     var child = getRealChild(rawChild);
     /* istanbul ignore if */
-    if (!child) return;
-    child.key = child.key || '__v' + (child.tag + this._uid) + '__';
+    if (!child) {
+      return rawChild;
+    }
+
+    child.key = child.key == null ? '__v' + (child.tag + this._uid) + '__' : child.key;
     var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
     var oldRawChild = this._vnode;
     var oldChild = getRealChild(oldRawChild);

+ 88 - 69
dist/vue.js

@@ -1,5 +1,5 @@
 /*!
- * Vue.js v2.0.0-beta.7
+ * Vue.js v2.0.0-beta.8
  * (c) 2014-2016 Evan You
  * Released under the MIT License.
  */
@@ -1341,15 +1341,10 @@
     }
   }
 
-  // in case the child is also an abstract component, e.g. <transition-control>
-  // we want to recrusively retrieve the real component to be rendered
-  function getRealChild(vnode) {
-    var compOptions = vnode && vnode.componentOptions;
-    if (compOptions && compOptions.Ctor.options.abstract) {
-      return getRealChild(compOptions.propsData && compOptions.propsData.child);
-    } else {
-      return vnode;
-    }
+  function getFirstComponentChild(children) {
+    return children && children.filter(function (c) {
+      return c && c.componentOptions;
+    })[0];
   }
 
   function mergeVNodeHook(def, key, hook) {
@@ -1535,8 +1530,9 @@
         vm.$options._parentListeners = listeners;
         vm._updateListeners(listeners, oldListeners);
       }
-      // force udpate if has children
+      // resolve slots + force update if has children
       if (hasChildren) {
+        vm.$slots = resolveSlots(renderChildren);
         vm.$forceUpdate();
       }
     };
@@ -1897,7 +1893,7 @@
     vm.$vnode = null; // the placeholder node in parent tree
     vm._vnode = null; // the root of the child tree
     vm._staticTrees = null;
-    vm.$slots = {};
+    vm.$slots = resolveSlots(vm.$options._renderChildren);
     // bind the public createElement fn to this instance
     // so that we get proper render context inside it.
     vm.$createElement = bind(createElement, vm);
@@ -1916,7 +1912,6 @@
       var _vm$$options = vm.$options;
       var render = _vm$$options.render;
       var staticRenderFns = _vm$$options.staticRenderFns;
-      var _renderChildren = _vm$$options._renderChildren;
       var _parentVnode = _vm$$options._parentVnode;
 
 
@@ -1926,9 +1921,6 @@
       // set parent vnode. this allows render functions to have access
       // to the data on the placeholder node.
       vm.$vnode = _parentVnode;
-      // resolve slots. becaues slots are rendered in parent scope,
-      // we set the activeInstance to parent.
-      vm.$slots = resolveSlots(_renderChildren);
       // render self
       var vnode = void 0;
       try {
@@ -1972,11 +1964,23 @@
     Vue.prototype._n = toNumber;
 
     // render static tree by index
-    Vue.prototype._m = function renderStatic(index) {
+    Vue.prototype._m = function renderStatic(index, isInFor) {
       var tree = this._staticTrees[index];
-      if (!tree) {
-        tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+      // if has already-rendered static tree and not inside v-for,
+      // we can reuse the same tree by indentity.
+      if (tree && !isInFor) {
+        return tree;
+      }
+      // otherwise, render a fresh tree.
+      tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+      if (Array.isArray(tree)) {
+        for (var i = 0; i < tree.length; i++) {
+          tree[i].isStatic = true;
+          tree[i].key = '__static__' + index + '_' + i;
+        }
+      } else {
         tree.isStatic = true;
+        tree.key = '__static__' + index;
       }
       return tree;
     };
@@ -2027,12 +2031,12 @@
             value = toObject(value);
           }
           var data = vnode.data;
-          for (var key in value) {
-            if (key === 'class' || key === 'style') {
-              data[key] = value[key];
+          for (var _key in value) {
+            if (_key === 'class' || _key === 'style') {
+              data[_key] = value[_key];
             } else {
-              var hash = asProp || config.mustUseProp(key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
-              hash[key] = value[key];
+              var hash = asProp || config.mustUseProp(_key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
+              hash[_key] = value[_key];
             }
           }
         }
@@ -2808,29 +2812,26 @@
   var KeepAlive = {
     name: 'keep-alive',
     abstract: true,
-    props: {
-      child: Object
-    },
     created: function created() {
       this.cache = Object.create(null);
     },
     render: function render() {
-      var rawChild = this.child;
-      var realChild = getRealChild(this.child);
-      if (realChild && realChild.componentOptions) {
-        var opts = realChild.componentOptions;
+      var vnode = getFirstComponentChild(this.$slots.default);
+      if (vnode && vnode.componentOptions) {
+        var opts = vnode.componentOptions;
+        var key = vnode.key == null
         // same constructor may get registered as different local components
         // so cid alone is not enough (#3269)
-        var key = opts.Ctor.cid + '::' + opts.tag;
+        ? opts.Ctor.cid + '::' + opts.tag : vnode.key;
         if (this.cache[key]) {
-          var child = realChild.child = this.cache[key].child;
-          realChild.elm = this.$el = child.$el;
+          var child = vnode.child = this.cache[key].child;
+          vnode.elm = this.$el = child.$el;
         } else {
-          this.cache[key] = realChild;
+          this.cache[key] = vnode;
         }
-        realChild.data.keepAlive = true;
+        vnode.data.keepAlive = true;
       }
-      return rawChild;
+      return vnode;
     },
     destroyed: function destroyed() {
       for (var key in this.cache) {
@@ -2883,7 +2884,7 @@
     }
   });
 
-  Vue.version = '2.0.0-beta.7';
+  Vue.version = '2.0.0-beta.8';
 
   // attributes that should be using props for binding
   var mustUseProp = makeMap('value,selected,checked,muted');
@@ -3044,8 +3045,10 @@
   var isIE9 = UA$1 && UA$1.indexOf('msie 9.0') > 0;
   var isAndroid = UA$1 && UA$1.indexOf('android') > 0;
 
-  // some browsers, e.g. PhantomJS, encodes angular brackets
-  // inside attribute values when retrieving innerHTML.
+  // According to
+  // https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
+  // when serializing innerHTML, <, >, ", & should be encoded as entities.
+  // However, only some browsers, e.g. PhantomJS, encodes < and >.
   // this causes problems with the in-browser parser.
   var shouldDecodeTags = inBrowser ? function () {
     var div = document.createElement('div');
@@ -3149,9 +3152,6 @@ var nodeOps = Object.freeze({
   }
 
   function sameVnode(vnode1, vnode2) {
-    if (vnode1.isStatic || vnode2.isStatic) {
-      return vnode1 === vnode2;
-    }
     return vnode1.key === vnode2.key && vnode1.tag === vnode2.tag && vnode1.isComment === vnode2.isComment && !vnode1.data === !vnode2.data;
   }
 
@@ -3393,8 +3393,8 @@ var nodeOps = Object.freeze({
           newStartVnode = newCh[++newStartIdx];
         } else {
           if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
-          idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : newStartVnode.isStatic ? oldCh.indexOf(newStartVnode) : null;
-          if (isUndef(idxInOld) || idxInOld === -1) {
+          idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null;
+          if (isUndef(idxInOld)) {
             // New element
             nodeOps.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
             newStartVnode = newCh[++newStartIdx];
@@ -3426,7 +3426,13 @@ var nodeOps = Object.freeze({
     }
 
     function patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly) {
-      if (oldVnode === vnode) return;
+      if (oldVnode === vnode) {
+        return;
+      }
+      if (vnode.isStatic && oldVnode.isStatic && vnode.key === oldVnode.key) {
+        vnode.elm = oldVnode.elm;
+        return;
+      }
       var i = void 0,
           hook = void 0;
       var hasData = isDef(i = vnode.data);
@@ -4081,7 +4087,7 @@ var nodeOps = Object.freeze({
     }
 
     /* istanbul ignore if */
-    if (el._enterCb) {
+    if (el._enterCb || el.nodeType !== 1) {
       return;
     }
 
@@ -4185,7 +4191,7 @@ var nodeOps = Object.freeze({
     }
 
     /* istanbul ignore if */
-    if (el._leaveCb) {
+    if (el._leaveCb || el.nodeType !== 1) {
       return;
     }
 
@@ -4438,7 +4444,10 @@ var nodeOps = Object.freeze({
     },
     update: function update(el, _ref2, vnode) {
       var value = _ref2.value;
+      var oldValue = _ref2.oldValue;
 
+      /* istanbul ignore if */
+      if (value === oldValue) return;
       vnode = locateNode(vnode);
       var transition = vnode.data && vnode.data.transition;
       if (transition && !isIE9) {
@@ -4475,6 +4484,17 @@ var nodeOps = Object.freeze({
     appearActiveClass: String
   };
 
+  // in case the child is also an abstract component, e.g. <keep-alive>
+  // we want to recrusively retrieve the real component to be rendered
+  function getRealChild(vnode) {
+    var compOptions = vnode && vnode.componentOptions;
+    if (compOptions && compOptions.Ctor.options.abstract) {
+      return getRealChild(getFirstComponentChild(compOptions.children));
+    } else {
+      return vnode;
+    }
+  }
+
   function extractTransitionData(comp) {
     var data = {};
     var options = comp.$options;
@@ -4536,8 +4556,11 @@ var nodeOps = Object.freeze({
       // use getRealChild() to ignore abstract components e.g. keep-alive
       var child = getRealChild(rawChild);
       /* istanbul ignore if */
-      if (!child) return;
-      child.key = child.key || '__v' + (child.tag + this._uid) + '__';
+      if (!child) {
+        return rawChild;
+      }
+
+      child.key = child.key == null ? '__v' + (child.tag + this._uid) + '__' : child.key;
       var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
       var oldRawChild = this._vnode;
       var oldChild = getRealChild(oldRawChild);
@@ -4778,12 +4801,13 @@ var nodeOps = Object.freeze({
   var ampRE = /&amp;/g;
   var ltRE = /&lt;/g;
   var gtRE = /&gt;/g;
+  var quoteRE = /&quot;/g;
 
   function decodeAttr(value, shouldDecodeTags) {
     if (shouldDecodeTags) {
       value = value.replace(ltRE, '<').replace(gtRE, '>');
     }
-    return value.replace(ampRE, '&');
+    return value.replace(ampRE, '&').replace(quoteRE, '"');
   }
 
   function parseHTML(html, options) {
@@ -5520,9 +5544,6 @@ var nodeOps = Object.freeze({
     if (binding = getBindingAttr(el, 'is')) {
       el.component = binding;
     }
-    if (getAndRemoveAttr(el, 'keep-alive') != null) {
-      el.keepAlive = true;
-    }
     if (getAndRemoveAttr(el, 'inline-template') != null) {
       el.inlineTemplate = true;
     }
@@ -5668,7 +5689,7 @@ var nodeOps = Object.freeze({
     // first pass: mark all non-static nodes.
     markStatic(root);
     // second pass: mark static roots.
-    markStaticRoots(root);
+    markStaticRoots(root, false);
   }
 
   function genStaticKeys$1(keys) {
@@ -5688,14 +5709,17 @@ var nodeOps = Object.freeze({
     }
   }
 
-  function markStaticRoots(node) {
-    if (node.type === 1 && (node.once || node.static)) {
-      node.staticRoot = true;
-      return;
-    }
-    if (node.children) {
-      for (var i = 0, l = node.children.length; i < l; i++) {
-        markStaticRoots(node.children[i]);
+  function markStaticRoots(node, isInFor) {
+    if (node.type === 1) {
+      if (node.once || node.static) {
+        node.staticRoot = true;
+        node.staticInFor = isInFor;
+        return;
+      }
+      if (node.children) {
+        for (var i = 0, l = node.children.length; i < l; i++) {
+          markStaticRoots(node.children[i], !!node.for);
+        }
       }
     }
   }
@@ -5802,7 +5826,6 @@ var nodeOps = Object.freeze({
     dataGenFns = pluckModuleFunction(options.modules, 'genData');
     platformDirectives$1 = options.directives || {};
     var code = ast ? genElement(ast) : '_h("div")';
-    // console.log(code)
     staticRenderFns = prevStaticRenderFns;
     return {
       render: 'with(this){return ' + code + '}',
@@ -5815,7 +5838,7 @@ var nodeOps = Object.freeze({
       // hoist static sub-trees out
       el.staticProcessed = true;
       staticRenderFns.push('with(this){return ' + genElement(el) + '}');
-      return '_m(' + (staticRenderFns.length - 1) + ')';
+      return '_m(' + (staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ')';
     } else if (el.for && !el.forProcessed) {
       return genFor(el);
     } else if (el.if && !el.ifProcessed) {
@@ -5840,10 +5863,6 @@ var nodeOps = Object.freeze({
       for (var i = 0; i < transforms$1.length; i++) {
         code = transforms$1[i](el, code);
       }
-      // check keep-alive
-      if (el.keepAlive) {
-        code = '_h("KeepAlive",{props:{child:' + code + '}})';
-      }
       return code;
     }
   }

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
dist/vue.min.js


+ 54 - 39
packages/vue-server-renderer/build.js

@@ -1664,8 +1664,9 @@ function lifecycleMixin(Vue) {
       vm.$options._parentListeners = listeners;
       vm._updateListeners(listeners, oldListeners);
     }
-    // force udpate if has children
+    // resolve slots + force update if has children
     if (hasChildren) {
+      vm.$slots = resolveSlots(renderChildren);
       vm.$forceUpdate();
     }
   };
@@ -2026,7 +2027,7 @@ function initRender(vm) {
   vm.$vnode = null; // the placeholder node in parent tree
   vm._vnode = null; // the root of the child tree
   vm._staticTrees = null;
-  vm.$slots = {};
+  vm.$slots = resolveSlots(vm.$options._renderChildren);
   // bind the public createElement fn to this instance
   // so that we get proper render context inside it.
   vm.$createElement = bind(createElement, vm);
@@ -2045,7 +2046,6 @@ function renderMixin(Vue) {
     var _vm$$options = vm.$options;
     var render = _vm$$options.render;
     var staticRenderFns = _vm$$options.staticRenderFns;
-    var _renderChildren = _vm$$options._renderChildren;
     var _parentVnode = _vm$$options._parentVnode;
 
 
@@ -2055,9 +2055,6 @@ function renderMixin(Vue) {
     // set parent vnode. this allows render functions to have access
     // to the data on the placeholder node.
     vm.$vnode = _parentVnode;
-    // resolve slots. becaues slots are rendered in parent scope,
-    // we set the activeInstance to parent.
-    vm.$slots = resolveSlots(_renderChildren);
     // render self
     var vnode = void 0;
     try {
@@ -2101,11 +2098,23 @@ function renderMixin(Vue) {
   Vue.prototype._n = toNumber;
 
   // render static tree by index
-  Vue.prototype._m = function renderStatic(index) {
+  Vue.prototype._m = function renderStatic(index, isInFor) {
     var tree = this._staticTrees[index];
-    if (!tree) {
-      tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    // if has already-rendered static tree and not inside v-for,
+    // we can reuse the same tree by indentity.
+    if (tree && !isInFor) {
+      return tree;
+    }
+    // otherwise, render a fresh tree.
+    tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    if (Array.isArray(tree)) {
+      for (var i = 0; i < tree.length; i++) {
+        tree[i].isStatic = true;
+        tree[i].key = '__static__' + index + '_' + i;
+      }
+    } else {
       tree.isStatic = true;
+      tree.key = '__static__' + index;
     }
     return tree;
   };
@@ -2156,12 +2165,12 @@ function renderMixin(Vue) {
           value = toObject(value);
         }
         var data = vnode.data;
-        for (var key in value) {
-          if (key === 'class' || key === 'style') {
-            data[key] = value[key];
+        for (var _key in value) {
+          if (_key === 'class' || _key === 'style') {
+            data[_key] = value[_key];
           } else {
-            var hash = asProp || config.mustUseProp(key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
-            hash[key] = value[key];
+            var hash = asProp || config.mustUseProp(_key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
+            hash[_key] = value[_key];
           }
         }
       }
@@ -2886,8 +2895,10 @@ var isIE = UA && /msie|trident/.test(UA);
 var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
 var isAndroid = UA && UA.indexOf('android') > 0;
 
-// some browsers, e.g. PhantomJS, encodes angular brackets
-// inside attribute values when retrieving innerHTML.
+// According to
+// https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
+// when serializing innerHTML, <, >, ", & should be encoded as entities.
+// However, only some browsers, e.g. PhantomJS, encodes < and >.
 // this causes problems with the in-browser parser.
 var shouldDecodeTags = inBrowser ? function () {
   var div = document.createElement('div');
@@ -2929,12 +2940,13 @@ var reCache = {};
 var ampRE = /&amp;/g;
 var ltRE = /&lt;/g;
 var gtRE = /&gt;/g;
+var quoteRE = /&quot;/g;
 
 function decodeAttr(value, shouldDecodeTags) {
   if (shouldDecodeTags) {
     value = value.replace(ltRE, '<').replace(gtRE, '>');
   }
-  return value.replace(ampRE, '&');
+  return value.replace(ampRE, '&').replace(quoteRE, '"');
 }
 
 function parseHTML(html, options) {
@@ -3671,9 +3683,6 @@ function processComponent(el) {
   if (binding = getBindingAttr(el, 'is')) {
     el.component = binding;
   }
-  if (getAndRemoveAttr(el, 'keep-alive') != null) {
-    el.keepAlive = true;
-  }
   if (getAndRemoveAttr(el, 'inline-template') != null) {
     el.inlineTemplate = true;
   }
@@ -3819,7 +3828,7 @@ function optimize(root, options) {
   // first pass: mark all non-static nodes.
   markStatic(root);
   // second pass: mark static roots.
-  markStaticRoots(root);
+  markStaticRoots(root, false);
 }
 
 function genStaticKeys$1(keys) {
@@ -3839,14 +3848,17 @@ function markStatic(node) {
   }
 }
 
-function markStaticRoots(node) {
-  if (node.type === 1 && (node.once || node.static)) {
-    node.staticRoot = true;
-    return;
-  }
-  if (node.children) {
-    for (var i = 0, l = node.children.length; i < l; i++) {
-      markStaticRoots(node.children[i]);
+function markStaticRoots(node, isInFor) {
+  if (node.type === 1) {
+    if (node.once || node.static) {
+      node.staticRoot = true;
+      node.staticInFor = isInFor;
+      return;
+    }
+    if (node.children) {
+      for (var i = 0, l = node.children.length; i < l; i++) {
+        markStaticRoots(node.children[i], !!node.for);
+      }
     }
   }
 }
@@ -3953,7 +3965,6 @@ function generate(ast, options) {
   dataGenFns = pluckModuleFunction(options.modules, 'genData');
   platformDirectives = options.directives || {};
   var code = ast ? genElement(ast) : '_h("div")';
-  // console.log(code)
   staticRenderFns = prevStaticRenderFns;
   return {
     render: 'with(this){return ' + code + '}',
@@ -3966,7 +3977,7 @@ function genElement(el) {
     // hoist static sub-trees out
     el.staticProcessed = true;
     staticRenderFns.push('with(this){return ' + genElement(el) + '}');
-    return '_m(' + (staticRenderFns.length - 1) + ')';
+    return '_m(' + (staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ')';
   } else if (el.for && !el.forProcessed) {
     return genFor(el);
   } else if (el.if && !el.ifProcessed) {
@@ -3991,10 +4002,6 @@ function genElement(el) {
     for (var i = 0; i < transforms$1.length; i++) {
       code = transforms$1[i](el, code);
     }
-    // check keep-alive
-    if (el.keepAlive) {
-      code = '_h("KeepAlive",{props:{child:' + code + '}})';
-    }
     return code;
   }
 }
@@ -4498,9 +4505,13 @@ var normalizeRender = function normalizeRender(vm) {
   var render = _vm$$options.render;
   var template = _vm$$options.template;
 
-  if (!render && template) {
-    var renderFns = compilationCache[template] || (compilationCache[template] = compileToFunctions(template));
-    Object.assign(vm.$options, renderFns);
+  if (!render) {
+    if (template) {
+      var renderFns = compilationCache[template] || (compilationCache[template] = compileToFunctions(template));
+      Object.assign(vm.$options, renderFns);
+    } else {
+      throw new Error('render function or template not defined in component: ' + (vm.$options.name || vm.$options._componentTag || 'anonymous'));
+    }
   }
 };
 
@@ -4763,7 +4774,11 @@ function createBundleRendererCreator(createRenderer) {
       renderToStream: function renderToStream(context) {
         var res = new stream.PassThrough();
         runInVm(code, context).then(function (app) {
-          renderer.renderToStream(app).pipe(res);
+          var renderStream = renderer.renderToStream(app);
+          renderStream.on('error', function (err) {
+            res.emit('error', err);
+          });
+          renderStream.pipe(res);
         }).catch(function (err) {
           process.nextTick(function () {
             res.emit('error', err);

+ 1 - 1
packages/vue-server-renderer/package.json

@@ -1,6 +1,6 @@
 {
   "name": "vue-server-renderer",
-  "version": "2.0.0-beta.7",
+  "version": "2.0.0-beta.8",
   "description": "server renderer for Vue 2.0",
   "main": "index.js",
   "repository": {

+ 42 - 35
packages/vue-template-compiler/build.js

@@ -1523,8 +1523,9 @@ function lifecycleMixin(Vue) {
       vm.$options._parentListeners = listeners;
       vm._updateListeners(listeners, oldListeners);
     }
-    // force udpate if has children
+    // resolve slots + force update if has children
     if (hasChildren) {
+      vm.$slots = resolveSlots(renderChildren);
       vm.$forceUpdate();
     }
   };
@@ -1885,7 +1886,7 @@ function initRender(vm) {
   vm.$vnode = null; // the placeholder node in parent tree
   vm._vnode = null; // the root of the child tree
   vm._staticTrees = null;
-  vm.$slots = {};
+  vm.$slots = resolveSlots(vm.$options._renderChildren);
   // bind the public createElement fn to this instance
   // so that we get proper render context inside it.
   vm.$createElement = bind(createElement, vm);
@@ -1904,7 +1905,6 @@ function renderMixin(Vue) {
     var _vm$$options = vm.$options;
     var render = _vm$$options.render;
     var staticRenderFns = _vm$$options.staticRenderFns;
-    var _renderChildren = _vm$$options._renderChildren;
     var _parentVnode = _vm$$options._parentVnode;
 
 
@@ -1914,9 +1914,6 @@ function renderMixin(Vue) {
     // set parent vnode. this allows render functions to have access
     // to the data on the placeholder node.
     vm.$vnode = _parentVnode;
-    // resolve slots. becaues slots are rendered in parent scope,
-    // we set the activeInstance to parent.
-    vm.$slots = resolveSlots(_renderChildren);
     // render self
     var vnode = void 0;
     try {
@@ -1960,11 +1957,23 @@ function renderMixin(Vue) {
   Vue.prototype._n = toNumber;
 
   // render static tree by index
-  Vue.prototype._m = function renderStatic(index) {
+  Vue.prototype._m = function renderStatic(index, isInFor) {
     var tree = this._staticTrees[index];
-    if (!tree) {
-      tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    // if has already-rendered static tree and not inside v-for,
+    // we can reuse the same tree by indentity.
+    if (tree && !isInFor) {
+      return tree;
+    }
+    // otherwise, render a fresh tree.
+    tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
+    if (Array.isArray(tree)) {
+      for (var i = 0; i < tree.length; i++) {
+        tree[i].isStatic = true;
+        tree[i].key = '__static__' + index + '_' + i;
+      }
+    } else {
       tree.isStatic = true;
+      tree.key = '__static__' + index;
     }
     return tree;
   };
@@ -2015,12 +2024,12 @@ function renderMixin(Vue) {
           value = toObject(value);
         }
         var data = vnode.data;
-        for (var key in value) {
-          if (key === 'class' || key === 'style') {
-            data[key] = value[key];
+        for (var _key in value) {
+          if (_key === 'class' || _key === 'style') {
+            data[_key] = value[_key];
           } else {
-            var hash = asProp || config.mustUseProp(key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
-            hash[key] = value[key];
+            var hash = asProp || config.mustUseProp(_key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {});
+            hash[_key] = value[_key];
           }
         }
       }
@@ -2662,8 +2671,10 @@ var isIE = UA && /msie|trident/.test(UA);
 var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
 var isAndroid = UA && UA.indexOf('android') > 0;
 
-// some browsers, e.g. PhantomJS, encodes angular brackets
-// inside attribute values when retrieving innerHTML.
+// According to
+// https://w3c.github.io/DOM-Parsing/#dfn-serializing-an-attribute-value
+// when serializing innerHTML, <, >, ", & should be encoded as entities.
+// However, only some browsers, e.g. PhantomJS, encodes < and >.
 // this causes problems with the in-browser parser.
 var shouldDecodeTags = inBrowser ? function () {
   var div = document.createElement('div');
@@ -2705,12 +2716,13 @@ var reCache = {};
 var ampRE = /&amp;/g;
 var ltRE = /&lt;/g;
 var gtRE = /&gt;/g;
+var quoteRE = /&quot;/g;
 
 function decodeAttr(value, shouldDecodeTags) {
   if (shouldDecodeTags) {
     value = value.replace(ltRE, '<').replace(gtRE, '>');
   }
-  return value.replace(ampRE, '&');
+  return value.replace(ampRE, '&').replace(quoteRE, '"');
 }
 
 function parseHTML(html, options) {
@@ -3447,9 +3459,6 @@ function processComponent(el) {
   if (binding = getBindingAttr(el, 'is')) {
     el.component = binding;
   }
-  if (getAndRemoveAttr(el, 'keep-alive') != null) {
-    el.keepAlive = true;
-  }
   if (getAndRemoveAttr(el, 'inline-template') != null) {
     el.inlineTemplate = true;
   }
@@ -3595,7 +3604,7 @@ function optimize(root, options) {
   // first pass: mark all non-static nodes.
   markStatic(root);
   // second pass: mark static roots.
-  markStaticRoots(root);
+  markStaticRoots(root, false);
 }
 
 function genStaticKeys$1(keys) {
@@ -3615,14 +3624,17 @@ function markStatic(node) {
   }
 }
 
-function markStaticRoots(node) {
-  if (node.type === 1 && (node.once || node.static)) {
-    node.staticRoot = true;
-    return;
-  }
-  if (node.children) {
-    for (var i = 0, l = node.children.length; i < l; i++) {
-      markStaticRoots(node.children[i]);
+function markStaticRoots(node, isInFor) {
+  if (node.type === 1) {
+    if (node.once || node.static) {
+      node.staticRoot = true;
+      node.staticInFor = isInFor;
+      return;
+    }
+    if (node.children) {
+      for (var i = 0, l = node.children.length; i < l; i++) {
+        markStaticRoots(node.children[i], !!node.for);
+      }
     }
   }
 }
@@ -3729,7 +3741,6 @@ function generate(ast, options) {
   dataGenFns = pluckModuleFunction(options.modules, 'genData');
   platformDirectives = options.directives || {};
   var code = ast ? genElement(ast) : '_h("div")';
-  // console.log(code)
   staticRenderFns = prevStaticRenderFns;
   return {
     render: 'with(this){return ' + code + '}',
@@ -3742,7 +3753,7 @@ function genElement(el) {
     // hoist static sub-trees out
     el.staticProcessed = true;
     staticRenderFns.push('with(this){return ' + genElement(el) + '}');
-    return '_m(' + (staticRenderFns.length - 1) + ')';
+    return '_m(' + (staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ')';
   } else if (el.for && !el.forProcessed) {
     return genFor(el);
   } else if (el.if && !el.ifProcessed) {
@@ -3767,10 +3778,6 @@ function genElement(el) {
     for (var i = 0; i < transforms$1.length; i++) {
       code = transforms$1[i](el, code);
     }
-    // check keep-alive
-    if (el.keepAlive) {
-      code = '_h("KeepAlive",{props:{child:' + code + '}})';
-    }
     return code;
   }
 }

+ 1 - 1
packages/vue-template-compiler/package.json

@@ -1,6 +1,6 @@
 {
   "name": "vue-template-compiler",
-  "version": "2.0.0-beta.7",
+  "version": "2.0.0-beta.8",
   "description": "template compiler for Vue 2.0",
   "main": "index.js",
   "repository": {

+ 48 - 0
phantomjsdriver.log

@@ -0,0 +1,48 @@
+[INFO  - 2016-08-10T04:48:46.464Z] GhostDriver - Main - running on port 46884
+[INFO  - 2016-08-10T04:48:46.589Z] Session [b8ea4070-5eb5-11e6-a779-e56825555de9] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:46.589Z] Session [b8ea4070-5eb5-11e6-a779-e56825555de9] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:46.589Z] Session [b8ea4070-5eb5-11e6-a779-e56825555de9] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:46.589Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: b8ea4070-5eb5-11e6-a779-e56825555de9
+[INFO  - 2016-08-10T04:48:47.736Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:48:49.306Z] GhostDriver - Main - running on port 46630
+[INFO  - 2016-08-10T04:48:49.482Z] Session [baa42570-5eb5-11e6-b6f4-a368050e2a43] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:49.482Z] Session [baa42570-5eb5-11e6-b6f4-a368050e2a43] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:49.483Z] Session [baa42570-5eb5-11e6-b6f4-a368050e2a43] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:49.483Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: baa42570-5eb5-11e6-b6f4-a368050e2a43
+[INFO  - 2016-08-10T04:48:51.013Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:48:51.573Z] GhostDriver - Main - running on port 9957
+[INFO  - 2016-08-10T04:48:51.764Z] Session [bc000bf0-5eb5-11e6-930f-37dbcdbbfad1] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:51.764Z] Session [bc000bf0-5eb5-11e6-930f-37dbcdbbfad1] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:51.764Z] Session [bc000bf0-5eb5-11e6-930f-37dbcdbbfad1] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:51.764Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: bc000bf0-5eb5-11e6-930f-37dbcdbbfad1
+[INFO  - 2016-08-10T04:48:52.530Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:48:53.111Z] GhostDriver - Main - running on port 10905
+[INFO  - 2016-08-10T04:48:53.282Z] Session [bce7d3e0-5eb5-11e6-874a-55c109c9f4d7] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:53.282Z] Session [bce7d3e0-5eb5-11e6-874a-55c109c9f4d7] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:53.282Z] Session [bce7d3e0-5eb5-11e6-874a-55c109c9f4d7] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:53.282Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: bce7d3e0-5eb5-11e6-874a-55c109c9f4d7
+[INFO  - 2016-08-10T04:48:54.814Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:48:55.494Z] GhostDriver - Main - running on port 33586
+[INFO  - 2016-08-10T04:48:55.576Z] Session [be45dd40-5eb5-11e6-bc8c-db828e371f48] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:55.576Z] Session [be45dd40-5eb5-11e6-bc8c-db828e371f48] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:55.576Z] Session [be45dd40-5eb5-11e6-bc8c-db828e371f48] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:55.576Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: be45dd40-5eb5-11e6-bc8c-db828e371f48
+[INFO  - 2016-08-10T04:48:56.574Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:48:57.228Z] GhostDriver - Main - running on port 3293
+[INFO  - 2016-08-10T04:48:57.326Z] Session [bf510bb0-5eb5-11e6-a16a-6fde8ecfcf4b] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:57.326Z] Session [bf510bb0-5eb5-11e6-a16a-6fde8ecfcf4b] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:57.327Z] Session [bf510bb0-5eb5-11e6-a16a-6fde8ecfcf4b] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:57.327Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: bf510bb0-5eb5-11e6-a16a-6fde8ecfcf4b
+[INFO  - 2016-08-10T04:48:57.718Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:48:58.933Z] GhostDriver - Main - running on port 32786
+[INFO  - 2016-08-10T04:48:59.066Z] Session [c05a6560-5eb5-11e6-a587-d17a98065415] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:48:59.066Z] Session [c05a6560-5eb5-11e6-a587-d17a98065415] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:48:59.066Z] Session [c05a6560-5eb5-11e6-a587-d17a98065415] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:48:59.066Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: c05a6560-5eb5-11e6-a587-d17a98065415
+[INFO  - 2016-08-10T04:49:01.601Z] ShutdownReqHand - _handle - About to shutdown
+[INFO  - 2016-08-10T04:49:02.711Z] GhostDriver - Main - running on port 17483
+[INFO  - 2016-08-10T04:49:02.859Z] Session [c29d2970-5eb5-11e6-82c8-13085eebdaf5] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1","webSecurityEnabled":true}
+[INFO  - 2016-08-10T04:49:02.859Z] Session [c29d2970-5eb5-11e6-82c8-13085eebdaf5] - page.customHeaders:  - {}
+[INFO  - 2016-08-10T04:49:02.859Z] Session [c29d2970-5eb5-11e6-82c8-13085eebdaf5] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.11 (El Capitan)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
+[INFO  - 2016-08-10T04:49:02.859Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: c29d2970-5eb5-11e6-82c8-13085eebdaf5
+[INFO  - 2016-08-10T04:49:03.875Z] ShutdownReqHand - _handle - About to shutdown

+ 1 - 1
src/core/index.js

@@ -8,6 +8,6 @@ Object.defineProperty(Vue.prototype, '$isServer', {
   get: () => config._isServer
 })
 
-Vue.version = '2.0.0-beta.7'
+Vue.version = '2.0.0-beta.8'
 
 export default Vue

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor