EncodedJSValue JSC_HOST_CALL COMMethodCall::call(ExecState* execState) { COMMethodCall* callee = jsCast<COMMethodCall*>(execState->callee()); if (execState->argumentCount() != callee->_parameterCells.size()) { // TODO: error CRASH(); } COMInterop* interop = jsCast<GlobalObject*>(execState->lexicalGlobalObject())->interop(); size_t numberOfABIParameters = callee->_parameterCells.size() + (callee->_isVoid ? 1 : 2); HRESULT hr; Microsoft::WRL::ComPtr<IUnknown> self; hr = interop->wrap(execState->thisValue(), callee->_methodInterface, self.GetAddressOf()); void** vtable = *reinterpret_cast<void***>(self.Get()); void* fn = vtable[callee->_methodIndex]; WTF::Vector<void*> arguments; arguments.reserveCapacity(numberOfABIParameters); IUnknown* thisValue = self.Get(); arguments.append(&thisValue); for (int i = 0; i < callee->_parameterCells.size(); i++) { JSCell* type = callee->_parameterCells[i].get(); void* buffer = _alloca(std::max(sizeof(ffi_arg), callee->_parameterTypes[i + 1]->size)); getFFIMethodTable(type)->marshalJSToNative(type, execState, execState->uncheckedArgument(i), buffer); arguments.append(buffer); } void* returnBuffer = nullptr; if (!callee->_isVoid) { returnBuffer = _alloca(std::max(sizeof(ffi_arg), callee->_parameterTypes[numberOfABIParameters - 1]->size)); arguments.append(&returnBuffer); } ffi_call(&callee->_cif, FFI_FN(fn), &hr, arguments.data()); JSValue jsResult; if (!SUCCEEDED(hr)) { _com_error error(hr, nullptr); jsResult = execState->vm().throwException(execState, createError(execState, error.ErrorMessage())); } else if (!callee->_isVoid) { JSCell* returnType = callee->_returnType.get(); jsResult = getFFIMethodTable(returnType)->marshalNativeToJS(returnType, execState, returnBuffer); } else { jsResult = jsUndefined(); } return JSValue::encode(jsResult); }
jbyteArray WebHistory::Flatten(JNIEnv* env, WTF::Vector<char>& v, WebCore::HistoryItem* item) { if (!item) return NULL; // Reserve a vector of chars with an initial size of HISTORY_MIN_SIZE. v.reserveCapacity(HISTORY_MIN_SIZE); // Write the top-level history item and then write all the children // recursively. LOG_ASSERT(item->bridge(), "Why don't we have a bridge object here?"); write_item(v, item); write_children_recursive(v, item); //SAMSUNG - CRASH FIX BEGIN int size = v.size(); if (size > 0) { long availableMemory = GetVmAvailableMemory(env); if(size > availableMemory) { LOGV("WebHistory::Flatten(): load size=%d, availableMemory=%ld, still larger, return NULL", size, availableMemory); return NULL; } checkException(env); } //SAMSUNG - CRASH FIX END // Try to create a new java byte array. jbyteArray b = env->NewByteArray(v.size()); if (!b) { //SAMSUNG - CRASH FIX BEGIN if (checkException(env)) { LOGV("WebHistory::Flatten(): env exception happened while allocating %d bytes, clear pending exception", v.size()); env->ExceptionClear(); } //SAMSUNG - CRASH FIX END return NULL; } // Write our flattened data to the java array. env->SetByteArrayRegion(b, 0, v.size(), (const jbyte*)v.data()); return b; }
jbyteArray WebHistory::Flatten(JNIEnv* env, WTF::Vector<char>& v, WebCore::HistoryItem* item) { if (!item) return NULL; // Reserve a vector of chars with an initial size of HISTORY_MIN_SIZE. v.reserveCapacity(HISTORY_MIN_SIZE); // Write the top-level history item and then write all the children // recursively. LOG_ASSERT(item->bridge(), "Why don't we have a bridge object here?"); write_item(v, item); write_children_recursive(v, item); // Try to create a new java byte array. jbyteArray b = env->NewByteArray(v.size()); if (!b) return NULL; // Write our flattened data to the java array. env->SetByteArrayRegion(b, 0, v.size(), (const jbyte*)v.data()); return b; }
void FrameLoaderClientAndroid::dispatchDidFailProvisionalLoad(const ResourceError& error) { ASSERT(m_frame); // Ignore ErrorInterrupted since it is due to a policy interruption. This // is caused by a decision to download the main resource rather than // display it. if (error.errorCode() == InternalErrorInterrupted || error.errorCode() == InternalErrorCancelled) { // If we decided to download the main resource or if the user cancelled // it, make sure we report that the load is done. didFinishLoad(); return; } AssetManager* am = globalAssetManager(); // Check to see if the error code was not generated internally WebCore::PlatformBridge::rawResId id = WebCore::PlatformBridge::NoDomain; if ((error.errorCode() == ErrorFile || error.errorCode() == ErrorFileNotFound) && (!error.localizedDescription().isEmpty())) { id = WebCore::PlatformBridge::LoadError; } String filename = m_webFrame->getRawResourceFilename(id); if (filename.isEmpty()) return; // Grab the error page from the asset manager Asset* a = am->openNonAsset( filename.utf8().data(), Asset::ACCESS_BUFFER); if (!a) return; // Take the failing url and encode html entities so javascript urls are not // executed. CString failingUrl = error.failingURL().utf8(); WTF::Vector<char> url; int len = failingUrl.length(); const char* data = failingUrl.data(); for (int i = 0; i < len; i++) { char c = data[i]; if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) url.append(c); else { char buf[16]; int res = sprintf(buf, "&#%d;", c); buf[res] = 0; url.append(buf, res); } } // Replace all occurances of %s with the failing url. String s = UTF8Encoding().decode((const char*)a->getBuffer(false), a->getLength()); // samsung shkim // \frameworks\base\core\res\res\raw-XX\nodomain.html or loaderror.html // These error pages does not have <viewport> tag, it is loaded as low zoom scale if( s.contains( "viewport" ) == false ) s = s.replace( "<head>", "<head> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"/>" ); s = s.replace("%s", String(url.data(), url.size())); // Replace all occurances of %e with the error text s = s.replace("%e", error.localizedDescription()); // Create the request and the substitute data and tell the FrameLoader to // load with the replacement data. // use KURL(const char*) as KURL(const String& url) can trigger ASSERT for // invalidate URL string. loadDataIntoFrame(m_frame, KURL(ParsedURLString, data), error.failingURL(), s); // Delete the asset. delete a; }