Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[weex] supported weex instance variable #4516

Merged
merged 1 commit into from
Dec 19, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
98 changes: 65 additions & 33 deletions src/entries/weex-framework.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,57 +54,69 @@ function clear (obj) {
* @param {string} appCode
* @param {object} config
* @param {object} data
* @param {object} env { info, config, services }
*/
export function createInstance (
instanceId, appCode = '', config = {} /* {bundleUrl, debug} */, data) {
instanceId,
appCode = '',
config = {},
data,
env = {}
) {
// Set active instance id and put some information into `instances` map.
activeId = instanceId

// Virtual-DOM object.
const document = new renderer.Document(instanceId, config.bundleUrl)

// All function/callback of parameters before sent to native
// will be converted as an id. So `callbacks` is used to store
// these real functions. When a callback invoked and won't be
// called again, it should be removed from here automatically.
const callbacks = []

// The latest callback id, incremental.
const callbackId = 1

instances[instanceId] = {
instanceId, config, data,
// Virtual-DOM object.
document: new renderer.Document(instanceId, config.bundleUrl),
// All function/callback of parameters before sent to native
// will be converted as an id. So `callbacks` is used to store
// these real functions. When a callback invoked and won't be
// called again, it should be removed from here automatically.
callbacks: [],
// The latest callback id, incremental.
callbackId: 1
document, callbacks, callbackId
}

// The function which create a closure the JS Bundle will run in.
// It will declare some global variables like `Vue`, HTML5 Timer APIs,
// and native module getter.
const start = new Function(
'Vue',
'__weex_require_module__',
'setTimeout',
'setInterval',
'clearTimeout',
'clearInterval',
appCode)

// Each instance has a independent `Vue` object and it should have
// Prepare native module getter and HTML5 Timer APIs.
const moduleGetter = genModuleGetter(instanceId)
const timerAPIs = getInstanceTimer(instanceId, moduleGetter)

// Prepare `weex` instance variable.
const weexInstanceVar = {
config,
document,
require: moduleGetter
}
Object.freeze(weexInstanceVar)

// Each instance has a independent `Vue` variable and it should have
// all top-level public APIs.
const subVue = Vue.extend({})

// ensure plain-object components are extended from the subVue
subVue.options._base = subVue

// expose global utility
;['util', 'set', 'delete', 'nextTick'].forEach(name => {
subVue[name] = Vue[name]
})

// Prepare native module getter and HTML5 Timer APIs.
const moduleGetter = genModuleGetter(instanceId)
const timerAPIs = getInstanceTimer(instanceId, moduleGetter)
// The function which create a closure the JS Bundle will run in.
// It will declare some instance variables like `Vue`, HTML5 Timer APIs etc.
const instanceVars = Object.assign({
Vue: subVue,
weex: weexInstanceVar,
__weex_require_module__: weexInstanceVar.require // deprecated
}, timerAPIs)
callFunction(instanceVars, appCode)

// Run the JS Bundle and send `createFinish` signal to native.
start(
subVue, moduleGetter,
timerAPIs.setTimeout,
timerAPIs.setInterval,
timerAPIs.clearTimeout,
timerAPIs.clearInterval)
// Send `createFinish` signal to native.
renderer.sendTasks(instanceId + '', [{ module: 'dom', method: 'createFinish', args: [] }], -1)
}

Expand Down Expand Up @@ -266,6 +278,7 @@ Vue.mixin({
})

/**
* @deprecated Just instance variable `weex.config`
* Get instance config.
* @return {object}
*/
Expand Down Expand Up @@ -340,6 +353,25 @@ function getInstanceTimer (instanceId, moduleGetter) {
return timerAPIs
}

/**
* Call a new function body with some global objects.
* @param {object} globalObjects
* @param {string} code
* @return {any}
*/
function callFunction (globalObjects, body) {
const globalKeys = []
const globalValues = []
for (const key in globalObjects) {
globalKeys.push(key)
globalValues.push(globalObjects[key])
}
globalKeys.push(body)

const result = new Function(...globalKeys)
return result(...globalValues)
}

/**
* Convert all type of values into "safe" format to send to native.
* 1. A `function` will be converted into callback id.
Expand Down